2014-09-10 14 views
9

Mam moduł ModulePass, który współpracuje z narzędziem opt, ale mam problem z ustaleniem, w jaki sposób udostępnić go do dzwonienia w wierszu poleceń. Mój obecny workflow za pomocą mojego Pass:Utwórz linię modułów LLVM w wierszu polecenia clang

  1. dzyń-LLVM -c -emit [Pliki kod C-source]
  2. llvm-link [pliki LLVM bitcode]
  3. opt -load [PassName]. tak - [nazwa pass-] [połączony plik llvm]
  4. LLC [plik wynikowy bitcode]
  5. gcc [plik wynikowy asembler] -o [cel]

Chciałbym, aby moje podanie zintegrowany z polecenie clang linię, aby można ją było wywołać w ramach kompilacji istniejącego oprogramowania (np. standardowa biblioteka C++) bez konieczności przerabiania całego systemu kompilacji dla każdej kompilowanej przeze mnie rzeczy. Widziałem wskazówki, jak to zrobić, ale nie udało mi się połączyć tych elementów w działającą konfigurację.

Run an LLVM Pass Automatically with Clang opisuje dokładnie to, co chcę, ale metoda wydaje się być przestarzała w LLVM 3.4 (PassManagerBuilder został przeniesiony do starszej przestrzeni nazw).

LLVM - Run Own Pass automatically with clang wydaje się zajmować podstawową kwestią, ale miałem nadzieję, że mogę to zrobić bez konieczności modyfikowania klang (co wydaje się być to, co zasugerowano tam).

Jaki jest najlepszy sposób na udostępnienie nowej przepustki za pomocą LLVM 3.4?

Odpowiedz

7

Klang nadal używa PassManagerBuilder od 3.5 (patrz klasa PassManagerBuilderWrapper w BackendUtil.cpp). Sądzę więc, że rozszerzenie go o RegisterStandardPasses, tak jak w moim poście na blogu, jest nadal jedynym sposobem na dodanie przepustki do menedżera przebiegu Clang.

Frustrująco trudno jest znaleźć jakiekolwiek informacje na temat , w jaki sposób przestał być "starą" infrastrukturą menedżera przepustek. Ale ponieważ Clang wciąż go używa, nie może być przestarzałe. :)

+0

Dzięki za odpowiedź, będę kontynuować konfigurację PassManagerBuilder. – Erik

+0

Działa na Llvm-3.7. Notatka do rejestracji ModulePass: zmień '' EP_EarlyAsPoif'' na '' EP_ModuleOptimizerEarly'' inaczej llvm może potraktować go jako FunctionPass i spróbować wywołać '' runOnFunction''. – xywang

Powiązane problemy