Meine Frage ist eigentlich allgemeiner als der Titel:
An welcher Stelle spielt die Architektur eine Rolle, wenn Code geschrieben wird, der schließlich in den LLVM-Zwischencode und von dort in die Maschinensprache übersetzt wird?
Sagen wir, ich schreibe Rust (die LLVM als Backend verwendet). Bin ich automatisch in der Lage, meinen Rust-Code für jede Architektur zu kompilieren, auf die LLVM abzielen kann (vorausgesetzt, es gibt ein Betriebssystem auf diesem Computer, auf dem es ausgeführt werden kann)?
Oder könnte es sein, dass die Rust-Standardbibliothek noch nicht "ARM-kompatibel" gemacht wurde, also konnte ich nicht zu ARM kompilieren, selbst wenn die LLVM darauf abzielt?
Was ist, wenn ich keine Standardbibliothek verwende, ist mein gesamtes Programm nur ein Programm, das sofort zurückkehrt? Könnte es sein, dass Rust (oder was hast du) selbst ohne Bibliotheken nicht zu ARM kompilieren kann (oder was hast du), selbst wenn LLVM es als Ziel hat?
Wenn alle oben genannten Beispiele gut kompiliert werden, was muss ich tun, damit mein Code auf break auf einer Architektur nicht auf eine bestimmte Architektur kompiliert wird?
Bonusfrage der gleichen Sorte:
Danke.
Aus meinem Verständnis heraus können Sie compilieren für jedes Ziel, das LLVM unterstützt (es kann hier noch ein paar Vorbehalte geben, wenn Sie Inline Assembler oder module level inline assembly ), Sie können jedoch nicht garantieren, dass korrekt ausgeführt wird. Das Frontend ist verantwortlich dafür, dass die Arbeit über die Plattformen, die der Autor unterstützt, übertragbar ist.
Beachten Sie auch, dass Sie als Frontend-Entwickler für das Datenlayout und Zieldreifach .
Siehe auch:
Nehmen wir an, ich schreibe Rust (die LLVM als Backend verwendet). Bin ich? automatisch in der Lage, meinen Rust-Code für jede Architektur zu erstellen dass LLVM zielen kann (vorausgesetzt, es gibt ein Betriebssystem auf dieser Maschine, das run it)?
Dies hängt von den Autoren des Rust-Frontends ab.
Oder könnte es sein, dass die Rust-Standard-Bibliothek nicht gemacht wurde "ARM kompatibel "noch, so konnte ich nicht zu ARM kompilieren, selbst wenn die LLVM Ziele es?
Ich bin mir ziemlich sicher, dass LLVM in der Lage sein würde, die Anweisungen auszugeben, aber es ist möglicherweise nicht korrekt in Bezug auf die Adressierung.
Ich habe die oben genannten Inline-Assembler-Funktionen nicht selbst verwendet, aber ich nehme an, wenn es plattformspezifische Assembly erlaubt, dann würde dies die plattformunabhängige Kompilierung ebenfalls unterbrechen.
Was ist, wenn ich keine Standardbibliothek verwende, ist mein gesamtes Programm nur ein Programm, das sofort zurückkehrt? Könnte es sein, dass sogar ohne irgendwelche Bibliotheken kann Rust (oder was hast du) nicht zu ARM kompilieren (oder was hast du), selbst wenn der LLVM darauf abzielt?
Das hängt wieder davon ab, was das Rust-Frontend aussendet. Es kann sein, dass einige Standard-Setup-Logik ausgegeben wird, noch bevor es Anweisungen für Ihre Logik ausgibt.
Ich schreibe meine eigene Sprache in LLVM, die dies im Fall einer speziellen Funktion namens "main" tut. Ich ziele auf den C ABI, also wird es dieses Haupt mit einem richtigen C-Stil main umhüllen und es mit einem strengeren Satz von Parametern aufrufen.
Wenn alle obigen Beispiele gut kompilieren, was muss ich tun bekomme meinen Code um auf eine Architektur zu brechen nicht zu einem bestimmten kompilieren Architektur?
Betrachten Sie C / C ++ mit Clang wie in llvm FAQ . Clang ist ein Frontend, wahrscheinlich das beliebteste für LLVM, und die Benutzer, die C / C ++ schreiben, sind dafür verantwortlich, # die entsprechende plattformspezifische Funktionalität zu integrieren.
Einige Sprachen können plattformunabhängig gestaltet werden und das Frontend könnte dann die Arbeit für Sie übernehmen.
Nehmen wir an, die Standardbibliothek nutzt OS-Systemaufrufe (d. h sicherlich tut es). Müssen Sie bei der Herstellung auf Architektur achten? Systemanrufe? Oder abstrahiert das Betriebssystem (Linux zum Beispiel) Architektur auch?
Ich gehe davon aus, dass Sie über den Fall sprechen, in dem das Frontend auf die C-Standardbibliothek abzielt. In diesem Fall hat LLVM Standard-C-Bibliotheks-Intrinsics , die vom Frontend verwendet werden können. Dies ist jedoch nicht die einzige Möglichkeit, da Sie die Aufrufanweisung verwenden können, um C-Funktionen direkt aufzurufen, wenn Targeting auf den C ABI wie im Kaleidoscope-Beispiel .
Am Ende kann die Standardbibliothek ein Portabilitätsproblem darstellen und muss von den Frontend-Entwicklern behoben werden.
Tags und Links llvm linux compiler-construction