llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang-codegen Author: Dan Blackwell (DanBlackwell) <details> <summary>Changes</summary> Currently we do not emit lifetimes by default when compiling with memtag-stack - which means we don't catch use-after-scope (when compiling without optimization). This patch fixes that by mirroring ASan, HWASan and MSan, and always emitting lifetime markers. The patch is based on the changes made in aeca569. rdar://163713381 --- Full diff: https://github.com/llvm/llvm-project/pull/177130.diff 6 Files Affected: - (modified) clang/lib/CodeGen/CGExpr.cpp (+1) - (modified) clang/lib/CodeGen/CodeGenFunction.cpp (+2-1) - (modified) clang/test/CodeGen/lifetime-sanitizer.c (+3) - (modified) clang/test/CodeGenCXX/lifetime-sanitizer.cpp (+3) - (modified) llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp (+2-1) - (modified) llvm/test/Transforms/InstCombine/lifetime-sanitizer.ll (+15) ``````````diff diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp index 2a5ae8da72512..76a3939cd28eb 100644 --- a/clang/lib/CodeGen/CGExpr.cpp +++ b/clang/lib/CodeGen/CGExpr.cpp @@ -620,6 +620,7 @@ EmitMaterializeTemporaryExpr(const MaterializeTemporaryExpr *M) { if (isInConditionalBranch() && !E->getType().isDestructedType() && ((!SanOpts.has(SanitizerKind::HWAddress) && !SanOpts.has(SanitizerKind::Memory) && + !SanOpts.has(SanitizerKind::MemtagStack) && !CGM.getCodeGenOpts().SanitizeAddressUseAfterScope) || inSuspendBlock())) { OldConditional = OutermostConditional; diff --git a/clang/lib/CodeGen/CodeGenFunction.cpp b/clang/lib/CodeGen/CodeGenFunction.cpp index bec359eb2b6b3..1ddcfbbe6461b 100644 --- a/clang/lib/CodeGen/CodeGenFunction.cpp +++ b/clang/lib/CodeGen/CodeGenFunction.cpp @@ -69,7 +69,8 @@ static bool shouldEmitLifetimeMarkers(const CodeGenOptions &CGOpts, // Sanitizers may use markers. if (CGOpts.SanitizeAddressUseAfterScope || LangOpts.Sanitize.has(SanitizerKind::HWAddress) || - LangOpts.Sanitize.has(SanitizerKind::Memory)) + LangOpts.Sanitize.has(SanitizerKind::Memory) || + LangOpts.Sanitize.has(SanitizerKind::MemtagStack)) return true; // For now, only in optimized builds. diff --git a/clang/test/CodeGen/lifetime-sanitizer.c b/clang/test/CodeGen/lifetime-sanitizer.c index 4d36bd7a9fee5..e529dccc35cc4 100644 --- a/clang/test/CodeGen/lifetime-sanitizer.c +++ b/clang/test/CodeGen/lifetime-sanitizer.c @@ -12,6 +12,9 @@ // RUN: %clang -target aarch64-linux-gnu -S -emit-llvm -o - -O0 \ // RUN: -fsanitize=hwaddress -Xclang -disable-llvm-passes %s | \ // RUN: FileCheck %s -check-prefix=LIFETIME +// RUN: %clang -target aarch64-linux-gnu -S -emit-llvm -o - -O0 \ +// RUN: -fsanitize=memtag-stack -march=armv8a+memtag -Xclang -disable-llvm-passes %s | \ +// RUN: FileCheck %s -check-prefix=LIFETIME extern int bar(char *A, int n); diff --git a/clang/test/CodeGenCXX/lifetime-sanitizer.cpp b/clang/test/CodeGenCXX/lifetime-sanitizer.cpp index 225d5e28921b8..a1557b03082b6 100644 --- a/clang/test/CodeGenCXX/lifetime-sanitizer.cpp +++ b/clang/test/CodeGenCXX/lifetime-sanitizer.cpp @@ -13,6 +13,9 @@ // RUN: %clang -w -target aarch64-linux-gnu -S -emit-llvm -o - -fno-exceptions -O0 \ // RUN: -fsanitize=hwaddress -Xclang -disable-llvm-passes %s | \ // RUN: FileCheck %s -check-prefixes=CHECK,LIFETIME +// RUN: %clang -w -target aarch64-linux-gnu -S -emit-llvm -o - -fno-exceptions -O0 \ +// RUN: -fsanitize=memtag-stack -march=armv8a+memtag -Xclang -disable-llvm-passes %s | \ +// RUN: FileCheck %s -check-prefixes=CHECK,LIFETIME extern int bar(char *A, int n); diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp index b870ac259d3b0..00b45545178ae 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp @@ -3524,7 +3524,8 @@ Instruction *InstCombinerImpl::visitCallInst(CallInst &CI) { // even for empty lifetime range. if (II->getFunction()->hasFnAttribute(Attribute::SanitizeAddress) || II->getFunction()->hasFnAttribute(Attribute::SanitizeMemory) || - II->getFunction()->hasFnAttribute(Attribute::SanitizeHWAddress)) + II->getFunction()->hasFnAttribute(Attribute::SanitizeHWAddress) || + II->getFunction()->hasFnAttribute(Attribute::SanitizeMemTag)) break; if (removeTriviallyEmptyRange(*II, *this, [](const IntrinsicInst &I) { diff --git a/llvm/test/Transforms/InstCombine/lifetime-sanitizer.ll b/llvm/test/Transforms/InstCombine/lifetime-sanitizer.ll index fd45fe2dd27d7..2f4e3e3528a2e 100644 --- a/llvm/test/Transforms/InstCombine/lifetime-sanitizer.ll +++ b/llvm/test/Transforms/InstCombine/lifetime-sanitizer.ll @@ -34,6 +34,21 @@ entry: ret void } +define void @memtag() sanitize_memtag { +entry: + ; CHECK-LABEL: @memtag( + %text = alloca i8, align 1 + + call void @llvm.lifetime.start.p0(ptr %text) + call void @llvm.lifetime.end.p0(ptr %text) + ; CHECK: call void @llvm.lifetime.start + ; CHECK-NEXT: call void @llvm.lifetime.end + + call void @foo(ptr %text) ; Keep alloca alive + + ret void +} + define void @msan() sanitize_memory { entry: ; CHECK-LABEL: @msan( `````````` </details> https://github.com/llvm/llvm-project/pull/177130 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
