直接通过LLVM API生成机器代码

时间:2016-01-16 00:40:17

标签: llvm llvm-c++-api

使用以下代码,我可以从模块生成 LLVM bitcode文件

llvm::Module * module;

// fill module with code
module = ...;

std::error_code ec;
llvm::raw_fd_ostream out("anonymous.bc", ec, llvm::sys::fs::F_None);

llvm::WriteBitcodeToFile(module, out);

然后我可以使用该bitcode文件生成可执行的机器代码文件,例如:

clang -o anonymous anonymous.bc

可替换地:

llc anonymous.bc
gcc -o anonymous anonymous.s

我现在的问题是:我是否可以使用LLVM API直接在C ++中生成机器代码而无需先写入bitcode文件?

我正在寻找代码示例或LLVM API中的至少一些起点,例如:使用哪些课程,向我推进正确的方向甚至可能就足够了。

2 个答案:

答案 0 :(得分:2)

查看llc tool source,具有特定compileModule()功能。简而言之,它会创建Target,通过TargetOptions为其设置一些选项,然后将其用于addPassesToEmitFile(),最后要求PassManager执行所有计划任务。

答案 1 :(得分:0)

我也在寻找代码,@ arrowd的建议起作用了。

为了省去下一个人的麻烦,这就是我想出的。

给出一个模块,它将在stdout上为您的本机目标生成汇编代码:

void printASM(Module *M) {
    InitializeNativeTarget();
    InitializeNativeTargetAsmPrinter();

    auto TargetTriple = sys::getDefaultTargetTriple();
    M->setTargetTriple(TargetTriple);

    std::string Error;
    const Target *target = TargetRegistry::lookupTarget(TargetTriple, Error);
    auto cpu = sys::getHostCPUName();
    SubtargetFeatures Features;
    StringMap<bool> HostFeatures;
    if (sys::getHostCPUFeatures(HostFeatures))
        for (auto &F : HostFeatures)
            Features.AddFeature(F.first(), F.second);
    auto features = Features.getString();

    TargetOptions Options;
    std::unique_ptr<TargetMachine> TM{
            target->createTargetMachine(
                    TargetTriple, cpu, features, Options,
                    Reloc::PIC_, None, CodeGenOpt::None)
    };

    legacy::PassManager PM;
    M->setDataLayout(TM->createDataLayout());
    TM->addPassesToEmitFile(PM, (raw_pwrite_stream &) outs(), (raw_pwrite_stream *) (&outs()),
                            TargetMachine::CodeGenFileType::CGFT_AssemblyFile, true, nullptr);
    PM.run(*M);
}

如果有人知道编写此代码的较短方法,请随时纠正我!