[llvm] [BOLT] Add metadata pre-emit finalization interface (PR #79925)
Maksim Panchenko via llvm-commits
llvm-commits at lists.llvm.org
Mon Jan 29 17:02:46 PST 2024
https://github.com/maksfb created https://github.com/llvm/llvm-project/pull/79925
Some metadata needs to be updated/finalized before the binary context is emitted into the binary. Add the interface and use it for Linux ORC update invocation.
>From e9d05d686f8860f82e2e36999be7dd43e56f511b Mon Sep 17 00:00:00 2001
From: Maksim Panchenko <maks at fb.com>
Date: Tue, 21 Nov 2023 16:38:08 -0800
Subject: [PATCH] [BOLT] Add metadata pre-emit finalization interface
Some metadata needs to be updated/finalized before the binary context
is emitted into the binary. Add the interface and use it for Linux
ORC update invocation.
---
bolt/include/bolt/Rewrite/MetadataManager.h | 3 +++
bolt/include/bolt/Rewrite/MetadataRewriter.h | 3 +++
bolt/include/bolt/Rewrite/RewriteInstance.h | 3 +++
bolt/lib/Rewrite/LinuxKernelRewriter.cpp | 10 +++++++---
bolt/lib/Rewrite/MetadataManager.cpp | 12 ++++++++++++
bolt/lib/Rewrite/RewriteInstance.cpp | 6 ++++++
6 files changed, 34 insertions(+), 3 deletions(-)
diff --git a/bolt/include/bolt/Rewrite/MetadataManager.h b/bolt/include/bolt/Rewrite/MetadataManager.h
index 1a4c394ff33bb..efbc74b4daba9 100644
--- a/bolt/include/bolt/Rewrite/MetadataManager.h
+++ b/bolt/include/bolt/Rewrite/MetadataManager.h
@@ -36,6 +36,9 @@ class MetadataManager {
/// Execute metadata initializers after CFG was constructed for functions.
void runInitializersPostCFG();
+ /// Run finalization step of rewriters before the binary is emitted.
+ void runFinalizersPreEmit();
+
/// Run finalization step of rewriters after code has been emitted.
void runFinalizersAfterEmit();
};
diff --git a/bolt/include/bolt/Rewrite/MetadataRewriter.h b/bolt/include/bolt/Rewrite/MetadataRewriter.h
index 12908089db428..1e7e0381c1e98 100644
--- a/bolt/include/bolt/Rewrite/MetadataRewriter.h
+++ b/bolt/include/bolt/Rewrite/MetadataRewriter.h
@@ -52,6 +52,9 @@ class MetadataRewriter {
/// Run the rewriter once the functions are in CFG state.
virtual Error postCFGInitializer() { return Error::success(); }
+ /// Run the pass before the binary is emitted.
+ virtual Error preEmitFinalizer() { return Error::success(); }
+
/// Finalize section contents based on the new context after the new code is
/// emitted.
virtual Error postEmitFinalizer() { return Error::success(); }
diff --git a/bolt/include/bolt/Rewrite/RewriteInstance.h b/bolt/include/bolt/Rewrite/RewriteInstance.h
index 495a3f1d7b7b4..3074ae77c7ef1 100644
--- a/bolt/include/bolt/Rewrite/RewriteInstance.h
+++ b/bolt/include/bolt/Rewrite/RewriteInstance.h
@@ -183,6 +183,9 @@ class RewriteInstance {
/// Process metadata in special sections after CFG is built for functions.
void processMetadataPostCFG();
+ /// Make changes to metadata before the binary is emitted.
+ void finalizeMetadataPreEmit();
+
/// Update debug and other auxiliary information in the file.
void updateMetadata();
diff --git a/bolt/lib/Rewrite/LinuxKernelRewriter.cpp b/bolt/lib/Rewrite/LinuxKernelRewriter.cpp
index 2f449da6206f2..0687c4836ced2 100644
--- a/bolt/lib/Rewrite/LinuxKernelRewriter.cpp
+++ b/bolt/lib/Rewrite/LinuxKernelRewriter.cpp
@@ -163,14 +163,18 @@ class LinuxKernelRewriter final : public MetadataRewriter {
return Error::success();
}
- Error postEmitFinalizer() override {
- updateLKMarkers();
-
+ Error preEmitFinalizer() override {
if (Error E = rewriteORCTables())
return E;
return Error::success();
}
+
+ Error postEmitFinalizer() override {
+ updateLKMarkers();
+
+ return Error::success();
+ }
};
Error LinuxKernelRewriter::markInstructions() {
diff --git a/bolt/lib/Rewrite/MetadataManager.cpp b/bolt/lib/Rewrite/MetadataManager.cpp
index 059b43f83328a..4ce44820d9eca 100644
--- a/bolt/lib/Rewrite/MetadataManager.cpp
+++ b/bolt/lib/Rewrite/MetadataManager.cpp
@@ -44,6 +44,18 @@ void MetadataManager::runInitializersPostCFG() {
}
}
+void MetadataManager::runFinalizersPreEmit() {
+ for (auto &Rewriter : Rewriters) {
+ LLVM_DEBUG(dbgs() << "BOLT-DEBUG: invoking " << Rewriter->getName()
+ << " before emitting binary context\n");
+ if (Error E = Rewriter->preEmitFinalizer()) {
+ errs() << "BOLT-ERROR: while running " << Rewriter->getName()
+ << " before emit: " << toString(std::move(E)) << '\n';
+ exit(1);
+ }
+ }
+}
+
void MetadataManager::runFinalizersAfterEmit() {
for (auto &Rewriter : Rewriters) {
LLVM_DEBUG(dbgs() << "BOLT-DEBUG: invoking " << Rewriter->getName()
diff --git a/bolt/lib/Rewrite/RewriteInstance.cpp b/bolt/lib/Rewrite/RewriteInstance.cpp
index f5a8a5b716874..d24bd18c08409 100644
--- a/bolt/lib/Rewrite/RewriteInstance.cpp
+++ b/bolt/lib/Rewrite/RewriteInstance.cpp
@@ -742,6 +742,8 @@ Error RewriteInstance::run() {
runOptimizationPasses();
+ finalizeMetadataPreEmit();
+
emitAndLink();
updateMetadata();
@@ -3416,6 +3418,10 @@ void RewriteInstance::emitAndLink() {
}
}
+void RewriteInstance::finalizeMetadataPreEmit() {
+ MetadataManager.runFinalizersPreEmit();
+}
+
void RewriteInstance::updateMetadata() {
MetadataManager.runFinalizersAfterEmit();
More information about the llvm-commits
mailing list