首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何进行AOT编译

如何进行AOT编译
EN

Stack Overflow用户
提问于 2020-07-25 18:24:07
回答 1查看 681关注 0票数 0

我正在尝试用LLVM创建一个玩具语言

目前,我能够用我的LLVM IR发出一个文件,但是我不知道如何静态地将它编译成一个可执行文件。LLVM教程使用JIT编译,但我想做AOT编译。

我该怎么做?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-26 10:03:29

如果您已经生成了LLVM,您可以首先通过LLC代码生成IR到机器代码,然后将对象文件链接到可执行文件。

如果您想通过命令行使用它,那么只需通过

代码语言:javascript
复制
clang yourIRFile.ll -o output

代码语言:javascript
复制
llc yourIRFile.ll --filetype=obj
lld generatedObjFileName.o -o output

否则,您可以使用llclld api。

(下面的密钥代码是从llc.cpplld.cpp工具目录中提取的,所有代码都由我来验证)

首先,对于代码gen,使用target machine pass

代码语言:javascript
复制
legacy::PassManager pass;
auto CPU = "generic";
auto Features = "";
std::string Error;
auto Target = TargetRegistry::lookupTarget(module->getTargetTriple(), Error);
TheTargetMachine =
        Target->createTargetMachine(module->getTargetTriple(), CPU, Features, targetOptions, RM);
assert(TheTargetMachine && "Fail to create TheTargetMachine");

auto FileType = CGFT_ObjectFile;
SmallVector<char, 0> objStream;
std::unique_ptr<raw_svector_ostream> BOS = std::make_unique<raw_svector_ostream>(objStream);
auto OS = BOS.get();
if (TheTargetMachine->addPassesToEmitFile(pass, *OS, nullptr, FileType)) {
    errs() << "TheTargetMachine can't emit a file of this type";
    return;
}

// Here write the `objStream` content to a temp file you like.
// the objStream is the object file need by lld linker

然后使用lld链接器。

代码语言:javascript
复制
const char *emu_argv[] = {
        "ld.lld",
        objFileName,
        "-o",
        execFileName,
};
int argc = sizeof(emu_argv) / sizeof(emu_argv[0]);
const char **argv = (const char **) emu_argv;
std::vector<const char *> args(argv, argv + argc);
lld::elf::link(args, false, outs(), outs());

objFileName是您在codegen生成的文件。最后,execFileName是最终的可执行文件。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63091984

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档