1

我有一个输入文件 (.ll),我想用 LLVM 对其进行解析,从而生成程序的内存中表示,然后它应该不被解析并转储到标准输出,但纯粹来自生成的 AST。我成功了一部分。LLVM 解析程序并将模块转储到标准输出。然而,原始源代码的格式被保留。这让人认为 LLVM 并没有真正解析 AST 以转储模块,而是 LLVM 将文本表示与内存中的 AST 一起存储,如果没有进行任何更改,则更喜欢转储此文本表示,这不是我想要的。

  std::cout << "Reading IR ...\n";

  LLVMContext &Context = getGlobalContext();
  SMDiagnostic Err;
  Module *Mod = ParseIRFile(argv[1], Err, Context);

  if (!Mod) {
    std::cerr << "Problems reading IR\n";
    return 1;
  }

  Mod->dump();

我的问题是:为什么在转储模块时保留原始源代码的格式,有没有办法让 LLVM 删除程序的文本表示并让它实际上解析 AST?

4

2 回答 2

3

IR 解析器保留格式。这样做没有任何意义。它只是一个 IR 写入器,用于将模块转储到标准输出,与用于转储到 .ll 文件的写入器完全相同。因此,与输入 .ll 文件相比,转储中的格式始终相同,除非后者是手动生成的。

于 2013-05-09T10:46:06.930 回答
1

我从未注意到转储模块会保留格式,您应该再次检查它。据我所知,它不应该发生。

此外,虽然在解析 IR 时可能会使用 AST,但 LLVM IR 本身并不是 AST——模块中没有隐藏树。

于 2013-05-09T07:48:19.563 回答