gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 02:59:03 24 4
gpt4 key购买 nike

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

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);

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

clang -o anonymous anonymous.bc

或者:

llc anonymous.bc
gcc -o anonymous anonymous.s
<小时/>

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

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

最佳答案

我也在寻找这方面的代码,@arrowd 的建议有效。

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

给定一个模块,它会在标准输出上为您的 native 目标生成汇编代码:

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);
}

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

关于llvm - 通过LLVM API直接生成机器代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34822212/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com