使用 C++ API 设置 LLVM 程序集输出语法

Set LLVM assembly output syntax with C++ API

我正在尝试找到一种方法来设置 LLVM 输出的汇编语法(特别是对于 x86)。在 Kaleidoscope 教程的 Compiling to Object Code 部分之后,我正在使用

输出汇编文件
TargetMachine->addPassesToEmitFile(pass, dest, nullptr, llvm::CGFT_AssemblyFile))

但是没有设置输出语法的选项。

llc 有命令行选项 --x86-asm-syntax,您可以使用它来设置输出汇编语法(对于 x86),所以我相信一定有办法做到这一点。

那么有没有一种方法可以通过 LLVM 的 C++ 来完成API?

以下是我通过阅读 LLVM 源代码发现的一些事情:

  • 输出汇编语法由AssemblyDialect member in llvm::MCAsmInfo. For x86 the derived classes of llvm::MCAsmInfo can be found in X86MCAsmInfo.h and X86MCAsmInfo.cpp控制。
  • 成员AssemblyDialect初始化为AsmWriterFlavor的值,由命令行选项x86-asm-syntax.
  • 设置

据我所知,AssemblyDialect 没有在代码库中的其他任何地方引用,因此设置它的唯一方法是通过 x86-asm-syntax 标志。为此,您可以使用 llvm::cl::ParseCommandLineOptions。将汇编语法设置为 intel 的最小示例:

#include <cassert>
#include <llvm/Support/CommandLine.h>

void set_asm_syntax_to_intel()
{
    char const *args[] = { "some-exe-name", "--x86-asm-syntax=intel" };
    auto const res = llvm::cl::ParseCommandLineOptions(std::size(args), args);
    assert(res);
}