Как повторно инициализировать llvm::GlobalVariable

Я пытаюсь создать функцию в llvm IR, которая переназначает все llvm::GlobalVariable их начальным значениям.

Я попытался решить эту проблему, сначала перебирая все llvm::GlobalVariable из llvm:: Module, а затем для каждого llvm::GlobalVariable, который имеет инициализатор и не является константой, чтобы добавить в мою новую функцию llvm:: StoreInst, который будет выполнять назначение.

Моя проблема в том, что llvm::GlobalVariable::getInitializer() возвращает *llvm::Constant, который является базовым классом, и я не уверен, как получить доступ к значениям инициализации, особенно для пользовательских структур и классов. Должен ли я использовать какой-то унылый или есть более чистое решение?

Пока это мой код, который хорошо компилируется, но вылетает во время выполнения: (Утверждение `getOperand(1)->getType()->isPointerTy() && "Ptr должно иметь тип указателя!"'Не удалось.)

Module::GlobalListType* glist = &M.getGlobalList();

for(auto it=glist->begin(); it!=glist->end(); ++it){

  if(it->hasInitializer() && !it->isConstant()){
    Constant* con = it->getInitializer();
    StoreInst(it, con, RET);//RET is a pointer to an existing instruction.
  }

}

Спасибо за ваше время!

0 ответов

Другие вопросы по тегам