2013-05-01 10 views
10

Ich möchte Software mit dem Autotools Build-System zu LLVM-Bitcode kompilieren; das heißt, ich möchte, dass die ausführbaren Dateien am Ende LLVM-Bitcode sind, nicht der tatsächliche Maschinencode.Erstellen Autotool-Software zu LLVM-Bitcode

(Das Ziel ist es, LLVM Bitcode Analyse-Tools auf dem gesamten Programm auszuführen.)

Ich habe versucht CC="clang -emit-llvm -use-gold-plugins" und Varianten zum configure Skript spezifizieren, ohne Erfolg. Es ist immer etwas schief gelaufen (z. B. erstellt das Paket .a statische Bibliotheken, die vom Linker abgelehnt werden).

Es scheint mir, dass der richtige Weg es wäre, dass LLVM-Bitcode ein Cross-Compilation-Ziel sein sollte. mit --host= eingestellt werden, aber es gibt kein solches Standardziel (obwohl es ein Ziel für Knuths MMIX gibt).

Bisher habe ich Kludges, wie zum Beispiel mit CC="clang -emit-llvm -use-gold-plugins" kompilieren und Verbindungslinien (mit llvm-ld oder llvm-link) manuell ausgeführt. Dies funktioniert für einfache Pakete wie grep.

Ich möchte eine Methode, die robust ist und mit den meisten, wenn nicht allen, Skripts zu konfigurieren, einschließlich wenn es Zwischen-.a Dateien oder Zwischenziele sind.

+0

llvm-ld scheint zu implizieren, dass es .a-Dateien akzeptiert http://llvm.org/releases/2.7/docs/CommandGuide/html/llvm-ld.html –

+0

llvm-ld existiert in späteren LLVM-Versionen nicht mehr. –

+0

Haben Sie sich für den Link 'lindern' entschieden? http://lld.llvm.org/ –

Antwort

2

Es gibt einige Methoden wie this. Bei einfachen Builds, bei denen keine statischen Bibliotheken verwendet werden, können Sie etwas einfacheres tun. Die Liste der Dinge, die Sie benötigen, sind

  1. llvm, mit Gold-Plugin-Unterstützung konfiguriert. Siehe this
  2. Klirren
  3. dragonegg, wenn Sie Front-End für Fortran benötigen, gehen usw.

Der Schlüssel ist, zu ermöglichen '-flto' entweder für Klirren oder dragonegg (Front-End) , sowohl zur Kompilierungszeit als auch zur Verbindungszeit. Es ist einfach für Klirren:

CC = clang 
CLINKER = clang 
CFLAGS = -flto -c 
CLINKFLAGS = -flto -Wl,-plugin-opt=also-emit-llvm 

Bei Bedarf zusätzliche '-plugin-opt' Option hinzufügen angeben llvm spezifische codegen Option:

-Wl,-plugin-opt=also-emit-llvm,-plugin-opt=-disable-fp-elim 

Die abgeladen ganzes Problem Bytecode würde sitzt zusammen mit Ihre endgültige ausführbare Datei.

Bei der Verwendung von dragonegg werden zwei zusätzliche Dinge benötigt.

Erstens, die dragonegg keine Kenntnis von der Lage der llvm Gold-Plugin ist, muss es wie diese -Wl,-plugin=/path/to/LLVMgold.so,-plugin-opt=...

An zweiter Stelle in dem Linker-Flags angegeben wird, ist dragonegg nur in der Lage IR-Dump statt Bytecode. Sie benötigen zu diesem Zweck ein Wrapper-Skript. Ich habe eine here erstellt. Funktioniert gut für mich.

Verwandte Themen