smeenai created this revision. smeenai added reviewers: efriedma, jyknight, rnk, MaskRay. Herald added a subscriber: kristof.beyls. Herald added a project: All. smeenai requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
This enables debuggers to step past that frame on architectures that don't use DWARF unwinding (such as armv7) even without debug info. The problem should theoretically be architecture-agnostic, but according to https://discourse.llvm.org/t/51633/2 it gets masked on architectures that use DWARF unwind info. Fixes https://github.com/llvm/llvm-project/issues/40696 Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D151393 Files: clang/lib/CodeGen/ItaniumCXXABI.cpp clang/test/CodeGenCXX/clang-call-terminate.uwtable.cpp Index: clang/test/CodeGenCXX/clang-call-terminate.uwtable.cpp =================================================================== --- /dev/null +++ clang/test/CodeGenCXX/clang-call-terminate.uwtable.cpp @@ -0,0 +1,15 @@ +// RUN: %clang_cc1 -triple=x86_64-linux-gnu -fexceptions -fcxx-exceptions -emit-llvm -o - %s | \ +// RUN: FileCheck --check-prefixes=CHECK,NOUNWIND %s +// RUN: %clang_cc1 -triple=x86_64-linux-gnu -fexceptions -fcxx-exceptions -funwind-tables=1 -emit-llvm -o - %s | \ +// RUN: FileCheck --check-prefixes=CHECK,SYNCUNWIND %s +// RUN: %clang_cc1 -triple=x86_64-linux-gnu -fexceptions -fcxx-exceptions -funwind-tables=2 -emit-llvm -o - %s | \ +// RUN: FileCheck --check-prefixes=CHECK,ASYNCUNWIND %s + +void caller(void callback()) noexcept { callback(); } + +// CHECK: define {{.*}}void @__clang_call_terminate({{[^)]*}}) #[[#ATTRNUM:]] +// CHECK: attributes #[[#ATTRNUM]] = { +// NOUNWIND-NOT: uwtable +// NOUNWIND-SAME: } +// SYNCUNWIND-SAME: uwtable(sync) +// ASYNCUNWIND-SAME: uwtable{{ }} Index: clang/lib/CodeGen/ItaniumCXXABI.cpp =================================================================== --- clang/lib/CodeGen/ItaniumCXXABI.cpp +++ clang/lib/CodeGen/ItaniumCXXABI.cpp @@ -4692,6 +4692,11 @@ fn->setDoesNotThrow(); fn->setDoesNotReturn(); + // Ensure stack traces can progress past this frame (e.g. for debuggers). + const CodeGenOptions &CodeGenOpts = CGM.getCodeGenOpts(); + if (CodeGenOpts.UnwindTables) + fn->setUWTableKind(llvm::UWTableKind(CodeGenOpts.UnwindTables)); + // What we really want is to massively penalize inlining without // forbidding it completely. The difference between that and // 'noinline' is negligible.
Index: clang/test/CodeGenCXX/clang-call-terminate.uwtable.cpp =================================================================== --- /dev/null +++ clang/test/CodeGenCXX/clang-call-terminate.uwtable.cpp @@ -0,0 +1,15 @@ +// RUN: %clang_cc1 -triple=x86_64-linux-gnu -fexceptions -fcxx-exceptions -emit-llvm -o - %s | \ +// RUN: FileCheck --check-prefixes=CHECK,NOUNWIND %s +// RUN: %clang_cc1 -triple=x86_64-linux-gnu -fexceptions -fcxx-exceptions -funwind-tables=1 -emit-llvm -o - %s | \ +// RUN: FileCheck --check-prefixes=CHECK,SYNCUNWIND %s +// RUN: %clang_cc1 -triple=x86_64-linux-gnu -fexceptions -fcxx-exceptions -funwind-tables=2 -emit-llvm -o - %s | \ +// RUN: FileCheck --check-prefixes=CHECK,ASYNCUNWIND %s + +void caller(void callback()) noexcept { callback(); } + +// CHECK: define {{.*}}void @__clang_call_terminate({{[^)]*}}) #[[#ATTRNUM:]] +// CHECK: attributes #[[#ATTRNUM]] = { +// NOUNWIND-NOT: uwtable +// NOUNWIND-SAME: } +// SYNCUNWIND-SAME: uwtable(sync) +// ASYNCUNWIND-SAME: uwtable{{ }} Index: clang/lib/CodeGen/ItaniumCXXABI.cpp =================================================================== --- clang/lib/CodeGen/ItaniumCXXABI.cpp +++ clang/lib/CodeGen/ItaniumCXXABI.cpp @@ -4692,6 +4692,11 @@ fn->setDoesNotThrow(); fn->setDoesNotReturn(); + // Ensure stack traces can progress past this frame (e.g. for debuggers). + const CodeGenOptions &CodeGenOpts = CGM.getCodeGenOpts(); + if (CodeGenOpts.UnwindTables) + fn->setUWTableKind(llvm::UWTableKind(CodeGenOpts.UnwindTables)); + // What we really want is to massively penalize inlining without // forbidding it completely. The difference between that and // 'noinline' is negligible.
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits