Глобални променливи без указател в LLVM

Пиша пропуск на функция и бих искал да добавя глобална променлива от тип int във фазата на инициализация, за използване в действителната работа на пропуска.

Досега имам

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 с помощта на този метод и ако е така, къде греша?


person Community    schedule 15.11.2015    source източник


Отговори (2)


Правилно го правиш. Глобалните променливи винаги се съхраняват в паметта - вмъкнали сте глобална променлива от тип i32 и сте получили обратно указател към това място в паметта. По отношение на C, вие сте върнали &var1 вместо var1. За да манипулирате стойността, съхранена в указателя, ще трябва да създадете инструкции load и store.

person Ismail Badawi    schedule 15.11.2015
comment
Благодаря за вашата помощ! Това е малко извън темата, но смятам, че е достатъчно свързано, за да остана на тази страница: В моя пропуск на функция извиквам Value* vpointer = M-›getGlobalVariable(var1); LoadInst load(vpointer,var1,&i); &i е от итератора. Този код сегреди. LoadInst е проблемът, премахването му премахва segfault. Мисля, че проблемът е от аргумента string към LoadInst(), защото всъщност просто предполагам какво да поставя там (има малко документация). Как трябва да поправя тази грешка? - person ; 15.11.2015
comment
@LLVMHacker30 Бих предложил да разгледате използването на IRBuilder вместо да създавате инструкции ръчно. - person Ismail Badawi; 16.11.2015
comment
Не съм сигурен какво добавя този отговор, което предишният ми отговор не добави :( - person dune.rocks; 16.11.2015
comment
@dune.rocks Гласуването „за“ не е мое (нямам „репутацията“ да гласувам „за“) и помолих за последващото съобщение на Исмаил, защото той случайно беше по-нагоре в страницата, когато се върнах. И двата отговора са наистина полезни. - person ; 16.11.2015

Когато използвате getOrInsertGlobal, предавате основния тип на обекта, който искате да създадете в глобалното пространство на имена. След това внедряването използва getPointerType, за да създаде реално съпоставяне в таблицата със символи на модула, поради което виждате указател към типа, който предавате.

Така че ще трябва да заредите и съхраните в глобалния свят.

person dune.rocks    schedule 15.11.2015