C++ 如何使用LLVMAPI获取全局变量的初始化器

C++ 如何使用LLVMAPI获取全局变量的初始化器,c++,c,linux,llvm,x86-64,C++,C,Linux,Llvm,X86 64,我正在写一个LLVM通行证,它在LLVM IR代码上工作。目标的一部分是读取全局变量的初始值,其中全局变量可以是任何类型,从基本类型到结构和类。我如何做到这一点 如果在GlobalVariable实例上调用getInitializer,则会得到类型为Constant的初始值设定项(尽管确保首先调用hasInitializer或其姐妹方法之一,以验证是否存在初始值设定项)。此外,IIRC全局变量和常量实现为同一事物,因此如果不需要,请使用isConstant过滤掉常量 当然,常量是抽象基类;实际类

我正在写一个LLVM通行证,它在LLVM IR代码上工作。目标的一部分是读取全局变量的初始值,其中全局变量可以是任何类型,从基本类型到结构和类。我如何做到这一点

如果在
GlobalVariable
实例上调用
getInitializer
,则会得到类型为
Constant
的初始值设定项(尽管确保首先调用
hasInitializer
或其姐妹方法之一,以验证是否存在初始值设定项)。此外,IIRC全局变量和常量实现为同一事物,因此如果不需要,请使用
isConstant
过滤掉常量

当然,
常量
是抽象基类;实际类型将是其子类型之一,您可以在中看到。您可以通过
isa
/
cast
/
dyn\u cast
以通常的方式查询和获取实际的常量类型,也可以使用
getType
(常量毕竟是一个
)并从那里开始工作


最后,要从
模块
获取所有全局变量,请使用
全局开始
/
全局结束
迭代器,或者只在其上使用
getGlobalList
(它有自己的迭代器)。

如果在
全局变量
实例上调用
getInitializer
,则获得初始值设定项,类型为
Constant
(但请确保首先调用
hasInitializer
或其姊妹方法之一,以验证是否存在初始值设定项)。此外,IIRC全局变量和常量实现为同一事物,因此如果不需要,请使用
isConstant
过滤掉常量

当然,
常量
是抽象基类;实际类型将是其子类型之一,您可以在中看到。您可以通过
isa
/
cast
/
dyn\u cast
以通常的方式查询和获取实际的常量类型,也可以使用
getType
(常量毕竟是一个
)并从那里开始工作


最后,要从
模块
中获取所有全局变量,请使用
全局开始
/
全局结束
迭代器,或者只在其上使用
getGlobalList
(它有自己的迭代器)。

我会在LLVM邮件列表上问这样的问题。我会在LLVM邮件列表上问这样的问题。是的,我已经了解了如何迭代全局变量和getInitializer、hasInitializer和常量,现在我看到了如何处理结构。无论如何,你的答案是好的,所以+1:)@你只需要越来越多地挖掘。例如,
ConstantStruct
将其值(当然也包括所有常量)存储为操作数。这个LLVM框架及其文档非常棒!是的,我已经知道了如何迭代全局变量和getInitializer,hasInitializer和常量,现在我看到了如何处理结构。无论如何,你的答案是好的,所以+1:)@你只需要越来越多地挖掘。例如,
ConstantStruct
将其值(当然也包括所有常量)存储为操作数。这个LLVM框架及其文档非常棒!