一、安裝llvm
二、使用clion建立demo工程
main.cpp**如下:
#include "llvm/ir/verifier.h"
#include "llvm/executionengine/genericvalue.h"
#include "llvm/executionengine/interpreter.h"
#include "llvm/ir/constants.h"
#include "llvm/ir/derivedtypes.h"
#include "llvm/ir/instructions.h"
#include "llvm/ir/llvmcontext.h"
#include "llvm/ir/module.h"
#include "llvm/ir/irbuilder.h"
#include "llvm/support/managedstatic.h"
#include "llvm/support/targetselect.h"
#include "llvm/support/raw_ostream.h"
//#include "llvm/bitcode/readerwriter.h"
#include "llvm/support/filesystem.h"
#include "llvm/ir/valuesymboltable.h"
using namespace llvm;
void register_printf(llvm::module *module)
int main()
// 輸出llvm位元組碼
outs() << "llvm module:\n\n" << *m;
outs() << "\n\n";
outs().flush();
// 輸出二進位制bitcode到.bc檔案
std::error_code errinfo;
raw_ostream *out = new raw_fd_ostream("a.bc", errinfo, sys::fs::f_none);
// writebitcodetofile(m, *out);
out->flush(); delete out;
// 關閉llvm釋放記憶體
llvm_shutdown();
return 0;
}
cmakelists.txt**如下:
cmake_minimum_required(version 3.14)
project(testllvm)
set(cmake_cxx_standard 11)
## 定義需要的庫
set(llvm_link_components
all)
# 使用llvm
find_package(llvm required config)
set(source_files main.cpp)
#set(cmake_cxx_flags "$ -fno-rtti")
# 新增標頭檔案路徑
message(status "include path: $")
include_directories($)
#add_definitions($)
#message(status "llvm_definitions: $")
add_executable(testllvm $)
# 尋找對應的庫
llvm_map_components_to_libnames(llvm_libs $)
# 將庫與目標**一起鏈結
target_link_libraries(testllvm $)
三、關鍵點記錄
1,set(cmake_cxx_standard 11)
通過在cmake檔案中新增該屬性,可以設定採用c++ 11進行編譯。另外還可以採用第二種方式,如下:
add_compile_options(-std=c++11)
add_compile_options是針對所有型別編譯器的,在編譯c**時可能會有問題,所以還可以採用第三種方式,如下
add_definitions($ -std=c++11)更多cmake命令可以參考:
2,llvm_map_components_to_libnames
它會將需要的庫與目標**進行連線,在上面的例子中,我們設定的屬性為all,所有庫都被鏈結。可以通過命令列執行llvm-config --components 命令來檢視所有的components,按照自己需要進行鏈結
LLVM學習筆記(53)
3.11.2.模式分析 globalisel 是以dag 指令選擇的 td定義處理與分析為基礎的。因此,globaliselemitter 包含了乙個 codegendagpatterns 型別的const 成員cgp 一旦建立完成,就是唯讀的 在 globaliselemitter 建構函式中將完...
編寫LLVM的後端 一)
本文件是指如何編寫乙個可以把llvm的中間表示轉換成乙個特定的機器或者其他語言的後端。對於乙個特定機器的 或者是組合語言或者是二進位制 llvm後端的是乙個和目標相關的 產生器,可以建立不同型別的目標處理器的輸出,如x86,powerpc,alpha,sparc。後端也可以用於產生針對cell處理器...
在LLVM中編寫pass的詳細教程(1)
可能你已經大概知道了llvm中pass是什麼,那麼你或許正躍躍欲試想在llvm中實際編寫乙個pass試試 即使你對pass的概念還很朦朧,實際practice一下或許也恰恰可以幫助你更加形象和具體的理解llvm中的pass。所以本文就是要向你介紹如何在llvm中實際編寫並使用乙個pass的入門教程。...