@@ -90,8 +90,8 @@ auto OTFResolver::resolveVirtualCall(const llvm::CallBase *CallSite)
9090 LOG_IF_ENABLE (BOOST_LOG_SEV (lg::get (), DEBUG)
9191 << " Call virtual function: " << llvmIRToString (CallSite));
9292
93- auto VtableIndex = getVFTIndex (CallSite);
94- if (VtableIndex < 0 ) {
93+ auto RetrievedVtableIndex = getVFTIndex (CallSite);
94+ if (!RetrievedVtableIndex. has_value () ) {
9595 // An error occured
9696 LOG_IF_ENABLE (BOOST_LOG_SEV (lg::get (), DEBUG)
9797 << " Error with resolveVirtualCall : impossible to retrieve "
@@ -100,6 +100,8 @@ auto OTFResolver::resolveVirtualCall(const llvm::CallBase *CallSite)
100100 return {};
101101 }
102102
103+ auto VtableIndex = RetrievedVtableIndex.value ();
104+
103105 LOG_IF_ENABLE (BOOST_LOG_SEV (lg::get (), DEBUG)
104106 << " Virtual function table entry is: " << VtableIndex);
105107
@@ -113,12 +115,13 @@ auto OTFResolver::resolveVirtualCall(const llvm::CallBase *CallSite)
113115 auto PTS = PT.getPointsToSet (CallSite->getCalledOperand (), CallSite);
114116 for (const auto *P : *PTS) {
115117 if (auto *PGV = llvm::dyn_cast<llvm::GlobalVariable>(P)) {
116- if (PGV->hasName () && PGV->getName ().startswith (" _ZTV" ) &&
118+ if (PGV->hasName () &&
119+ PGV->getName ().startswith (LLVMTypeHierarchy::VTablePrefix) &&
117120 PGV->hasInitializer ()) {
118121 if (auto *PCS = llvm::dyn_cast<llvm::ConstantStruct>(
119122 PGV->getInitializer ())) {
120- auto VFs = LLVMVFTable::getVFVectorFromIRVTable (PCS);
121- if (VtableIndex < 0 || VtableIndex >= VFs.size ()) {
123+ auto VFs = LLVMVFTable::getVFVectorFromIRVTable (* PCS);
124+ if (VtableIndex >= VFs.size ()) {
122125 continue ;
123126 }
124127 auto *Callee = VFs[VtableIndex];
0 commit comments