diff --git a/llvm/include/llvm/CodeGen/SanitizerBinaryMetadata.h b/llvm/include/llvm/CodeGen/SanitizerBinaryMetadata.h new file mode 100644 index 0000000000000..6cf2e11aa911e --- /dev/null +++ b/llvm/include/llvm/CodeGen/SanitizerBinaryMetadata.h @@ -0,0 +1,26 @@ +//===- llvm/CodeGen/SanitizerBinaryMetadata.h -------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CODEGEN_SANITIZERBINARYMETADATA_H +#define LLVM_CODEGEN_SANITIZERBINARYMETADATA_H + +#include "llvm/CodeGen/MachinePassManager.h" + +namespace llvm { + +class MachineSanitizerBinaryMetadataPass + : public PassInfoMixin { +public: + PreservedAnalyses run(MachineFunction &MF, + MachineFunctionAnalysisManager &MFAM); + static bool isRequired() { return true; } +}; + +} // namespace llvm + +#endif // LLVM_CODEGEN_SANITIZERBINARYMETADATA_H diff --git a/llvm/include/llvm/InitializePasses.h b/llvm/include/llvm/InitializePasses.h index 3242ccff7f879..71486ab52e348 100644 --- a/llvm/include/llvm/InitializePasses.h +++ b/llvm/include/llvm/InitializePasses.h @@ -208,7 +208,7 @@ void initializeStaticDataAnnotatorPass(PassRegistry &); void initializeMachinePipelinerPass(PassRegistry &); void initializeMachinePostDominatorTreeWrapperPassPass(PassRegistry &); void initializeMachineRegionInfoPassPass(PassRegistry &); -void initializeMachineSanitizerBinaryMetadataPass(PassRegistry &); +void initializeMachineSanitizerBinaryMetadataLegacyPass(PassRegistry &); void initializeMachineSchedulerLegacyPass(PassRegistry &); void initializeMachineSinkingLegacyPass(PassRegistry &); void initializeMachineTraceMetricsWrapperPassPass(PassRegistry &); diff --git a/llvm/include/llvm/Passes/CodeGenPassBuilder.h b/llvm/include/llvm/Passes/CodeGenPassBuilder.h index 6e2c2683730cc..ab9e7b2d23b9f 100644 --- a/llvm/include/llvm/Passes/CodeGenPassBuilder.h +++ b/llvm/include/llvm/Passes/CodeGenPassBuilder.h @@ -79,6 +79,7 @@ #include "llvm/CodeGen/RenameIndependentSubregs.h" #include "llvm/CodeGen/ReplaceWithVeclib.h" #include "llvm/CodeGen/SafeStack.h" +#include "llvm/CodeGen/SanitizerBinaryMetadata.h" #include "llvm/CodeGen/SelectOptimize.h" #include "llvm/CodeGen/ShadowStackGCLowering.h" #include "llvm/CodeGen/SjLjEHPrepare.h" @@ -1008,7 +1009,7 @@ Error CodeGenPassBuilder::addMachinePasses( addPass(StackMapLivenessPass()); addPass(LiveDebugValuesPass( getTM().Options.ShouldEmitDebugEntryValues())); - addPass(MachineSanitizerBinaryMetadata()); + addPass(MachineSanitizerBinaryMetadataPass()); if (TM.Options.EnableMachineOutliner && getOptLevel() != CodeGenOptLevel::None && diff --git a/llvm/include/llvm/Passes/MachinePassRegistry.def b/llvm/include/llvm/Passes/MachinePassRegistry.def index 94febae16eeec..076daf0b40ccf 100644 --- a/llvm/include/llvm/Passes/MachinePassRegistry.def +++ b/llvm/include/llvm/Passes/MachinePassRegistry.def @@ -150,6 +150,7 @@ MACHINE_FUNCTION_PASS("localstackalloc", LocalStackSlotAllocationPass()) MACHINE_FUNCTION_PASS("machine-cp", MachineCopyPropagationPass()) MACHINE_FUNCTION_PASS("machine-cse", MachineCSEPass()) MACHINE_FUNCTION_PASS("machine-latecleanup", MachineLateInstrsCleanupPass()) +MACHINE_FUNCTION_PASS("machine-sanmd", MachineSanitizerBinaryMetadataPass()) MACHINE_FUNCTION_PASS("machine-scheduler", MachineSchedulerPass(TM)) MACHINE_FUNCTION_PASS("machinelicm", MachineLICMPass()) MACHINE_FUNCTION_PASS("no-op-machine-function", NoOpMachineFunctionPass()) @@ -298,7 +299,6 @@ DUMMY_MACHINE_FUNCTION_PASS("lrshrink", LiveRangeShrinkPass) DUMMY_MACHINE_FUNCTION_PASS("machine-combiner", MachineCombinerPass) DUMMY_MACHINE_FUNCTION_PASS("static-data-splitter", StaticDataSplitter) DUMMY_MACHINE_FUNCTION_PASS("machine-function-splitter", MachineFunctionSplitterPass) -DUMMY_MACHINE_FUNCTION_PASS("machine-sanmd", MachineSanitizerBinaryMetadata) DUMMY_MACHINE_FUNCTION_PASS("machine-uniformity", MachineUniformityInfoWrapperPass) DUMMY_MACHINE_FUNCTION_PASS("machineinstr-printer", MachineFunctionPrinterPass) DUMMY_MACHINE_FUNCTION_PASS("mirfs-discriminators", MIRAddFSDiscriminatorsPass) diff --git a/llvm/lib/CodeGen/CodeGen.cpp b/llvm/lib/CodeGen/CodeGen.cpp index b77cefca00b73..0581598432487 100644 --- a/llvm/lib/CodeGen/CodeGen.cpp +++ b/llvm/lib/CodeGen/CodeGen.cpp @@ -90,7 +90,7 @@ void llvm::initializeCodeGen(PassRegistry &Registry) { initializeMachineOptimizationRemarkEmitterPassPass(Registry); initializeMachineOutlinerPass(Registry); initializeMachinePipelinerPass(Registry); - initializeMachineSanitizerBinaryMetadataPass(Registry); + initializeMachineSanitizerBinaryMetadataLegacyPass(Registry); initializeModuloScheduleTestPass(Registry); initializeMachinePostDominatorTreeWrapperPassPass(Registry); initializeMachineRegionInfoPassPass(Registry); diff --git a/llvm/lib/CodeGen/SanitizerBinaryMetadata.cpp b/llvm/lib/CodeGen/SanitizerBinaryMetadata.cpp index 9002a70768401..5cd35cc79d8a1 100644 --- a/llvm/lib/CodeGen/SanitizerBinaryMetadata.cpp +++ b/llvm/lib/CodeGen/SanitizerBinaryMetadata.cpp @@ -11,7 +11,7 @@ // //===----------------------------------------------------------------------===// -#include "llvm/Transforms/Instrumentation/SanitizerBinaryMetadata.h" +#include "llvm/CodeGen/SanitizerBinaryMetadata.h" #include "llvm/CodeGen/MachineFrameInfo.h" #include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/MachineFunctionPass.h" @@ -20,34 +20,56 @@ #include "llvm/IR/MDBuilder.h" #include "llvm/InitializePasses.h" #include "llvm/Pass.h" +#include "llvm/Transforms/Instrumentation/SanitizerBinaryMetadata.h" #include using namespace llvm; namespace { -class MachineSanitizerBinaryMetadata : public MachineFunctionPass { +// FIXME: This pass modifies Function metadata, which is not to be done in +// MachineFunctionPass. It should probably be moved to a FunctionPass. +class MachineSanitizerBinaryMetadataLegacy : public MachineFunctionPass { public: static char ID; - MachineSanitizerBinaryMetadata(); + MachineSanitizerBinaryMetadataLegacy(); bool runOnMachineFunction(MachineFunction &F) override; }; + +struct MachineSanitizerBinaryMetadata { + bool run(MachineFunction &MF); +}; + } // namespace -INITIALIZE_PASS(MachineSanitizerBinaryMetadata, "machine-sanmd", +INITIALIZE_PASS(MachineSanitizerBinaryMetadataLegacy, "machine-sanmd", "Machine Sanitizer Binary Metadata", false, false) -char MachineSanitizerBinaryMetadata::ID = 0; +char MachineSanitizerBinaryMetadataLegacy::ID = 0; char &llvm::MachineSanitizerBinaryMetadataID = - MachineSanitizerBinaryMetadata::ID; + MachineSanitizerBinaryMetadataLegacy::ID; -MachineSanitizerBinaryMetadata::MachineSanitizerBinaryMetadata() +MachineSanitizerBinaryMetadataLegacy::MachineSanitizerBinaryMetadataLegacy() : MachineFunctionPass(ID) { - initializeMachineSanitizerBinaryMetadataPass( + initializeMachineSanitizerBinaryMetadataLegacyPass( *PassRegistry::getPassRegistry()); } -bool MachineSanitizerBinaryMetadata::runOnMachineFunction(MachineFunction &MF) { +bool MachineSanitizerBinaryMetadataLegacy::runOnMachineFunction( + MachineFunction &MF) { + return MachineSanitizerBinaryMetadata().run(MF); +} + +PreservedAnalyses +MachineSanitizerBinaryMetadataPass::run(MachineFunction &MF, + MachineFunctionAnalysisManager &MFAM) { + if (!MachineSanitizerBinaryMetadata().run(MF)) + return PreservedAnalyses::all(); + + return getMachineFunctionPassPreservedAnalyses(); +} + +bool MachineSanitizerBinaryMetadata::run(MachineFunction &MF) { MDNode *MD = MF.getFunction().getMetadata(LLVMContext::MD_pcsections); if (!MD) return false; diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp index 215355827337a..d5c5098725972 100644 --- a/llvm/lib/Passes/PassBuilder.cpp +++ b/llvm/lib/Passes/PassBuilder.cpp @@ -153,6 +153,7 @@ #include "llvm/CodeGen/RemoveRedundantDebugValues.h" #include "llvm/CodeGen/RenameIndependentSubregs.h" #include "llvm/CodeGen/SafeStack.h" +#include "llvm/CodeGen/SanitizerBinaryMetadata.h" #include "llvm/CodeGen/SelectOptimize.h" #include "llvm/CodeGen/ShadowStackGCLowering.h" #include "llvm/CodeGen/SjLjEHPrepare.h" diff --git a/llvm/test/tools/llc/new-pm/pipeline.ll b/llvm/test/tools/llc/new-pm/pipeline.ll index d1a50642ea311..c1ed0203f83a4 100644 --- a/llvm/test/tools/llc/new-pm/pipeline.ll +++ b/llvm/test/tools/llc/new-pm/pipeline.ll @@ -1,5 +1,5 @@ ; RUN: llc -mtriple=x86_64-pc-linux-gnu -enable-new-pm -print-pipeline-passes -filetype=null %s | FileCheck %s ; CHECK: require,require -; CHECK: MachineSanitizerBinaryMetadata +; CHECK: machine-sanmd