[PATCH] D132495: [BOLT] Verify externally referenced blocks against jump table targets

Amir Ayupov via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Aug 24 13:14:40 PDT 2022


Amir updated this revision to Diff 455341.
Amir added a comment.

clang-format


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D132495/new/

https://reviews.llvm.org/D132495

Files:
  bolt/lib/Core/BinaryFunction.cpp


Index: bolt/lib/Core/BinaryFunction.cpp
===================================================================
--- bolt/lib/Core/BinaryFunction.cpp
+++ 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<MCSymbol *, 4> 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;
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D132495.455341.patch
Type: text/x-patch
Size: 1247 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220824/abe4b5a3/attachment.bin>


More information about the llvm-commits mailing list