[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 09:43:43 PDT 2022


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

HasUnknownControlFlow -> !Strict


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
@@ -1842,6 +1842,33 @@
   if (HasInternalLabelReference)
     return false;
 
+  // Validate that all data references to function offsets are claimed by
+  // recognized jump tables. Register externally referenced blocks as entry
+  // points. Unknown control flow requires
+  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) {
+          if (opts::Verbosity >= 1) {
+            outs() << "BOLT-WARNING: registering externally referenced "
+                   << BB->getName() << " as a secondary entry point in "
+                   << *this << ".\n";
+          }
+          addEntryPoint(*BB);
+        }
+      } else {
+        outs() << "BOLT-WARNING: external reference to offset "
+               << formatv("{0:x}", Destination)
+               << " does not point to a valid BB in " << *this << ".\n";
+        return false;
+      }
+    }
+  }
+
   // If there's only one jump table, and one indirect jump, and no other
   // references, then we should be able to derive the jump table even if we
   // fail to match the pattern.


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


More information about the llvm-commits mailing list