我有一个输入文件(.ll),我希望由LLVM解析,从而生成程序的内存中表示,然后它应该被解析并转储到stdout,但纯粹来自生成AST。我成功了一部分。 LLVM解析程序并将模块转储到stdout。但是,保留了原始源代码的格式。这可能是因为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?
答案 0 :(得分:3)
IR解析器不保留格式。这样做没有意义。它只是一个用于将模块转储到stdout的IR编写器,与用于转储到.ll文件的IR编写器完全相同。因此,与输入.ll文件相比,转储中的格式总是相同,除非后者以某种方式手动生成。
答案 1 :(得分:1)
我从未注意到转储模块会保留格式,您应该再次检查它。据我所知,它不应该发生。
此外,虽然在解析IR时可能使用AST,但LLVM IR本身不是AST - 模块中没有隐藏树。