llvm-6 代码生成实例

本文通过一个实例,详细介绍了如何使用LLVM和MCJIT进行即时编译,包括如何在IR中声明和映射C++全局变量及函数,以及如何在IR中定义和调用函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/ExecutionEngine/MCJIT.h"
#include "llvm/Support/TargetSelect.h"
#include "llvm/IR/TypeBuilder.h"
#include <iostream>

using namespace llvm;


int foo(int x)
{
    return 2 * x;
}

int value = 10;

int main()
{
    static LLVMContext MyGlobalContext;
    LLVMContext &context = MyGlobalContext;
    Module *module = new Module("test", context);

    // 在IR代码中声明一个全局变量`
    GlobalVariable *v = cast<GlobalVariable>(
        module->getOrInsertGlobal("value", Type::getInt32Ty(context)));
    // 在IR中声明一个函数,注意我们并不会在IR中定义foo,我们会将这个IR中声明的函数映射到C++代码中的函数
    FunctionType *foo_type =
      TypeBuilder<int(int), false>::get(context);

    Function *f = cast<Function>(
        module->getOrInsertFunction("foo", foo_type));

    // 在IR中声明一个函数bar,我们会用IR定义这个函数
    FunctionType *bar_type =
      TypeBuilder<int(), false>::get(context);
    Function *bar = cast<Function>(
        module->getOrInsertFunction("bar", bar_type));

    // 创建函数bar的代码块
    BasicBlock *entry = BasicBlock::Create(context, "entry", bar);
    IRBuilder<> builder(entry);

    // 用一个局部变量获取全局变量v的值
    Value *v_IR = builder.CreateLoad(v);
    // 调用函数foo
    Value *ret = builder.CreateCall(f, v_IR);
    // 返回值
    builder.CreateRet(ret);

    InitializeNativeTarget();
    InitializeNativeTargetAsmPrinter();
    InitializeNativeTargetAsmParser();
    ExecutionEngine *ee =
        EngineBuilder(std::unique_ptr<Module>(module)).setEngineKind(EngineKind::JIT).create();

    // 将外部的C++代码中的全局变量映射到IR代码中,IR代码中只有声明
    ee->addGlobalMapping(v, &value);

    // 将外部的C++代码中的全局函数映射到IR代码中,IR代码中只有声明
    ee->addGlobalMapping(f, (void *)foo);

    void *barAddr = ee->getPointerToFunction(bar);
    typedef int (*FuncType)();
    FuncType barFunc = (FuncType)barAddr;
    ee->finalizeObject();
    std::cout << barFunc() << std::endl;
    
    return 0;
}

 

 

编译:

clang++ -O3 ./main.cpp -o test -I/usr/include/llvm-6.0 -I/usr/include/llvm-c-6.0 `llvm-config-6.0 --cxxflags --ldflags --libs --libfiles --system-libs`

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值