Skip to content

Commit ed08f7d

Browse files
committed
[Clang] Add coverage for VTable debug info
Add test for: - shows effect of inlining member functions - shows effect of template instantiation methods Make cleaner a bit: - drops unnecessary REQUIRES clause - uses %clang_cc1 instead of %clang -Xclang - uses simply -O1 instead of -disable-O0-optnone -disable-llvm-passes * LTO test remains unchanged since replacing by -O1 changes output even if variables are anchored
1 parent c87a29f commit ed08f7d

7 files changed

+211
-28
lines changed
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
// The debug info of vtable is attached conditionally to whether
2+
// - Member functions are inlined or not
3+
// - Definition of destructor is visible or not
4+
5+
struct CInlined {
6+
virtual void f1() noexcept {}
7+
virtual void f2() noexcept {}
8+
virtual ~CInlined() noexcept;
9+
};
10+
#ifndef NO_DTOR_BODY
11+
inline CInlined::~CInlined() noexcept {}
12+
#endif
13+
14+
struct CNoInline {
15+
virtual void g1() noexcept;
16+
virtual void g2() noexcept;
17+
virtual ~CNoInline() noexcept;
18+
};
19+
20+
void CNoInline::g1() noexcept {}
21+
void CNoInline::g2() noexcept {}
22+
#ifndef NO_DTOR_BODY
23+
CNoInline::~CNoInline() noexcept {}
24+
#endif
25+
26+
struct CNoFnDef {
27+
virtual void h1() noexcept;
28+
virtual void h2() noexcept;
29+
virtual ~CNoFnDef() noexcept;
30+
};
31+
32+
#ifndef NO_DTOR_BODY
33+
CNoFnDef::~CNoFnDef() noexcept {}
34+
#endif
35+
36+
void use(void *, ...);
37+
38+
int main() {
39+
CInlined Inlined;
40+
CNoInline NoInline;
41+
CNoFnDef NoFnDef;
42+
use(&Inlined, &NoInline, &NoFnDef);
43+
44+
return 0;
45+
}
46+
47+
// RUN: %clang_cc1 -triple x86_64-linux -emit-llvm -debug-info-kind=limited -dwarf-version=5 -O1 %s -o - | FileCheck %s -check-prefix CHECK-HAS-DTOR
48+
// RUN: %clang_cc1 -triple x86_64-linux -emit-llvm -debug-info-kind=limited -dwarf-version=5 -O1 -DNO_DTOR_BODY %s -o - | FileCheck %s -check-prefixes CHECK-NO-DTOR
49+
50+
// CHECK-HAS-DTOR: $_ZTV8CInlined = comdat any
51+
// CHECK-HAS-DTOR-NOT: $_ZTV9CNoInline
52+
// CHECK-HAS-DTOR-NOT: $_ZTV8CNoFnDef
53+
54+
// CHECK-HAS-DTOR-DAG: @_ZTV8CInlined = linkonce_odr {{.*}}constant {{{ \[[^]]*\] } { \[[^]]*\] \[[^]]*\] }}}, comdat, align 8, !dbg [[INLINED_VTABLE_VAR:![0-9]+]]
55+
// CHECK-HAS-DTOR-DAG: @_ZTV9CNoInline = {{.*}}constant {{{ \[[^]]*\] } { \[[^]]*\] \[[^]]*\] }}}, align 8, !dbg [[NOINLINE_VTABLE_VAR:![0-9]+]]
56+
// CHECK-HAS-DTOR-DAG: @_ZTV8CNoFnDef = external {{.*}}constant {{{ \[[^]]*\] }}}, align 8
57+
58+
// CHECK-HAS-DTOR: !llvm.dbg.cu
59+
60+
// CHECK-HAS-DTOR-DAG: [[INLINED_VTABLE:![0-9]+]] = distinct !DIGlobalVariable(name: "_vtable$", linkageName: "_ZTV8CInlined"
61+
// CHECK-HAS-DTOR-DAG: [[INLINED_VTABLE_VAR]] = !DIGlobalVariableExpression(var: [[INLINED_VTABLE]], expr: !DIExpression())
62+
// CHECK-HAS-DTOR-DAG: [[INLINED:![0-9]+]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "CInlined"
63+
// CHECK-HAS-DTOR-DAG: !DIDerivedType(tag: DW_TAG_variable, name: "_vtable$", scope: [[INLINED]], file: {{.*}}, baseType: {{![0-9]+}}, flags: DIFlagPrivate | DIFlagArtificial | DIFlagStaticMember)
64+
65+
// CHECK-HAS-DTOR-DAG: [[NOINLINE_VTABLE:![0-9]+]] = distinct !DIGlobalVariable(name: "_vtable$", linkageName: "_ZTV9CNoInline"
66+
// CHECK-HAS-DTOR-DAG: [[NOINLINE_VTABLE_VAR]] = !DIGlobalVariableExpression(var: [[NOINLINE_VTABLE]], expr: !DIExpression())
67+
// CHECK-HAS-DTOR-DAG: [[NOINLINE:![0-9]+]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "CNoInline"
68+
// CHECK-HAS-DTOR-DAG: !DIDerivedType(tag: DW_TAG_variable, name: "_vtable$", scope: [[NOINLINE]], file: {{.*}}, baseType: {{![0-9]+}}, flags: DIFlagPrivate | DIFlagArtificial | DIFlagStaticMember)
69+
70+
// CHECK-HAS-DTOR-DAG: !llvm.ident
71+
72+
// CHECK-HAS-DTOR-NOT: !DIGlobalVariable(name: "_vtable$", linkageName: "_ZTV8CNoFnDef"
73+
74+
75+
// CHECK-NO-DTOR-NOT: $_ZTV8CInlined
76+
// CHECK-NO-DTOR-NOT: $_ZTV9CNoInline
77+
// CHECK-NO-DTOR-NOT: $_ZTV8CNoFnDef
78+
79+
// CHECK-NO-DTOR-DAG: @_ZTV8CInlined = external {{.*}}constant {{.*}}, align 8{{$}}
80+
// CHECK-NO-DTOR-DAG: @_ZTV9CNoInline = {{.*}}constant {{{ \[[^]]*\] } { \[[^]]*\] \[[^]]*\] }}}, align 8, !dbg [[NOINLINE_VTABLE_VAR:![0-9]+]]
81+
// CHECK-NO-DTOR-DAG: @_ZTV8CNoFnDef = external {{.*}}constant {{{ \[[^]]*\] }}}, align 8, !dbg [[NOFNDEF_VTABLE_VAR:![0-9]+]]
82+
83+
// CHECK-NO-DTOR: !llvm.dbg.cu
84+
85+
// CHECK-NO-DTOR-DAG: [[NOINLINE_VTABLE:![0-9]+]] = distinct !DIGlobalVariable(name: "_vtable$", linkageName: "_ZTV9CNoInline"
86+
// CHECK-NO-DTOR-DAG: [[NOINLINE_VTABLE_VAR]] = !DIGlobalVariableExpression(var: [[NOINLINE_VTABLE]], expr: !DIExpression())
87+
// CHECK-NO-DTOR-DAG: [[NOINLINE:![0-9]+]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "CNoInline"
88+
// CHECK-NO-DTOR-DAG: !DIDerivedType(tag: DW_TAG_variable, name: "_vtable$", scope: [[NOINLINE]], file: {{.*}}, baseType: {{![0-9]+}}, flags: DIFlagPrivate | DIFlagArtificial | DIFlagStaticMember)
89+
90+
// CHECK-NO-DTOR-DAG: !llvm.ident
91+
92+
// CHECK-NO-DTOR-NOT: !DIGlobalVariable(name: "_vtable$", linkageName: "_ZTV8CInlined"
93+
// CHECK-NO-DTOR-NOT: !DIGlobalVariable(name: "_vtable$", linkageName: "_ZTV8CNoFnDef"

