分析pass在實際不修改ir的情況下提供關於ir的更高階的資訊,而這些資訊可以被其他的分析pass使用來計算其結果,只要乙個分析的pass計算得出了結果,這個計算結果可以被不同的pass拿來多次使用,直到乙個pass改變了這個ir我們先編寫下我們需要去進行測試的**
int func(int a,int b)
}return
sum;
}
然後我們去利用clang -c -emit-llvm testcode.c -o testcode.bc,去將其轉換為.bc檔案,也就是位元組碼檔案
之後我們就開始進行編寫分析pass
#define debug_type "opcodecounter"
#include "llvm/pass.h"
#include "llvm/ir/function.h"
#include "llvm/support/raw_ostream.h"
#include
using
namespace llvm;
namespace
virtual
bool runonfunction (function &f)
else}}
std::map
::iterator i = opcodecounter.begin();
std::map
::iterator e = opcodecounter.end();
//遍歷輸出
while(i!=e)
llvm::outs()<<"\n";
opcodecounter.clear();
//函式沒有修改測試**當中的任何東西,所以返回false
return
false;}};
}//註冊pass
char countopcode::id = 0;
static registerpassx("opcodecounter","count number of opcode in a functions");
緊接著我們再通過下面的命令去生成.so動態庫
g++ opcodecount.cpp -fpic
-g-wall
-wextra
-std
=c++
11`llvm-config --cppflags `
-shared
-o opcodecount.so
最後通過下面的命令進行鏈結
opt -load opcodecount.so -opcodecounter
-disable
-output testcode.bc
結果如下所示
function func
add:
3alloca:
5br:
8icmp:
3load:
10ret:
1select:
1store:
8
在LLVM中編寫pass的詳細教程(1)
可能你已經大概知道了llvm中pass是什麼,那麼你或許正躍躍欲試想在llvm中實際編寫乙個pass試試 即使你對pass的概念還很朦朧,實際practice一下或許也恰恰可以幫助你更加形象和具體的理解llvm中的pass。所以本文就是要向你介紹如何在llvm中實際編寫並使用乙個pass的入門教程。...
製作基於軟盤的Linux系統
嵌入式linux由乙個幾百kb的kernel 核心 和一些根據需要進行定製的系統模組組成。由於linux是開放源 的作業系統,因此,其在嵌入式領域有其不可替代的成本和高度靈活性等優勢。將linux系統裁減到就像dos一樣只要一張軟盤就能啟動,是製作嵌入式linux的基礎。網路上有許多實現方法的介紹,...
製作基於軟盤的Linux系統
製作基於軟盤的linux系統 將linux系統裁減到就像dos一樣只要一張軟盤就能啟動,是製作嵌入式linux的基礎。網路上有許多實現方法的介紹,但是在實踐過程中都或多或少存在著一些問題或不方便之處。我們結合自己在這方面的實踐經驗,詳細介紹基於軟盤的linux系統製作過程。三個基本元素 乙個嵌入式l...