2013-07-03 7 views
10

Ho un progetto C++ che utilizza una libreria C++ che ho anche scritto. Sto usando clang ++ 3.3 per costruire tutto. Ogni file nella libreria viene compilata comeCreazione e utilizzo di librerie di codici a barre LLVM

clang++ -c -O -emit-llvm somefile.cpp -o somefile.bc 

Sto quindi utilizzando LLVM-link per unire tutta la biblioteca * .BC file in un unico file di codice po 'come in modo

llvm-link -o MyLibrary.bc somefile.bc someotherfile.bc etc.bc 

Sono Concettualizzare questo per essere simile alla creazione di un archivio di file oggetto, ma non penso che sia vero in base a come le cose stanno agendo.

Quindi compilo i file sorgente del mio progetto usando un comando simile a quello sopra. Ho quindi utilizzare LLVM-link (di nuovo) per combinare questi, insieme con il file di codice po libreria in un file di codice singolo bit come questo

llvm-link -o app.bc1 main.bc x.bc y.bc path/to/MyLibrary.bc 

Successivo compilo app.bc1 in un file oggetto nativo

llc -filetype=obj app.bc1 -o app.o 

Infine io uso clang ++ di nuovo per collegare questo file oggetto nativo (e contro le altre librerie native di cui ho bisogno, come ad esempio la libreria standard C++, ecc)

clang++ app.o -o app 

Tuttavia, quello che sembra essere HAP il pening è che quando Ivm-link il codice bit dell'applicazione l'intero contenuto di MyLibrary.bc sembra essere incluso nel risultato. Quindi il collegamento finale deve risolvere i riferimenti fatti dai componenti della libreria che non sto effettivamente utilizzando.

Quello che mi piacerebbe fare è estrarre da MyLibrary.bc solo i file di codice bit di cui la mia applicazione ha bisogno. Vedo che c'è un programma di llvm-ar ma leggendo su di esso non ho l'impressione che sarebbe di aiuto qui. Ho immaginato di poter combinare la libreria con llvm-ar invece di llvm-link, ma non riesco a capirlo. Spero che tutto ciò di cui ho bisogno sia una piccola spinta :)

+0

Il passaggio del collegamento non include alcuna indicazione di ottimizzazione o di rimozione definitiva da eseguire. Hai provato ad aggiungere una bandiera per farlo? –

+0

Vuoi dire una bandiera su llvm-link? La documentazione qui http://llvm.org/docs/CommandGuide/llvm-link.html non parla di nessuna di tali flag. Ho provato a usare opt con i flag -dce e -adce ma non c'era alcun effetto (sul mio problema). –

+0

No, sul link finale. Mettere a nudo una biblioteca non ha davvero senso. –

risposta

4

MODIFICA: In realtà è proprio così che funziona.

Bit ritardo ma ancora potrebbero essere rilevanti per qualcuno, usiamo ar e ld.gold con LLVM plugin per collegare codice binario che:

ar r --plugin /usr/lib64/llvm/LLVMgold.so library.a <files...> 
ld.gold --plugin /usr/lib64/llvm/LLVMgold.so -plugin-opt emit-llvm main.bc library.a 

Naturalmente il percorso LLVMgold.so potrebbe essere diverso. In questo modo .bc ha appena avuto bisogno dei simboli.

+0

Vladimir, un plug-in di questo tipo potrebbe essere utilizzato in un processo come AOP per lo strumento del bytecode? –

+0

Si potrebbe fare la strumentazione di bitcode usando opt di LLVM, credo che abbia anche il supporto per i plug-in (passa in modo personalizzato il bitcode LLVM in questo caso). –