Lazarus als IDE für LLVM (llvm-pascal)

Für Dinge rund um die Unterstützung des offizielen Lazarusprojekts, wie Übersetzungsabsprachen und anderem.
mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Lazarus als IDE für LLVM (llvm-pascal)

Beitrag von mschnell »

marcov hat geschrieben: Hieß früher Gimple

Off Topik:
Vielen Dank für den Hinweis !

Jetzt weiß ich endlich was der "Gimple Error" zu bedeuten hat, den mir der Compiler unter bestimmten Bedingungen (die meist irgendwie mit volatile-Definitionen zu tun haben) beim Compilieren eines 68K Programms auswirft und die - mangels Beschreibung, mit was der gnu Compiler da nicht klarkommt (während ein MRI-Compiler es übersetzt) - äußerst schwer zu beheben sind.

-Michael
Zuletzt geändert von mschnell am Fr 9. Jan 2015, 13:08, insgesamt 1-mal geändert.

MitjaStachowiak
Lazarusforum e. V.
Beiträge: 394
Registriert: Sa 15. Mai 2010, 13:46
CPU-Target: 64 bit
Kontaktdaten:

Re: Lazarus als IDE für LLVM (llvm-pascal)

Beitrag von MitjaStachowiak »

lli sieht für mich jetzt nicht nach einer virtuellen Maschine aus. Kann es sein, dass die den LLVM-Code direkt in x86 übersetzen, ohne Optimierungen, und das dann auf der physischen CPU laufen lassen?
Weil dann könnte man ja durchaus auch DLLs laden...

Und was Debugging betrifft: LLVM übersetzt hier auch die Debugger-Befehle nach x86 und der Debugger muss dann direkt am ausführbaren Programm arbeiten?
Also er bekommt nicht vorgegaukelt, dass der LLVM-Code ausgeführt wird?

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Lazarus als IDE für LLVM (llvm-pascal)

Beitrag von mschnell »

mse hat geschrieben:http://llvm.org/docs/CommandGuide/lli.html

-> "executes it using a just-in-time compiler, if one is available for the current architecture, or an interpreter."

Klingt so als gäbe es einen Interpreter für jede Architektur, für die LLVM (native code compiler) verfügbar ist.

-Michael

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Lazarus als IDE für LLVM (llvm-pascal)

Beitrag von mse »

MitjaStachowiak hat geschrieben:lli sieht für mich jetzt nicht nach einer virtuellen Maschine aus.

Wie kommst du darauf?
https://github.com/llvm-mirror/llvm/blo ... cution.cpp
Kann es sein, dass die den LLVM-Code direkt in x86 übersetzen, ohne Optimierungen, und das dann auf der physischen CPU laufen lassen?
Weil dann könnte man ja durchaus auch DLLs laden...

Falls für die entsprechende Plattform eine JIT Compiler Implementation zur Verfügung steht wird sie von lli verwendet.
Und was Debugging betrifft: LLVM übersetzt hier auch die Debugger-Befehle nach x86 und der Debugger muss dann direkt am ausführbaren Programm arbeiten?
Also er bekommt nicht vorgegaukelt, dass der LLVM-Code ausgeführt wird?

Meinst du LLVM Bitcode? Dafür gibt es so viel ich weiss keinen Debugger, bin mir aber nicht sicher.

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Lazarus als IDE für LLVM (llvm-pascal)

Beitrag von mschnell »

MitjaStachowiak hat geschrieben:lli sieht für mich jetzt nicht nach einer virtuellen Maschine aus.


LLVM heißt doch "Low Level Virtual Machine"

-Michael

MitjaStachowiak
Lazarusforum e. V.
Beiträge: 394
Registriert: Sa 15. Mai 2010, 13:46
CPU-Target: 64 bit
Kontaktdaten:

Re: Lazarus als IDE für LLVM (llvm-pascal)

Beitrag von MitjaStachowiak »

LLVM heißt doch "Low Level Virtual Machine"

Ja, schon, aber ob diese virtuelle Maschine auch einen virtuellen Prozessor simuliert, wie bei Java, oder ob der LLVM-Bitcode immer per JIT-Compiler oder Interpreter in x86 übersetzt wird und dann auf der Physischen CPU läuft - das ist hier die Frage...

