diff --git a/include/revng/Support/ProgramCounterHandler.h b/include/revng/Support/ProgramCounterHandler.h index 8726b5d95..9f453da4b 100644 --- a/include/revng/Support/ProgramCounterHandler.h +++ b/include/revng/Support/ProgramCounterHandler.h @@ -114,6 +114,8 @@ public: setPC(Builder, MA); } + llvm::Value *loadPC(llvm::IRBuilder<> &Builder) const; + protected: virtual void initializePCInternal(llvm::IRBuilder<> &Builder, MetaAddress NewPC) const = 0; diff --git a/lib/Support/ProgramCounterHandler.cpp b/lib/Support/ProgramCounterHandler.cpp index e047fe4b7..9de4b6367 100644 --- a/lib/Support/ProgramCounterHandler.cpp +++ b/lib/Support/ProgramCounterHandler.cpp @@ -310,6 +310,29 @@ bool PCH::isPCAffectingHelper(Instruction *I) const { return false; } +llvm::Value *ProgramCounterHandler::loadPC(llvm::IRBuilder<> &Builder) const { + using namespace llvm; + + BasicBlock *BB = Builder.GetInsertBlock(); + Module *M = BB->getParent()->getParent(); + Value *V = UndefValue::get(MetaAddress::getStruct(M)); + unsigned I = 0; + auto Insert = [&](llvm::GlobalVariable *CSV) { + using IV = InsertValueInst; + Value *ToInsert = Builder.CreateZExt(Builder.CreateLoad(CSV), + V->getType()->getStructElementType(I)); + V = Builder.Insert(IV::Create(V, ToInsert, { I })); + ++I; + }; + + Insert(EpochCSV); + Insert(AddressSpaceCSV); + Insert(TypeCSV); + Insert(AddressCSV); + + return V; +} + std::pair PCH::getUniqueJumpTarget(BasicBlock *BB) { std::vector Stack; diff --git a/tools/revng-lift/JumpTargetManager.cpp b/tools/revng-lift/JumpTargetManager.cpp index 10a1ae04a..cd88a881f 100644 --- a/tools/revng-lift/JumpTargetManager.cpp +++ b/tools/revng-lift/JumpTargetManager.cpp @@ -961,11 +961,13 @@ void JumpTargetManager::prepareDispatcher() { TheFunction); Builder.SetInsertPoint(DispatcherFail); - Module *TheModule = TheFunction->getParent(); - auto *UnknownPCTy = FunctionType::get(Type::getVoidTy(Context), {}, false); - FunctionCallee UnknownPC = TheModule->getOrInsertFunction("unknownPC", - UnknownPCTy); - Builder.CreateCall(UnknownPC); + auto *UnknownPCTy = FunctionType::get(Type::getVoidTy(Context), + { MetaAddress::getStruct(&TheModule) }, + false); + FunctionCallee UnknownPC = TheModule.getOrInsertFunction("unknownPC", + UnknownPCTy); + + Builder.CreateCall(UnknownPC, PCH->loadPC(Builder)); auto *FailUnreachable = Builder.CreateUnreachable(); setBlockType(FailUnreachable, BlockType::DispatcherFailureBlock);