From 8fa2e93538595e1ff973110cb3f301b65bc9d2eb Mon Sep 17 00:00:00 2001 From: "Henrik G. Olsson" Date: Wed, 30 Nov 2022 14:59:49 +0100 Subject: [PATCH] [clang] Do not merge traps in functions annotated optnone This aligns the behaviour with that of disabling optimisations for the translation unit entirely. Not merging the traps allows us to keep separate debug information for each, improving the debugging experience when finding the cause for a ubsan trap. Differential Revision: https://reviews.llvm.org/D137714 --- clang/lib/CodeGen/CGExpr.cpp | 3 ++- clang/test/CodeGen/ubsan-trap-debugloc.c | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp index d2d2ace..5021fc7 100644 --- a/clang/lib/CodeGen/CGExpr.cpp +++ b/clang/lib/CodeGen/CGExpr.cpp @@ -3550,7 +3550,8 @@ void CodeGenFunction::EmitTrapCheck(llvm::Value *Checked, TrapBBs.resize(CheckHandlerID + 1); llvm::BasicBlock *&TrapBB = TrapBBs[CheckHandlerID]; - if (!CGM.getCodeGenOpts().OptimizationLevel || !TrapBB) { + if (!CGM.getCodeGenOpts().OptimizationLevel || !TrapBB || + (CurCodeDecl && CurCodeDecl->hasAttr())) { TrapBB = createBasicBlock("trap"); Builder.CreateCondBr(Checked, Cont, TrapBB); EmitBlock(TrapBB); diff --git a/clang/test/CodeGen/ubsan-trap-debugloc.c b/clang/test/CodeGen/ubsan-trap-debugloc.c index d73cf73..4cad708 100644 --- a/clang/test/CodeGen/ubsan-trap-debugloc.c +++ b/clang/test/CodeGen/ubsan-trap-debugloc.c @@ -2,9 +2,23 @@ void foo(volatile int a) { + // CHECK-LABEL: @foo // CHECK: call void @llvm.ubsantrap(i8 0){{.*}} !dbg [[LOC:![0-9]+]] a = a + 1; a = a + 1; } +void bar(volatile int a) __attribute__((optnone)) { + // CHECK-LABEL: @bar + // CHECK: call void @llvm.ubsantrap(i8 0){{.*}} !dbg [[LOC2:![0-9]+]] + // CHECK: call void @llvm.ubsantrap(i8 0){{.*}} !dbg [[LOC3:![0-9]+]] + a = a + 1; + a = a + 1; +} + +// With optimisations enabled the traps are merged and need to share a debug location // CHECK: [[LOC]] = !DILocation(line: 0 + +// With optimisations disabled the traps are not merged and retain accurate debug locations +// CHECK: [[LOC2]] = !DILocation(line: 15, column: 9 +// CHECK: [[LOC3]] = !DILocation(line: 16, column: 9 -- 2.7.4