2014-09-10 10 views
9

Ich habe einen ModulPass, der mit dem opt-Tool arbeitet, aber ich habe Probleme herauszufinden, wie man es für das Klingeln in der Befehlszeile verfügbar macht. Mein aktueller Workflow meines Passes für die Verwendung ist:Stellen Sie einen LLVM ModulePass in der Befehlszeile zur Verfügung

  1. Klirren -c -emit-llvm [c-Quellcode-Dateien]
  2. llvm-link [llvm Bitcode Dateien]
  3. opt -load [PassName]. so - [Pass name] [verknüpft llvm Datei]
  4. llc [resultierende Bitcode Datei]
  5. gcc [resultierende Assembler-Datei] -o [target]

ich möchte meinen Pass erhalten integriert der Befehl klingeln Zeile, so dass es als Teil der Erstellung von bestehender Software (z. B. C++ Standard-Bibliothek), ohne das ganze Build-System für jede Sache neu kompilieren zu müssen. Ich habe Hinweise dazu gesehen, aber ich war nicht in der Lage, die Teile zu einem funktionierenden Setup zusammenzufügen.

Run an LLVM Pass Automatically with Clang beschreibt genau, was ich will, aber die Methode scheint veraltet in LLVM 3.4 (PassManagerBuilder wurde in den Legacy-Namespace verschoben).

LLVM - Run Own Pass automatically with clang scheint das grundlegende Problem zu adressieren, aber ich hatte gehofft, ich könnte dies tun, ohne clang ändern zu müssen (was zu sein scheint, was dort vorgeschlagen wird).

Was ist der beste Weg, um einen neuen Pass mit LLVM 3.4 vom Clang aus verfügbar zu machen?

Antwort

7

Clang verwendet immer noch PassManagerBuilder ab 3.5 (siehe die PassManagerBuilderWrapper Klasse in BackendUtil.cpp). Daher glaube ich, dass die Erweiterung um RegisterStandardPasses, wie in meinem Blogbeitrag, immer noch die einzige Möglichkeit ist, einen Pass zu Clangs Passmanager hinzuzufügen.

Es ist frustrierend schwierig, Informationen über wie veraltete die "alte" Pass-Manager-Infrastruktur ist. Aber da Clang es immer noch benutzt, kann es nicht sein, dass veraltet ist. :)

+0

Danke für die Antwort, ich werde dann mit dem PassManagerBuilder Setup fortfahren. – Erik

+0

Es funktioniert auf llvm-3.7. Ein Hinweis für die Registrierung von ModulePass: Ändere '' EP_EarlyAsPossible'' in '' EP_ModuleOptimizerEarly'' ansonsten könnte llvm es als FunctionPass behandeln und versuchen '' runOnFunction'' aufzurufen. – xywang