2013-07-03 13 views
10

Yazdığım bir C++ kitaplığı kullanan bir C++ projem var. Ben her şeyi inşa etmek için clang ++ 3.3 kullanıyorum. kütüphanede Her dosya Sonra ben bu yüzdenLLVM bit kodu kitaplıkları oluşturma ve kullanma

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

gibi tek bitlik kod dosyası içine tüm kütüphane * .bc dosyaları birleştirmek için LLVM-bağlantısını kullanıyorum

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

olarak derlenmektedir Bu, nesne dosyalarının bir arşivini oluşturmaya benzer bir şekilde kavramsallaştırıyor, ancak bunun nasıl hareket ettiğine bağlı olduğunu sanmıyorum.

Daha sonra, projemin kaynak dosyalarını, yukarıdaki ile aynı komutu kullanarak derledim. Sonra ben bir yerli nesne dosyası

llc -filetype=obj app.bc1 -o app.o 
içine app.bc1 derlemek bu

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

Sonraki gibi tek bitlik kod dosyası içine kütüphane bit kod dosyası ile birlikte, bu birleştirmek için (tekrar) LLVM-linki kullanınız

Son olarak kullandığım çınlama Bu yerel nesne dosyasını bağlamak için tekrar ++ (ve örneğin, C++ standardı kütüphane, vb ihtiyacım diğer yerli kütüphaneler, karşı) Ancak

clang++ app.o -o app 

ne hap gibi görünen pening, uygulamanın bit kodunu bağladığımda, MyLibrary.bc'nin tüm içeriğinin sonuca dahil edilmiş gibi görünmesidir. Böylece son bağlantı aslında kullanmayan kütüphane bileşenleri tarafından yapılan referansları çözmek gerekiyor.

Ne yapmak istediğim, MyLibrary.bc uygulamasından yalnızca uygulamanın gerektirdiği bit kod dosyalarını ayıklamaktır. Görüyorum ki bir llvm-ar programı var ama bu konuyla ilgili olarak, burada yardımcı olacağı izlenimini almıyorum. Kütüphaneyi llvm-ar yerine llvm-ar ile birleştirebileceğimi tahmin ettim ama anlayamıyorum. Tek ihtiyacım olan şey biraz ümit etmektir umuyoruz.

+0

Bağlantı adımınız, gerçekleştirilmesi gereken herhangi bir optimizasyon veya ölü çıkarma belirtisi içermez. Bunu yapmak için bir bayrak ekledin mi? –

+0

llvm-link üzerinde bir bayrak mı demek istiyorsun? Buradaki belgeler http://llvm.org/docs/CommandGuide/llvm-link.html herhangi bir bayrak hakkında konuşmuyor. -dce ve -adce bayraklarını tercih etmeyi denedim ama hiçbir sorun yoktu (benim sorunumda). –

+0

Hayır, son bağlantıda. Ölü bir kütüphaneyi sıyırmak gerçekten bir anlam ifade etmiyor. –

cevap

4

DÜZENLEME: Aslında çalışmasını sağlayan şey budur. Birine alakalı olabilir hala

biraz geç kaldın ama biz bitcode bağlamak için LLVM eklenti ile ar ve ld.gold kullanın:

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 

Tabii LLVMgold.so yolu farklı olabilir. Bu sayede .bc'nin sembollere ihtiyacı vardı.

+0

Vladimir, bu doğanın eklenti yükünü bayt kodu çalmak için AOP gibi bir işlemde kullanılabilir mi? –

+0

LLVM'in tercihini kullanarak bit kodu enstrümantasyonu yapabilirsiniz, ayrıca eklentiler için de destek (inanıyorum ki bu durumda LLVM bit kodu üzerinden özel geçişler). –