2014-09-10 13 views
9

Possiedo un ModulePass che funziona con lo strumento opt, ma non riesco a capire come renderlo disponibile per clangare sulla riga di comando. Il mio attuale flusso di lavoro per utilizzare il mio pass è:Creare un ModulePass LLVM sulla riga di comando clang

  1. Clang [file di codice c-source] -c -emit-LLVM
  2. [file] LLVM codice binario che LLVM-link
  3. opt-load [PassName]. così - [nome pass-] [file LLVM collegato]
  4. LLC [file risultante codice binario che]
  5. gcc [file di assembler risultante] -o [destinazione]

Vorrei ottenere il mio pass integrato con il comando clang linea in modo che possa essere invocato come parte della build del software esistente (ad es. libreria standard C++) senza dover rifare l'intero sistema di compilazione per ogni cosa che compilo. Ho visto suggerimenti su come farlo, ma non sono riuscito a mettere insieme i pezzi in una configurazione funzionante.

Run an LLVM Pass Automatically with Clang descrive esattamente quello che voglio, ma il metodo sembra essere deprecato in LLVM 3.4 (PassManagerBuilder è stato spostato nello spazio dei nomi legacy).

LLVM - Run Own Pass automatically with clang sembra affrontare il problema di base, ma speravo di poterlo fare senza dover modificare clang (che sembra essere quello che viene suggerito lì).

Qual è il modo migliore per rendere disponibile un nuovo passaggio da clang utilizzando LLVM 3.4?

risposta

7

Clang utilizza ancora PassManagerBuilder su 3.5 (vedere la classe PassManagerBuilderWrapper in BackendUtil.cpp). Quindi credo che estenderlo con RegisterStandardPasses, come nel mio post sul blog, sia ancora l'unico modo per aggiungere un pass al gestore di pass di Clang.

E 'frustrante difficile trovare tutte le informazioni su come deprecato il "vecchio" infrastruttura passaggio manager è. Ma poiché Clang lo sta ancora utilizzando, non può essere che deprecato. :)

+0

Grazie per la risposta, continuerò con l'installazione PassManagerBuilder quindi. – Erik

+0

Funziona su llvm-3.7. Una nota per la registrazione di ModulePass: cambia '' EP_EarlyAsPossible'' in '' EP_ModuleOptimizerEarly'' altrimenti Lvm potrebbe trattarlo come un FunctionPass e provare a richiamare '' runOnFunction''. – xywang