clang/test/DebugInfo/CXX/vtable-inheritance-diamond.cpp

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
// REQUIRES: target={{x86_64.*-linux.*}}
2-
31
// Diamond inheritance case:
42
// For CBase, CLeft, CRight and CDerived we check:
53
// - Generation of their vtables (including attributes).
@@ -35,26 +33,29 @@ struct CDerived : NSP_1::CLeft, NSP_2::CRight {
3533
int fooDerived() { return 3; };
3634
};
3735

36+
void use(void *, ...);
37+
3838
int main() {
3939
NSP::CBase Base;
4040
NSP_1::CLeft Left;
4141
NSP_2::CRight Right;
4242
CDerived Derived;
43+
use(&Base, &Left, &Right, &Derived);
4344

4445
return 0;
4546
}
4647

47-
// RUN: %clang --target=x86_64-linux -Xclang -disable-O0-optnone -Xclang -disable-llvm-passes -emit-llvm -S -g %s -o - | FileCheck %s
48+
// RUN: %clang_cc1 -triple x86_64-linux -emit-llvm -debug-info-kind=limited -dwarf-version=5 -O1 %s -o - | FileCheck %s
4849

4950
// CHECK: $_ZTVN3NSP5CBaseE = comdat any
5051
// CHECK: $_ZTVN5NSP_15CLeftE = comdat any
5152
// CHECK: $_ZTVN5NSP_26CRightE = comdat any
5253
// CHECK: $_ZTV8CDerived = comdat any
5354

