[PATCH] D150339: [BOLT] Fix state of MCSymbols in lowering pass
Rafael Auler via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu May 11 11:13:14 PDT 2023
rafauler updated this revision to Diff 521378.
rafauler added a comment.
Not sure what's off format. Removing an extra new line just in case.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D150339/new/
https://reviews.llvm.org/D150339
Files:
bolt/include/bolt/Passes/BinaryPasses.h
bolt/lib/Passes/BinaryPasses.cpp
bolt/lib/Rewrite/BinaryPassManager.cpp
Index: bolt/lib/Rewrite/BinaryPassManager.cpp
===================================================================
--- bolt/lib/Rewrite/BinaryPassManager.cpp
+++ bolt/lib/Rewrite/BinaryPassManager.cpp
@@ -488,6 +488,10 @@
Manager.registerPass(std::make_unique<LowerAnnotations>(NeverPrint));
+ // Check for dirty state of MCSymbols caused by running calculateEmittedSize
+ // in parallel and restore them
+ Manager.registerPass(std::make_unique<CleanMCState>(NeverPrint));
+
Manager.runPasses();
}
Index: bolt/lib/Passes/BinaryPasses.cpp
===================================================================
--- bolt/lib/Passes/BinaryPasses.cpp
+++ bolt/lib/Passes/BinaryPasses.cpp
@@ -626,6 +626,30 @@
BC.MIB->setOffset(*Item.first, Item.second);
}
+// Check for dirty state in MCSymbol objects that might be a consequence
+// of running calculateEmittedSize() in parallel, during split functions
+// pass. If an inconsistent state is found (symbol already registered or
+// already defined), clean it.
+void CleanMCState::runOnFunctions(BinaryContext &BC) {
+ MCContext &Ctx = *BC.Ctx;
+ for (const auto &SymMapEntry : Ctx.getSymbols()) {
+ const MCSymbol *S = SymMapEntry.second;
+ if (S->isDefined()) {
+ LLVM_DEBUG(dbgs() << "BOLT-DEBUG: Symbol \"" << S->getName()
+ << "\" is already defined\n");
+ const_cast<MCSymbol *>(S)->setUndefined();
+ }
+ if (S->isRegistered()) {
+ LLVM_DEBUG(dbgs() << "BOLT-DEBUG: Symbol \"" << S->getName()
+ << "\" is already registered\n");
+ const_cast<MCSymbol *>(S)->setIsRegistered(false);
+ }
+ LLVM_DEBUG(if (S->isVariable()) {
+ dbgs() << "BOLT-DEBUG: Symbol \"" << S->getName() << "\" is variable\n";
+ });
+ }
+}
+
// This peephole fixes jump instructions that jump to another basic
// block with a single jump instruction, e.g.
//
Index: bolt/include/bolt/Passes/BinaryPasses.h
===================================================================
--- bolt/include/bolt/Passes/BinaryPasses.h
+++ bolt/include/bolt/Passes/BinaryPasses.h
@@ -213,6 +213,16 @@
void runOnFunctions(BinaryContext &BC) override;
};
+/// Clean the state of the MC representation before sending it to emission
+class CleanMCState : public BinaryFunctionPass {
+public:
+ explicit CleanMCState(const cl::opt<bool> &PrintPass)
+ : BinaryFunctionPass(PrintPass) {}
+
+ const char *getName() const override { return "clean-mc-state"; }
+ void runOnFunctions(BinaryContext &BC) override;
+};
+
/// An optimization to simplify conditional tail calls by removing
/// unnecessary branches.
///
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D150339.521378.patch
Type: text/x-patch
Size: 2642 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230511/6123dcb3/attachment.bin>
More information about the llvm-commits
mailing list