我正在寻找使用Clang编写工具。细节相当无关紧要,但我要做的是从Clang获得llvm类型。例如,我想从“printf”转到llvm::Function*
,将“size_t”转到llvm::Type*
。但我找不到Clang中提供这些功能的任何功能。我已经决定要求Clang破坏名称,然后向llvm::Module*
询问数据 - 但我找不到如何获得与Clang调用相对应的llvm::Module*
。 / p>
如何从Clang获取内部LLVM数据?
答案 0 :(得分:2)
最终,代码生成API不是Clang公共API的一部分。这是有充分理由的,因为它们很糟糕。
但是,您可以创建一个clang::CodeGen::CodeGenModule
,您可以将其用于将给定TU编码为提供的llvm::Module
。然后,您可以使用getMangledName
上的CodeGenModule
函数获取符号的错位名称。
但是,请勿尝试使用提供的功能从clang::QualType
转换为llvm::Type*
- 它们无法使用。我发现可靠地执行此转换的唯一可行策略是找到带签名的函数,例如成员函数,然后在Module中查询该参数的类型,例如this
。但这是相当ABI特定的和讨厌的黑客。您还可以计算Clang为给定类型生成的LLVM类型名称,并在模块中搜索它,但这并不总是成功。
答案 1 :(得分:0)
一般情况下,你不能。 clang内部也是分层制作的。所以,你不能简单地抓住一块AST说'嘿,给我一个功能'。 AST一次在IR生成步骤模块中转换为LLVM IR。通过这种方式,我们可以确保所有内容都经过解析并在语义上正确完整。
所以,如果你真的需要所有这些东西,那么你需要在IR生成之后很晚才进入clang并尝试在那时对松散耦合的AST和LLVM IR进行操作。