54-
// CHECK: @_ZTVN3NSP5CBaseE = linkonce_odr {{dso_local|hidden}} unnamed_addr constant {{.*}}, comdat, align 8, !dbg [[BASE_VTABLE_VAR:![0-9]*]]
55-
// CHECK: @_ZTVN5NSP_15CLeftE = linkonce_odr {{dso_local|hidden}} unnamed_addr constant {{.*}}, comdat, align 8, !dbg [[LEFT_VTABLE_VAR:![0-9]*]]
56-
// CHECK: @_ZTVN5NSP_26CRightE = linkonce_odr {{dso_local|hidden}} unnamed_addr constant {{.*}}, comdat, align 8, !dbg [[RIGHT_VTABLE_VAR:![0-9]*]]
57-
// CHECK: @_ZTV8CDerived = linkonce_odr {{dso_local|hidden}} unnamed_addr constant {{.*}}, comdat, align 8, !dbg [[DERIVED_VTABLE_VAR:![0-9]*]]
55+
// CHECK: @_ZTVN3NSP5CBaseE = linkonce_odr {{.*}}unnamed_addr constant {{.*}}, comdat, align 8, !dbg [[BASE_VTABLE_VAR:![0-9]*]]
56+
// CHECK: @_ZTVN5NSP_15CLeftE = linkonce_odr {{.*}}unnamed_addr constant {{.*}}, comdat, align 8, !dbg [[LEFT_VTABLE_VAR:![0-9]*]]
57+
// CHECK: @_ZTVN5NSP_26CRightE = linkonce_odr {{.*}}unnamed_addr constant {{.*}}, comdat, align 8, !dbg [[RIGHT_VTABLE_VAR:![0-9]*]]
58+
// CHECK: @_ZTV8CDerived = linkonce_odr {{.*}}unnamed_addr constant {{.*}}, comdat, align 8, !dbg [[DERIVED_VTABLE_VAR:![0-9]*]]
5859

5960
// CHECK: [[BASE_VTABLE_VAR]] = !DIGlobalVariableExpression(var: [[BASE_VTABLE:![0-9]*]], expr: !DIExpression())
6061
// CHECK-NEXT: [[BASE_VTABLE]] = distinct !DIGlobalVariable(name: "_vtable$", linkageName: "_ZTVN3NSP5CBaseE"

clang/test/DebugInfo/CXX/vtable-inheritance-multiple.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
// REQUIRES: target={{x86_64.*-linux.*}}
2-
31
// Multiple inheritance case:
42
// For CBaseOne, CBaseTwo and CDerived we check:
53
// - Generation of their vtables (including attributes).
@@ -30,23 +28,25 @@ struct CDerived : NSP_1::CBaseOne, NSP_2::CBaseTwo {
3028
int six() override { return 66; }
3129
};
3230

31+
void use(void *, ...);
3332
int main() {
3433
NSP_1::CBaseOne BaseOne;
3534
NSP_2::CBaseTwo BaseTwo;
3635
CDerived Derived;
36+
use(&BaseOne, &BaseTwo, &Derived);
3737

3838
return 0;
3939
}
4040

