https://github.com/oontvoo updated https://github.com/llvm/llvm-project/pull/197789
>From 48bc3a4580675833dc69afcb8d6a4328644b6ce2 Mon Sep 17 00:00:00 2001 From: Vy Nguyen <[email protected]> Date: Thu, 14 May 2026 15:36:16 -0400 Subject: [PATCH 1/4] [codegen]Ensure __builtin_trap() has an unreachable --- clang/lib/CodeGen/CGBuiltin.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 20f99f489c55f..678985ebb55e1 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -4022,6 +4022,12 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID, } case Builtin::BI__builtin_trap: EmitTrapCall(Intrinsic::trap); + if (Builder.GetInsertBlock()) { + Builder.CreateUnreachable(); + // Dummy block for the ret void - it'll be clened up + llvm::BasicBlock *DeadBB = createBasicBlock("dead.trap"); + EmitBlock(DeadBB); + } return RValue::get(nullptr); case Builtin::BI__builtin_verbose_trap: { llvm::DILocation *TrapLocation = Builder.getCurrentDebugLocation(); >From b7c197092170a9a44030f950973ac941ca554d01 Mon Sep 17 00:00:00 2001 From: Vy Nguyen <[email protected]> Date: Thu, 14 May 2026 20:22:07 -0400 Subject: [PATCH 2/4] set no ret --- clang/lib/CodeGen/CGBuiltin.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 678985ebb55e1..c907bd829d149 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -4020,15 +4020,18 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID, Function *F = CGM.getIntrinsic(Intrinsic::clear_cache, {CGM.DefaultPtrTy}); return RValue::get(Builder.CreateCall(F, {Begin, End})); } - case Builtin::BI__builtin_trap: + case Builtin::BI__builtin_trap: { EmitTrapCall(Intrinsic::trap); + Trap->setDoesNotReturn(); + Trap->setDoesNotThrow(); + Builder.CreateUnreachable(); if (Builder.GetInsertBlock()) { - Builder.CreateUnreachable(); - // Dummy block for the ret void - it'll be clened up + // Dummy block for the ret void - it'll be cleaned up llvm::BasicBlock *DeadBB = createBasicBlock("dead.trap"); EmitBlock(DeadBB); } return RValue::get(nullptr); + } case Builtin::BI__builtin_verbose_trap: { llvm::DILocation *TrapLocation = Builder.getCurrentDebugLocation(); if (getDebugInfo()) { >From d2c974b04a8b9315d63127fa3b636ec0501b578a Mon Sep 17 00:00:00 2001 From: Vy Nguyen <[email protected]> Date: Thu, 14 May 2026 21:17:41 -0400 Subject: [PATCH 3/4] typo --- clang/lib/CodeGen/CGBuiltin.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index c907bd829d149..d01e00c7fd35d 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -4021,12 +4021,12 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID, return RValue::get(Builder.CreateCall(F, {Begin, End})); } case Builtin::BI__builtin_trap: { - EmitTrapCall(Intrinsic::trap); + llvm::CallInst *Trap = EmitTrapCall(Intrinsic::trap); Trap->setDoesNotReturn(); Trap->setDoesNotThrow(); Builder.CreateUnreachable(); if (Builder.GetInsertBlock()) { - // Dummy block for the ret void - it'll be cleaned up + // Dummy block for the ret void - it'll be cleaned up. llvm::BasicBlock *DeadBB = createBasicBlock("dead.trap"); EmitBlock(DeadBB); } >From ca1be1c1763d5fef010472f735b7aa835e3914fd Mon Sep 17 00:00:00 2001 From: Vy Nguyen <[email protected]> Date: Fri, 15 May 2026 08:47:31 -0400 Subject: [PATCH 4/4] update tests --- clang/test/CodeGen/amdgpu-builtin-is-invocable.c | 4 +++- clang/test/CodeGen/amdgpu-builtin-processor-is.c | 4 ++++ clang/test/CodeGen/attr-nomerge.cpp | 7 +++---- clang/test/CodeGen/pr53127.cpp | 2 ++ clang/test/CodeGenCXX/microsoft-abi-byval-vararg.cpp | 1 + clang/test/CodeGenCXX/trap-fnattr.cpp | 2 +- 6 files changed, 14 insertions(+), 6 deletions(-) diff --git a/clang/test/CodeGen/amdgpu-builtin-is-invocable.c b/clang/test/CodeGen/amdgpu-builtin-is-invocable.c index 5c6d7b25f3bf1..b92215be472ab 100644 --- a/clang/test/CodeGen/amdgpu-builtin-is-invocable.c +++ b/clang/test/CodeGen/amdgpu-builtin-is-invocable.c @@ -20,7 +20,7 @@ // AMDGCN-GFX1010-SAME: ) #[[ATTR0:[0-9]+]] { // AMDGCN-GFX1010-NEXT: [[ENTRY:.*:]] // AMDGCN-GFX1010-NEXT: call void @llvm.trap() -// AMDGCN-GFX1010-NEXT: ret void +// AMDGCN-GFX1010-NEXT: unreachable // // AMDGCNSPIRV-LABEL: define spir_func void @foo( // AMDGCNSPIRV-SAME: ) addrspace(4) #[[ATTR0:[0-9]+]] { @@ -38,6 +38,8 @@ // AMDGCNSPIRV-NEXT: br i1 [[TOBOOL3]], label %[[IF_THEN]], label %[[IF_END:.*]] // AMDGCNSPIRV: [[IF_THEN]]: // AMDGCNSPIRV-NEXT: call addrspace(4) void @llvm.trap() +// AMDGCNSPIRV-NEXT: unreachable +// AMDGCNSPIRV: dead.trap: // AMDGCNSPIRV-NEXT: br label %[[IF_END]] // AMDGCNSPIRV: [[IF_END]]: // AMDGCNSPIRV-NEXT: ret void diff --git a/clang/test/CodeGen/amdgpu-builtin-processor-is.c b/clang/test/CodeGen/amdgpu-builtin-processor-is.c index b2f04f11ecb54..70a00960b971c 100644 --- a/clang/test/CodeGen/amdgpu-builtin-processor-is.c +++ b/clang/test/CodeGen/amdgpu-builtin-processor-is.c @@ -14,6 +14,8 @@ // AMDGCN-GFX900-SAME: ) #[[ATTR0:[0-9]+]] { // AMDGCN-GFX900-NEXT: [[ENTRY:.*:]] // AMDGCN-GFX900-NEXT: call void @llvm.trap() +// AMDGCN-GFX900-NEXT: unreachable +// AMDGCN-GFX900: dead.trap: // AMDGCN-GFX900-NEXT: ret void // // AMDGCN-GFX1010-LABEL: define dso_local void @foo( @@ -45,6 +47,8 @@ // AMDGCNSPIRV-NEXT: br i1 [[TOBOOL7]], label %[[IF_THEN]], label %[[IF_END:.*]] // AMDGCNSPIRV: [[IF_THEN]]: // AMDGCNSPIRV-NEXT: call addrspace(4) void @llvm.trap() +// AMDGCNSPIRV-NEXT: unreachable +// AMDGCNSPIRV: dead.trap: // AMDGCNSPIRV-NEXT: br label %[[IF_END]] // AMDGCNSPIRV: [[IF_END]]: // AMDGCNSPIRV-NEXT: ret void diff --git a/clang/test/CodeGen/attr-nomerge.cpp b/clang/test/CodeGen/attr-nomerge.cpp index 1cf5bb1619b31..312e8ed62d5d9 100644 --- a/clang/test/CodeGen/attr-nomerge.cpp +++ b/clang/test/CodeGen/attr-nomerge.cpp @@ -100,10 +100,9 @@ void something_else_again() { // CHECK: load ptr, ptr // CHECK: %[[AG:.*]] = load ptr, ptr // CHECK-NEXT: call void %[[AG]](ptr {{.*}}) #[[ATTR1]] -// CHECK: call void @llvm.trap() #[[ATTR0]] -// CHECK: call void @llvm.debugtrap() #[[ATTR0]] -// CHECK: call void @llvm.trap() #[[ATTR0]] -// CHECK: call void @_ZN1AD1Ev(ptr {{.*}}) #[[ATTR1]] +// CHECK: call void @llvm.trap() #[[ATTR8:[0-9]+]] +// CHECK: unreachable // CHECK-DAG: attributes #[[ATTR0]] = {{{.*}}nomerge{{.*}}} // CHECK-DAG: attributes #[[ATTR1]] = {{{.*}}nomerge{{.*}}} +// CHECK-DAG attributes #[[ATTR8]] = { nomerge noreturn nounwind } diff --git a/clang/test/CodeGen/pr53127.cpp b/clang/test/CodeGen/pr53127.cpp index 5a52b4860eecd..473f4444410c7 100644 --- a/clang/test/CodeGen/pr53127.cpp +++ b/clang/test/CodeGen/pr53127.cpp @@ -15,6 +15,8 @@ void operator delete(void*); // CHECK-NEXT: br i1 [[CALL]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]] // CHECK: cond.true: // CHECK-NEXT: call void @llvm.trap() +// CHECK-NEXT: unreachable +// CHECK: dead.trap: // CHECK-NEXT: br label [[COND_END:%.*]] // CHECK: cond.false: // CHECK-NEXT: br label [[COND_END]] diff --git a/clang/test/CodeGenCXX/microsoft-abi-byval-vararg.cpp b/clang/test/CodeGenCXX/microsoft-abi-byval-vararg.cpp index 80ea63e2a1e10..f0f46dcc9faf5 100644 --- a/clang/test/CodeGenCXX/microsoft-abi-byval-vararg.cpp +++ b/clang/test/CodeGenCXX/microsoft-abi-byval-vararg.cpp @@ -41,6 +41,7 @@ void call_var_args() { } // CHECK-LABEL: define dso_local void @"?call_var_args@@YAXXZ"() +// FIXME all of these are after the trap so they should be gone. // CHECK: call void {{.*varargs_zero.*}}(ptr inalloca(<{ %struct.A }>) %{{.*}}) // CHECK: call void {{.*varargs_one.*}}(ptr inalloca(<{ i32, %struct.A }>) %{{.*}}) // CHECK: call void {{.*varargs_two.*}}(ptr inalloca(<{ i32, i32, %struct.A }>) %{{.*}}) diff --git a/clang/test/CodeGenCXX/trap-fnattr.cpp b/clang/test/CodeGenCXX/trap-fnattr.cpp index ed7162fc43a6c..0b377813fa89b 100644 --- a/clang/test/CodeGenCXX/trap-fnattr.cpp +++ b/clang/test/CodeGenCXX/trap-fnattr.cpp @@ -30,7 +30,7 @@ int test_add_overflow(int a, int b) { return a + b; } -// TRAPFUNC: attributes [[ATTR0]] = { {{.*}}"trap-func-name"="mytrap" } +// TRAPFUNC: attributes [[ATTR0]] = { noreturn no unwind "trap-func-name"="mytrap" } // TRAPFUNC: attributes [[ATTR1]] = { {{.*}}"trap-func-name"="mytrap" } // NOOPTION-NOT: attributes [[ATTR2]] = { {{.*}}"trap-func-name"="mytrap" } _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
