3

我正在寻找使用 Clang 编写工具。细节相当无关紧要,但我想做的是从 Clang 获得一个 llvm 类型。例如,我想从 "printf" 到llvm::Function*,和 "size_t" 到 a llvm::Type*。但是我在 Clang 中找不到任何提供这些功能的功能。我决定我可以要求 Clang 修改名称,然后要求llvm::Module*提供数据 - 但我找不到llvm::Module*与 Clang 调用相对应的方法。

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

4

2 回答 2

2

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

但是,您可以创建一个clang::CodeGen::CodeGenModule,您可以使用它来将给定的 TU 代码生成为提供的llvm::Module. 然后,您可以getMangledName使用CodeGenModule.

但是,不要尝试使用提供的函数将 a 转换clang::QualType为 an llvm::Type*- 它们已无法使用。我发现可靠地执行此转换的唯一可行策略是找到具有签名的函数,例如成员函数,然后在模块中查询该参数的类型,例如this. 但这是非常特定于 ABI 和令人讨厌的 hack。您还可以计算 Clang 为给定类型生成的 LLVM 类型名称并在模块中搜索它,但这并不总是成功的。

于 2013-10-18T19:01:09.683 回答
0

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

因此,如果您真的需要所有这些东西,那么您需要在 IR 生成之后很晚才开始使用 clang,并尝试在那时对松散耦合的 AST 和 LLVM IR 进行操作。

于 2012-12-09T09:23:41.703 回答