我的LLVM學習筆記 編寫LLVM demo

2021-09-27 08:45:14 字數 2345 閱讀 6700

一、安裝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的入門教程。...