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