一起學習LLVM(三)

2021-09-13 16:06:36 字數 1302 閱讀 4941

---關於函式和指令以及block和指令的操作;

---dynamic casts

---instanceof-of casts

---修改基本塊或者指令

llvm有五種執行時的value的型別操作,其中有三種是比較常用的:

1.isa(v):知道v這個值的動態型別,如果v是t的乙個引用則返回true,否則返回true.

比如:以下主要是判斷對應的指令是不是phinode型別:

count_phis() : functionpass(id) {}

virtual bool runonfunction(function &f)

}return false;

}};

2.cast(v):型別的檢查。

3.v'=dyn_cast(v):把v轉換為v',否則失敗。

把為phinode的指令轉換為pn型別:

virtual bool runonfunction(function &f) }}

return false;

}

1.增加/刪除指令;指令是basicblock中以list的形式存在,無法單獨存在,必須是某個basicblock中,通常我們通過寫pass進行優化和反優化大部分就是操作的指令。

2.增加/刪除基本塊;基本塊(basicblock)是function中以list的形式存放的,無法單獨存在,裡面有很多的指令存在,分為普通指令和terminatorinst指令。

3.增加刪除函式;函式是無數個基本塊組成,使用列表組成,有且僅有乙個entryblcok,是列表中得第乙個basicblock。

舉例:smallvectorworklist,收集到phinode結點的指令,再呼叫 pn->replacealluseswith(pn->getincomin**alue(0)); pn->erasefromparent()在迭代器外進行刪除,不能夠在迭代器內部進行刪除操作。

virtual bool runonfunction(function &f) 

} else }}

// eliminate the uses:

while (!worklist.empty())

return cutinstruction;

}

通過本節可以學習到runtime type inference(rtti)三種常見的基本型別操作,以及理解llvm中指令(instructions)、基本塊(basicblock)、以及函式(function)之間的關係和對於它們的基本操作。

參考:

開源一起學習

要想自己學習機器學習,3本 聖經 是一定要看的 花書,西瓜書,和統計學習方法 但不是剛入門就要看的,首先啊,我們必須學好學校教的c語言,對程式設計有乙個初步的了解,其次,我們都知道python的厲害,可以幹很多事,也很出名,這就出現了人人都知道py,但不是人人都懂py的現象。確實要想搞機器學習,你最...

一起學習extjs( )

可以說,extjs是系統類專案最好的ui 前端使用者介面 選擇,特別是自從extjs4.0出來後,不管是 美觀還是效能的提高,及其功能之強大,說它排第一,無可厚非。當然,最近也蠻流行easyui這個輕量級的,據說是國人開發的ui。其實,也是很不錯的。大家可以根據自己專案的情況來進行選擇。然後,我們自...

一起學C 三

第二章 核心c 第一節,第乙個c 程式。第乙個程式成功執行了,我們來看看 都是由什麼組成的,它們都做了些什麼。using system namespace wrox 1.第1行,using system using是關鍵字,想要使用這個功能,就必須使用using這個關鍵字。c 中有很多關鍵字,每乙個...