Analisis #LLVM dan Transform Pass
Proyek ini menggunakan Clang dan LLVM untuk menganalisis dan mengubah kode sumber C ++.
Dentang adalah ujung depan ke LLVM, mengkompilasi C ++ menjadi IR. Representasi perantara jauh lebih sederhana daripada C ++, membuatnya lebih mudah untuk dianalisis dan diubah.
LLVM memiliki berbagai perpustakaan yang dapat digunakan untuk menganalisis dan mengubah IR. Instruksi untuk analisis atau transformasi disebut umpan.
Demo video pass
Done See BelowDone See BelowLLVM dan dentang diperlukan untuk menyusun dan menerapkan pass. Cmake diperlukan untuk membangun LLVM dan dentingan.
Dentang digunakan untuk mengkompilasi C ++ ke Bytecode LLVM digunakan untuk mengimpmori pass analisis yang dilakukan oleh StaticCount Pass melalui setiap instruksi dalam byetecode dan mencetak jenis apa itu. Ini juga menggunakan LLVM untuk melacak statistik certian yang dicetak di akhir analisis.
Sebelum mengikuti panduan ini, Anda harus mengunduh dan membangun LLVM.
Proyek dan panduan ini dibuat menggunakan macOS.
Untuk menerapkan pass ke beberapa kode C, ada sejumlah langkah yang harus ditempel, mereka adalah sebagai berikut.
<LLVM_Source_Directory>/lib/Transforms .StaticCount dari repositori yang dikloning ke direktori yang tercantum di atas.Transforms harus ada sejumlah direktori dan hanya satu file CMakeLists.txt .CMakeLists.txt dan tambahkan garis add_subdirectory(StaticCount) .<LLVM_Build_Directory> Anda dan jalankan cmake --build . Ini akan membangun semua LLVM termasuk pass yang baru saja kami tambahkan.HeapTimeTestProgram di dalam repositori yang dikloning.clang -O0 -emit-llvm -c main.cpp -o bctest.bc Ini menggunakan clang untuk mengkompilasi file c ++ kami ke bytecode yang dapat bekerja dengan llvm.opt -load <LLVM_Build_Directory>/lib/llvmstaticcount.dylib -StaticCount -stats< bctest.bc > /dev/null Statmen yang dicetak adalah hasil dari analisis statis menggunakan llvm.
Catatan - Ini bukan output lengkap dari pass. Itu direduksi sehingga perintah di atas terlihat.
Masalah? Tolong hubungi saya.
Clang digunakan untuk mengkompilasi C ++ ke Bytecode LLVM digunakan untuk mengimpmori pass analisis, DynCount Pass melewati setiap blok dasar dalam byetecode dan menambahkan panggilan ke pustaka runtime. Fungsi di perpustakaan hanyalah statmen output untuk tonggak sejarah ini.
Pertama, pass dikompilasi seperti yang pertama, selanjutnya kami menyusun program pengujian menjadi bytecode. Setelah itu pustaka runtime dikompilasi ke dalam bytecode. Dua file bytecode ini kemudian ditautkan ke dalam satu file bytecode menggunakan LLVM. Setelah ini, pass diterapkan, tidak seperti pada pass pertama tidak akan ada output pada saat itu. Karena ini adalah pass dinamis, kami akan mendapatkan hasilnya saat runtime. Akhirnya kami menjalankan program dan mendapatkan hasil kami, akan ada statmen output di setiap okorensi beberapa jenis blok dasar yang berbeda.
Sebelum mengikuti panduan ini, Anda harus mengunduh dan membangun LLVM.
Proyek dan panduan ini dibuat menggunakan macOS.
Untuk menerapkan Kode C ke C ada sejumlah langkah yang harus ditempel, mereka adalah sebagai berikut.
<LLVM_Source_Directory>/lib/Transforms .DynCount dari repositori yang dikloning ke direktori yang tercantum di atas.Transforms harus ada sejumlah direktori dan hanya satu file CMakeLists.txt .CMakeLists.txt dan tambahkan garis add_subdirectory(DynCount) .<LLVM_Build_Directory> Anda dan jalankan cmake --build . Ini akan membangun semua LLVM termasuk pass yang baru saja kami tambahkan.SmallTestProgram di dalam repositori yang dikloning.clang -O0 -emit-llvm -c smallProgram.c -o sp.bc Ini menggunakan clang untuk mengkompilasi file C kami ke bytecode yang dapat bekerja dengan LLVM.clang -O0 -emit-llvm -c print -o p.bc Ini menggunakan clang untuk mengkompilasi pustaka runtime kami ke bytecode yang dapat dihubungkan dengan program yang kami kumpulkan di atas.llvm-link p.bc sp.bc -S -o smallprogramandprint.bc tautan program kami yang akan dianalisis dan perpustakaan runtime kami.opt -load <LLVM_Build_Directory>/lib/llvmDynCount.dylib -DynCount <smallprogramandprint.bc> instrumentedprogram.bc Ini menerapkan pass ke program, memodifikasi bytecode dengan panggilan ke pustaka runtime yang kami hubungkan ke dalamnya.lli instrumentedprogram.bc Ini menjalankan program instrumen sehingga kita dapat melihat hasil dari pass. 
Catatan - Ini bukan output lengkap dari pass. Itu direduksi sehingga perintah di atas terlihat.
Masalah? Tolong hubungi saya.