diff --git a/bolt/lib/Core/BinaryFunction.cpp b/bolt/lib/Core/BinaryFunction.cpp --- a/bolt/lib/Core/BinaryFunction.cpp +++ b/bolt/lib/Core/BinaryFunction.cpp @@ -1856,6 +1856,30 @@ if (HasFixedIndirectBranch) return false; + // Validate that all data references to function offsets are claimed by + // recognized jump tables. Register externally referenced blocks as entry + // points. + if (!opts::StrictMode && hasInternalReference()) { + SmallPtrSet JTTargets; + for (const JumpTable *JT : llvm::make_second_range(JumpTables)) + JTTargets.insert(JT->Entries.begin(), JT->Entries.end()); + + for (uint64_t Destination : ExternallyReferencedOffsets) { + if (BinaryBasicBlock *BB = getBasicBlockAtOffset(Destination)) { + bool Found = JTTargets.contains(BB->getLabel()); + if (Found) + continue; + + if (opts::Verbosity >= 1) { + outs() << "BOLT-WARNING: registering externally referenced " + << BB->getName() << " as a secondary entry point in " + << *this << ".\n"; + } + addEntryPoint(*BB); + } + } + } + if (HasUnknownControlFlow && !BC.HasRelocations) return false;