41-
// RUN: %clang --target=x86_64-linux -Xclang -disable-O0-optnone -Xclang -disable-llvm-passes -emit-llvm -S -g %s -o - | FileCheck %s
41+
// RUN: %clang_cc1 -triple x86_64-linux -emit-llvm -debug-info-kind=limited -dwarf-version=5 -O1 %s -o - | FileCheck %s
4242

4343
// CHECK: $_ZTVN5NSP_18CBaseOneE = comdat any
4444
// CHECK: $_ZTVN5NSP_28CBaseTwoE = comdat any
4545
// CHECK: $_ZTV8CDerived = comdat any
4646

47-
// CHECK: @_ZTVN5NSP_18CBaseOneE = linkonce_odr {{dso_local|hidden}} unnamed_addr constant {{.*}}, comdat, align 8, !dbg [[BASE_ONE_VTABLE_VAR:![0-9]*]]
48-
// CHECK: @_ZTVN5NSP_28CBaseTwoE = linkonce_odr {{dso_local|hidden}} unnamed_addr constant {{.*}}, comdat, align 8, !dbg [[BASE_TWO_VTABLE_VAR:![0-9]*]]
49-
// CHECK: @_ZTV8CDerived = linkonce_odr {{dso_local|hidden}} unnamed_addr constant {{.*}}, comdat, align 8, !dbg [[DERIVED_VTABLE_VAR:![0-9]*]]
47+
// CHECK: @_ZTVN5NSP_18CBaseOneE = linkonce_odr {{.*}}unnamed_addr constant {{.*}}, comdat, align 8, !dbg [[BASE_ONE_VTABLE_VAR:![0-9]*]]
48+
// CHECK: @_ZTVN5NSP_28CBaseTwoE = linkonce_odr {{.*}}unnamed_addr constant {{.*}}, comdat, align 8, !dbg [[BASE_TWO_VTABLE_VAR:![0-9]*]]
49+
// CHECK: @_ZTV8CDerived = linkonce_odr {{.*}}unnamed_addr constant {{.*}}, comdat, align 8, !dbg [[DERIVED_VTABLE_VAR:![0-9]*]]
5050

5151
// CHECK: [[BASE_ONE_VTABLE_VAR]] = !DIGlobalVariableExpression(var: [[BASE_ONE_VTABLE:![0-9]*]], expr: !DIExpression())
5252
// CHECK-NEXT: [[BASE_ONE_VTABLE]] = distinct !DIGlobalVariable(name: "_vtable$", linkageName: "_ZTVN5NSP_18CBaseOneE"

clang/test/DebugInfo/CXX/vtable-inheritance-simple-main.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
// REQUIRES: target={{x86_64.*-linux.*}}
2-
31
// Simple inheritance case:
42
// For CBase and CDerived we check:
53
// - Generation of their vtables (including attributes).

clang/test/DebugInfo/CXX/vtable-inheritance-simple.cpp

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,25 +21,28 @@ struct CDerived : NSP::CBase {
2121
int three() override { return 33; }
2222
};
2323

24+
void use(void *, ...);
25+
2426
int main() {
2527
NSP::CBase Base;
2628
CDerived Derived;
29+
use(&Base, &Derived);
2730

2831
return 0;
2932
}
3033

31-
// RUN: %clang_cc1 -triple x86_64-linux -emit-llvm -mrelocation-model pic -pic-is-pie -debug-info-kind=limited -dwarf-version=5 -disable-O0-optnone -disable-llvm-passes %s -o - | FileCheck %s
32-
// RUN: %clang_cc1 -triple x86_64-windows-gnu -emit-llvm -mrelocation-model pic -pic-is-pie -debug-info-kind=limited -dwarf-version=5 -disable-O0-optnone -disable-llvm-passes %s -o - | FileCheck %s --check-prefix=COFF
34+
// RUN: %clang_cc1 -triple x86_64-linux -emit-llvm -debug-info-kind=limited -dwarf-version=5 -O1 %s -o - | FileCheck %s
35+
// RUN: %clang_cc1 -triple x86_64-mingw -emit-llvm -debug-info-kind=limited -dwarf-version=5 -O1 %s -o - | FileCheck %s --check-prefix=COFF
3336

3437
// CHECK: $_ZTVN3NSP5CBaseE = comdat any
3538
// CHECK: $_ZTV8CDerived = comdat any
3639

