繁体   English   中英

如何从Clang获取LLVM类型?

[英]How do I get LLVM types from Clang?

我正在寻找使用Clang编写工具。 细节相当无关紧要,但我要做的是从Clang获得llvm类型。 例如,我想从“printf”转到llvm::Function* ,将“size_t”转换为llvm::Type* 但我找不到Clang中提供这些功能的任何功能。 我已经决定我可以让Clang破坏名称,然后向llvm::Module*询问数据 - 但我找不到如何获得与Clang调用相对应的llvm::Module*

如何从Clang获取内部LLVM数据?

最终,代码生成API不是Clang公共API的一部分。 这是有充分理由的,因为它们很糟糕。

但是,您可以创建一个clang::CodeGen::CodeGenModule ,您可以使用该代码将给定的TU clang::CodeGen::CodeGenModule为提供的llvm::Module 然后,您可以使用getMangledName上的CodeGenModule函数获取符号的错位名称。

但是,不要尝试使用提供的函数从clang::QualType转换为llvm::Type* - 它们不可用地被破坏。 我发现可靠地执行此转换的唯一可行策略是找到带签名的函数,例如成员函数,然后在Module中查询该参数的类型,例如, this 但这是相当ABI特定的和讨厌的黑客。 您还可以计算Clang为给定类型生成的LLVM类型名称,并在模块中搜索它,但这并不总是成功。

一般来说,你不能。 clang内部也是分层制作的。 所以,你不能简单地抓住一块AST说'嘿,给我一个功能'。 AST一次在IR生成步骤模块中转换为LLVM IR。 通过这种方式,我们可以确保所有内容都经过解析并在语义上正确完整。

所以,如果你确实需要所有这些东西,那么你需要在IR生成之后很晚才进入clang,并尝试在那时对松散耦合的AST和LLVM IR进行操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM