如何强制LLVM取消解析AST

How to force LLVM to unparse the AST?

本文关键字:AST 取消 何强制 LLVM      更新时间:2023-10-16

我有一个输入文件(.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 IRn";
    return 1;
  }
  Mod->dump();

我的问题是:为什么在转储模块时保留原始源代码的格式,并且有一种方法可以使LLVM删除程序的文本表示并使其实际上取消解析AST?

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

我从来没有注意到转储模块会保留格式,您应该再检查一次。据我所知,这是不应该发生的。

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