一. 安装 (后补)
二.使用LLVM IR代码;
1. 写一个简单的C++函数
test.cpp
void MyPrint()
{
std::cout << "Fuck You! " << std::endl;
}
<2>转换为IR代码
Clang++ -c -emit-llvm –o test.bc test.cpp 编译为二进制文件
Llc –march=cpp –o test_llvm.cpp testbc 反转为IR
3. 使用C++调用IR
<1> 所需要的头文件
#include <llvm/Pass.h>
#include <llvm/PassManager.h>
#include <llvm/ADT/SmallVector.h>
#include <llvm/Analysis/Verifier.h>
#include <llvm/Assembly/PrintModulePass.h>
#include <llvm/IR/BasicBlock.h>
#include <llvm/IR/CallingConv.h>
#include <llvm/IR/Constants.h>
#include <llvm/IR/DerivedTypes.h>
#include <llvm/IR/Function.h>
#include <llvm/IR/GlobalVariable.h>
#include <llvm/IR/InlineAsm.h>
#include <llvm/IR/Instructions.h>
#include <llvm/IR/LLVMContext.h>
#include <llvm/IR/Module.h>
#include <llvm/Support/FormattedStream.h>
#include <llvm/Support/MathExtras.h>
#include <algorithm>
#include <llvm/ExecutionEngine/ExecutionEngine.h>
#include <llvm/Support/TargetSelect.h>
#include <llvm/ExecutionEngine/JIT.h>
#include "llvm/Support/ManagedStatic.h"
#include <llvm/Pass.h>
#include <llvm/PassManager.h>
#include <llvm/ADT/SmallVector.h>
#include <llvm/Analysis/Verifier.h>
#include <llvm/Assembly/PrintModulePass.h>
#include "llvm/Transforms/IPO.h"
#include <llvm/Transforms/IPO/PassManagerBuilder.h>
#include <iostream>
<2>所需要库文件 (可添加至.cproject文件中)
<listOptionValue builtIn="false" value="m"/>
<listOptionValue builtIn="false" value="pthread"/>
<listOptionValue builtIn="false" value="dl"/>
<listOptionValue builtIn="false" value="LLVMInstrumentation"/>
<listOptionValue builtIn="false" value="LLVMArchive"/>
<listOptionValue builtIn="false" value="LLVMLinker"/>
<listOptionValue builtIn="false" value="LLVMIRReader"/>
<listOptionValue builtIn="false" value="LLVMBitReader"/>
<listOptionValue builtIn="false" value="LLVMAsmParser"/>
<listOptionValue builtIn="false" value="LLVMDebugInfo"/>
<listOptionValue builtIn="false" value="LLVMOption"/>
<listOptionValue builtIn="false" value="LLVMipo"/>
<listOptionValue builtIn="false" value="LLVMVectorize"/>
<listOptionValue builtIn="false" value="LLVMBitWriter"/>
<listOptionValue builtIn="false" value="LLVMTableGen"/>
<listOptionValue builtIn="false" value="LLVMSystemZCodeGen"/>
<listOptionValue builtIn="false" value="LLVMSystemZAsmParser"/>
<listOptionValue builtIn="false" value="LLVMSystemZDesc"/>
<listOptionValue builtIn="false" value="LLVMSystemZInfo"/>
<listOptionValue builtIn="false" value="LLVMSystemZAsmPrinter"/>
<listOptionValue builtIn="false" value="LLVMHexagonCodeGen"/>
<listOptionValue builtIn="false" value="LLVMHexagonAsmPrinter"/>
<listOptionValue builtIn="false" value="LLVMHexagonDesc"/>
<listOptionValue builtIn="false" value="LLVMHexagonInfo"/>
<listOptionValue builtIn="false" value="LLVMNVPTXCodeGen"/>
<listOptionValue builtIn="false" value="LLVMNVPTXDesc"/>
<listOptionValue builtIn="false" value="LLVMNVPTXInfo"/>
<listOptionValue builtIn="false" value="LLVMNVPTXAsmPrinter"/>
<listOptionValue builtIn="false" value="LLVMMBlazeDisassembler"/>
<listOptionValue builtIn="false" value="LLVMMBlazeCodeGen"/>
<listOptionValue builtIn="false" value="LLVMMBlazeDesc"/>
<listOptionValue builtIn="false" value="LLVMMBlazeAsmPrinter"/>
<listOptionValue builtIn="false" value="LLVMMBlazeAsmParser"/>
<listOptionValue builtIn="false" value="LLVMMBlazeInfo"/>
<listOptionValue builtIn="false" value="LLVMCppBackendCodeGen"/>
<listOptionValue builtIn="false" value="LLVMCppBackendInfo"/>
<listOptionValue builtIn="false" value="LLVMMSP430CodeGen"/>
<listOptionValue builtIn="false" value="LLVMMSP430Desc"/>
<listOptionValue builtIn="false" value="LLVMMSP430Info"/>
<listOptionValue builtIn="false" value="LLVMMSP430AsmPrinter"/>
<listOptionValue builtIn="false" value="LLVMXCoreDisassembler"/>
<listOptionValue builtIn="false" value="LLVMXCoreCodeGen"/>
<listOptionValue builtIn="false" value="LLVMXCoreDesc"/>
<listOptionValue builtIn="false" value="LLVMXCoreInfo"/>
<listOptionValue builtIn="false" value="LLVMXCoreAsmPrinter"/>
<listOptionValue builtIn="false" value="LLVMMipsDisassembler"/>
<listOptionValue builtIn="false" value="LLVMMipsCodeGen"/>
<listOptionValue builtIn="false" value="LLVMMipsAsmParser"/>
<listOptionValue builtIn="false" value="LLVMMipsDesc"/>
<listOptionValue builtIn="false" value="LLVMMipsInfo"/>
<listOptionValue builtIn="false" value="LLVMMipsAsmPrinter"/>
<listOptionValue builtIn="false" value="LLVMARMDisassembler"/>
<listOptionValue builtIn="false" value="LLVMARMCodeGen"/>
<listOptionValue builtIn="false" value="LLVMARMAsmParser"/>
<listOptionValue builtIn="false" value="LLVMARMDesc"/>
<listOptionValue builtIn="false" value="LLVMARMInfo"/>
<listOptionValue builtIn="false" value="LLVMARMAsmPrinter"/>
<listOptionValue builtIn="false" value="LLVMAArch64Disassembler"/>
<listOptionValue builtIn="false" value="LLVMAArch64CodeGen"/>
<listOptionValue builtIn="false" value="LLVMAArch64AsmParser"/>
<listOptionValue builtIn="false" value="LLVMAArch64Desc"/>
<listOptionValue builtIn="false" value="LLVMAArch64Info"/>
<listOptionValue builtIn="false" value="LLVMAArch64AsmPrinter"/>
<listOptionValue builtIn="false" value="LLVMAArch64Utils"/>
<listOptionValue builtIn="false" value="LLVMPowerPCCodeGen"/>
<listOptionValue builtIn="false" value="LLVMPowerPCDesc"/>
<listOptionValue builtIn="false" value="LLVMPowerPCAsmPrinter"/>
<listOptionValue builtIn="false" value="LLVMPowerPCAsmParser"/>
<listOptionValue builtIn="false" value="LLVMPowerPCInfo"/>
<listOptionValue builtIn="false" value="LLVMSparcCodeGen"/>
<listOptionValue builtIn="false" value="LLVMSparcDesc"/>
<listOptionValue builtIn="false" value="LLVMSparcInfo"/>
<listOptionValue builtIn="false" value="LLVMX86Disassembler"/>
<listOptionValue builtIn="false" value="LLVMX86AsmParser"/>
<listOptionValue builtIn="false" value="LLVMX86CodeGen"/>
<listOptionValue builtIn="false" value="LLVMSelectionDAG"/>
<listOptionValue builtIn="false" value="LLVMAsmPrinter"/>
<listOptionValue builtIn="false" value="LLVMX86Desc"/>
<listOptionValue builtIn="false" value="LLVMX86Info"/>
<listOptionValue builtIn="false" value="LLVMX86AsmPrinter"/>
<listOptionValue builtIn="false" value="LLVMX86Utils"/>
<listOptionValue builtIn="false" value="LLVMMCDisassembler"/>
<listOptionValue builtIn="false" value="LLVMMCParser"/>
<listOptionValue builtIn="false" value="LLVMInterpreter"/>
<listOptionValue builtIn="false" value="LLVMMCJIT"/>
<listOptionValue builtIn="false" value="LLVMJIT"/>
<listOptionValue builtIn="false" value="LLVMCodeGen"/>
<listOptionValue builtIn="false" value="LLVMObjCARCOpts"/>
<listOptionValue builtIn="false" value="LLVMScalarOpts"/>
<listOptionValue builtIn="false" value="LLVMInstCombine"/>
<listOptionValue builtIn="false" value="LLVMTransformUtils"/>
<listOptionValue builtIn="false" value="LLVMipa"/>
<listOptionValue builtIn="false" value="LLVMAnalysis"/>
<listOptionValue builtIn="false" value="LLVMRuntimeDyld"/>
<listOptionValue builtIn="false" value="LLVMExecutionEngine"/>
<listOptionValue builtIn="false" value="LLVMTarget"/>
<listOptionValue builtIn="false" value="LLVMMC"/>
<listOptionValue builtIn="false" value="LLVMObject"/>
<listOptionValue builtIn="false" value="LLVMCore"/>
<listOptionValue builtIn="false" value="LLVMSupport"/>
<3>编译选项
-D __STDC_CONSTANT_MACROS –D __STDC_LIMIT_MACROS
eclipse 如下设置
<4>启动还需添加的代码(main)
llvm::llvm_start_multithreaded();
llvm::InitializeNativeTarget();
Module* Mod = makeLLVMModule();//该函数实现是IR代码
verifyModule(*Mod, PrintMessageAction);
PassManager PM;
PM.add(createPrintModulePass(&outs()));
PM.run(*Mod);
// 函数指针定义,此函数依据你原始的 c 函数规格定义
typedef int (*fnGetValue)(int a, int b);
std::string err;
EngineBuilder eb = EngineBuilder(Mod); // 根據給定的 Module 生成 ExecutionEngine
eb.setEngineKind(EngineKind::JIT);
eb.setErrorStr(&err);
ExecutionEngine* EE = eb.create();
Function* func = Mod->getFunction("_Z8getValueii"); // get LLVM function, get function name from the implementation makeLLVMModule()
void* jitAddr = EE->getPointerToFunction(func); // get complied JIT function code address
fnGetValue jitFunc = reinterpret_cast<fnGetValue>(jitAddr); // cast to our original signature
int ret = jitFunc(5,6); // call the function
printf("ret=[%d]\n", ret);
EE->freeMachineCodeForFunction(func); // free the JIT code space
delete EE;
llvm_shutdown();
return 0;
<5> g++编译命令:
g++ -O2 test_llvm_noif.cpp -D __STDC_LIMIT_MACROS -D __STDC_CONSTANT_MACROS `llvm-config --cxxflags --ldflags --libs` -o test_noif