2015-11-15 7 views
0

Я пишу пропуск функции и хотел бы добавить глобальную переменную типа int на этапе инициализации для использования в фактической работе прохода.Глобальные переменные без указателя в LLVM

До сих пор у меня есть

bool doInitialization(Module &M) { 
    LLVMContext &c = M.getContext(); 
    Type *intTy = TypeBuilder<int,false>::get(c); 
    Value *p = M.getOrInsertGlobal("var1",intTy); 
    return true 
} 

по какой-либо причине, var1 имеет тип Int *. Например, добавив это после объявления

Type *pt = p->getType(); 
if (isa<PointerType>(pt)) { 
    errs().write_escaped("Is a pointer ty") << '\n'; 
} 

будет в конечном итоге с оттиском, когда скомпилированный код выполняется, и

if ((intTy->getPointerTo()) == (p->getType())) { 
    errs().write_escaped("This is confusing") << '\n'; 
} 

будет снова напечатать строку.

Можно ли добавить глобальную переменную типа int, используя этот метод, и если да, то где я иду не так?

ответ

0

При использовании getOrInsertGlobal вы передаете , лежащий в основе, тип объекта, который вы хотите создать в глобальном пространстве имен. Затем реализация использует getPointerType для фактического создания сопоставления в таблице символов модуля, поэтому вы видите указатель на тип, в котором вы проходите.

Таким образом, вам нужно загрузить и сохранить глобальную ,

2

Вы делаете это правильно. Глобальные переменные всегда хранятся в памяти - вы ввели глобальную переменную типа i32 и вернули указатель на эту ячейку памяти. В терминах C вы вернулись &var1 вместо var1. Чтобы управлять значением, хранящимся в указателе, вам необходимо создать инструкции load и store.

+0

Спасибо за помощь! Это немного не по теме, но я чувствую, что это связано достаточно, чтобы остаться на этой странице: В моей функции перевале, я звоню Value * vpointer = M-> getGlobalVariable («var1»); LoadInst нагрузки (vpointer, «var1», &i); и я от итератора. Этот код возвращает ошибку сегментации. LoadInst проблема, ее удаление удаляет Segfault. Я думаю, что вопрос из строки аргумента LoadInst() , потому что я в основном просто угадываю, что там делать (есть небольшая документация). Как мне исправить этот segfault? –

+0

@ LLVMHacker30 Я бы предложил изучить использование ['IRBuilder'] (http://llvm.org/docs /doxygen/html/classllvm_1_1IRBuilder.html), а не для создания инструкций вручную. –

+0

Не уверен, что этот ответ добавляет, что мой более ранний ответ не дал :( –