2015-12-16 11 views
8

Meine Frage ist eigentlich allgemeiner als der Titel:Wenn Code vom LLVM-Back-End kompiliert wird, spielt Architektur eine Rolle?

An welchem ​​Punkt ist die Architektur wichtig, wenn Code geschrieben wird, der schließlich zu LLVM-Vermittlercode und dann von dort zur Maschinensprache kompiliert wird?

  1. Sagen wir, ich schreibe Rust (die LLVM als Backend verwendet). Bin ich in der Lage, meinen Rust-Code automatisch 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)?

  2. Oder könnte es sein, dass die Rust-Standardbibliothek noch nicht "ARM-kompatibel" gemacht wurde, also konnte ich nicht zu ARM kompilieren, selbst wenn der LLVM darauf abzielt?

  3. 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 die LLVM darauf abzielt?

  4. Wenn alle oben genannten Beispiele gut kompilieren, was muss ich tun, um meinen Code zu brechen auf einer Architektur nicht zu einer bestimmten Architektur kompilieren?

Bonus Frage der gleichen Sorte:

  1. sagen Lassen Sie die Standard-Bibliothek Verwendung von OS-Systemaufrufe macht (was sicherlich tut, ist). Müssen Sie sich bei Systemaufrufen um die Architektur kümmern? Oder abstrahiert das OS (Linux zum Beispiel) auch die Architektur?

Danke.

Antwort

4

TL; DR

Von meinem Verständnis kann man zu beliebigem Ziel LLVM unterstützt kompilieren (es noch ein paar Einschränkungen hier mit Frontends sein kann inline assembler oder module level inline assembly verwendet wird), ist jedoch nicht gewährleistet, wird tatsächlich korrekt ausführen. Das Frontend ist verantwortlich dafür, dass die Arbeit über die Plattformen, die der Autor unterstützt, portierbar ist. Bitte beachten Sie, dass Sie als Frontend-Entwickler für die Bereitstellung der data layout und target triple verantwortlich sind.

siehe auch:

Ihre Fragen:

Sagen wir, ich schreibe Rust (die LLVM als Backend verwendet).Bin ich automatisch in der Lage, meine Rust-Code zu jeder Architektur , die LLVM zielen kann (vorausgesetzt, es gibt ein Betriebssystem auf dieser Maschine, die kann es laufen lassen) kompilieren?

Dies ist abhängig von den Autoren des Rust-Frontends.

Oder könnte es sein, dass die Rust Standardbibliothek noch nicht gemacht worden „ARM kompatibel“, so konnte ich nicht einmal, wenn die LLVM ARM kompilieren zielt es ?

Ich bin mir ziemlich sicher, LLVM wäre in der Lage, die Anweisungen zu emittieren, aber es kann nicht in Bezug auf die Adressierung korrekt sein.

Ich habe die oben genannten Inline-Assembler-Funktionen nicht selbst benutzt, 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 Bibliotheken, Rust (oder was hast du) kann nicht auf ARM (oder was hast du) kompilieren, auch wenn die LLVM zielt darauf ab?

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 "Haupt" tut. Ich ziele auf den C ABI, also wird es dieses Haupt mit einem richtigen C-Stil-Hauptteil umhüllen und es mit einem strengeren Satz von Parametern aufrufen.

Wenn alle oben genannten Beispiele nur gut zu kompilieren, was habe ich zu zu tun, meinen Code brechen lassen nicht auf eine Architektur zu einem gewissen Architektur kompilieren?

Betrachten Sie C/C++ mit Clang wie in der llvm FAQ erwähnt. 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 einzuschließen.

Einige Sprachen können plattformunabhängig gestaltet werden und das Frontend könnte dann die Arbeit für Sie übernehmen.

Nehmen wir an, dass die Standardbibliothek OS-Systemaufrufe verwendet (was sicherlich tut). Müssen Sie bei der Erstellung von Systemaufrufen auf die Architektur achten? Oder abstrahiert das Betriebssystem (Linux, zum Beispiel) auch Architektur?

Ich nehme an, Sie über den Fall sprechen, wo das Frontend der C-Standardbibliothek richtet sich in diesem Fall LLVM standard C library intrinsics hat, die durch das Frontend verwendet werden könnten. Dies ist jedoch nicht der einzige Weg, da Sie die call instruction verwenden können, um C-Funktionen direkt aufzurufen, wenn Sie auf den C ABI wie in der Kaleidoscope example zielen.

Am Ende kann die Standardbibliothek ein Problem der Portabilität sein und muss von den Frontend-Entwicklern behoben werden.