llvm编译c 语言,c – LLVM:即时编译的简单示例

所以,我已经挖掘了KaleidoscopeJIT并找回了最重要的部分.首先请注意我正在使用llvm-4.0.我没有意识到4.0和更低版本之间的不兼容性,我遇到了很多问题.

代码适用于C 11.我正在使用clang -4.0以及以下编译标志:

llvm-config-4.0 --cxxflags --ldflags --system-libs --libs core engine

现在整个代码:

#include

#include

#include

#include "llvm/IR/LLVMContext.h"

#include "llvm/IR/Module.h"

#include "llvm/IR/IRBuilder.h"

#include "llvm/IR/Verifier.h"

#include "llvm/ADT/iterator_range.h"

#include "llvm/ADT/STLExtras.h"

#include "llvm/ExecutionEngine/ExecutionEngine.h"

#include "llvm/ExecutionEngine/RTDyldMemoryManager.h"

#include "llvm/ExecutionEngine/RuntimeDyld.h"

#include "llvm/ExecutionEngine/SectionMemoryManager.h"

#include "llvm/ExecutionEngine/Orc/CompileUtils.h"

#include "llvm/ExecutionEngine/Orc/IRCompileLayer.h"

#include "llvm/ExecutionEngine/Orc/LambdaResolver.h"

#include "llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h"

#include "llvm/ExecutionEngine/JITSymbol.h"

#include "llvm/IR/DataLayout.h"

#include "llvm/IR/Mangler.h"

#include "llvm/Support/DynamicLibrary.h"

#include "llvm/Support/raw_ostream.h"

#include "llvm/Support/TargetSelect.h"

using namespace llvm;

typedef orc::ObjectLinkingLayer<> ObjLayerT;

typedef orc::IRCompileLayer CompileLayerT;

static LLVMContext Context;

static auto MyModule = make_unique("my compiler", Context);

Function *createFunc(IRBuilder<> &Builder, std::string Name) {

std::vector Integers(2, Builder.getInt32Ty());

auto *funcType = FunctionType::get(Builder.getInt32Ty(), Integers, false);

auto *fooFunc = Function::Create(funcType, Function::ExternalLinkage, Name, MyModule.get());

return fooFunc;

};

void updateBody(Function *fooFunc, IRBuilder<> &Builder) {

auto *entry = BasicBlock::Create(Context, "entry", fooFunc);

Builder.SetInsertPoint(entry);

auto args = fooFunc->arg_begin();

Value *arg1 = &(*args);

args = std::next(args);

Value *arg2 = &(*args);

auto *sum = Builder.CreateAdd(arg1, arg2, "tmp");

Builder.CreateRet(sum);

};

int main(int argc, char* argv[]) {

// Prepare the module

static IRBuilder<> Builder(Context);

auto *fooFunc = createFunc(Builder, "sum");

updateBody(fooFunc, Builder);

verifyFunction(*fooFunc);

// Initilaze native target

InitializeNativeTarget();

InitializeNativeTargetAsmPrinter();

InitializeNativeTargetAsmParser();

// Prepare jit layer

ObjLayerT ObjectLayer;

std::unique_ptr TM(EngineBuilder().selectTarget());

DataLayout DL(TM->createDataLayout());

CompileLayerT CompileLayer(ObjectLayer, orc::SimpleCompiler(*TM));

auto Resolver = orc::createLambdaResolver(

[&](const std::string &Name) {

if (auto Sym = CompileLayer.findSymbol(Name, false))

return Sym;

return JITSymbol(nullptr);

},

[](const std::string &S) { return nullptr; }

);

// Add MyModule to the jit layer

std::vector<:unique_ptr>> Modules;

Modules.push_back(std::move(MyModule));

CompileLayer.addModuleSet(

std::move(Modules),

make_unique(),

std::move(Resolver)

);

// Retrieve the foo symbol

std::string MangledName;

raw_string_ostream MangledNameStream(MangledName);

Mangler::getNameWithPrefix(MangledNameStream, "sum", DL);

auto Sym = CompileLayer.findSymbol(MangledNameStream.str(), true);

// Cast to function

auto func = (int(*)(int, int))Sym.getAddress();

// Try it

std::cout << func(5, 7) << std::endl;

return 0;

}

我不确定是否需要所有包含但无论如何它都像魅力一样.虽然我期待着对如何改进它的任何评论. 🙂

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值