您好,登錄后才能下訂單哦!
LLVM 下載地址 http://releases.llvm.org/download.html,
目前最新版是 6.0.0,下載完成之后,執(zhí)行 tar 解壓 llvm 包:
tar -xzvf llvm-6.0.0.src.tar.xz
再下載 Clang 解壓:
tar -xzvf cfe-6.0.0.src.tar.xz
將 cfe-6.0.0.src 目錄復制到 llvm-6.0.0.src/tools,重命名為 clang。通過 brew 安裝 cmake:
brew install cmake
然后在命令行下切換到 llvm-6.0.0.src 目錄,新建 build 目錄,切換到 build 目錄執(zhí)行 cmake 生成配置文件,命令如下:
mkdir build
cd build
cmake -G Xcode CMAKE_BUILD_TYPE="Debug" ..
執(zhí)行完成之后,可以看到 Xcode 的工程文件 LLVM.xcodeproj,打開工程文件,會提示是否自動創(chuàng)建 Schemes,如圖所示:
點擊 Manually Manage Schemes 手動創(chuàng)建,添加 ALL_BUILD,如圖所示:
然后在 Xcode 上進行編譯,編譯過程比如慢,可能得二十分鐘到半小時左右,全部編譯完文件會在 11G 左右。
我們編寫第一個 Pass 的功能很簡單,只是輸出程序中的每個方法名,操作步驟如下:
(1) 在 lib/Transforms 目錄下新建一個文件夾,文件夾名稱為 TestPass,在 TestPass 目錄下創(chuàng)建文件 TestPass.cpp,代碼如下:
//導入頭文件
#include "llvm/ADT/Statistic.h"
#include "llvm/IR/Function.h"
#include "llvm/Pass.h"
#include "llvm/Support/raw_ostream.h"
using namespace llvm; //指定所使用的 LLVM 命名空間
namespace {
//定義 First 類繼承自 FunctionPass
struct First : public FunctionPass {
static char ID; // Pass ID
First() : FunctionPass(ID) {}
//定義 runOnFunction 重載繼承父類的抽象虛函數(shù)
bool runOnFunction(Function &F) override {
//打印每個函數(shù)的名字
errs() << "First: ";
errs().write_escaped(F.getName()) << '\n';
return false;
}
};
}
char First::ID = 0; //初始化 Pass ID
//最后注冊 FirstPass, 指定命令行參數(shù)為 First
static RegisterPass<First> X("First", "First Pass");
(2) 然后再在 lib/Transforms/TestPass 下新建 CMakeList.txt,編輯內(nèi)容如下:
add_llvm_loadable_module( LLVMFirstPass
FirstPass.cpp
DEPENDS
intrinsics_gen
PLUGIN_TOOL
opt
)
(3) 在 lib/Transforms/CMakeLists.txt 添加 add_subdirectory(TestPass)
(4) 重新編譯整個工程,添加 LLVMFirstPass 到 Scheme,如圖:
編譯 LLVMFirstPass 成功之后,動態(tài)庫保存在 build/Debug/lib/LLVMFirstPass.dylib。
(1) 編寫一段測試代碼:
#include <stdio.h>
int test() {
printf("test\n");
return 0;
}
int main(){
int num = 1;
printf("main %d\n", num);
test();
return 0;
}
編譯源文件,生成 Bitcode:
clang -emit-llvm -c test.c -o test.bc
(2) 在 Xcode 中將 opt 添加到 scheme,編輯 scheme 的啟動參數(shù),-load 參數(shù)指向 LLVMFirstPass.dylib,-First 參數(shù)就是剛才在源代碼里注冊的參數(shù),如圖所示:
編譯 opt 并運行起來,可以看到輸出了程序的每個函數(shù)名稱,并且前面還打印了 First 字符串,效果如下:
First: test
First: main
Program ended with exit code: 0
opt 編譯成功保存在 build/Debug/bin/opt。也可以給 pass 的代碼下斷點,在 Xcode 上運行 opt 就可以調(diào)試 pass,效果如圖:
原文地址:https://www.exchen.net/開發(fā)和調(diào)試第一個-llvm-pass.html
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。