Я пытаюсь выполнить инструкции по загрузке/хранению инструмента в 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!"
Может кто-нибудь предоставить мне какие-то намеки?
Спасибо, Генри
Спасибо. Мой проект используется для отслеживания доступа к памяти инструкций загрузки/хранения во время выполнения. Поэтому мне нужно вставить некоторые пользовательские функции в llvm ir для записи адресов. Это похоже на пользовательский llvm-gprof. – henry