37-
// CHECK: @_ZTVN3NSP5CBaseE = linkonce_odr {{dso_local|hidden}} unnamed_addr constant {{.*}}, comdat, align 8, !dbg [[BASE_VTABLE_VAR:![0-9]*]]
38-
// CHECK: @_ZTV8CDerived = linkonce_odr {{dso_local|hidden}} unnamed_addr constant {{.*}}, comdat, align 8, !dbg [[DERIVED_VTABLE_VAR:![0-9]*]]
39-
// COFF: @_ZTVN3NSP5CBaseE = linkonce_odr {{dso_local|hidden}} unnamed_addr constant {{.*}}, comdat, align 8
40+
// CHECK: @_ZTVN3NSP5CBaseE = linkonce_odr {{.*}}unnamed_addr constant {{.*}}, comdat, align 8, !dbg [[BASE_VTABLE_VAR:![0-9]*]]
41+
// CHECK: @_ZTV8CDerived = linkonce_odr {{.*}}unnamed_addr constant {{.*}}, comdat, align 8, !dbg [[DERIVED_VTABLE_VAR:![0-9]*]]
42+
// COFF: @_ZTVN3NSP5CBaseE = linkonce_odr {{.*}}unnamed_addr constant {{.*}}, comdat, align 8
4043
// COFF-NOT: !dbg
4144
// COFF-SAME: {{$}}
42-
// COFF: @_ZTV8CDerived = linkonce_odr {{dso_local|hidden}} unnamed_addr constant {{.*}}, comdat, align 8
45+
// COFF: @_ZTV8CDerived = linkonce_odr {{.*}}unnamed_addr constant {{.*}}, comdat, align 8
4346
// COFF-NOT: !dbg
4447
// COFF-SAME: {{$}}
4548

clang/test/DebugInfo/CXX/vtable-inheritance-virtual.cpp

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
// REQUIRES: target={{x86_64.*-linux.*}}
2-
31
// Virtual inheritance case:
42
// For CBase, CLeft, CRight and CDerived we check:
53
// - Generation of their vtables (including attributes).
@@ -35,26 +33,29 @@ struct CDerived : NSP_1::CLeft, NSP_2::CRight {
3533
int fooDerived() { return 3; };
3634
};
3735

36+
void use(void *, ...);
37+
3838
int main() {
3939
NSP::CBase Base;
4040
NSP_1::CLeft Left;
4141
NSP_2::CRight Right;
4242
CDerived Derived;
43+
use(&Base, &Left, &Right, &Derived);
4344

4445
return 0;
4546
}
4647

47-
// RUN: %clang --target=x86_64-linux -Xclang -disable-O0-optnone -Xclang -disable-llvm-passes -emit-llvm -S -g %s -o - | FileCheck %s
48+
// RUN: %clang_cc1 -triple x86_64-linux -emit-llvm -debug-info-kind=limited -dwarf-version=5 -O1 %s -o - | FileCheck %s
4849

4950
// CHECK: $_ZTVN3NSP5CBaseE = comdat any
5051
// CHECK: $_ZTVN5NSP_15CLeftE = comdat any
5152
// CHECK: $_ZTVN5NSP_26CRightE = comdat any
5253
// CHECK: $_ZTV8CDerived = comdat any
5354

