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



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

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

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

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

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

(请记住,并不是每个结构类型都可以通过询问LLVM来找到。在我的案例中,我曾经遇到过一个问题,调用方需要制作一个指向结构的指针,但结构类型在代码中当时仍然只是一个占位符,没有名称或定义。我最终通过询问自己的代码而不是询问LLVM找到了正确的LLVM类型ngs.(

StructType *StructType::getTypeByName(Context, Name)。如果没有上下文,请使用MyModule.getContext()。多氧

顺便说一句,我不认为其他类型可以有名字。

我认为语句

。。。模块中定义的类型

只能应用于已标识的结构,因为在特定LLVMContext中只能有一个具有给定名称的已标识结构。字面结构类型在结构上是唯一的,像i8这样的基元已经在"exist"中找到,所以你所要做的就是获取它们并使用它们来注释值。也许这就是使用get方法创建它们的原因。

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

如果你感兴趣的是浏览一个模块并识别该模块中使用的所有类型,那么一定要看看TypeFinder.cpp

最新更新