Saya ingin dentang untuk mengkompilasi C/C++
kode saya untuk LLVM
bytecode daripada biner dieksekusi. Bagaimana saya bisa mencapainya? Dan jika saya mendapatkan LLVM
bytecode, bagaimana saya bisa membawanya ke kompilasi lebih lanjut ke biner yang dapat dieksekusi.
Pada dasarnya saya ingin menambahkan beberapa kode saya sendiri ke LLVM
bytecode sebelum dikompilasi ke binary executable.
Jawaban:
Diberikan beberapa file C / C ++
foo.c
:Menghasilkan
foo.ll
file IR LLVM.The
-emit-llvm
pilihan juga dapat dikirimkan ke compiler front-end langsung, dan tidak pengemudi dengan cara-cc1
:Diproduksi
foo.ll
dengan IR.-cc1
menambahkan beberapa opsi keren seperti-ast-print
. Lihat-cc1 --help
detail lebih lanjut.Untuk mengkompilasi LLVM IR lebih lanjut ke perakitan, gunakan
llc
alat ini:Diproduksi
foo.s
dengan perakitan (default ke arsitektur mesin tempat Anda menjalankannya).llc
adalah salah satu alat LLVM - di sini adalah dokumentasinya .sumber
Menggunakan
sumber
.o
harus merujuk ke file objek biner,.s
ke file rakitan, dan sesuatu yang lain (berdasarkan konvensi.ll
) ke file IR LLVM. Kalau tidak mudah bingung. Dentang / LLVM sekarang tidak memiliki tautan sendiri untuk objek biner (meskipun satu masih dalam pengerjaan). Linker LLVMllvm-ld
hanya menggabungkan beberapa file IR menjadi satu.bc
digunakan; juga, ingatlah bahwallvm-ld
dapat bertindak sebagai antarmuka untuk toolchain sistem, yaitu jawaban saya sebelumnya menggunakanllvm-ld -native
harus bekerja seperti yang diharapkan ....foo.bc
adalah file bitcode LLVMclang -emit-llvm -o test.bc -c test.c && file test.bc: test.bc: LLVM IR bitcode
.Jika Anda memiliki banyak file sumber, Anda mungkin sebenarnya ingin menggunakan optimasi waktu-tautan untuk menghasilkan satu file bitcode untuk seluruh program. Jawaban lain yang diberikan akan menyebabkan Anda berakhir dengan file bitcode untuk setiap file sumber.
Sebagai gantinya, Anda ingin mengompilasi dengan optimasi tautan-waktu
dan untuk langkah penghubung terakhir, tambahkan argumen -Wl, -plugin-opt = also-emit-llvm
Ini akan memberikan Anda berdua program dikompilasi dan bitcode sesuai dengan itu (program.bc). Anda kemudian dapat memodifikasi program.bc dengan cara apa pun yang Anda suka, dan mengkompilasi ulang program yang dimodifikasi kapan saja dengan melakukan
meskipun perlu diketahui bahwa Anda perlu menyertakan flag linker yang diperlukan (untuk perpustakaan eksternal, dll) pada langkah ini lagi.
Perhatikan bahwa Anda harus menggunakan penghubung emas agar ini berfungsi. Jika Anda ingin memaksa dentang menggunakan tautan tertentu, buat symlink ke tautan yang bernama "ld" di direktori khusus yang disebut "fakebin" di suatu tempat di komputer Anda, dan tambahkan opsi
untuk setiap langkah yang menghubungkan di atas.
sumber
Jika Anda memiliki banyak file dan Anda tidak ingin harus mengetik setiap file, saya sarankan Anda mengikuti langkah-langkah sederhana ini (saya menggunakan
clang-3.8
tetapi Anda dapat menggunakan versi lain):buat semua
.ll
filemenghubungkannya menjadi satu
(Opsional) Optimalkan kode Anda (mungkin beberapa analisis alias)
Hasilkan perakitan (menghasilkan
optimised.s
file)Buat yang dapat dieksekusi (bernama
a.out
)sumber
-S
opsi (pada langkah 2), saya menentukan bahwa saya ingin menghasilkan output dalam LLVM IR. Pada dasarnya, letakkan semua file * .ll menjadi satu. Saya melakukan ini untuk memeriksa apakah optimisasi benar-benar mengubah kode, yaitusingle.ll
danoptimised.ll
sekarang harus terlihat berbeda (berdasarkan kode) dan Anda juga dapat menunjukkan laporan untuk melihat apakah ada perbedaan sama sekali.-basicaaa
adalah bendera yang salah,-basicaa
harus digunakan sebagai gantinya.Apakah Anda membaca
clang
dokumentasi ? Anda mungkin sedang mencari-emit-llvm
.sumber