Как преобразовать тип CallInst в GlobalVariable в LLVM

Я написал проход функции, который инициализирует глобальную переменную, а затем вставляет функцию в IR. Я хотел бы установить результат вызова функции в глобальную переменную, но не знаю, как преобразовать тип CallInst в тип GlobalVariable. Вот код, который я написал для объявления глобальной переменной:

GlobalVariable *virtAddr = new GlobalVariable(*F.getParent(), 
    Type::getInt8PtrTy(F.getContext(),8),
    false,
    GlobalValue::ExternalLinkage,
    0,
    "virt_addr");
virtAddr->setAlignment(4);

Затем я пытаюсь установить глобальную переменную в этой строке:

virtAddr = builder.CreateCall(mmap,putsArgs,"mmap");

Когда я пытаюсь скомпилировать, я получаю такую ​​ошибку:

error: assigning to 'llvm::GlobalVariable *' from incompatible type
'llvm::CallInst *'

Спасибо за любую помощь!


person Josh    schedule 25.03.2014    source источник


Ответы (1)


Этот код:

GlobalVariable *virtAddr = new GlobalVariable(...);
virtAddr = builder.CreateCall(mmap,putsArgs,"mmap");

не «преобразует CallInst в GlobalVariable» больше, чем этот код «преобразует 3 в 4»:

int x = 3;
x = 4;

Другими словами, это обычное присвоение переменной C ++. В вашем случае значение и переменная даже не имеют совместимых типов, поэтому вы получаете стандартную ошибку типа C ++.

Итак, как сделать присвоить результаты вызова функции (или любое другое значение) глобальной переменной? Ну, глобальные переменные всегда представляют собой указатель на некоторую ячейку памяти; поэтому, если вы хотите сохранить что-либо там, вам нужно использовать StoreInst, указав ему глобальную переменную в качестве адреса и инструкцию вызова в качестве значения для сохранения.

person Oak    schedule 25.03.2014
comment
Большое тебе спасибо! Мне удалось добавить эту строку: builder.CreateStore (x, virtAddr, false); что в итоге дало мне ИК-код, который я хотел. Где x - это только тип значения, установленный в builder.CreateCall (mmap, putArgs, mmap); - person Josh; 25.03.2014