Я пишу проход LLVM, который работает с кодом IR LLVM. Часть цели состоит в том, чтобы прочитать начальные значения глобальных переменных, где глобальные переменные могут быть любого типа, от базовых типов до структур и классов. Как мне этого добиться?
Если вы вызываете getInitializer
на GlobalVariable
Например, вы получаете инициализатор, типа Constant
(хотя обязательно позвоните hasInitializer
или сначала один из его родственных методов, чтобы убедиться, что инициализатор вообще есть). Также глобальные переменные и константы IIRC реализованы как одно и то же, поэтому используйте isConstant
отфильтровать константы, если вы не хотите их.
Конечно, Constant
абстрактный базовый класс; фактический тип будет одним из его потомков, который вы можете увидеть в схема представлена на странице документации. Вы можете запросить и получить фактический тип константы обычным способом, через isa
/ cast
/ dyn_cast
или вы можете использовать getType
на нем (константа является Value
в конце концов) и работа оттуда.
Наконец, чтобы получить все глобальные переменные из Module
используйте либо global_begin
/global_end
итераторы, или просто использовать getGlobalList
на нем (у него есть свой итератор).
Других решений пока нет …