Ich dachte bislang eher an Letzteres, denn bei Java kann man ja nicht direkt auf externe DLLs zugreifen, außer die JRE bietet dafür eine spezielle Funktion.

lli interpretiert bzw. compiliert anscheinend nicht den Assembercode (LLVM IR), sondern tatsächlich die Maschinensprache. Innerhalb dieses Bitcodes muss es folglich auch Debuggerbefehle geben, die gdb dann lernen müsste, oder sogar schon kann (http://lldb.llvm.org/lldb-gdb.html). Wenn ich Mattias' Präsentation beim letzten Forumtreffen (http://mitjastachowiak.de?sonstiges/lazarusforumtreffen2014) richtig in Erinnerung habe, arbeitet man bei Freepascal bereits an einem eigenen Debugger.

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Lazarus als IDE für LLVM (llvm-pascal)

Beitrag von mse »

MitjaStachowiak hat geschrieben:
LLVM heißt doch "Low Level Virtual Machine"

Ja, schon, aber ob diese virtuelle Maschine auch einen virtuellen Prozessor simuliert, wie bei Java, oder ob der LLVM-Bitcode immer per JIT-Compiler oder Interpreter in x86 übersetzt wird und dann auf der Physischen CPU läuft - das ist hier die Frage...

Ich dachte bislang eher an Letzteres, denn bei Java kann man ja nicht direkt auf externe DLLs zugreifen, außer die JRE bietet dafür eine spezielle Funktion.

lli interpretiert bzw. compiliert anscheinend nicht den Assembercode (LLVM IR), sondern tatsächlich die Maschinensprache.

Nochmals: Wie kommst du darauf?
https://github.com/llvm-mirror/llvm/blo ... cution.cpp
Innerhalb dieses Bitcodes muss es folglich auch Debuggerbefehle geben, die gdb dann lernen müsste, oder sogar schon kann

Wie bereits geschrieben, die mittels Metadata an den Eingabecode gebundene Debuginformationen werden von llc in DWARF-Form in den Objektdateien abgelegt.

MitjaStachowiak
Lazarusforum e. V.
Beiträge: 394
Registriert: Sa 15. Mai 2010, 13:46
CPU-Target: 64 bit
Kontaktdaten:

Re: Lazarus als IDE für LLVM (llvm-pascal)

Beitrag von MitjaStachowiak »

... komme ich worauf? Dass LLVM keinen virtuellen Prozessor simuliert? Die Execution.cpp könnte auf den ersten Blick das eine oder andere machen...

Wenn ein virtueller Prozessor simuliert wird, würde doch der JIT-Compiler keinen Sinn machen, jedenfalls wenn ich das richtig verstehe und dieser nach x86, ARM, usw. compiliert. Weil wozu einen komplizierten Prozessor, wie x86 simulieren?

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Lazarus als IDE für LLVM (llvm-pascal)

Beitrag von mse »

Was verstehst du denn unter just-in-time Kompilierung? Die übliche Verwendung des Begriffes ist etwa "übersetze in Maschinencode sobald die Routine gebraucht wird und führe den übersetzten Code aus". Warum? Weil das viel schneller läuft als das interpretieren eines IR.

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Lazarus als IDE für LLVM (llvm-pascal)

Beitrag von mschnell »

MitjaStachowiak hat geschrieben: Weil wozu einen komplizierten Prozessor, wie x86 simulieren?

Wer simuliert in diesem Zusammenhang einen x86 ?

-Michael

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Lazarus als IDE für LLVM (llvm-pascal)

Beitrag von mschnell »

mse hat geschrieben:Die übliche Verwendung des Begriffes ist etwa "übersetze in Maschinencode sobald die Routine gebraucht wird und führe den übersetzten Code aus".


... und halte die übersetze Version in einem Cache, falls sie bald noch einmal gebraucht wird.

Das führt dazu dass (nicht allzu große) C# Programme in CIL-Form mit dem JIT Compiler nur langsamer laden, aber nicht langsamer laufen, als wenn man sie mit dem (ebenfalls existierenden, aber selten verwendeten) Compiler von CIL in native Code übersetzt und dann die native-Datei startet.

-Michael

MitjaStachowiak
Lazarusforum e. V.
Beiträge: 394
Registriert: Sa 15. Mai 2010, 13:46
CPU-Target: 64 bit
Kontaktdaten:

Re: Lazarus als IDE für LLVM (llvm-pascal)

Beitrag von MitjaStachowiak »

Was verstehst du denn unter just-in-time Kompilierung? Die übliche Verwendung des Begriffes ist etwa "übersetze in Maschinencode sobald die Routine gebraucht wird und führe den übersetzten Code aus".


Genau, also kein virtueller Prozessor.

Wer simuliert in diesem Zusammenhang einen x86?


Wie ich vermutet habe: Niemand. Der übersetzte Code läuft dann direkt auf der physischen CPU. Das ist ein etwas anderes Konzept, als bei Java, oder diversen Scriptsprachen, die JIT-Compiling verwenden.

Heißt das dann, es gibt einen zweistufigen Debugger? Also im JIT-compilierten x86-Code befindet sich ein Haltepunkt. Ein "Backend-Debugger" erkennt diesen und unterbricht das Programm. Dann wird im LLVM-Bitcode das Erreichen des äquivalenten Haltepunktes simuliert und ein zweiter "Frontend-Debugger" erkennt dies und markiert in der IDE die entsprechende Zeile?

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Lazarus als IDE für LLVM (llvm-pascal)

Beitrag von mschnell »

MitjaStachowiak hat geschrieben:Genau, also kein virtueller Prozessor.

Äääh doch ?!?!? Der ausgeführte (ausgelieferte) Binär-Code wird nicht von einem Hardware-Prozessor, sondern für einen Virtuellen (in Software realisierten) Prozessor ausgeführt. Wie diese Software das macht (rein interpretativ oder durch einen nachgeschalteten Übersetzungsvorgang für den lokalen Hardware-Prozessor) ist egal.

-Michael

MitjaStachowiak
Lazarusforum e. V.
Beiträge: 394
Registriert: Sa 15. Mai 2010, 13:46
CPU-Target: 64 bit
Kontaktdaten:

Re: Lazarus als IDE für LLVM (llvm-pascal)

Beitrag von MitjaStachowiak »

Wirklich?

Also bei einer JIT-Compilation denke ich, dass der erzeugte Code vor dem Laden in den Prozessor als "ausführbar" markiert wird, weil ansonsten die Data Execution Prevention greifen müsste. Der vollständig compilierte Code müsste dann auch anderen Prozessen Messages schicken können, auf Hardware zugreifen, MMF verwenden, usw. Bei einer richtigen, virtuellen Umgebung, wie JRE oder einem modernen Webbrowser, bleibt auch der compilierte Code ein Datenblock, nur der virtuelle Prozessor kann ihn ausführen, bietet dabei aber keine Interaktionsmöglichkeit mit anderen Prozessen oder dem System, außer vielleicht über spezielle Interfaces.

Im Prinzip könnte man natürlich sagen, dass jeder Prozess in einer Art virtuellen Maschine läuft, da er ja eine eigene Pagetable bekommt, aber ob das Betriebssystem diese Maschine ist, oder ob dazwischen eine weitere Abstraktionsebene liegt... Gerade wenn es um Cuda oder die Frage, ob man von lli aus die Windows-API verwenden kann, geht, ist das schon relevant.

marcov
Beiträge: 1100
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: Lazarus als IDE für LLVM (llvm-pascal)

Beitrag von marcov »

MitjaStachowiak hat geschrieben:
Was verstehst du denn unter just-in-time Kompilierung? Die übliche Verwendung des Begriffes ist etwa "übersetze in Maschinencode sobald die Routine gebraucht wird und führe den übersetzten Code aus".


Genau, also kein virtueller Prozessor.


Man kann ein virtueller Prozessor haben ohne JIT. Beispiel: Java 1.0 (rein interpretiert, und (assembler Ebene) Typen explizit in Opcodes codiert).

Antworten