llvmbot wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-lto

Author: Marco Elver (melver)

<details>
<summary>Changes</summary>

Add support for running `AllocTokenPass` during the LTO backend phase,
controlled by a new internal option `-lto-alloc-token-mode`.

This is required to support running the pass after other heap allocation
optimizations (such as PGHO) in the LTO backend, avoiding interference
between them.

---

This change is part of the following series:
1. https://github.com/llvm/llvm-project/pull/169242
2. https://github.com/llvm/llvm-project/pull/169243
3. https://github.com/llvm/llvm-project/pull/169358
4. https://github.com/llvm/llvm-project/pull/169359
5. https://github.com/llvm/llvm-project/pull/169360

---
Full diff: https://github.com/llvm/llvm-project/pull/169358.diff


2 Files Affected:

- (modified) llvm/lib/LTO/LTOBackend.cpp (+33) 
- (added) llvm/test/LTO/X86/alloc-token.ll (+34) 


``````````diff
diff --git a/llvm/lib/LTO/LTOBackend.cpp b/llvm/lib/LTO/LTOBackend.cpp
index 93118becedbac..190cec4f5701c 100644
--- a/llvm/lib/LTO/LTOBackend.cpp
+++ b/llvm/lib/LTO/LTOBackend.cpp
@@ -31,6 +31,7 @@
 #include "llvm/Passes/PassBuilder.h"
 #include "llvm/Passes/PassPlugin.h"
 #include "llvm/Passes/StandardInstrumentations.h"
+#include "llvm/Support/AllocToken.h"
 #include "llvm/Support/Error.h"
 #include "llvm/Support/FileSystem.h"
 #include "llvm/Support/MemoryBuffer.h"
@@ -42,6 +43,7 @@
 #include "llvm/Target/TargetMachine.h"
 #include "llvm/TargetParser/SubtargetFeature.h"
 #include "llvm/Transforms/IPO/WholeProgramDevirt.h"
+#include "llvm/Transforms/Instrumentation/AllocToken.h"
 #include "llvm/Transforms/Utils/FunctionImportUtils.h"
 #include "llvm/Transforms/Utils/SplitModule.h"
 #include <optional>
@@ -68,6 +70,10 @@ static cl::opt<LTOBitcodeEmbedding> EmbedBitcode(
                           "Embed post merge, but before optimizations")),
     cl::desc("Embed LLVM bitcode in object files produced by LTO"));
 
+static cl::opt<std::string> LTOAllocTokenMode(
+    "lto-alloc-token-mode", cl::init(""),
+    cl::desc("Enable AllocToken instrumentation during LTO with chosen mode"));
+
 static cl::opt<bool> ThinLTOAssumeMerged(
     "thinlto-assume-merged", cl::init(false),
     cl::desc("Assume the input has already undergone ThinLTO function "
@@ -198,6 +204,31 @@ static void RegisterPassPlugins(ArrayRef<std::string> 
PassPlugins,
   }
 }
 
+// Register instrumentation passes that need to run late in the pipeline; these
+// are non-optimization passes and need to run after most optimizations to 
avoid
+// interfering with them (e.g. PGHO) or to capture the final state of the code.
+static void registerBackendInstrumentation(PassBuilder &PB) {
+  if (!LTOAllocTokenMode.empty()) {
+    AllocTokenOptions Opts;
+    if (auto Mode = getAllocTokenModeFromString(LTOAllocTokenMode))
+      Opts.Mode = *Mode;
+    else
+      report_fatal_error("invalid lto-alloc-token-mode: " +
+                         Twine(LTOAllocTokenMode));
+
+    // ThinLTO backend
+    PB.registerOptimizerLastEPCallback(
+        [Opts](ModulePassManager &MPM, OptimizationLevel, ThinOrFullLTOPhase) {
+          MPM.addPass(AllocTokenPass(Opts));
+        });
+    // Full LTO backend
+    PB.registerFullLinkTimeOptimizationLastEPCallback(
+        [Opts](ModulePassManager &MPM, OptimizationLevel) {
+          MPM.addPass(AllocTokenPass(Opts));
+        });
+  }
+}
+
 static std::unique_ptr<TargetMachine>
 createTargetMachine(const Config &Conf, const Target *TheTarget, Module &M) {
   const Triple &TheTriple = M.getTargetTriple();
@@ -277,6 +308,8 @@ static void runNewPMPasses(const Config &Conf, Module &Mod, 
TargetMachine *TM,
 
   RegisterPassPlugins(Conf.PassPlugins, PB);
 
+  registerBackendInstrumentation(PB);
+
   std::unique_ptr<TargetLibraryInfoImpl> TLII(
       new TargetLibraryInfoImpl(TM->getTargetTriple()));
   if (Conf.Freestanding)
diff --git a/llvm/test/LTO/X86/alloc-token.ll b/llvm/test/LTO/X86/alloc-token.ll
new file mode 100644
index 0000000000000..873b7c94620bc
--- /dev/null
+++ b/llvm/test/LTO/X86/alloc-token.ll
@@ -0,0 +1,34 @@
+; RUN: llvm-as %s -o %t.bc
+;
+; RUN: llvm-lto2 run -lto-alloc-token-mode=default %t.bc -o %t.out \
+; RUN:   -r=%t.bc,main,plx \
+; RUN:   -r=%t.bc,_Znwm, \
+; RUN:   -r=%t.bc,sink,pl
+; RUN: llvm-objdump -d -r %t.out.0 | FileCheck %s 
--check-prefixes=CHECK,DEFAULT
+;
+; RUN: llvm-lto2 run -lto-alloc-token-mode=default -alloc-token-fast-abi 
-alloc-token-max=1 %t.bc -o %t.out \
+; RUN:   -r=%t.bc,main,plx \
+; RUN:   -r=%t.bc,_Znwm, \
+; RUN:   -r=%t.bc,sink,pl
+; RUN: llvm-objdump -d -r %t.out.0 | FileCheck %s 
--check-prefixes=CHECK,FASTABI
+
+target datalayout = 
"e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+declare ptr @_Znwm(i64) #0
+
+@sink = global ptr null
+
+; CHECK-LABEL: <main>:
+; CHECK: callq
+; DEFAULT-NEXT: R_X86_64_PLT32 __alloc_token__Znwm
+; FASTABI-NEXT: R_X86_64_PLT32 __alloc_token_0__Znwm
+define void @main() sanitize_alloc_token {
+  %call = call ptr @_Znwm(i64 8) #0, !alloc_token !0
+  store volatile ptr %call, ptr @sink
+  ret void
+}
+
+attributes #0 = { nobuiltin allocsize(0) }
+
+!0 = !{!"int", i1 0}

``````````

</details>


https://github.com/llvm/llvm-project/pull/169358
_______________________________________________
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits

Reply via email to