基於LLVM 分析Pass的製作

2021-08-21 03:11:11 字數 1711 閱讀 1027

分析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...