Skip to content

Commit 9c1baa2

Browse files
committed
re-land [DebugInfo] Add debug location to stubs generated by CGDeclCXX and mark them as artificial
Differential Revision: https://reviews.llvm.org/D66328
1 parent 7f1cb1f commit 9c1baa2

File tree

7 files changed

+75
-20
lines changed

7 files changed

+75
-20
lines changed

clang/include/clang/AST/GlobalDecl.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ enum class DynamicInitKind : unsigned {
3131
NoStub = 0,
3232
Initializer,
3333
AtExit,
34+
GlobalArrayDestructor
3435
};
3536

3637
/// GlobalDecl - represents a global declaration. This can either be a

clang/lib/CodeGen/CGDebugInfo.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1944,7 +1944,8 @@ StringRef CGDebugInfo::getDynamicInitializerName(const VarDecl *VD,
19441944
llvm::Function *InitFn) {
19451945
// If we're not emitting codeview, use the mangled name. For Itanium, this is
19461946
// arbitrary.
1947-
if (!CGM.getCodeGenOpts().EmitCodeView)
1947+
if (!CGM.getCodeGenOpts().EmitCodeView ||
1948+
StubKind == DynamicInitKind::GlobalArrayDestructor)
19481949
return InitFn->getName();
19491950

19501951
// Print the normal qualified name for the variable, then break off the last
@@ -1969,6 +1970,7 @@ StringRef CGDebugInfo::getDynamicInitializerName(const VarDecl *VD,
19691970

19701971
switch (StubKind) {
19711972
case DynamicInitKind::NoStub:
1973+
case DynamicInitKind::GlobalArrayDestructor:
19721974
llvm_unreachable("not an initializer");
19731975
case DynamicInitKind::Initializer:
19741976
OS << "`dynamic initializer for '";
@@ -3644,7 +3646,8 @@ void CGDebugInfo::EmitFunctionStart(GlobalDecl GD, SourceLocation Loc,
36443646
if (Name.startswith("\01"))
36453647
Name = Name.substr(1);
36463648

3647-
if (!HasDecl || D->isImplicit() || D->hasAttr<ArtificialAttr>()) {
3649+
if (!HasDecl || D->isImplicit() || D->hasAttr<ArtificialAttr>() ||
3650+
(isa<VarDecl>(D) && GD.getDynamicInitKind() != DynamicInitKind::NoStub)) {
36483651
Flags |= llvm::DINode::FlagArtificial;
36493652
// Artificial functions should not silently reuse CurLoc.
36503653
CurLoc = SourceLocation();

clang/lib/CodeGen/CGDeclCXX.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,8 @@ llvm::Function *CodeGenFunction::createAtExitStub(const VarDecl &VD,
244244

245245
CGF.StartFunction(GlobalDecl(&VD, DynamicInitKind::AtExit),
246246
CGM.getContext().VoidTy, fn, FI, FunctionArgList());
247+
// Emit an artificial location for this function.
248+
auto AL = ApplyDebugLocation::CreateArtificial(CGF);
247249

248250
llvm::CallInst *call = CGF.Builder.CreateCall(dtor, addr);
249251

@@ -644,8 +646,9 @@ void CodeGenFunction::GenerateCXXGlobalVarDeclInitFunc(llvm::Function *Fn,
644646

645647
StartFunction(GlobalDecl(D, DynamicInitKind::Initializer),
646648
getContext().VoidTy, Fn, getTypes().arrangeNullaryFunction(),
647-
FunctionArgList(), D->getLocation(),
648-
D->getInit()->getExprLoc());
649+
FunctionArgList());
650+
// Emit an artificial location for this function.
651+
auto AL = ApplyDebugLocation::CreateArtificial(*this);
649652

650653
// Use guarded initialization if the global variable is weak. This
651654
// occurs for, e.g., instantiated static data members and
@@ -770,7 +773,10 @@ llvm::Function *CodeGenFunction::generateDestroyHelper(
770773

771774
CurEHLocation = VD->getBeginLoc();
772775

773-
StartFunction(VD, getContext().VoidTy, fn, FI, args);
776+
StartFunction(GlobalDecl(VD, DynamicInitKind::GlobalArrayDestructor),
777+
getContext().VoidTy, fn, FI, args);
778+
// Emit an artificial location for this function.
779+
auto AL = ApplyDebugLocation::CreateArtificial(*this);
774780

775781
emitDestroy(addr, type, destroyer, useEHCleanupForArray);
776782

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// RUN: %clang_cc1 -emit-llvm %s -triple x86_64-windows-msvc -gcodeview -debug-info-kind=limited -o - | FileCheck %s
2+
3+
struct a {
4+
~a();
5+
};
6+
template <typename b> struct c : a {
7+
c(void (b::*)());
8+
};
9+
struct B {
10+
virtual void e();
11+
};
12+
c<B> *d() { static c<B> f(&B::e); return &f; }
13+
14+
// CHECK: define internal void @"??__Ff@?1??d@@YAPEAU?$c@UB@@@@XZ@YAXXZ"()
15+
// CHECK-SAME: !dbg ![[SUBPROGRAM:[0-9]+]] {
16+
// CHECK: call void @"??1?$c@UB@@@@QEAA@XZ"(%struct.c* @"?f@?1??d@@YAPEAU?$c@UB@@@@XZ@4U2@A"), !dbg ![[LOCATION:[0-9]+]]
17+
// CHECK-NEXT: ret void, !dbg ![[LOCATION]]
18+
// CHECK: ![[SUBPROGRAM]] = distinct !DISubprogram(name: "`dynamic atexit destructor for 'f'"
19+
// CHECK-SAME: flags: DIFlagArtificial
20+
// CHECK: ![[LOCATION]] = !DILocation(line: 0, scope: ![[SUBPROGRAM]])
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// RUN: %clang_cc1 -emit-llvm %s -triple x86_64-windows-msvc -gcodeview -debug-info-kind=limited -o - | FileCheck %s
2+
3+
struct b {
4+
b(char *);
5+
~b();
6+
};
7+
struct a {
8+
~a();
9+
};
10+
struct {
11+
b c;
12+
const a &d;
13+
} e[]{nullptr, {}};
14+
15+
// CHECK: define internal void @__cxx_global_array_dtor(i8* %0)
16+
// CHECK-SAME: !dbg ![[SUBPROGRAM:[0-9]+]] {
17+
// CHECK: arraydestroy.body
18+
// CHECK: %arraydestroy.elementPast =
19+
// CHECK-SAME: !dbg ![[LOCATION:[0-9]+]]
20+
// CHECK: call void @"??1<unnamed-type-e>@@QEAA@XZ"(%struct.anon* %arraydestroy.element)
21+
// CHECK-SAME: !dbg ![[LOCATION]]
22+
// CHECK: ![[SUBPROGRAM]] = distinct !DISubprogram(name: "__cxx_global_array_dtor"
23+
// CHECK-SAME: flags: DIFlagArtificial
24+
// CHECK: ![[LOCATION]] = !DILocation(line: 0,

clang/test/CodeGenCXX/debug-info-global-ctor-dtor.cpp

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -29,25 +29,26 @@ template <typename U>
2929
A FooTpl<T>::sdm_tpl(sizeof(U) + sizeof(T));
3030
template A FooTpl<int>::sdm_tpl<int>;
3131

32-
// CHECK-NOKEXT: !DISubprogram(name: "__cxx_global_var_init",{{.*}} line: 15,{{.*}} DISPFlagLocalToUnit | DISPFlagDefinition
33-
// CHECK-NOKEXT: !DISubprogram(name: "__dtor_glob",{{.*}} line: 15,{{.*}} DISPFlagLocalToUnit | DISPFlagDefinition
34-
// CHECK-NOKEXT: !DISubprogram(name: "__cxx_global_var_init.1",{{.*}} line: 16,{{.*}} DISPFlagLocalToUnit | DISPFlagDefinition
35-
// CHECK-NOKEXT: !DISubprogram(name: "__cxx_global_array_dtor",{{.*}} line: 16,{{.*}} DISPFlagLocalToUnit | DISPFlagDefinition
36-
// CHECK-NOKEXT: !DISubprogram(name: "__dtor_array",{{.*}} line: 16,{{.*}} DISPFlagLocalToUnit | DISPFlagDefinition
37-
// CHECK-NOKEXT: !DISubprogram(name: "__dtor__ZZ3foovE4stat",{{.*}} line: 19,{{.*}} DISPFlagLocalToUnit | DISPFlagDefinition
32+
// CHECK-NOKEXT: !DISubprogram(name: "__cxx_global_var_init",{{.*}} flags: DIFlagArtificial, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition
33+
// CHECK-NOKEXT: !DISubprogram(name: "__dtor_glob",{{.*}} flags: DIFlagArtificial, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition
34+
// CHECK-NOKEXT: !DISubprogram(name: "__cxx_global_var_init.1",{{.*}} flags: DIFlagArtificial, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition
35+
// CHECK-NOKEXT: !DISubprogram(name: "__cxx_global_array_dtor",{{.*}} flags: DIFlagArtificial, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition
36+
// CHECK-NOKEXT: !DISubprogram(name: "__dtor_array",{{.*}} flags: DIFlagArtificial, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition
37+
// CHECK-NOKEXT: !DISubprogram(name: "__dtor__ZZ3foovE4stat",{{.*}} flags: DIFlagArtificial, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition
3838
// CHECK-NOKEXT: !DISubprogram({{.*}} DISPFlagLocalToUnit | DISPFlagDefinition
3939

4040
// CHECK-KEXT: !DISubprogram({{.*}} DISPFlagLocalToUnit | DISPFlagDefinition
4141

42-
// CHECK-MSVC: !DISubprogram(name: "`dynamic initializer for 'glob'",{{.*}} line: 15,{{.*}}: DISPFlagLocalToUnit | DISPFlagDefinition
43-
// CHECK-MSVC: !DISubprogram(name: "`dynamic atexit destructor for 'glob'",{{.*}} line: 15,{{.*}}: DISPFlagLocalToUnit | DISPFlagDefinition
44-
// CHECK-MSVC: !DISubprogram(name: "`dynamic initializer for 'array'",{{.*}} line: 16,{{.*}}: DISPFlagLocalToUnit | DISPFlagDefinition
45-
// CHECK-MSVC: !DISubprogram(name: "__cxx_global_array_dtor",{{.*}} line: 16,{{.*}}: DISPFlagLocalToUnit | DISPFlagDefinition
46-
// CHECK-MSVC: !DISubprogram(name: "`dynamic atexit destructor for 'array'",{{.*}} line: 16,{{.*}}: DISPFlagLocalToUnit | DISPFlagDefinition
47-
// CHECK-MSVC: !DISubprogram(name: "`dynamic atexit destructor for 'stat'",{{.*}} line: 19,{{.*}}: DISPFlagLocalToUnit | DISPFlagDefinition
42+
// CHECK-MSVC: !DISubprogram(name: "`dynamic initializer for 'glob'",{{.*}} flags: DIFlagArtificial, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition
43+
// CHECK-MSVC: !DISubprogram(name: "`dynamic atexit destructor for 'glob'",{{.*}} flags: DIFlagArtificial, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition
44+
// CHECK-MSVC: !DISubprogram(name: "`dynamic initializer for 'array'",{{.*}} flags: DIFlagArtificial, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition
45+
// CHECK-MSVC: !DISubprogram(name: "__cxx_global_array_dtor",{{.*}} flags: DIFlagArtificial, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition
46+
// CHECK-MSVC: !DISubprogram(name: "`dynamic atexit destructor for 'array'",{{.*}} flags: DIFlagArtificial, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition
47+
// CHECK-MSVC: !DISubprogram(name: "`dynamic atexit destructor for 'stat'",{{.*}} flags: DIFlagArtificial, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition
4848

4949
// MSVC does weird stuff when templates are involved, so we don't match exactly,
5050
// but these names are reasonable.
5151
// FIXME: These should not be marked DISPFlagLocalToUnit.
52-
// CHECK-MSVC: !DISubprogram(name: "FooTpl<int>::`dynamic initializer for 'sdm_tpl<int>'",{{.*}} line: 29,{{.*}}: DISPFlagLocalToUnit | DISPFlagDefinition
53-
// CHECK-MSVC: !DISubprogram(name: "FooTpl<int>::`dynamic atexit destructor for 'sdm_tpl<int>'",{{.*}} line: 29,{{.*}}: DISPFlagLocalToUnit | DISPFlagDefinition
52+
// CHECK-MSVC: !DISubprogram(name: "FooTpl<int>::`dynamic initializer for 'sdm_tpl<int>'",{{.*}} flags: DIFlagArtificial, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition
53+
// CHECK-MSVC: !DISubprogram(name: "FooTpl<int>::`dynamic atexit destructor for 'sdm_tpl<int>'",{{.*}} flags: DIFlagArtificial, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition
54+
// CHECK-MSVC: !DISubprogram(linkageName: "_GLOBAL__sub_I_debug_info_global_ctor_dtor.cpp",{{.*}} flags: DIFlagArtificial

clang/test/CodeGenCXX/debug-info-line.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,7 @@ void f25() {
314314
// CHECK: [[DBG_F9]] = !DILocation(line: 1000,
315315
// CHECK: [[DBG_F10_STORE]] = !DILocation(line: 1100,
316316
// CHECK: [[DBG_GLBL_CTOR_B]] = !DILocation(line: 1200,
317-
// CHECK: [[DBG_GLBL_DTOR_B]] = !DILocation(line: 1200,
317+
// CHECK: [[DBG_GLBL_DTOR_B]] = !DILocation(line: 0,
318318
// CHECK: [[DBG_F11]] = !DILocation(line: 1300,
319319
// CHECK: [[DBG_F12]] = !DILocation(line: 1400,
320320
// CHECK: [[DBG_F13]] = !DILocation(line: 1500,

0 commit comments

Comments
 (0)