54-
// CHECK: @_ZTVN3NSP5CBaseE = linkonce_odr {{dso_local|hidden}} unnamed_addr constant {{.*}}, comdat, align 8, !dbg [[BASE_VTABLE_VAR:![0-9]*]]
55-
// CHECK: @_ZTVN5NSP_15CLeftE = linkonce_odr {{dso_local|hidden}} unnamed_addr constant {{.*}}, comdat, align 8, !dbg [[LEFT_VTABLE_VAR:![0-9]*]]
56-
// CHECK: @_ZTVN5NSP_26CRightE = linkonce_odr {{dso_local|hidden}} unnamed_addr constant {{.*}}, comdat, align 8, !dbg [[RIGHT_VTABLE_VAR:![0-9]*]]
57-
// CHECK: @_ZTV8CDerived = linkonce_odr {{dso_local|hidden}} unnamed_addr constant {{.*}}, comdat, align 8, !dbg [[DERIVED_VTABLE_VAR:![0-9]*]]
55+
// CHECK: @_ZTVN3NSP5CBaseE = linkonce_odr {{.*}}unnamed_addr constant {{.*}}, comdat, align 8, !dbg [[BASE_VTABLE_VAR:![0-9]*]]
56+
// CHECK: @_ZTVN5NSP_15CLeftE = linkonce_odr {{.*}}unnamed_addr constant {{.*}}, comdat, align 8, !dbg [[LEFT_VTABLE_VAR:![0-9]*]]
57+
// CHECK: @_ZTVN5NSP_26CRightE = linkonce_odr {{.*}}unnamed_addr constant {{.*}}, comdat, align 8, !dbg [[RIGHT_VTABLE_VAR:![0-9]*]]
58+
// CHECK: @_ZTV8CDerived = linkonce_odr {{.*}}unnamed_addr constant {{.*}}, comdat, align 8, !dbg [[DERIVED_VTABLE_VAR:![0-9]*]]
5859

5960
// CHECK: [[BASE_VTABLE_VAR]] = !DIGlobalVariableExpression(var: [[BASE_VTABLE:![0-9]*]], expr: !DIExpression())
6061
// CHECK-NEXT: [[BASE_VTABLE]] = distinct !DIGlobalVariable(name: "_vtable$", linkageName: "_ZTVN3NSP5CBaseE"
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
// For CTemplate we check in case of:
2+
// - Implicitly instantiate whole class by up-casting:
3+
// * The vtable is generated with comdat
4+
// * Its '_vtable$' is generated
5+
// - Implicitly instantiate member function only:
6+
// * The vtable is NOT generated
7+
// * Its '_vtable$' is generated
8+
// - Define explicitly instantiation:
9+
// * The vtable is generated with comdat
10+
// * Its '_vtable$' is generated
11+
// - Declare explicitly instantiation as extern:
12+
// # for COFF targets:
13+
// * The vtable is declared but NOT associated with '_vtable$'
14+
// # for non-COFF targets:
15+
// * The vtable is declared
16+
// * Its '_vtable$' is generated
17+
18+
struct CBase {
19+
virtual void f() noexcept {}
20+
};
21+
22+
template <typename T>
23+
struct CTemplate: CBase {
24+
void f() noexcept override;
25+
virtual ~CTemplate() noexcept;
26+
};
27+
template <typename T>
28+
void CTemplate<T>::f() noexcept {}
29+
template <typename T>
30+
CTemplate<T>::~CTemplate() noexcept {}
31+
32+
#ifdef EXPLICIT
33+
template struct CTemplate<void>;
34+
#endif
35+
#ifdef EXTERN
36+
extern template struct CTemplate<void>;
37+
#endif
38+
39+
CTemplate<void> *get(CBase *) noexcept;
40+
41+
int main() {
42+
CTemplate<void> Template;
43+
#ifdef NOCAST
44+
get(nullptr)->f();
45+
#else
46+
get(&Template)->f();
47+
#endif
48+
49+
return 0;
50+
}
51+
52+
// RUN: %clang_cc1 -triple x86_64-linux -emit-llvm -debug-info-kind=limited -dwarf-version=5 -O1 %s -o - | FileCheck %s -check-prefix IMPLICIT
53+
// RUN: %clang_cc1 -triple x86_64-linux -emit-llvm -debug-info-kind=limited -dwarf-version=5 -O1 %s -o - -DNOCAST | FileCheck %s -check-prefix NOCAST
54+
// RUN: %clang_cc1 -triple x86_64-linux -emit-llvm -debug-info-kind=limited -dwarf-version=5 -O1 %s -o - -DEXPLICIT | FileCheck %s -check-prefix EXPLICIT
55+
// RUN: %clang_cc1 -triple x86_64-linux -emit-llvm -debug-info-kind=limited -dwarf-version=5 -O1 %s -o - -DEXTERN | FileCheck %s -check-prefix EXTERN
56+
57+
// IMPLICIT: $_ZTV9CTemplateIvE = comdat any
58+
// IMPLICIT: @_ZTV9CTemplateIvE = linkonce_odr {{.*}}unnamed_addr constant {{.*}}, comdat, align 8, !dbg [[VTABLE_VAR:![0-9]*]]
59+
// IMPLICIT-DAG: [[VTABLE:![0-9]+]] = distinct !DIGlobalVariable(name: "_vtable$", linkageName: "_ZTV9CTemplateIvE"
60+
// IMPLICIT-DAG: !DIGlobalVariableExpression(var: [[VTABLE]], expr: !DIExpression())
61+
// IMPLICIT-DAG: [[TYPE:![0-9]+]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "CTemplate<void>"
62+
// IMPLICIT-DAG: !DIDerivedType(tag: DW_TAG_variable, name: "_vtable$", scope: [[TYPE]], file: {{.*}}, baseType: [[PVOID:![0-9]+]], flags: DIFlagPrivate | DIFlagArtificial | DIFlagStaticMember)
63+
// IMPLICIT-DAG: [[PVOID]] = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: null, size: 64)
64+
65+
// NOCAST-NOT: $_ZTV9CTemplateIvE
66+
// NOCAST-NOT: @_ZTV9CTemplateIvE
67+
// NOCAST-DAG: [[VTABLE:![0-9]+]] = distinct !DIGlobalVariable(name: "_vtable$", linkageName: "_ZTV9CTemplateIvE"
68+
// NOCAST-DAG: !DIGlobalVariableExpression(var: [[VTABLE]], expr: !DIExpression())
69+
// NOCAST-DAG: [[TYPE:![0-9]+]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "CTemplate<void>"
70+
// NOCAST-DAG: !DIDerivedType(tag: DW_TAG_variable, name: "_vtable$", scope: [[TYPE]], file: {{.*}}, baseType: [[PVOID:![0-9]+]], flags: DIFlagPrivate | DIFlagArtificial | DIFlagStaticMember)
71+
// NOCAST-DAG: [[PVOID]] = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: null, size: 64)
72+
73+
// EXPLICIT: $_ZTV9CTemplateIvE = comdat any
74+
// EXPLICIT: @_ZTV9CTemplateIvE = weak_odr {{.*}}unnamed_addr constant {{.*}}, comdat, align 8, !dbg [[VTABLE_VAR:![0-9]*]]
75+
// EXPLICIT-DAG: [[VTABLE:![0-9]+]] = distinct !DIGlobalVariable(name: "_vtable$", linkageName: "_ZTV9CTemplateIvE"
76+
// EXPLICIT-DAG: [[VTABLE_VAR]] = !DIGlobalVariableExpression(var: [[VTABLE]], expr: !DIExpression())
77+
// EXPLICIT-DAG: [[TYPE:![0-9]+]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "CTemplate<void>"
78+
// EXPLICIT-DAG: !DIDerivedType(tag: DW_TAG_variable, name: "_vtable$", scope: [[TYPE]], file: {{.*}}, baseType: [[PVOID:![0-9]+]], flags: DIFlagPrivate | DIFlagArtificial | DIFlagStaticMember)
79+
// EXPLICIT-DAG: [[PVOID]] = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: null, size: 64)
80+
81+
// EXTERN-NOT: $_ZTV9CTemplateIvE
82+
// EXTERN: @_ZTV9CTemplateIvE = external {{.*}}unnamed_addr constant {{.*}}, align 8, !dbg [[VTABLE_VAR:![0-9]*]]
83+
// EXTERN-DAG: [[VTABLE:![0-9]+]] = distinct !DIGlobalVariable(name: "_vtable$", linkageName: "_ZTV9CTemplateIvE"
84+
// EXTERN-DAG: [[VTABLE_VAR]] = !DIGlobalVariableExpression(var: [[VTABLE]], expr: !DIExpression())
85+
// EXTERN-DAG: [[TYPE:![0-9]+]] = !DICompositeType(tag: DW_TAG_structure_type, name: "CTemplate<void>"
86+
// EXTERN-DAG: !DIDerivedType(tag: DW_TAG_variable, name: "_vtable$", scope: [[TYPE]], file: {{.*}}, baseType: [[PVOID:![0-9]+]], flags: DIFlagPrivate | DIFlagArtificial | DIFlagStaticMember)
87+
// EXTERN-DAG: [[PVOID]] = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: null, size: 64)

0 commit comments

Comments
 (0)