如何在 LLVM 中按名称查找模块中使用的类型?

发布于 2025-01-14 04:23:37 字数 207 浏览 0 评论 0原文

在 LLVM 中,可以使用 Function* Module::getFunction(StringRef Name) const 在模块内按名称查找函数。

同样,可以使用 GlobalVariable* Module::getGlobalVariable(StringRef Name) const 在模块内按名称查找全局变量。

如何使用模块中定义的类型执行相同的操作?

In LLVM, it is possible to lookup a function by name within a module using Function* Module::getFunction(StringRef Name) const.

Similarly, it is possible to lookup a global variable by name within a module using GlobalVariable* Module::getGlobalVariable(StringRef Name) const.

How can I do the same thing with a type defined within a module?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

辞别 2025-01-21 04:23:37

类型与函数和全局变量不同,因为这两者存在于模块中,并且最终将在可执行文件或生成的任何内容中包含一些字节。类型不是这样的。

类型不占用空间,存在于 上下文 中,并且不一定可以找到。不过,通常可以找到它们:如果您想找到单例 42 位整数类型,请询问 IntegerType::get(),如果你想找到一个结构,您询问 StructType,按结构按名称

(请记住,并不是每个结构类型都可以通过询问 LLVM 找到。就我而言,我曾经遇到过一个问题,调用者需要创建一个指向结构的指针,但此时结构类型仍然只是一个占位符代码,没有名称或定义,我最终通过询问自己的代码而不是询问 LLVM 找到了正确的 LLVM 类型,我认为很多人都做类似的事情。)

Types are different from Functions and global variables because those two exist within a Module, and are things that will eventually have some bytes in the executable or whatever is generated. Types aren't like that.

Types occupy no space, exist within the Context and aren't necessarily findable. They generally can be found, though: If you want to find the singleton 42-bit integer type, you ask IntegerType::get(), and if you want to find a struct, you ask StructType, either by structure or by name.

(Keep in mind that not every struct type can be found by asking LLVM. In my case, I once had a problem where a caller needed to make a pointer to a struct, but the struct type was still just a placeholder at that point in the code, without either a name or a definition. I ended up finding the right LLVM type by asking my own code, rather than by asking LLVM, and I think many people do similar things.)

榕城若虚 2025-01-21 04:23:37

StructType *StructType::getTypeByName(Context, Name)。如果您没有 Context,请使用 MyModule.getContext()doxygen

我认为其他类型不能有名称。

StructType *StructType::getTypeByName(Context, Name). If you don't have a Context, use MyModule.getContext(). doxygen

Offhand I don't think other types can have names.

A君 2025-01-21 04:23:37

我认为该声明

...模块内定义的类型

只能应用于已识别的结构,因为在特定的 LLVMContext 中只能有一个具有给定名称的已识别结构。文字结构类型在结构上是唯一的,并且像 i8 这样的基元已经寻求“存在”,因此您所做的就是获取它们并使用它们来注释值。也许这就是为什么它们是使用 get 方法创建的。

您可以使用 模块在 llvm::Module 中获取已识别的结构::getIdentifiedStructTypes 方法。

如果您对遍历一个模块并识别该模块中使用的所有类型感兴趣,那么一定要看看 TypeFinder.cpp

I think the statement

... a type defined within a module

could only apply to identified structs because there can only be a single identified struct with a given name in a particular LLVMContext. Literal struct types are uniqued structurally and primitives like an i8 already sought of 'exist', so all you do is get them and use them to annotate values. Maybe that's why they're created with a get method.

You can get the identified structs in an llvm::Module using the Module::getIdentifiedStructTypes method.

If walking over a module and identifying all the types used in that module is something that interests you, definitely have a look at TypeFinder.cpp

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文