vitalybuka created this revision. vitalybuka added a reviewer: eugenis. Herald added subscribers: llvm-commits, cfe-commits, dexonsmith, steven_wu, hiraditya, inglorion. Herald added projects: clang, LLVM.
Depends on D80039 <https://reviews.llvm.org/D80039>. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D80046 Files: clang/lib/CodeGen/BackendUtil.cpp clang/test/Driver/memtag_lto.c llvm/include/llvm/Analysis/StackSafetyAnalysis.h llvm/lib/Analysis/StackSafetyAnalysis.cpp llvm/lib/Passes/PassBuilder.cpp llvm/lib/Passes/PassRegistry.def llvm/lib/Transforms/IPO/PassManagerBuilder.cpp
Index: llvm/lib/Transforms/IPO/PassManagerBuilder.cpp =================================================================== --- llvm/lib/Transforms/IPO/PassManagerBuilder.cpp +++ llvm/lib/Transforms/IPO/PassManagerBuilder.cpp @@ -22,6 +22,7 @@ #include "llvm/Analysis/InlineCost.h" #include "llvm/Analysis/Passes.h" #include "llvm/Analysis/ScopedNoAliasAA.h" +#include "llvm/Analysis/StackSafetyAnalysis.h" #include "llvm/Analysis/TargetLibraryInfo.h" #include "llvm/Analysis/TypeBasedAliasAnalysis.h" #include "llvm/IR/DataLayout.h" @@ -916,6 +917,10 @@ // Apply whole-program devirtualization and virtual constant propagation. PM.add(createWholeProgramDevirtPass(ExportSummary, nullptr)); + // Add stack safety metatada if needed. + PM.add(createStackSafetyGlobalInfoWrapperPass( + /*SetMetadata=*/true, /*Optional=*/true)); + // That's all we need at opt level 1. if (OptLevel == 1) return; Index: llvm/lib/Passes/PassRegistry.def =================================================================== --- llvm/lib/Passes/PassRegistry.def +++ llvm/lib/Passes/PassRegistry.def @@ -96,7 +96,7 @@ MODULE_PASS("kasan-module", ModuleAddressSanitizerPass(/*CompileKernel=*/true, false, true, false)) MODULE_PASS("sancov-module", ModuleSanitizerCoveragePass()) MODULE_PASS("poison-checking", PoisonCheckingPass()) -MODULE_PASS("stack-safety-annotator", StackSafetyGlobalAnnotatorPass()) +MODULE_PASS("stack-safety-annotator", StackSafetyGlobalAnnotatorPass(/*Optional=*/false)) #undef MODULE_PASS #ifndef CGSCC_ANALYSIS Index: llvm/lib/Passes/PassBuilder.cpp =================================================================== --- llvm/lib/Passes/PassBuilder.cpp +++ llvm/lib/Passes/PassBuilder.cpp @@ -1288,6 +1288,9 @@ // is fixed. MPM.addPass(WholeProgramDevirtPass(ExportSummary, nullptr)); + // Add stack safety metatada if needed. + MPM.addPass(StackSafetyGlobalAnnotatorPass(true)); + // Stop here at -O1. if (Level == OptimizationLevel::O1) { // The LowerTypeTestsPass needs to run to lower type metadata and the Index: llvm/lib/Analysis/StackSafetyAnalysis.cpp =================================================================== --- llvm/lib/Analysis/StackSafetyAnalysis.cpp +++ llvm/lib/Analysis/StackSafetyAnalysis.cpp @@ -603,6 +603,13 @@ return Changed; } +bool hasInterestingFunctions(const Module &M) { + for (auto &F : M.functions()) + if (F.hasFnAttribute(Attribute::SanitizeMemTag)) + return true; + return false; +} + } // end anonymous namespace StackSafetyInfo::StackSafetyInfo() = default; @@ -676,6 +683,8 @@ PreservedAnalyses StackSafetyGlobalAnnotatorPass::run(Module &M, ModuleAnalysisManager &AM) { + if (Optional && !hasInterestingFunctions(M)) + return PreservedAnalyses::all(); auto &SSGI = AM.getResult<StackSafetyGlobalAnalysis>(M); (void)setStackSafetyMetadata(M, SSGI); return PreservedAnalyses::all(); @@ -684,8 +693,8 @@ char StackSafetyGlobalInfoWrapperPass::ID = 0; StackSafetyGlobalInfoWrapperPass::StackSafetyGlobalInfoWrapperPass( - bool SetMetadata) - : ModulePass(ID), SetMetadata(SetMetadata) { + bool SetMetadata, bool Optional) + : ModulePass(ID), SetMetadata(SetMetadata), Optional(Optional) { initializeStackSafetyGlobalInfoWrapperPassPass( *PassRegistry::getPassRegistry()); } @@ -701,6 +710,9 @@ } bool StackSafetyGlobalInfoWrapperPass::runOnModule(Module &M) { + if (Optional && !hasInterestingFunctions(M)) + return false; + StackSafetyDataFlowAnalysis SSDFA( M, [this](Function &F) -> const StackSafetyInfo & { return getAnalysis<StackSafetyInfoWrapperPass>(F).getResult(); @@ -709,8 +721,9 @@ return SetMetadata ? setStackSafetyMetadata(M, SSGI) : false; } -ModulePass *llvm::createStackSafetyGlobalInfoWrapperPass(bool SetMetadata) { - return new StackSafetyGlobalInfoWrapperPass(SetMetadata); +ModulePass *llvm::createStackSafetyGlobalInfoWrapperPass(bool SetMetadata, + bool Optional) { + return new StackSafetyGlobalInfoWrapperPass(SetMetadata, Optional); } static const char LocalPassArg[] = "stack-safety-local"; Index: llvm/include/llvm/Analysis/StackSafetyAnalysis.h =================================================================== --- llvm/include/llvm/Analysis/StackSafetyAnalysis.h +++ llvm/include/llvm/Analysis/StackSafetyAnalysis.h @@ -98,11 +98,16 @@ PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM); }; +// Attaches StackSafety metadata to allocas. class StackSafetyGlobalAnnotatorPass : public PassInfoMixin<StackSafetyGlobalAnnotatorPass> { + bool Optional = false; + public: - explicit StackSafetyGlobalAnnotatorPass() {} + // When Optional is true the pass does nothing if no consumers of meta + // information is expected. + explicit StackSafetyGlobalAnnotatorPass(bool Optional) : Optional(Optional) {} PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM); }; @@ -111,11 +116,13 @@ class StackSafetyGlobalInfoWrapperPass : public ModulePass { StackSafetyGlobalInfo SSGI; bool SetMetadata; + bool Optional; public: static char ID; - StackSafetyGlobalInfoWrapperPass(bool SetMetadata = false); + explicit StackSafetyGlobalInfoWrapperPass(bool SetMetadata = false, + bool Optional = false); const StackSafetyGlobalInfo &getResult() const { return SSGI; } @@ -125,7 +132,11 @@ bool runOnModule(Module &M) override; }; -ModulePass *createStackSafetyGlobalInfoWrapperPass(bool SetMetadata); +// Attaches StackSafety metadata to allocas. +// When Optional is true the pass does nothing if no consumers of meta +// information is expected. +ModulePass *createStackSafetyGlobalInfoWrapperPass(bool SetMetadata, + bool Optional); } // end namespace llvm Index: clang/test/Driver/memtag_lto.c =================================================================== --- clang/test/Driver/memtag_lto.c +++ clang/test/Driver/memtag_lto.c @@ -75,8 +75,7 @@ // RUN: -r %t.lto1.bc,w, \ // RUN: -r %t.lto2.bc,use,plx \ // RUN: -r %t.lto2.bc,z, -// FIXME: Must be -check-prefixes=XSAFE,YSAFE -// RUN: llvm-dis %t.lto.0.5.precodegen.bc -o - | FileCheck %s -check-prefixes=XUNSAFE,YSAFE +// RUN: llvm-dis %t.lto.0.5.precodegen.bc -o - | FileCheck %s -check-prefixes=XSAFE,YSAFE // Full LTO, new PM: both are safe. // RUN: %clang -fexperimental-new-pass-manager -O1 -target aarch64-unknown-linux -march=armv8+memtag -fsanitize=memtag -c %s -flto=full -o %t.ltonewpm1.bc @@ -88,8 +87,7 @@ // RUN: -r %t.ltonewpm1.bc,w, \ // RUN: -r %t.ltonewpm2.bc,use,plx \ // RUN: -r %t.ltonewpm2.bc,z, -// FIXME: Must be -check-prefixes=XSAFE,YSAFE -// RUN: llvm-dis %t.ltonewpm.0.5.precodegen.bc -o - | FileCheck %s -check-prefixes=XUNSAFE,YSAFE +// RUN: llvm-dis %t.ltonewpm.0.5.precodegen.bc -o - | FileCheck %s -check-prefixes=XSAFE,YSAFE // Thin LTO: both are safe. // RUN: %clang -fno-experimental-new-pass-manager -O1 -target aarch64-unknown-linux -march=armv8+memtag -fsanitize=memtag -c %s -flto=thin -o %t.thinlto1.bc Index: clang/lib/CodeGen/BackendUtil.cpp =================================================================== --- clang/lib/CodeGen/BackendUtil.cpp +++ clang/lib/CodeGen/BackendUtil.cpp @@ -353,7 +353,8 @@ static void addMemTagOptimizationPasses(const PassManagerBuilder &Builder, legacy::PassManagerBase &PM) { - PM.add(createStackSafetyGlobalInfoWrapperPass(/*SetMetadata=*/true)); + PM.add(createStackSafetyGlobalInfoWrapperPass(/*SetMetadata=*/true, + /*Optional=*/true)); } static TargetLibraryInfoImpl *createTLII(llvm::Triple &TargetTriple, @@ -1346,7 +1347,7 @@ if (CodeGenOpts.OptimizationLevel > 0 && LangOpts.Sanitize.has(SanitizerKind::MemTag)) { - MPM.addPass(StackSafetyGlobalAnnotatorPass()); + MPM.addPass(StackSafetyGlobalAnnotatorPass(/*Optional=*/true)); } if (CodeGenOpts.OptimizationLevel == 0) {
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits