LLVM 初学笔记

一. 安装 (后补)

二.使用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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值