Skip to content

Commit 66face6

Browse files
committed
Re-land [DebugInfo] Add debug location to stubs generated by CGDeclCXX and mark them as artificial
Previously, when clang was compiled with -DLLVM_ENABLE_ASSERTIONS=ON, the added tests were displaying: inlinable function call in a function with debug info must have a !dbg location call void @"??1?$c@UB@@@@qeaa@XZ"(%struct.c* @"?f@?1??d@@YAPEAU?$c@UB@@@@xz@4U2@A") fatal error: error in backend: Broken module found, compilation aborted! Stack dump: 0. Program arguments: <f:\svn\buildninja\bin\clang -cc1 -emit-llvm debug-info-no-location.cpp> -gcodeview -debug-info-kind=limited 1. <eof> parser at end of file 2. Per-function optimization Fixes PR43012 Differential Revision: https://reviews.llvm.org/D66328
1 parent 1c19900 commit 66face6

8 files changed

+83
-25
lines changed

clang/include/clang/AST/GlobalDecl.h

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

3738
enum class KernelReferenceKind : unsigned {

clang/lib/CodeGen/CGDebugInfo.cpp

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

20472048
// Print the normal qualified name for the variable, then break off the last
@@ -2066,6 +2067,7 @@ StringRef CGDebugInfo::getDynamicInitializerName(const VarDecl *VD,
20662067

20672068
switch (StubKind) {
20682069
case DynamicInitKind::NoStub:
2070+
case DynamicInitKind::GlobalArrayDestructor:
20692071
llvm_unreachable("not an initializer");
20702072
case DynamicInitKind::Initializer:
20712073
OS << "`dynamic initializer for '";
@@ -3832,7 +3834,8 @@ void CGDebugInfo::EmitFunctionStart(GlobalDecl GD, SourceLocation Loc,
38323834
if (Name.startswith("\01"))
38333835
Name = Name.substr(1);
38343836

3835-
if (!HasDecl || D->isImplicit() || D->hasAttr<ArtificialAttr>()) {
3837+
if (!HasDecl || D->isImplicit() || D->hasAttr<ArtificialAttr>() ||
3838+
(isa<VarDecl>(D) && GD.getDynamicInitKind() != DynamicInitKind::NoStub)) {
38363839
Flags |= llvm::DINode::FlagArtificial;
38373840
// Artificial functions should not silently reuse CurLoc.
38383841
CurLoc = SourceLocation();

clang/lib/CodeGen/CGDeclCXX.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,8 @@ llvm::Function *CodeGenFunction::createAtExitStub(const VarDecl &VD,
247247
CGF.StartFunction(GlobalDecl(&VD, DynamicInitKind::AtExit),
248248
CGM.getContext().VoidTy, fn, FI, FunctionArgList(),
249249
VD.getLocation(), VD.getInit()->getExprLoc());
250+
// Emit an artificial location for this function.
251+
auto AL = ApplyDebugLocation::CreateArtificial(CGF);
250252

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

@@ -672,8 +674,9 @@ void CodeGenFunction::GenerateCXXGlobalVarDeclInitFunc(llvm::Function *Fn,
672674

673675
StartFunction(GlobalDecl(D, DynamicInitKind::Initializer),
674676
getContext().VoidTy, Fn, getTypes().arrangeNullaryFunction(),
675-
FunctionArgList(), D->getLocation(),
676-
D->getInit()->getExprLoc());
677+
FunctionArgList());
678+
// Emit an artificial location for this function.
679+
auto AL = ApplyDebugLocation::CreateArtificial(*this);
677680

678681
// Use guarded initialization if the global variable is weak. This
679682
// occurs for, e.g., instantiated static data members and
@@ -807,7 +810,10 @@ llvm::Function *CodeGenFunction::generateDestroyHelper(
807810

808811
CurEHLocation = VD->getBeginLoc();
809812

810-
StartFunction(VD, getContext().VoidTy, fn, FI, args);
813+
StartFunction(GlobalDecl(VD, DynamicInitKind::GlobalArrayDestructor),
814+
getContext().VoidTy, fn, FI, args);
815+
// Emit an artificial location for this function.
816+
auto AL = ApplyDebugLocation::CreateArtificial(*this);
811817

812818
emitDestroy(addr, type, destroyer, useEHCleanupForArray);
813819

clang/test/CodeGenCXX/aix-static-init-debug-info.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,14 @@ X v;
1616
// CHECK: define internal void @__cxx_global_var_init() [[ATTR:#[0-9]+]] !dbg ![[DBGVAR16:[0-9]+]] {
1717
// CHECK: entry:
1818
// CHECK: call void @_ZN1XC1Ev(%struct.X* @v), !dbg ![[DBGVAR19:[0-9]+]]
19-
// CHECK: %0 = call i32 @atexit(void ()* @__dtor_v) [[ATTR:#[0-9]+]], !dbg ![[DBGVAR19]]
19+
// CHECK: %0 = call i32 @atexit(void ()* @__dtor_v) [[ATTR:#[0-9]+]], !dbg ![[DBGVAR19b:[0-9]+]]
2020
// CHECK: ret void, !dbg ![[DBGVAR19]]
2121
// CHECK: }
2222

2323
// CHECK: define internal void @__dtor_v() [[ATTR:#[0-9]+]] !dbg ![[DBGVAR20:[0-9]+]] {
2424
// CHECK: entry:
25-
// CHECK: call void @_ZN1XD1Ev(%struct.X* @v), !dbg ![[DBGVAR21:[0-9]+]]
26-
// CHECK: ret void, !dbg ![[DBGVAR21]]
25+
// CHECK: call void @_ZN1XD1Ev(%struct.X* @v), !dbg ![[DBGVAR21b:[0-9]+]]
26+
// CHECK: ret void, !dbg ![[DBGVAR21:[0-9]+]]
2727
// CHECK: }
2828

2929
// CHECK: define internal void @__finalize_v() [[ATTR:#[0-9]+]] !dbg ![[DBGVAR22:[0-9]+]] {
@@ -52,9 +52,11 @@ X v;
5252
// CHECK: ret void
5353
// CHECK: }
5454

55-
// CHECK: ![[DBGVAR16]] = distinct !DISubprogram(name: "__cxx_global_var_init", scope: !{{[0-9]+}}, file: !{{[0-9]+}}, line: 14, type: !{{[0-9]+}}, scopeLine: 14, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition, unit: !{{[0-9]+}}, retainedNodes: !{{[0-9]+}})
55+
// CHECK: ![[DBGVAR16]] = distinct !DISubprogram(name: "__cxx_global_var_init", scope: !{{[0-9]+}}, file: !{{[0-9]+}}, type: !{{[0-9]+}}, flags: DIFlagArtificial, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition, unit: !{{[0-9]+}}, retainedNodes: !{{[0-9]+}})
5656
// CHECK: ![[DBGVAR19]] = !DILocation(line: 14, column: 3, scope: ![[DBGVAR16]])
57-
// CHECK: ![[DBGVAR20]] = distinct !DISubprogram(name: "__dtor_v", scope: !{{[0-9]+}}, file: !{{[0-9]+}}, line: 14, type: !{{[0-9]+}}, scopeLine: 14, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition, unit: !{{[0-9]+}}, retainedNodes: !{{[0-9]+}})
57+
// CHECK: ![[DBGVAR19b]] = !DILocation(line: 0, scope: ![[DBGVAR16]])
58+
// CHECK: ![[DBGVAR20]] = distinct !DISubprogram(name: "__dtor_v", scope: !{{[0-9]+}}, file: !{{[0-9]+}}, line: 14, type: !{{[0-9]+}}, scopeLine: 14, flags: DIFlagArtificial, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition, unit: !{{[0-9]+}}, retainedNodes: !{{[0-9]+}})
59+
// CHECK: ![[DBGVAR21b]] = !DILocation(line: 0, scope: ![[DBGVAR20]])
5860
// CHECK: ![[DBGVAR21]] = !DILocation(line: 14, column: 3, scope: ![[DBGVAR20]])
5961
// CHECK: ![[DBGVAR22]] = distinct !DISubprogram(linkageName: "__finalize_v", scope: !{{[0-9]+}}, file: !{{[0-9]+}}, line: 14, type: !{{[0-9]+}}, scopeLine: 14, flags: DIFlagArtificial, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition, unit: !{{[0-9]+}}, retainedNodes: !{{[0-9]+}})
6062
// CHECK: ![[DBGVAR24]] = !DILocation(line: 14, column: 3, scope: ![[DBGVAR22]])
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
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() {
13+
static c<B> f(&B::e);
14+
return &f;
15+
}
16+
17+
// CHECK: define internal void @"??__Ff@?1??d@@YAPEAU?$c@UB@@@@XZ@YAXXZ"()
18+
// CHECK-SAME: !dbg ![[SUBPROGRAM:[0-9]+]] {
19+
// CHECK: call void @"??1?$c@UB@@@@QEAA@XZ"(%struct.c* @"?f@?1??d@@YAPEAU?$c@UB@@@@XZ@4U2@A"), !dbg ![[LOCATION:[0-9]+]]
20+
// CHECK: ![[SUBPROGRAM]] = distinct !DISubprogram(name: "`dynamic atexit destructor for 'f'"
21+
// CHECK-SAME: flags: DIFlagArtificial
22+
// 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: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -29,25 +29,25 @@ 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

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)