diff options
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/CodeGen/CGDeclCXX.cpp | 4 | ||||
-rw-r--r-- | clang/lib/CodeGen/CGObjC.cpp | 1 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/debug-info-line.cpp | 27 | ||||
-rw-r--r-- | clang/test/CodeGenObjCXX/debug-info-line.mm | 20 |
4 files changed, 48 insertions, 4 deletions
diff --git a/clang/lib/CodeGen/CGDeclCXX.cpp b/clang/lib/CodeGen/CGDeclCXX.cpp index 12cdb950978..9bfad217185 100644 --- a/clang/lib/CodeGen/CGDeclCXX.cpp +++ b/clang/lib/CodeGen/CGDeclCXX.cpp @@ -445,6 +445,8 @@ void CodeGenFunction::GenerateCXXGlobalVarDeclInitFunc(llvm::Function *Fn, if (D->hasAttr<NoDebugAttr>()) DebugInfo = nullptr; // disable debug info indefinitely for this function + CurEHLocation = D->getLocStart(); + StartFunction(GlobalDecl(D), getContext().VoidTy, Fn, getTypes().arrangeNullaryFunction(), FunctionArgList(), D->getLocation(), @@ -554,6 +556,8 @@ llvm::Function *CodeGenFunction::generateDestroyHelper( llvm::Function *fn = CGM.CreateGlobalInitOrDestructFunction( FTy, "__cxx_global_array_dtor", VD->getLocation()); + CurEHLocation = VD->getLocStart(); + StartFunction(VD, getContext().VoidTy, fn, FI, args); emitDestroy(addr, type, destroyer, useEHCleanupForArray); diff --git a/clang/lib/CodeGen/CGObjC.cpp b/clang/lib/CodeGen/CGObjC.cpp index d56d3e36d49..34c6d94f881 100644 --- a/clang/lib/CodeGen/CGObjC.cpp +++ b/clang/lib/CodeGen/CGObjC.cpp @@ -476,6 +476,7 @@ void CodeGenFunction::StartObjCMethod(const ObjCMethodDecl *OMD, args.push_back(PI); CurGD = OMD; + CurEHLocation = OMD->getLocEnd(); StartFunction(OMD, OMD->getReturnType(), Fn, FI, args, OMD->getLocation(), StartLoc); diff --git a/clang/test/CodeGenCXX/debug-info-line.cpp b/clang/test/CodeGenCXX/debug-info-line.cpp index ba3b8700789..7a6d6543a9e 100644 --- a/clang/test/CodeGenCXX/debug-info-line.cpp +++ b/clang/test/CodeGenCXX/debug-info-line.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -g -std=c++11 -S -emit-llvm %s -o - | FileCheck %s +// RUN: %clang_cc1 -fexceptions -fcxx-exceptions -g -std=c++11 -S -emit-llvm %s -o - | FileCheck %s int &src(); int *sink(); @@ -110,6 +110,29 @@ void f10() { new (void_src()) int(src())); } +// noexcept just to simplify the codegen a bit +void fn() noexcept(true); + +struct bar { + bar(); + // noexcept(false) to convolute the global dtor + ~bar() noexcept(false); +}; +// global ctor cleanup +// CHECK-LABEL: define +// CHECK: invoke{{ }} +// CHECK: invoke{{ }} +// CHECK: to label {{.*}}, !dbg [[DBG_GLBL_CTOR_B:!.*]] +// global dtor cleanup +// CHECK-LABEL: define +// CHECK: invoke{{ }} +// CHECK: invoke{{ }} +// CHECK: to label {{.*}}, !dbg [[DBG_GLBL_DTOR_B:!.*]] +#line 1500 +bar b[1] = { // + (fn(), // + bar())}; + // CHECK: [[DBG_F1]] = !{i32 100, // CHECK: [[DBG_FOO_VALUE]] = !{i32 200, // CHECK: [[DBG_FOO_REF]] = !{i32 202, @@ -124,3 +147,5 @@ void f10() { // CHECK: [[DBG_F9]] = !{i32 1000, // CHECK: [[DBG_F10_ICMP]] = !{i32 1100, // CHECK: [[DBG_F10_STORE]] = !{i32 1100, +// CHECK: [[DBG_GLBL_CTOR_B]] = !{i32 1500, +// CHECK: [[DBG_GLBL_DTOR_B]] = !{i32 1500, diff --git a/clang/test/CodeGenObjCXX/debug-info-line.mm b/clang/test/CodeGenObjCXX/debug-info-line.mm index f38ab5f28ab..f3546a12a6d 100644 --- a/clang/test/CodeGenObjCXX/debug-info-line.mm +++ b/clang/test/CodeGenObjCXX/debug-info-line.mm @@ -6,11 +6,25 @@ struct foo { ~foo(); }; -void func() { +void f1() { ^{ foo f; fn(); - // CHECK: cleanup, !dbg [[LINE:![0-9]*]] - // CHECK: [[LINE]] = !{i32 [[@LINE+1]], + // CHECK: cleanup, !dbg [[DBG_F1:![0-9]*]] +#line 100 }(); } + +// CHECK-LABEL: define internal i8* @"\01-[TNSObject init]" +@implementation TNSObject +- (id)init +{ + foo f; + fn(); + // CHECK: cleanup, !dbg [[DBG_TNSO:![0-9]*]] +#line 200 +} +@end + +// CHECK: [[DBG_F1]] = !{i32 100, +// CHECK: [[DBG_TNSO]] = !{i32 200, |