2014-10-27 5 views
1

Я пытаюсь выполнить инструкции по загрузке/хранению инструмента в LLVM IR и проследить их адрес памяти, поэтому мне нужно вставить инструментальную функцию для записи адреса инструкций загрузки/хранения.Ошибка при преобразовании значения * в PointerType в проходе llvm

У меня есть проблема преобразования типа, когда я пытаюсь создать функцию recordLoad/магазин:

Сначала создается тип указателя, «VoidPtrType»

Type Int64Type = IntegerType::getInt64Ty(M.getContext()); 
Type* VoidPtrType = PointerType::getUnqual(Int64Type); 

Затем я создаю аргументы для инструментальных функция:

// ldstInst is a load/store instruction 
Value* Args[] = { 
    ConstantInt::get(Int64Type, uint64_t(lsIDpass->getlsID(inst))), 
    ConstantInt::get(VoidPtrType, uint64_t(ldstInst->getPointerOperand())), 
    ConstantInt::get(Int64Type, uint64_t(DL->getTypeStoreSize(VTy))) 
}; 

Однако, когда я запускаю свою программу, я не могу передать "Constantin т :: получить (VoidPtrType, uint64_t (ldstInst-> getPointerOperand()))», сообщение об ошибке, приводится ниже:

Assertion failed: isa<X>(Val) && "cast<Ty>() argument of incompatible type!" 

Может кто-нибудь предоставить мне какие-то намеки?

Спасибо, Генри

ответ

1

Проблема заключается в том, что VoidPtrType не из IntegerType (вместо этого, это из PointerType). Я считаю, что вам нужно использовать inttoptr, чтобы создать постоянный указатель.

Хотя, я не уверен в вашем дизайне. Вы действительно хотите использовать указатель на LLVM Operand, который существует только во время компиляции в вашей скомпилированной программе?

+0

Спасибо. Мой проект используется для отслеживания доступа к памяти инструкций загрузки/хранения во время выполнения. Поэтому мне нужно вставить некоторые пользовательские функции в llvm ir для записи адресов. Это похоже на пользовательский llvm-gprof. – henry

 Смежные вопросы

  • Нет связанных вопросов^_^