From 1ae04916cca78d8a7f024c3069122be46efda111 Mon Sep 17 00:00:00 2001 From: David Blaikie Date: Tue, 13 Jan 2015 23:06:27 +0000 Subject: [PATCH] DebugInfo: Correct the location of EH cleanup for blocks This was previously piggybacking on whatever happened to be the last location set on CGDebugInfo/DIBuilder, which was wrong (it was often the current location, such as the 'fn()' call site, not the end of the block). With my improvements to set/unset the location in a scoped manner (r225000) this went from a bad quality situation, to a crash. Fixing this goes part-way to unblocking the recommit of r225000. It's likely that any call to CodeGenFunction::StartFunction without the CurEHLocation set represents a similar bug or risk of a bug. Perhaps there are some callers that know they won't generate EH cleanups, but I'm not sure. I considered a generic catch-fix in StartFunction (just fallback to the GlobalDecl's location) but that seemed like it'd mask bugs where the EH location shouldn't be the same as the decl's location (& indeed by not using that stop-gap I found this bug). We'll see how long I can hold out on the generic catch-all. I might eventually be able to add an assertion in. llvm-svn: 225845 --- clang/lib/CodeGen/CGBlocks.cpp | 2 ++ clang/test/CodeGenObjCXX/debug-info-line.mm | 16 ++++++++++++++++ 2 files changed, 18 insertions(+) create mode 100644 clang/test/CodeGenObjCXX/debug-info-line.mm diff --git a/clang/lib/CodeGen/CGBlocks.cpp b/clang/lib/CodeGen/CGBlocks.cpp index 24611e5..9db1b7a 100644 --- a/clang/lib/CodeGen/CGBlocks.cpp +++ b/clang/lib/CodeGen/CGBlocks.cpp @@ -1107,6 +1107,8 @@ CodeGenFunction::GenerateBlockFunction(GlobalDecl GD, const BlockDecl *blockDecl = blockInfo.getBlockDecl(); CurGD = GD; + + CurEHLocation = blockInfo.getBlockExpr()->getLocEnd(); BlockInfo = &blockInfo; diff --git a/clang/test/CodeGenObjCXX/debug-info-line.mm b/clang/test/CodeGenObjCXX/debug-info-line.mm new file mode 100644 index 0000000..f38ab5f --- /dev/null +++ b/clang/test/CodeGenObjCXX/debug-info-line.mm @@ -0,0 +1,16 @@ +// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -gline-tables-only -fblocks -emit-llvm %s -o - | FileCheck %s + +void fn(); + +struct foo { + ~foo(); +}; + +void func() { + ^{ + foo f; + fn(); + // CHECK: cleanup, !dbg [[LINE:![0-9]*]] + // CHECK: [[LINE]] = !{i32 [[@LINE+1]], + }(); +} -- 2.7.4