2013-07-03 20 views
10

Mam projekt C++, który używa biblioteki C++, którą również napisałem. Używam clang ++ 3.3 do budowania wszystkiego. Każdy plik w bibliotece jest kompilowany jakoTworzenie i używanie bibliotek Bitcode LLVM

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

jestem następnie za pomocą LLVM-link, aby połączyć wszystkie biblioteki * .BC plików w jednym pliku kodu trochę jak tak

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

jestem konceptualizacja tego jest podobna do tworzenia archiwum plików obiektowych, ale nie sądzę, że jest to prawda w oparciu o to, jak działają.

Następnie kompiluję pliki źródłowe mojego projektu, używając polecenia podobnego do powyższego. Następnie używać LLVM-link (znowu), aby połączyć je, wraz z plikiem bitowy kod biblioteki do pojedynczego pliku z kodem nieco podobny do tego

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

Następny skompilować app.bc1 do natywnego pliku obiektu

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

końcu używam dzyń ++ ponownie połączyć ten natywny plik obiektowy (i wobec innych natywnych bibliotek muszę, takich jak C++ standardowej biblioteki, etc)

clang++ app.o -o app 

jednak to, co wydaje się być hap Pening polega na tym, że kiedy llvm-link kodu bitowego aplikacji, cała zawartość MyLibrary.bc wydaje się być zawarta w wyniku. W związku z tym ostateczne powiązanie musi rozwiązać odniesienia wykonane przez składniki biblioteki, których faktycznie nie używam.

Co chcę zrobić, to wyodrębnić z MyLibrary.bc tylko pliki kodów bitowych, które moja aplikacja potrzebuje. Widzę, że istnieje program llvm-ar, ale czytając o tym nie mam wrażenia, że ​​pomogłoby to tutaj. Podejrzewałem, że mogę łączyć bibliotekę z llvm-ar zamiast llvm-link, ale nie mogę tego zrozumieć. Mam nadzieję, że wszystko, czego potrzebuję, to trochę wepchnąć :)

+0

Twój krok łączenia nie zawiera żadnych informacji o optymalizacji ani martwym usuwaniu, które należy wykonać. Czy próbowałeś dodać flagę, żeby to zrobić? –

+0

Masz na myśli flagę na linku llvm? Dokumentacja tutaj http://llvm.org/docs/CommandGuide/llvm-link.html nie mówi o żadnej takiej flagie. Próbowałem użyć opcji opt z flagami -dce i -adce, ale nie było efektu (w moim wydaniu). –

+0

Nie, na ostatnim łączu. Martwe zdejmowanie biblioteki nie ma większego sensu. –

Odpowiedz

4

EDYCJA: W rzeczywistości jest to, co sprawia, że ​​działa.

trochę późno, ale nadal może być istotne dla kogoś, używamy ar i ld.gold z wtyczką LLVM połączyć bitcode:

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 

Oczywiście droga do LLVMgold.so może być inna. W ten sposób .bc właśnie potrzebuje symboli.

+0

Vladimir, czy obciążenie wtyczki tego rodzaju może być wykorzystane w procesie takim jak AOP do instrumentowania kodu bajtowego? –

+0

Można zrobić oprzyrządowanie bitcode przy użyciu opcji LLVM, uważam, że ma również obsługę wtyczek (w tym przypadku niestandardowe przejścia nad kodem LLVM). –

Powiązane problemy