mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-02-14 06:29:38 +00:00
DebugInfo: Adapt to loss of DITypeRef in LLVM r267296
LLVM stopped using MDString-based type references, and DIBuilder no longer fills 'retainedTypes:' with every DICompositeType that has an 'identifier:' field. There are just minor changes to keep the same behaviour in CFE. Leaving 'retainedTypes:' unfilled has a dramatic impact on the output order of the IR though. There are a huge number of testcase changes, which were unfortunately not really scriptable. llvm-svn: 267297
This commit is contained in:
parent
a59d3e5af8
commit
383f8413cf
@ -1451,11 +1451,6 @@ llvm::DIType *CGDebugInfo::getOrCreateStandaloneType(QualType D,
|
||||
llvm::DIType *T = getOrCreateType(D, getOrCreateFile(Loc));
|
||||
assert(T && "could not create debug info for type");
|
||||
|
||||
// Composite types with UIDs were already retained by DIBuilder
|
||||
// because they are only referenced by name in the IR.
|
||||
if (auto *CTy = dyn_cast<llvm::DICompositeType>(T))
|
||||
if (!CTy->getIdentifier().empty())
|
||||
return T;
|
||||
RetainedTypes.push_back(D.getAsOpaquePtr());
|
||||
return T;
|
||||
}
|
||||
@ -3435,6 +3430,9 @@ void CGDebugInfo::EmitGlobalVariable(const ValueDecl *VD,
|
||||
auto *RD = cast<RecordDecl>(VarD->getDeclContext());
|
||||
getDeclContextDescriptor(VarD);
|
||||
// Ensure that the type is retained even though it's otherwise unreferenced.
|
||||
//
|
||||
// FIXME: This is probably unnecessary, since Ty should reference RD
|
||||
// through its scope.
|
||||
RetainedTypes.push_back(
|
||||
CGM.getContext().getRecordType(RD).getAsOpaquePtr());
|
||||
return;
|
||||
|
@ -6,5 +6,6 @@ using std::A; using ::A;
|
||||
|
||||
// CHECK: [[CompileUnit:![0-9]+]] = distinct !DICompileUnit({{.+}} imports: [[Imports:![0-9]+]])
|
||||
// CHECK: [[Imports]] = !{[[ImportedEntity:![0-9]+]]}
|
||||
// CHECK: [[ImportedEntity]] = !DIImportedEntity(tag: DW_TAG_imported_declaration, scope: [[CompileUnit]], entity: !"_ZTSSt1A", line: 4)
|
||||
// CHECK: [[ImportedEntity]] = !DIImportedEntity(tag: DW_TAG_imported_declaration, scope: [[CompileUnit]], entity: [[STDA:![0-9]+]], line: 4)
|
||||
// CHECK: [[STDA]] = !DICompositeType(tag: DW_TAG_class_type, name: "A",
|
||||
|
||||
|
@ -1,13 +1,16 @@
|
||||
// RUN: %clang_cc1 -emit-llvm -debug-info-kind=limited -triple %itanium_abi_triple %s -o - | FileCheck %s
|
||||
// Test the various accessibility flags in the debug info.
|
||||
struct A {
|
||||
// CHECK: ![[A:[0-9]+]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "A",
|
||||
|
||||
// CHECK-DAG: !DISubprogram(name: "pub_default",{{.*}} line: [[@LINE+1]],{{.*}} flags: DIFlagPrototyped,
|
||||
void pub_default();
|
||||
// CHECK-DAG: !DIDerivedType(tag: DW_TAG_member, name: "pub_default_static",{{.*}} line: [[@LINE+1]],{{.*}} flags: DIFlagStaticMember)
|
||||
static int pub_default_static;
|
||||
};
|
||||
|
||||
// CHECK: !DIDerivedType(tag: DW_TAG_inheritance,{{.*}} baseType: !"_ZTS1A",{{.*}} flags: DIFlagPublic)
|
||||
|
||||
// CHECK: !DIDerivedType(tag: DW_TAG_inheritance,{{.*}} baseType: ![[A]],{{.*}} flags: DIFlagPublic)
|
||||
class B : public A {
|
||||
public:
|
||||
// CHECK-DAG: !DISubprogram(name: "pub",{{.*}} line: [[@LINE+1]],{{.*}} flags: DIFlagPublic | DIFlagPrototyped,
|
||||
|
@ -24,9 +24,8 @@ int main(int argc, char **argv) {
|
||||
|
||||
// CHECK: ![[CLASSTYPE:.*]] = distinct !DICompositeType(tag: DW_TAG_class_type, name: "A",
|
||||
// CHECK-SAME: identifier: "_ZTS1A"
|
||||
// CHECK: ![[ARTARG:.*]] = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !"_ZTS1A",
|
||||
// CHECK-SAME: DIFlagArtificial
|
||||
// CHECK: !DISubprogram(name: "A", scope: !"_ZTS1A"
|
||||
// CHECK: ![[ARTARG:.*]] = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: ![[CLASSTYPE]],{{.*}} DIFlagArtificial
|
||||
// CHECK: !DISubprogram(name: "A", scope: ![[CLASSTYPE]]
|
||||
// CHECK-SAME: line: 12
|
||||
// CHECK-SAME: DIFlagPublic
|
||||
// CHECK: !DISubroutineType(types: [[FUNCTYPE:![0-9]*]])
|
||||
|
@ -90,6 +90,15 @@ int main(int argc, char **argv) {
|
||||
// CHECK: invoke {{.+}} @_ZN1BD1Ev(%class.B* %b)
|
||||
// CHECK-NEXT: unwind label %{{.+}}, !dbg ![[EXCEPTLOC:.*]]
|
||||
// CHECK: store i32 0, i32* %{{.+}}, !dbg ![[RETLOC:.*]]
|
||||
|
||||
// CHECK: [[F:![0-9]*]] = !DICompositeType(tag: DW_TAG_structure_type, name: "F"
|
||||
// CHECK-SAME: DIFlagFwdDecl
|
||||
// CHECK-SAME: identifier: "_ZTS1F"
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "I"
|
||||
// CHECK-NOT: DIFlagFwdDecl
|
||||
// CHECK-SAME: ){{$}}
|
||||
|
||||
// CHECK: ![[INT:[0-9]+]] = !DIBasicType(name: "int"
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "foo"
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_class_type, name: "bar"
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_union_type, name: "baz"
|
||||
@ -99,12 +108,10 @@ int main(int argc, char **argv) {
|
||||
// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "_vptr$B",
|
||||
// CHECK-SAME: DIFlagArtificial
|
||||
|
||||
// CHECK: ![[INT:[0-9]+]] = !DIBasicType(name: "int"
|
||||
|
||||
// CHECK: [[C:![0-9]*]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "C",
|
||||
// CHECK-NOT: DIFlagFwdDecl
|
||||
// CHECK-SAME: elements: [[C_MEM:![0-9]*]]
|
||||
// CHECK-SAME: vtableHolder: !"_ZTS1C"
|
||||
// CHECK-SAME: vtableHolder: [[C]]
|
||||
// CHECK-SAME: identifier: "_ZTS1C"
|
||||
// CHECK: [[C_MEM]] = !{[[C_VPTR:![0-9]*]], [[C_S:![0-9]*]], [[C_DTOR:![0-9]*]]}
|
||||
// CHECK: [[C_VPTR]] = !DIDerivedType(tag: DW_TAG_member, name: "_vptr$C"
|
||||
@ -114,39 +121,33 @@ int main(int argc, char **argv) {
|
||||
// CHECK-SAME: DIFlagStaticMember
|
||||
// CHECK: [[C_DTOR]] = !DISubprogram(name: "~C"
|
||||
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "D"
|
||||
// CHECK: [[D:![0-9]+]] = !DICompositeType(tag: DW_TAG_structure_type, name: "D"
|
||||
// CHECK-SAME: DIFlagFwdDecl
|
||||
// CHECK-SAME: identifier: "_ZTS1D"
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "E"
|
||||
// CHECK-SAME: DIFlagFwdDecl
|
||||
// CHECK-SAME: identifier: "_ZTS1E"
|
||||
// CHECK: [[F:![0-9]*]] = !DICompositeType(tag: DW_TAG_structure_type, name: "F"
|
||||
// CHECK-SAME: DIFlagFwdDecl
|
||||
// CHECK-SAME: identifier: "_ZTS1F"
|
||||
|
||||
// CHECK: !DISubprogram(name: "func",{{.*}} scope: [[D]]
|
||||
// CHECK-SAME: isDefinition: true
|
||||
// CHECK-SAME: declaration: [[D_FUNC_DECL:![0-9]*]]
|
||||
// CHECK: [[D_FUNC_DECL]] = !DISubprogram(name: "func",{{.*}} scope: [[D]]
|
||||
// CHECK-SAME: isDefinition: false
|
||||
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "inner",{{.*}} line: 50
|
||||
// CHECK-NOT: DIFlagFwdDecl
|
||||
// CHECK-SAME: elements: [[G_INNER_MEM:![0-9]*]]
|
||||
// CHECK-SAME: identifier: "_ZTSN1G5innerE"
|
||||
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "G"
|
||||
// CHECK-SAME: DIFlagFwdDecl
|
||||
// CHECK-SAME: identifier: "_ZTS1G"
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "inner"
|
||||
// CHECK: line: 50
|
||||
// CHECK-NOT: DIFlagFwdDecl
|
||||
// CHECK-SAME: elements: [[G_INNER_MEM:![0-9]*]]
|
||||
// CHECK-SAME: identifier: "_ZTSN1G5innerE"
|
||||
// CHECK: [[G_INNER_MEM]] = !{[[G_INNER_I:![0-9]*]]}
|
||||
// CHECK: [[G_INNER_I]] = !DIDerivedType(tag: DW_TAG_member, name: "j"
|
||||
// CHECK-SAME: baseType: ![[INT]]
|
||||
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "A"
|
||||
// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "HdrSize"
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "I"
|
||||
// CHECK-NOT: DIFlagFwdDecl
|
||||
// CHECK-SAME: ){{$}}
|
||||
//
|
||||
// CHECK: !DISubprogram(name: "func",{{.*}} scope: !"_ZTS1D"
|
||||
// CHECK-SAME: isDefinition: true
|
||||
// CHECK-SAME: declaration: [[D_FUNC_DECL:![0-9]*]]
|
||||
// CHECK: [[D_FUNC_DECL]] = !DISubprogram(name: "func",{{.*}} scope: !"_ZTS1D"
|
||||
// CHECK-SAME: isDefinition: false
|
||||
|
||||
// CHECK: ![[EXCEPTLOC]] = !DILocation(line: 84,
|
||||
// CHECK: ![[RETLOC]] = !DILocation(line: 83,
|
||||
|
@ -1,10 +1,10 @@
|
||||
// RUN: %clang_cc1 -triple %itanium_abi_triple -emit-llvm-only -std=c++14 -emit-llvm -debug-info-kind=limited %s -o - | FileCheck %s
|
||||
|
||||
// CHECK: [[EMPTY:![0-9]*]] = !{}
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "foo",
|
||||
// CHECK: [[FOO:![0-9]+]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "foo",
|
||||
// CHECK-SAME: elements: [[EMPTY]]
|
||||
// FIXME: The context of this definition should be the CU/file scope, not the class.
|
||||
// CHECK: !DISubprogram(name: "func", {{.*}} scope: !"_ZTS3foo"
|
||||
// CHECK: !DISubprogram(name: "func", {{.*}} scope: [[FOO]]
|
||||
// CHECK-SAME: type: [[SUBROUTINE_TYPE:![0-9]*]]
|
||||
// CHECK-SAME: isDefinition: true
|
||||
// CHECK-SAME: declaration: [[FUNC_DECL:![0-9]*]]
|
||||
@ -12,7 +12,7 @@
|
||||
// CHECK: [[TYPE_LIST]] = !{[[INT:![0-9]*]]}
|
||||
// CHECK: [[INT]] = !DIBasicType(name: "int"
|
||||
// CHECK: [[FUNC_DECL]] = !DISubprogram(name: "func",
|
||||
// CHECK-SAME: scope: !"_ZTS3foo"
|
||||
// CHECK-SAME: scope: [[FOO]]
|
||||
// CHECK-SAME: type: [[SUBROUTINE_TYPE]]
|
||||
// CHECK-SAME: isDefinition: false
|
||||
|
||||
|
@ -101,11 +101,11 @@ void f2(E) {
|
||||
void fz() { Z z; }
|
||||
|
||||
namespace test5 {
|
||||
// CHECK: [[TEST5:![0-9]+]] = !DINamespace(name: "test5"
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_enumeration_type, name: "E"
|
||||
// CHECK-SAME: scope: [[TEST5:![0-9]+]]
|
||||
// CHECK-SAME: scope: [[TEST5]]
|
||||
// CHECK-SAME: flags: DIFlagFwdDecl
|
||||
// CHECK-SAME: identifier: "_ZTSN5test51EE"
|
||||
// CHECK: [[TEST5]] = !DINamespace(name: "test5"
|
||||
enum E : int;
|
||||
void f1(E *) {
|
||||
}
|
||||
|
@ -26,10 +26,11 @@ int global_namespace_variable = 1;
|
||||
// function has the file as a context.
|
||||
|
||||
// CHECK: ![[FILE:[0-9]+]] = !DIFile(filename: "{{.*}}context.cpp",
|
||||
// CHECK: ![[C:[0-9]+]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "C",
|
||||
// CHECK: ![[NS:.*]] = !DINamespace(name: "ns"
|
||||
// CHECK: !DISubprogram(name: "member_function",{{.*}} scope: !"_ZTS1C",{{.*}} isDefinition: true
|
||||
// CHECK: !DISubprogram(name: "member_function",{{.*}} scope: ![[C]],{{.*}} isDefinition: true
|
||||
|
||||
// CHECK: !DISubprogram(name: "static_member_function",{{.*}} scope: !"_ZTS1C",{{.*}} isDefinition: true
|
||||
// CHECK: !DISubprogram(name: "static_member_function",{{.*}} scope: ![[C]],{{.*}} isDefinition: true
|
||||
|
||||
// CHECK: !DISubprogram(name: "global_function",{{.*}} scope: ![[FILE]],{{.*}} isDefinition: true
|
||||
|
||||
|
@ -9,9 +9,10 @@ struct Bar {
|
||||
int i1;
|
||||
// CHECK: ![[INT:[0-9]+]] = !DIBasicType(name: "int"
|
||||
// CHECK: !DIDerivedType(tag: DW_TAG_member, scope:
|
||||
// CHECK-SAME: line: [[@LINE+3]]
|
||||
// CHECK-SAME: baseType: !"_ZTSN3BarUt_E"
|
||||
// CHECK-SAME: line: [[@LINE+4]]
|
||||
// CHECK-SAME: baseType: ![[UNION:[0-9]+]]
|
||||
// CHECK-SAME: size: 32, align: 32, offset: 32
|
||||
// CHECK: ![[UNION]] = distinct !DICompositeType(tag: DW_TAG_union_type,{{.*}} identifier: "_ZTSN3BarUt_E")
|
||||
union {
|
||||
// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "i2",
|
||||
// CHECK-SAME: line: [[@LINE+5]]
|
||||
|
@ -1,8 +1,8 @@
|
||||
// RUN: %clang_cc1 -emit-llvm -triple %itanium_abi_triple -std=c++11 -debug-info-kind=limited %s -o - | FileCheck %s
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_class_type, name: "A",{{.*}} identifier: "_ZTS1A")
|
||||
// CHECK: ![[A:[0-9]+]] = distinct !DICompositeType(tag: DW_TAG_class_type, name: "A",{{.*}} identifier: "_ZTS1A")
|
||||
// CHECK: !DISubprogram(name: "foo", linkageName: "_ZN1A3fooEiS_3$_0"
|
||||
// CHECK-SAME: DIFlagProtected
|
||||
// CHECK: ![[THISTYPE:[0-9]+]] = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !"_ZTS1A"
|
||||
// CHECK: ![[THISTYPE:[0-9]+]] = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: ![[A]]
|
||||
// CHECK-SAME: DIFlagArtificial
|
||||
// CHECK: !DIDerivedType(tag: DW_TAG_ptr_to_member_type
|
||||
// CHECK: !DIDerivedType(tag: DW_TAG_ptr_to_member_type, baseType: ![[MEMFUNTYPE:[0-9]+]]
|
||||
|
@ -57,41 +57,41 @@ void B::func_fwd() {}
|
||||
|
||||
// CHECK: [[CU:![0-9]+]] = distinct !DICompileUnit(
|
||||
// CHECK-SAME: imports: [[MODULES:![0-9]*]]
|
||||
// CHECK: [[FOO:![0-9]+]] = !DICompositeType(tag: DW_TAG_structure_type, name: "foo",
|
||||
// CHECK-SAME: line: 5
|
||||
// CHECK-SAME: DIFlagFwdDecl
|
||||
// CHECK: [[FOOCPP:![0-9]+]] = !DIFile(filename: "foo.cpp"
|
||||
// CHECK: [[NS:![0-9]+]] = !DINamespace(name: "B", scope: [[CTXT:![0-9]+]], file: [[FOOCPP]], line: 1)
|
||||
// CHECK: [[I:![0-9]+]] = !DIGlobalVariable(name: "i",{{.*}} scope: [[NS:![0-9]+]],
|
||||
// CHECK: [[NS]] = !DINamespace(name: "B", scope: [[CTXT:![0-9]+]], file: [[FOOCPP:![0-9]+]], line: 1)
|
||||
// CHECK: [[FOOCPP]] = !DIFile(filename: "foo.cpp"
|
||||
// CHECK: [[CTXT]] = !DINamespace(name: "A", scope: null, file: [[FILE:![0-9]+]], line: 5)
|
||||
// CHECK: [[FILE]] = !DIFile(filename: "{{.*}}debug-info-namespace.cpp",
|
||||
// CHECK: [[BAR:![0-9]+]] = !DICompositeType(tag: DW_TAG_structure_type, name: "bar",
|
||||
// CHECK-SAME: line: 6
|
||||
// CHECK-SAME: DIFlagFwdDecl
|
||||
|
||||
// CHECK: [[I:![0-9]+]] = !DIGlobalVariable(name: "i",{{.*}} scope: [[NS]],
|
||||
// CHECK: [[VAR_FWD:![0-9]+]] = !DIGlobalVariable(name: "var_fwd",{{.*}} scope: [[NS]],
|
||||
// CHECK-SAME: line: 44
|
||||
// CHECK-SAME: isDefinition: true
|
||||
|
||||
// CHECK: [[MODULES]] = !{[[M1:![0-9]+]], [[M2:![0-9]+]], [[M3:![0-9]+]], [[M4:![0-9]+]], [[M5:![0-9]+]], [[M6:![0-9]+]], [[M7:![0-9]+]], [[M8:![0-9]+]], [[M9:![0-9]+]], [[M10:![0-9]+]], [[M11:![0-9]+]], [[M12:![0-9]+]], [[M13:![0-9]+]], [[M14:![0-9]+]], [[M15:![0-9]+]], [[M16:![0-9]+]], [[M17:![0-9]+]]}
|
||||
// CHECK: [[M1]] = !DIImportedEntity(tag: DW_TAG_imported_module, scope: [[CTXT]], entity: [[NS]], line: 15)
|
||||
|
||||
// CHECK: [[M2]] = !DIImportedEntity(tag: DW_TAG_imported_module, scope: [[CU]], entity: [[CTXT]],
|
||||
// CHECK: [[M3]] = !DIImportedEntity(tag: DW_TAG_imported_declaration, name: "E", scope: [[CU]], entity: [[CTXT]], line: 19)
|
||||
// CHECK: [[M4]] = !DIImportedEntity(tag: DW_TAG_imported_module, scope: [[LEX2:![0-9]+]], entity: [[NS]], line: 23)
|
||||
// CHECK: [[LEX2]] = distinct !DILexicalBlock(scope: [[LEX1:![0-9]+]], file: [[FOOCPP]],
|
||||
// CHECK: [[LEX1]] = distinct !DILexicalBlock(scope: [[FUNC:![0-9]+]], file: [[FOOCPP]],
|
||||
// CHECK: [[FUNC]] = distinct !DISubprogram(name: "func",{{.*}} isDefinition: true
|
||||
|
||||
// CHECK: [[M5]] = !DIImportedEntity(tag: DW_TAG_imported_module, scope: [[FUNC]], entity: [[CTXT]],
|
||||
// CHECK: [[M6]] = !DIImportedEntity(tag: DW_TAG_imported_declaration, scope: [[FUNC]], entity: [[FOO:!"_ZTSN1A1B3fooE"]], line: 27)
|
||||
// CHECK: [[M7]] = !DIImportedEntity(tag: DW_TAG_imported_declaration, scope: [[FUNC]], entity: [[BAR:!"_ZTSN1A1B3barE"]]
|
||||
// CHECK: [[FUNC:![0-9]+]] = distinct !DISubprogram(name: "func",{{.*}} isDefinition: true
|
||||
// CHECK: [[M5]] = !DIImportedEntity(tag: DW_TAG_imported_module, scope: [[FUNC]], entity: [[CTXT:![0-9]+]],
|
||||
// CHECK: [[M6]] = !DIImportedEntity(tag: DW_TAG_imported_declaration, scope: [[FUNC]], entity: [[FOO:![0-9]+]], line: 27)
|
||||
// CHECK: [[FOO]] = !DICompositeType(tag: DW_TAG_structure_type, name: "foo",
|
||||
// CHECK-SAME: line: 5
|
||||
// CHECK-SAME: DIFlagFwdDecl
|
||||
// CHECK: [[M7]] = !DIImportedEntity(tag: DW_TAG_imported_declaration, scope: [[FUNC]], entity: [[BAR:![0-9]+]]
|
||||
// CHECK: [[BAR]] = !DICompositeType(tag: DW_TAG_structure_type, name: "bar",
|
||||
// CHECK-SAME: line: 6
|
||||
// CHECK-SAME: DIFlagFwdDecl
|
||||
|
||||
// CHECK: [[M8]] = !DIImportedEntity(tag: DW_TAG_imported_declaration, scope: [[FUNC]], entity: [[F1:![0-9]+]]
|
||||
// CHECK: [[F1:![0-9]+]] = distinct !DISubprogram(name: "f1",{{.*}} line: 4
|
||||
// CHECK-SAME: isDefinition: true
|
||||
// CHECK: [[M9]] = !DIImportedEntity(tag: DW_TAG_imported_declaration, scope: [[FUNC]], entity: [[I]]
|
||||
// CHECK: [[M10]] = !DIImportedEntity(tag: DW_TAG_imported_declaration, scope: [[FUNC]], entity: [[BAZ:![0-9]+]]
|
||||
// CHECK: [[BAZ]] = !DIDerivedType(tag: DW_TAG_typedef, name: "baz", scope: [[NS]], file: [[FOOCPP]],
|
||||
// CHECK-SAME: baseType: !"_ZTSN1A1B3barE"
|
||||
// CHECK-SAME: baseType: [[BAR]]
|
||||
// CHECK: [[M11]] = !DIImportedEntity(tag: DW_TAG_imported_declaration, name: "X", scope: [[FUNC]], entity: [[CTXT]]
|
||||
// CHECK: [[M12]] = !DIImportedEntity(tag: DW_TAG_imported_declaration, name: "Y", scope: [[FUNC]], entity: [[M11]]
|
||||
// CHECK: [[M13]] = !DIImportedEntity(tag: DW_TAG_imported_declaration, scope: [[FUNC]], entity: [[VAR_DECL:![0-9]+]]
|
||||
|
@ -24,37 +24,35 @@ public:
|
||||
static X x_a;
|
||||
};
|
||||
|
||||
int C::a = 4;
|
||||
int C::b = 2;
|
||||
int C::c = 1;
|
||||
|
||||
int main()
|
||||
{
|
||||
C instance_C;
|
||||
instance_C.d = 8;
|
||||
return C::c;
|
||||
}
|
||||
|
||||
// The definition of C::a drives the emission of class C, which is
|
||||
// why the definition of "a" comes before the declarations while
|
||||
// "b" and "c" come after.
|
||||
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_enumeration_type, name: "X"{{.*}}, identifier: "_ZTS1X")
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_class_type, name: "C"{{.*}}, identifier: "_ZTS1C")
|
||||
//
|
||||
// CHECK: ![[DECL_A:[0-9]+]] = !DIDerivedType(tag: DW_TAG_member, name: "a"
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "anon_static_decl_struct"
|
||||
// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "anon_static_decl_var"
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "static_decl_templ<int>"
|
||||
// CHECK-NOT: DIFlagFwdDecl
|
||||
// CHECK-SAME: ){{$}}
|
||||
// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "static_decl_templ_var"
|
||||
|
||||
// CHECK: !DIGlobalVariable(name: "a", {{.*}}variable: i32* @_ZN1C1aE, declaration: ![[DECL_A:[0-9]+]])
|
||||
int C::a = 4;
|
||||
// CHECK: ![[DECL_A]] = !DIDerivedType(tag: DW_TAG_member, name: "a"
|
||||
// CHECK-NOT: size:
|
||||
// CHECK-NOT: align:
|
||||
// CHECK-NOT: offset:
|
||||
// CHECK-SAME: flags: DIFlagStaticMember)
|
||||
//
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_class_type, name: "C"{{.*}}, identifier: "_ZTS1C")
|
||||
//
|
||||
// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "const_a"
|
||||
// CHECK-NOT: size:
|
||||
// CHECK-NOT: align:
|
||||
// CHECK-NOT: offset:
|
||||
// CHECK-SAME: flags: DIFlagStaticMember,
|
||||
// CHECK-SAME: extraData: i1 true)
|
||||
//
|
||||
|
||||
// CHECK: ![[DECL_B:[0-9]+]] = !DIDerivedType(tag: DW_TAG_member, name: "b"
|
||||
// CHECK-NOT: size:
|
||||
// CHECK-NOT: align:
|
||||
@ -67,7 +65,7 @@ int main()
|
||||
// CHECK-NOT: offset:
|
||||
// CHECK-SAME: flags: DIFlagProtected | DIFlagStaticMember,
|
||||
// CHECK-SAME: extraData: float 0x{{.*}})
|
||||
//
|
||||
|
||||
// CHECK: ![[DECL_C:[0-9]+]] = !DIDerivedType(tag: DW_TAG_member, name: "c"
|
||||
// CHECK-NOT: size:
|
||||
// CHECK-NOT: align:
|
||||
@ -84,12 +82,19 @@ int main()
|
||||
// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "x_a"
|
||||
// CHECK-SAME: flags: DIFlagPublic | DIFlagStaticMember)
|
||||
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "static_decl_templ<int>"
|
||||
// CHECK-NOT: DIFlagFwdDecl
|
||||
// CHECK-SAME: ){{$}}
|
||||
// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "static_decl_templ_var"
|
||||
// CHECK: !DIGlobalVariable(name: "b", {{.*}}variable: i32* @_ZN1C1bE, declaration: ![[DECL_B]])
|
||||
int C::b = 2;
|
||||
// CHECK: !DIGlobalVariable(name: "c", {{.*}}variable: i32* @_ZN1C1cE, declaration: ![[DECL_C]])
|
||||
int C::c = 1;
|
||||
|
||||
// CHECK: [[NS_X:![0-9]+]] = !DINamespace(name: "x"
|
||||
int main()
|
||||
{
|
||||
C instance_C;
|
||||
instance_C.d = 8;
|
||||
return C::c;
|
||||
}
|
||||
|
||||
// CHECK-NOT: !DIGlobalVariable(name: "anon_static_decl_var"
|
||||
|
||||
// Test this in an anonymous namespace to ensure the type is retained even when
|
||||
// it doesn't get automatically retained by the string type reference machinery.
|
||||
@ -100,9 +105,6 @@ struct anon_static_decl_struct {
|
||||
}
|
||||
|
||||
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "anon_static_decl_struct"
|
||||
// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "anon_static_decl_var"
|
||||
|
||||
int ref() {
|
||||
return anon_static_decl_struct::anon_static_decl_var;
|
||||
}
|
||||
@ -119,12 +121,6 @@ int static_decl_templ_ref() {
|
||||
return static_decl_templ<int>::static_decl_templ_var;
|
||||
}
|
||||
|
||||
// CHECK: !DIGlobalVariable(name: "a", {{.*}}variable: i32* @_ZN1C1aE, declaration: ![[DECL_A]])
|
||||
// CHECK: !DIGlobalVariable(name: "b", {{.*}}variable: i32* @_ZN1C1bE, declaration: ![[DECL_B]])
|
||||
// CHECK: !DIGlobalVariable(name: "c", {{.*}}variable: i32* @_ZN1C1cE, declaration: ![[DECL_C]])
|
||||
|
||||
// CHECK-NOT: !DIGlobalVariable(name: "anon_static_decl_var"
|
||||
|
||||
// Verify that even when a static member declaration is created lazily when
|
||||
// creating the definition, the declaration line is that of the canonical
|
||||
// declaration, not the definition. Also, since we look at the canonical
|
||||
@ -141,10 +137,10 @@ const int V::const_va;
|
||||
|
||||
namespace x {
|
||||
struct y {
|
||||
// CHECK: !DIGlobalVariable(name: "z",
|
||||
// CHECK-SAME: scope: [[NS_X:![0-9]+]]
|
||||
// CHECK: [[NS_X]] = !DINamespace(name: "x"
|
||||
static int z;
|
||||
};
|
||||
int y::z;
|
||||
}
|
||||
|
||||
// CHECK: !DIGlobalVariable(name: "z",
|
||||
// CHECK-SAME: scope: [[NS_X]]
|
||||
|
@ -6,6 +6,11 @@
|
||||
|
||||
// LINES-ONLY-NOT: !DICompositeType(tag: DW_TAG_structure_type
|
||||
|
||||
// "h" is at the top because it's in the compile unit's retainedTypes: list.
|
||||
// CHECK: DICompositeType(tag: DW_TAG_structure_type, name: "h<int>"
|
||||
// CHECK-NOT: DIFlagFwdDecl
|
||||
// CHECK-SAME: ){{$}}
|
||||
|
||||
template <typename T>
|
||||
struct a {
|
||||
};
|
||||
@ -85,9 +90,6 @@ template <typename T>
|
||||
struct h {
|
||||
};
|
||||
template class h<int>;
|
||||
// CHECK: DICompositeType(tag: DW_TAG_structure_type, name: "h<int>"
|
||||
// CHECK-NOT: DIFlagFwdDecl
|
||||
// CHECK-SAME: ){{$}}
|
||||
|
||||
template <typename T>
|
||||
struct i {
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
// Check that this pointer type is TC<int>
|
||||
// CHECK: ![[LINE:[0-9]+]] = distinct !DICompositeType(tag: DW_TAG_class_type, name: "TC<int>"{{.*}}, identifier: "_ZTS2TCIiE")
|
||||
// CHECK: !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !"_ZTS2TCIiE"
|
||||
// CHECK: !DIDerivedType(tag: DW_TAG_pointer_type, baseType: ![[LINE]]
|
||||
|
||||
template<typename T>
|
||||
class TC {
|
||||
|
@ -16,6 +16,12 @@ inline int add3(int x) {
|
||||
return MyClass().add<3>(x); // even though add<3> is ODR used, don't emit it since we don't codegen it
|
||||
}
|
||||
|
||||
// The compile unit pulls in the global variables first.
|
||||
// CHECK: !DIGlobalVariable(name: "x",
|
||||
// CHECK-SAME: type: ![[OUTER_FOO_INNER_ID:[0-9]+]]
|
||||
// CHECK-SAME: variable: %"struct.outer<foo>::inner"* @x
|
||||
|
||||
// CHECK: ![[OUTER_FOO_INNER_ID:[0-9]*]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "inner"{{.*}}, identifier:
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "foo"
|
||||
// CHECK-SAME: elements: [[FOO_MEM:![0-9]*]]
|
||||
// CHECK-SAME: identifier: "_ZTS3foo"
|
||||
@ -23,33 +29,35 @@ inline int add3(int x) {
|
||||
// CHECK: [[FOO_FUNC]] = !DISubprogram(name: "func", linkageName: "_ZN3foo4funcEN5outerIS_E5innerE",
|
||||
// CHECK-SAME: type: [[FOO_FUNC_TYPE:![0-9]*]]
|
||||
// CHECK: [[FOO_FUNC_TYPE]] = !DISubroutineType(types: [[FOO_FUNC_PARAMS:![0-9]*]])
|
||||
// CHECK: [[FOO_FUNC_PARAMS]] = !{null, !{{[0-9]*}}, !"[[OUTER_FOO_INNER_ID:.*]]"}
|
||||
// CHECK: !{{[0-9]*}} = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "inner"{{.*}}, identifier: "[[OUTER_FOO_INNER_ID]]")
|
||||
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "virt<elem>"
|
||||
// CHECK-SAME: elements: [[VIRT_MEM:![0-9]*]]
|
||||
// CHECK-SAME: vtableHolder: !"_ZTS4virtI4elemE"
|
||||
// CHECK-SAME: templateParams: [[VIRT_TEMP_PARAM:![0-9]*]]
|
||||
// CHECK-SAME: identifier: "_ZTS4virtI4elemE"
|
||||
// CHECK: [[VIRT_TEMP_PARAM]] = !{[[VIRT_T:![0-9]*]]}
|
||||
// CHECK: [[VIRT_T]] = !DITemplateTypeParameter(name: "T", type: !"_ZTS4elem")
|
||||
// CHECK: [[FOO_FUNC_PARAMS]] = !{null, !{{[0-9]*}}, ![[OUTER_FOO_INNER_ID]]}
|
||||
|
||||
// CHECK: [[C:![0-9]*]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "MyClass"
|
||||
// CHECK-SAME: elements: [[C_MEM:![0-9]*]]
|
||||
// CHECK-SAME: vtableHolder: !"_ZTS7MyClass"
|
||||
// CHECK-SAME: vtableHolder: [[C]]
|
||||
// CHECK-SAME: identifier: "_ZTS7MyClass")
|
||||
// CHECK: [[C_MEM]] = !{[[C_VPTR:![0-9]*]], [[C_FUNC:![0-9]*]]}
|
||||
// CHECK: [[C_VPTR]] = !DIDerivedType(tag: DW_TAG_member, name: "_vptr$MyClass"
|
||||
|
||||
// CHECK: [[C_FUNC]] = !DISubprogram(name: "func",{{.*}} line: 7,
|
||||
|
||||
// CHECK: [[ELEM:![0-9]*]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "elem"
|
||||
// CHECK: !DISubprogram(name: "add<2>"
|
||||
// CHECK-SAME: scope: [[C]]
|
||||
//
|
||||
// CHECK: [[VIRT_TEMP:![0-9]+]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "virt<elem>"
|
||||
// CHECK-SAME: elements: [[VIRT_MEM:![0-9]*]]
|
||||
// CHECK-SAME: vtableHolder: [[VIRT_TEMP]]
|
||||
// CHECK-SAME: templateParams: [[VIRT_TEMP_PARAM:![0-9]*]]
|
||||
// CHECK-SAME: identifier: "_ZTS4virtI4elemE"
|
||||
|
||||
// CHECK: [[ELEM:![0-9]+]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "elem"
|
||||
// CHECK-SAME: elements: [[ELEM_MEM:![0-9]*]]
|
||||
// CHECK-SAME: identifier: "_ZTS4elem"
|
||||
// CHECK: [[ELEM_MEM]] = !{[[ELEM_X:![0-9]*]]}
|
||||
// CHECK: [[ELEM_X]] = !DIDerivedType(tag: DW_TAG_member, name: "x", scope: !"_ZTS4elem"
|
||||
// CHECK-SAME: baseType: !"_ZTS4virtI4elemE"
|
||||
// CHECK: [[ELEM_X]] = !DIDerivedType(tag: DW_TAG_member, name: "x", scope: [[ELEM]]
|
||||
// CHECK-SAME: baseType: [[VIRT_TEMP:![0-9]+]]
|
||||
|
||||
// CHECK: [[VIRT_TEMP_PARAM]] = !{[[VIRT_T:![0-9]*]]}
|
||||
// CHECK: [[VIRT_T]] = !DITemplateTypeParameter(name: "T", type: [[ELEM]])
|
||||
|
||||
template<typename T>
|
||||
struct outer {
|
||||
@ -71,10 +79,6 @@ inline void func() {
|
||||
|
||||
outer<foo>::inner x;
|
||||
|
||||
// CHECK: !DIGlobalVariable(name: "x",
|
||||
// CHECK-SAME: type: !"[[OUTER_FOO_INNER_ID]]"
|
||||
// CHECK-SAME: variable: %"struct.outer<foo>::inner"* @x
|
||||
|
||||
template <typename T>
|
||||
struct virt {
|
||||
T* values;
|
||||
@ -96,6 +100,4 @@ void f2() {
|
||||
// from being added to type units, while still appearing in the type
|
||||
// declaration/reference in the compile unit.
|
||||
// CHECK: !DISubprogram(name: "MyClass"
|
||||
// CHECK-SAME: scope: !"_ZTS7MyClass"
|
||||
// CHECK: !DISubprogram(name: "add<2>"
|
||||
// CHECK-SAME: scope: !"_ZTS7MyClass"
|
||||
// CHECK-SAME: scope: [[C]]
|
||||
|
@ -15,17 +15,17 @@ void foo (const char *c) {
|
||||
str.assign(c, str);
|
||||
}
|
||||
|
||||
// CHECK: [[P:![0-9]*]] = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: [[CON:![0-9]*]]
|
||||
// CHECK: [[CON]] = !DIDerivedType(tag: DW_TAG_const_type, baseType: [[CH:![0-9]*]]
|
||||
// CHECK: [[CH]] = !DIBasicType(name: "char", size: 8, align: 8, encoding: DW_ATE_signed_char)
|
||||
// CHECK: [[BS:.*]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "basic_string<char>"
|
||||
// CHECK-SAME: line: 4
|
||||
// CHECK-SAME: size: 8, align: 8
|
||||
// CHECK: [[TYPE:![0-9]*]] = !DISubroutineType(types: [[ARGS:.*]])
|
||||
// CHECK: [[ARGS]] = !{!{{.*}}, !{{.*}}, [[P:![0-9]*]], [[R:.*]]}
|
||||
// CHECK: [[P]] = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: [[CON:![0-9]*]]
|
||||
// CHECK: [[CON]] = !DIDerivedType(tag: DW_TAG_const_type, baseType: [[CH:![0-9]*]]
|
||||
// CHECK: [[CH]] = !DIBasicType(name: "char", size: 8, align: 8, encoding: DW_ATE_signed_char)
|
||||
// CHECK: [[ARGS]] = !{!{{.*}}, !{{.*}}, [[P]], [[R:.*]]}
|
||||
|
||||
// CHECK: [[R]] = !DIDerivedType(tag: DW_TAG_reference_type, baseType: [[CON2:![0-9]*]]
|
||||
// CHECK: [[CON2]] = !DIDerivedType(tag: DW_TAG_const_type, baseType: !"_ZTS12basic_stringIcE"
|
||||
// CHECK: [[CON2]] = !DIDerivedType(tag: DW_TAG_const_type, baseType: [[BS]]
|
||||
// CHECK: !DISubprogram(name: "assign"
|
||||
// CHECK-SAME: line: 7
|
||||
// CHECK-SAME: scopeLine: 8
|
||||
|
@ -1,112 +1,8 @@
|
||||
// RUN: %clang -S -emit-llvm -target x86_64-unknown_unknown -g %s -o - -std=c++11 | FileCheck %s
|
||||
|
||||
// CHECK: !DICompileUnit(
|
||||
// CHECK-SAME: retainedTypes: [[RETAIN:![0-9]*]]
|
||||
// CHECK: [[EMPTY:![0-9]*]] = !{}
|
||||
// CHECK: [[RETAIN]] = !{!{{[0-9]]*}}, [[FOO:![0-9]*]],
|
||||
|
||||
|
||||
// CHECK: [[TC:![0-9]*]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "TC<unsigned int, 2, &glb, &foo::e, &foo::f, &foo::g, 1, 2, 3>"
|
||||
// CHECK-SAME: templateParams: [[TCARGS:![0-9]*]]
|
||||
// CHECK: [[TCARGS]] = !{[[TCARG1:![0-9]*]], [[TCARG2:![0-9]*]], [[TCARG3:![0-9]*]], [[TCARG4:![0-9]*]], [[TCARG5:![0-9]*]], [[TCARG6:![0-9]*]], [[TCARG7:![0-9]*]]}
|
||||
//
|
||||
// CHECK: [[TCARG1]] = !DITemplateTypeParameter(name: "T", type: [[UINT:![0-9]*]])
|
||||
// CHECK: [[UINT:![0-9]*]] = !DIBasicType(name: "unsigned int"
|
||||
// CHECK: [[TCARG2]] = !DITemplateValueParameter(type: [[UINT]], value: i32 2)
|
||||
// CHECK: [[TCARG3]] = !DITemplateValueParameter(name: "x", type: [[CINTPTR:![0-9]*]], value: i32* @glb)
|
||||
// CHECK: [[CINTPTR]] = !DIDerivedType(tag: DW_TAG_pointer_type, {{.*}}baseType: [[CINT:![0-9]+]]
|
||||
// CHECK: [[CINT]] = !DIDerivedType(tag: DW_TAG_const_type, {{.*}}baseType: [[INT:![0-9]+]]
|
||||
// CHECK: [[INT]] = !DIBasicType(name: "int"
|
||||
// CHECK: [[TCARG4]] = !DITemplateValueParameter(name: "a", type: [[MEMINTPTR:![0-9]*]], value: i64 8)
|
||||
// CHECK: [[MEMINTPTR]] = !DIDerivedType(tag: DW_TAG_ptr_to_member_type, {{.*}}baseType: [[INT]], {{.*}}extraData: !"_ZTS3foo")
|
||||
//
|
||||
// Currently Clang emits the pointer-to-member-function value, but LLVM doesn't
|
||||
// use it (GCC doesn't emit a value for pointers to member functions either - so
|
||||
// it's not clear what, if any, format would be acceptable to GDB)
|
||||
//
|
||||
// CHECK: [[TCARG5]] = !DITemplateValueParameter(name: "b", type: [[MEMFUNPTR:![0-9]*]], value: { i64, i64 } { i64 ptrtoint (void (%struct.foo*)* @_ZN3foo1fEv to i64), i64 0 })
|
||||
// CHECK: [[MEMFUNPTR]] = !DIDerivedType(tag: DW_TAG_ptr_to_member_type, {{.*}}baseType: [[FTYPE:![0-9]*]], {{.*}}extraData: !"_ZTS3foo")
|
||||
// CHECK: [[FTYPE]] = !DISubroutineType(types: [[FARGS:![0-9]*]])
|
||||
// CHECK: [[FARGS]] = !{null, [[FARG1:![0-9]*]]}
|
||||
// CHECK: [[FARG1]] = !DIDerivedType(tag: DW_TAG_pointer_type,
|
||||
// CHECK-SAME: baseType: !"_ZTS3foo"
|
||||
// CHECK-NOT: line:
|
||||
// CHECK-SAME: size: 64, align: 64
|
||||
// CHECK-NOT: offset: 0
|
||||
// CHECK-SAME: DIFlagArtificial
|
||||
//
|
||||
// CHECK: [[TCARG6]] = !DITemplateValueParameter(name: "f", type: [[FUNPTR:![0-9]*]], value: void ()* @_ZN3foo1gEv)
|
||||
// CHECK: [[FUNPTR]] = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: [[FUNTYPE:![0-9]*]]
|
||||
// CHECK: [[FUNTYPE]] = !DISubroutineType(types: [[FUNARGS:![0-9]*]])
|
||||
// CHECK: [[FUNARGS]] = !{null}
|
||||
// CHECK: [[TCARG7]] = !DITemplateValueParameter(tag: DW_TAG_GNU_template_parameter_pack, name: "Is", value: [[TCARG7_VALS:![0-9]*]])
|
||||
// CHECK: [[TCARG7_VALS]] = !{[[TCARG7_1:![0-9]*]], [[TCARG7_2:![0-9]*]], [[TCARG7_3:![0-9]*]]}
|
||||
// CHECK: [[TCARG7_1]] = !DITemplateValueParameter(type: [[INT]], value: i32 1)
|
||||
// CHECK: [[TCARG7_2]] = !DITemplateValueParameter(type: [[INT]], value: i32 2)
|
||||
// CHECK: [[TCARG7_3]] = !DITemplateValueParameter(type: [[INT]], value: i32 3)
|
||||
//
|
||||
// We could just emit a declaration of 'foo' here, rather than the entire
|
||||
// definition (same goes for any time we emit a member (function or data)
|
||||
// pointer type)
|
||||
// CHECK: [[FOO]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "foo", {{.*}}identifier: "_ZTS3foo")
|
||||
// CHECK: !DISubprogram(name: "f", linkageName: "_ZN3foo1fEv", {{.*}}type: [[FTYPE:![0-9]*]]
|
||||
//
|
||||
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "nested",
|
||||
// CHECK-SAME: scope: !"_ZTS2TCIjLj2EXadL_Z3glbEEXadL_ZN3foo1eEEEXadL_ZNS0_1fEvEEXadL_ZNS0_1gEvEEJLi1ELi2ELi3EEE"
|
||||
// CHECK-SAME: identifier: "[[TCNESTED:.*]]")
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "TC<int, -3, nullptr, nullptr, nullptr, nullptr>"
|
||||
// CHECK-SAME: templateParams: [[TCNARGS:![0-9]*]]
|
||||
// CHECK-SAME: identifier: "[[TCNT:.*]]")
|
||||
// CHECK: [[TCNARGS]] = !{[[TCNARG1:![0-9]*]], [[TCNARG2:![0-9]*]], [[TCNARG3:![0-9]*]], [[TCNARG4:![0-9]*]], [[TCNARG5:![0-9]*]], [[TCNARG6:![0-9]*]], [[TCNARG7:![0-9]*]]}
|
||||
// CHECK: [[TCNARG1]] = !DITemplateTypeParameter(name: "T", type: [[INT]])
|
||||
// CHECK: [[TCNARG2]] = !DITemplateValueParameter(type: [[INT]], value: i32 -3)
|
||||
// CHECK: [[TCNARG3]] = !DITemplateValueParameter(name: "x", type: [[CINTPTR]], value: i8 0)
|
||||
|
||||
// The interesting null pointer: -1 for member data pointers (since they are
|
||||
// just an offset in an object, they can be zero and non-null for the first
|
||||
// member)
|
||||
|
||||
// CHECK: [[TCNARG4]] = !DITemplateValueParameter(name: "a", type: [[MEMINTPTR]], value: i64 -1)
|
||||
//
|
||||
// In some future iteration we could possibly emit the value of a null member
|
||||
// function pointer as '{ i64, i64 } zeroinitializer' as it may be handled
|
||||
// naturally from the LLVM CodeGen side once we decide how to handle non-null
|
||||
// member function pointers. For now, it's simpler just to emit the 'i8 0'.
|
||||
//
|
||||
// CHECK: [[TCNARG5]] = !DITemplateValueParameter(name: "b", type: [[MEMFUNPTR]], value: i8 0)
|
||||
// CHECK: [[TCNARG6]] = !DITemplateValueParameter(name: "f", type: [[FUNPTR]], value: i8 0)
|
||||
// CHECK: [[TCNARG7]] = !DITemplateValueParameter(tag: DW_TAG_GNU_template_parameter_pack, name: "Is", value: [[EMPTY]])
|
||||
|
||||
// FIXME: these parameters should probably be rendered as 'glb' rather than
|
||||
// '&glb', since they're references, not pointers.
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "NN<tmpl_impl, &glb, &glb>",
|
||||
// CHECK-SAME: templateParams: [[NNARGS:![0-9]*]]
|
||||
// CHECK-SAME: identifier: "[[NNT:.*]]")
|
||||
// CHECK: [[NNARGS]] = !{[[NNARG1:![0-9]*]], [[NNARG2:![0-9]*]], [[NNARG3:![0-9]*]]}
|
||||
// CHECK: [[NNARG1]] = !DITemplateValueParameter(tag: DW_TAG_GNU_template_template_param, name: "tmpl", value: !"tmpl_impl")
|
||||
// CHECK: [[NNARG2]] = !DITemplateValueParameter(name: "lvr", type: [[INTLVR:![0-9]*]], value: i32* @glb)
|
||||
// CHECK: [[INTLVR]] = !DIDerivedType(tag: DW_TAG_reference_type, baseType: [[INT]]
|
||||
// CHECK: [[NNARG3]] = !DITemplateValueParameter(name: "rvr", type: [[INTRVR:![0-9]*]], value: i32* @glb)
|
||||
// CHECK: [[INTRVR]] = !DIDerivedType(tag: DW_TAG_rvalue_reference_type, baseType: [[INT]]
|
||||
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "PaddingAtEndTemplate<&PaddedObj>"
|
||||
// CHECK-SAME: templateParams: [[PTOARGS:![0-9]*]]
|
||||
// CHECK: [[PTOARGS]] = !{[[PTOARG1:![0-9]*]]}
|
||||
// CHECK: [[PTOARG1]] = !DITemplateValueParameter(type: [[CONST_PADDINGATEND_PTR:![0-9]*]], value: %struct.PaddingAtEnd* @PaddedObj)
|
||||
// CHECK: [[CONST_PADDINGATEND_PTR]] = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !"_ZTS12PaddingAtEnd", size: 64, align: 64)
|
||||
|
||||
// CHECK: !DIGlobalVariable(name: "tci",
|
||||
// CHECK-SAME: type: !"[[TCNESTED]]"
|
||||
// CHECK-SAME: variable: %"struct.TC<unsigned int, 2, &glb, &foo::e, &foo::f, &foo::g, 1, 2, 3>::nested"* @tci
|
||||
|
||||
// CHECK: !DIGlobalVariable(name: "tcn"
|
||||
// CHECK-SAME: type: !"[[TCNT]]"
|
||||
// CHECK-SAME: variable: %struct.TC* @tcn
|
||||
|
||||
// CHECK: !DIGlobalVariable(name: "nn"
|
||||
// CHECK-SAME: type: !"[[NNT]]"
|
||||
// CHECK-SAME: variable: %struct.NN* @nn
|
||||
struct foo {
|
||||
char pad[8]; // make the member pointer to 'e' a bit more interesting (nonzero)
|
||||
int e;
|
||||
@ -122,11 +18,100 @@ struct TC {
|
||||
};
|
||||
};
|
||||
|
||||
// CHECK: [[INT:![0-9]+]] = !DIBasicType(name: "int"
|
||||
int glb;
|
||||
void func();
|
||||
|
||||
TC<unsigned, 2, &glb, &foo::e, &foo::f, &foo::g, 1, 2, 3>::nested tci;
|
||||
TC<int, -3, nullptr, nullptr, nullptr, nullptr> tcn;
|
||||
// CHECK: !DIGlobalVariable(name: "tci",
|
||||
// CHECK-SAME: type: ![[TCNESTED:[0-9]+]]
|
||||
// CHECK-SAME: variable: %"struct.TC<unsigned int, 2, &glb, &foo::e, &foo::f, &foo::g, 1, 2, 3>::nested"* @tci
|
||||
// CHECK: ![[TCNESTED]] ={{.*}}!DICompositeType(tag: DW_TAG_structure_type, name: "nested",
|
||||
// CHECK-SAME: scope: ![[TC:[0-9]+]],
|
||||
|
||||
// CHECK: ![[TC]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "TC<unsigned int, 2, &glb, &foo::e, &foo::f, &foo::g, 1, 2, 3>"
|
||||
// CHECK-SAME: templateParams: [[TCARGS:![0-9]*]]
|
||||
TC
|
||||
// CHECK: [[TCARGS]] = !{[[TCARG1:![0-9]*]], [[TCARG2:![0-9]*]], [[TCARG3:![0-9]*]], [[TCARG4:![0-9]*]], [[TCARG5:![0-9]*]], [[TCARG6:![0-9]*]], [[TCARG7:![0-9]*]]}
|
||||
// CHECK: [[TCARG1]] = !DITemplateTypeParameter(name: "T", type: [[UINT:![0-9]*]])
|
||||
// CHECK: [[UINT:![0-9]*]] = !DIBasicType(name: "unsigned int"
|
||||
< unsigned,
|
||||
// CHECK: [[TCARG2]] = !DITemplateValueParameter(type: [[UINT]], value: i32 2)
|
||||
2,
|
||||
// CHECK: [[TCARG3]] = !DITemplateValueParameter(name: "x", type: [[CINTPTR:![0-9]*]], value: i32* @glb)
|
||||
// CHECK: [[CINTPTR]] = !DIDerivedType(tag: DW_TAG_pointer_type, {{.*}}baseType: [[CINT:![0-9]+]]
|
||||
// CHECK: [[CINT]] = !DIDerivedType(tag: DW_TAG_const_type, {{.*}}baseType: [[INT]]
|
||||
&glb,
|
||||
// CHECK: [[TCARG4]] = !DITemplateValueParameter(name: "a", type: [[MEMINTPTR:![0-9]*]], value: i64 8)
|
||||
// CHECK: [[MEMINTPTR]] = !DIDerivedType(tag: DW_TAG_ptr_to_member_type, {{.*}}baseType: [[INT]], {{.*}}extraData: ![[FOO:[0-9]+]])
|
||||
//
|
||||
// We could just emit a declaration of 'foo' here, rather than the entire
|
||||
// definition (same goes for any time we emit a member (function or data)
|
||||
// pointer type)
|
||||
// CHECK: [[FOO]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "foo", {{.*}}identifier: "_ZTS3foo")
|
||||
// CHECK: !DISubprogram(name: "f", linkageName: "_ZN3foo1fEv", {{.*}}type: [[FTYPE:![0-9]*]]
|
||||
//
|
||||
// Currently Clang emits the pointer-to-member-function value, but LLVM doesn't
|
||||
// use it (GCC doesn't emit a value for pointers to member functions either - so
|
||||
// it's not clear what, if any, format would be acceptable to GDB)
|
||||
//
|
||||
// CHECK: [[FTYPE:![0-9]*]] = !DISubroutineType(types: [[FARGS:![0-9]*]])
|
||||
// CHECK: [[FARGS]] = !{null, [[FARG1:![0-9]*]]}
|
||||
// CHECK: [[FARG1]] = !DIDerivedType(tag: DW_TAG_pointer_type,
|
||||
// CHECK-SAME: baseType: ![[FOO]]
|
||||
// CHECK-NOT: line:
|
||||
// CHECK-SAME: size: 64, align: 64
|
||||
// CHECK-NOT: offset: 0
|
||||
// CHECK-SAME: DIFlagArtificial
|
||||
// CHECK: [[FUNTYPE:![0-9]*]] = !DISubroutineType(types: [[FUNARGS:![0-9]*]])
|
||||
// CHECK: [[FUNARGS]] = !{null}
|
||||
&foo::e,
|
||||
// CHECK: [[TCARG5]] = !DITemplateValueParameter(name: "b", type: [[MEMFUNPTR:![0-9]*]], value: { i64, i64 } { i64 ptrtoint (void (%struct.foo*)* @_ZN3foo1fEv to i64), i64 0 })
|
||||
// CHECK: [[MEMFUNPTR]] = !DIDerivedType(tag: DW_TAG_ptr_to_member_type, {{.*}}baseType: [[FTYPE]], {{.*}}extraData: ![[FOO]])
|
||||
&foo::f,
|
||||
// CHECK: [[TCARG6]] = !DITemplateValueParameter(name: "f", type: [[FUNPTR:![0-9]*]], value: void ()* @_ZN3foo1gEv)
|
||||
// CHECK: [[FUNPTR]] = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: [[FUNTYPE]]
|
||||
&foo::g,
|
||||
// CHECK: [[TCARG7]] = !DITemplateValueParameter(tag: DW_TAG_GNU_template_parameter_pack, name: "Is", value: [[TCARG7_VALS:![0-9]*]])
|
||||
// CHECK: [[TCARG7_VALS]] = !{[[TCARG7_1:![0-9]*]], [[TCARG7_2:![0-9]*]], [[TCARG7_3:![0-9]*]]}
|
||||
// CHECK: [[TCARG7_1]] = !DITemplateValueParameter(type: [[INT]], value: i32 1)
|
||||
1,
|
||||
// CHECK: [[TCARG7_2]] = !DITemplateValueParameter(type: [[INT]], value: i32 2)
|
||||
2,
|
||||
// CHECK: [[TCARG7_3]] = !DITemplateValueParameter(type: [[INT]], value: i32 3)
|
||||
3>::nested tci;
|
||||
|
||||
// CHECK: !DIGlobalVariable(name: "tcn"
|
||||
// CHECK-SAME: type: ![[TCNT:[0-9]+]]
|
||||
// CHECK-SAME: variable: %struct.TC* @tcn
|
||||
TC
|
||||
// CHECK: ![[TCNT]] ={{.*}}!DICompositeType(tag: DW_TAG_structure_type, name: "TC<int, -3, nullptr, nullptr, nullptr, nullptr>"
|
||||
// CHECK-SAME: templateParams: [[TCNARGS:![0-9]*]]
|
||||
// CHECK: [[TCNARGS]] = !{[[TCNARG1:![0-9]*]], [[TCNARG2:![0-9]*]], [[TCNARG3:![0-9]*]], [[TCNARG4:![0-9]*]], [[TCNARG5:![0-9]*]], [[TCNARG6:![0-9]*]], [[TCNARG7:![0-9]*]]}
|
||||
// CHECK: [[TCNARG1]] = !DITemplateTypeParameter(name: "T", type: [[INT]])
|
||||
<int,
|
||||
// CHECK: [[TCNARG2]] = !DITemplateValueParameter(type: [[INT]], value: i32 -3)
|
||||
-3,
|
||||
// CHECK: [[TCNARG3]] = !DITemplateValueParameter(name: "x", type: [[CINTPTR]], value: i8 0)
|
||||
nullptr,
|
||||
|
||||
// The interesting null pointer: -1 for member data pointers (since they are
|
||||
// just an offset in an object, they can be zero and non-null for the first
|
||||
// member)
|
||||
|
||||
// CHECK: [[TCNARG4]] = !DITemplateValueParameter(name: "a", type: [[MEMINTPTR]], value: i64 -1)
|
||||
nullptr,
|
||||
//
|
||||
// In some future iteration we could possibly emit the value of a null member
|
||||
// function pointer as '{ i64, i64 } zeroinitializer' as it may be handled
|
||||
// naturally from the LLVM CodeGen side once we decide how to handle non-null
|
||||
// member function pointers. For now, it's simpler just to emit the 'i8 0'.
|
||||
//
|
||||
// CHECK: [[TCNARG5]] = !DITemplateValueParameter(name: "b", type: [[MEMFUNPTR]], value: i8 0)
|
||||
nullptr,
|
||||
// CHECK: [[TCNARG6]] = !DITemplateValueParameter(name: "f", type: [[FUNPTR]], value: i8 0)
|
||||
nullptr
|
||||
// CHECK: [[TCNARG7]] = !DITemplateValueParameter(tag: DW_TAG_GNU_template_parameter_pack, name: "Is", value: [[EMPTY]])
|
||||
> tcn;
|
||||
|
||||
template<typename>
|
||||
struct tmpl_impl {
|
||||
@ -136,8 +121,24 @@ template <template <typename> class tmpl, int &lvr, int &&rvr>
|
||||
struct NN {
|
||||
};
|
||||
|
||||
// CHECK: !DIGlobalVariable(name: "nn"
|
||||
// CHECK-SAME: type: ![[NNT:[0-9]+]]
|
||||
// CHECK-SAME: variable: %struct.NN* @nn
|
||||
|
||||
// FIXME: these parameters should probably be rendered as 'glb' rather than
|
||||
// '&glb', since they're references, not pointers.
|
||||
// CHECK: ![[NNT]] ={{.*}}!DICompositeType(tag: DW_TAG_structure_type, name: "NN<tmpl_impl, &glb, &glb>",
|
||||
// CHECK-SAME: templateParams: [[NNARGS:![0-9]*]]
|
||||
// CHECK-SAME: identifier:
|
||||
// CHECK: [[NNARGS]] = !{[[NNARG1:![0-9]*]], [[NNARG2:![0-9]*]], [[NNARG3:![0-9]*]]}
|
||||
// CHECK: [[NNARG1]] = !DITemplateValueParameter(tag: DW_TAG_GNU_template_template_param, name: "tmpl", value: !"tmpl_impl")
|
||||
// CHECK: [[NNARG2]] = !DITemplateValueParameter(name: "lvr", type: [[INTLVR:![0-9]*]], value: i32* @glb)
|
||||
// CHECK: [[INTLVR]] = !DIDerivedType(tag: DW_TAG_reference_type, baseType: [[INT]]
|
||||
// CHECK: [[NNARG3]] = !DITemplateValueParameter(name: "rvr", type: [[INTRVR:![0-9]*]], value: i32* @glb)
|
||||
// CHECK: [[INTRVR]] = !DIDerivedType(tag: DW_TAG_rvalue_reference_type, baseType: [[INT]]
|
||||
NN<tmpl_impl, glb, glb> nn;
|
||||
|
||||
// CHECK: ![[PADDINGATEND:[0-9]+]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "PaddingAtEnd",
|
||||
struct PaddingAtEnd {
|
||||
int i;
|
||||
char c;
|
||||
@ -145,6 +146,11 @@ struct PaddingAtEnd {
|
||||
|
||||
PaddingAtEnd PaddedObj = {};
|
||||
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "PaddingAtEndTemplate<&PaddedObj>"
|
||||
// CHECK-SAME: templateParams: [[PTOARGS:![0-9]*]]
|
||||
// CHECK: [[PTOARGS]] = !{[[PTOARG1:![0-9]*]]}
|
||||
// CHECK: [[PTOARG1]] = !DITemplateValueParameter(type: [[CONST_PADDINGATEND_PTR:![0-9]*]], value: %struct.PaddingAtEnd* @PaddedObj)
|
||||
// CHECK: [[CONST_PADDINGATEND_PTR]] = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: ![[PADDINGATEND]], size: 64, align: 64)
|
||||
template <PaddingAtEnd *>
|
||||
struct PaddingAtEndTemplate {
|
||||
};
|
||||
|
@ -2,13 +2,7 @@
|
||||
|
||||
struct A
|
||||
{
|
||||
// CHECK: !DISubprogram(name: "a", linkageName: "_ZN1A1aEiz"
|
||||
// CHECK-SAME: line: [[@LINE+2]]
|
||||
// CHECK-SAME: type: ![[ATY:[0-9]+]]
|
||||
void a(int c, ...) {}
|
||||
// CHECK: ![[ATY]] = !DISubroutineType(types: ![[AARGS:[0-9]+]])
|
||||
// We no longer use an explicit unspecified parameter. Instead we use a trailing null to mean the function is variadic.
|
||||
// CHECK: ![[AARGS]] = !{null, !{{[0-9]+}}, !{{[0-9]+}}, null}
|
||||
};
|
||||
|
||||
// CHECK: !DISubprogram(name: "b", linkageName: "_Z1biz"
|
||||
@ -18,6 +12,14 @@ void b(int c, ...) {
|
||||
// CHECK: ![[BTY]] = !DISubroutineType(types: ![[BARGS:[0-9]+]])
|
||||
// CHECK: ![[BARGS]] = !{null, !{{[0-9]+}}, null}
|
||||
|
||||
// The subprogram "a" comes after "b" because the function comes later.
|
||||
// CHECK: !DISubprogram(name: "a", linkageName: "_ZN1A1aEiz"
|
||||
// CHECK-SAME: line: 5,
|
||||
// CHECK-SAME: type: ![[ATY:[0-9]+]]
|
||||
// CHECK: ![[ATY]] = !DISubroutineType(types: ![[AARGS:[0-9]+]])
|
||||
// We no longer use an explicit unspecified parameter. Instead we use a trailing null to mean the function is variadic.
|
||||
// CHECK: ![[AARGS]] = !{null, !{{[0-9]+}}, !{{[0-9]+}}, null}
|
||||
|
||||
A a;
|
||||
|
||||
// CHECK: !DILocalVariable(name: "fptr"
|
||||
|
@ -1,5 +1,24 @@
|
||||
// RUN: %clang_cc1 -triple x86_64-none-linux-gnu -emit-llvm -debug-info-kind=limited %s -o - | FileCheck %s
|
||||
// RUN: %clang_cc1 -triple i686-pc-windows-msvc -emit-llvm -debug-info-kind=limited %s -o - | FileCheck %s --check-prefix=MSVC
|
||||
// RUN: %clang_cc1 -triple x86_64-none-linux-gnu -emit-llvm -debug-info-kind=limited %s -o - | FileCheck %s --check-prefix=CHECK --check-prefix=BOTH
|
||||
// RUN: %clang_cc1 -triple i686-pc-windows-msvc -emit-llvm -debug-info-kind=limited %s -o - | FileCheck %s --check-prefix=MSVC --check-prefix=BOTH
|
||||
|
||||
// CHECK: define void @_ZN7pr147634funcENS_3fooE
|
||||
// CHECK: call void @llvm.dbg.declare({{.*}}, metadata ![[F:[0-9]+]], metadata ![[EXPR:[0-9]+]])
|
||||
|
||||
// !llvm.dbg.cu pulls in globals and their types first.
|
||||
// CHECK-NOT: !DIGlobalVariable(name: "c"
|
||||
// CHECK: !DIGlobalVariable(name: "x", linkageName: "_ZN6pr96081xE"
|
||||
// CHECK-SAME: type: [[INCARRAYPTR:![0-9]*]]
|
||||
// CHECK-SAME: variable: [3 x i8]** @_ZN6pr96081xE
|
||||
// CHECK: [[INCARRAYPTR]] = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: [[INCARRAY:![0-9]+]]
|
||||
// CHECK: [[INCARRAY]] = !DICompositeType(tag: DW_TAG_array_type
|
||||
// CHECK-NOT: line:
|
||||
// CHECK-NOT: size:
|
||||
// CHECK-NOT: align:
|
||||
// CHECK-NOT: offset:
|
||||
// CHECK-SAME: baseType: ![[INCTYPE:[0-9]+]]
|
||||
|
||||
// CHECK: ![[INCTYPE]] = !DICompositeType(tag: DW_TAG_structure_type, name: "incomplete"
|
||||
// CHECK-SAME: DIFlagFwdDecl
|
||||
|
||||
template<typename T> struct Identity {
|
||||
typedef T Type;
|
||||
@ -47,38 +66,27 @@ namespace VirtualDtor {
|
||||
namespace VirtualBase {
|
||||
struct A { int a; };
|
||||
struct B : virtual A { int b; };
|
||||
// BOTH: ![[VBASE_B:[0-9]+]] ={{.*}}!DICompositeType(tag: DW_TAG_structure_type, name: "B",{{.*}} line: [[@LINE-1]],
|
||||
// MSVC-SAME: size: 96, align: 32
|
||||
// CHECK-SAME: size: 128, align: 64,
|
||||
// BOTH-NOT: offset:
|
||||
// BOTH-NOT: DIFlagFwdDecl
|
||||
// BOTH-SAME: elements: [[VBASE_B_DEF:![0-9]+]]
|
||||
// BOTH: [[VBASE_B_DEF]] = !{[[VBASE_A_IN_B:![0-9]+]],
|
||||
//
|
||||
// Look for the vbtable offset of A, which should be 4 for MSVC, 24 otherwise.
|
||||
// BOTH: [[VBASE_A_IN_B]] = !DIDerivedType(tag: DW_TAG_inheritance, scope: ![[VBASE_B]],
|
||||
// BOTH-SAME: baseType: ![[VBASE_A:[0-9]+]],
|
||||
// MSVC-SAME: offset: 4,
|
||||
// CHECK-SAME: offset: 24,
|
||||
//
|
||||
// BOTH: ![[VBASE_A]] ={{.*}}!DICompositeType(tag: DW_TAG_structure_type, name: "A",
|
||||
|
||||
void f() {
|
||||
B b;
|
||||
}
|
||||
}
|
||||
|
||||
// CHECK: define void @_ZN7pr147634funcENS_3fooE
|
||||
// CHECK: call void @llvm.dbg.declare({{.*}}, metadata ![[F:.*]], metadata ![[EXPR:.*]])
|
||||
|
||||
// MSVC: [[VBASE_B:![0-9]+]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "B",{{.*}} line: 49
|
||||
// MSVC-SAME: size: 96, align: 32
|
||||
// MSVC-NOT: offset:
|
||||
// MSVC-NOT: DIFlagFwdDecl
|
||||
// MSVC-SAME: elements: [[VBASE_B_DEF:![0-9]+]]
|
||||
// MSVC: [[VBASE_B_DEF]] = !{[[VBASE_A_IN_B:![0-9]+]],
|
||||
//
|
||||
// Look for the vbtable offset of A, which should be 4.
|
||||
// MSVC: [[VBASE_A_IN_B]] = !DIDerivedType(tag: DW_TAG_inheritance, scope: [[VBASE_B]],
|
||||
// MSVC-SAME: baseType: !{{[0-9]*}}
|
||||
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "B",{{.*}} line: 49,
|
||||
// CHECK-SAME: size: 128, align: 64,
|
||||
// CHECK-NOT: offset:
|
||||
// CHECK-NOT: DIFlagFwdDecl
|
||||
// CHECK-SAME: elements: [[VBASE_B_DEF:![^,)]+]]
|
||||
// CHECK: [[VBASE_B_DEF]] = !{[[VBASE_A_IN_B:![0-9]+]],
|
||||
//
|
||||
// Look for the vtable offset offset, which should be -24.
|
||||
// CHECK: [[VBASE_A_IN_B]] = !DIDerivedType(tag: DW_TAG_inheritance
|
||||
// CHECK-SAME: scope: !"_ZTSN11VirtualBase1BE"
|
||||
// CHECK-SAME: baseType: !"_ZTSN11VirtualBase1AE"
|
||||
// CHECK-SAME: offset: 24,
|
||||
namespace b5249287 {
|
||||
template <typename T> class A {
|
||||
struct B;
|
||||
@ -91,73 +99,56 @@ class Cls {
|
||||
Cls obj;
|
||||
}
|
||||
|
||||
// CHECK: [[FUNC:[0-9]+]] = distinct !DISubprogram(name: "func", linkageName: "_ZN7pr147634funcENS_3fooE"
|
||||
// CHECK-SAME: type: {{![0-9]+}}
|
||||
// CHECK-SAME: isDefinition: true
|
||||
|
||||
// CHECK: [[PR14763:![0-9]+]] = !DINamespace(name: "pr14763"
|
||||
namespace pr14763 {
|
||||
struct foo {
|
||||
// CHECK: ![[FOO:[0-9]+]] ={{.*}}!DICompositeType(tag: DW_TAG_structure_type, name: "foo"
|
||||
// CHECK-SAME: scope: [[PR14763]]
|
||||
// CHECK-SAME: identifier:
|
||||
foo(const foo&);
|
||||
};
|
||||
|
||||
// For some reason function arguments ended up down here
|
||||
// CHECK: ![[F]] = !DILocalVariable(name: "f", arg: 1, scope: ![[FUNC]]
|
||||
// CHECK-SAME: type: ![[FOO]]
|
||||
// CHECK: ![[EXPR]] = !DIExpression(DW_OP_deref)
|
||||
foo func(foo f) {
|
||||
return f; // reference 'f' for now because otherwise we hit another bug
|
||||
}
|
||||
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "foo"
|
||||
// CHECK-SAME: scope: [[PR14763:![0-9]+]]
|
||||
// CHECK-SAME: identifier: "[[FOO:.*]]"
|
||||
// CHECK: [[PR14763]] = !DINamespace(name: "pr14763"
|
||||
// CHECK: [[INCTYPE:![0-9]*]] = !DICompositeType(tag: DW_TAG_structure_type, name: "incomplete"
|
||||
// CHECK-SAME: DIFlagFwdDecl
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "a"
|
||||
// CHECK-SAME: elements: [[A_MEM:![0-9]+]]
|
||||
// CHECK-SAME: identifier: "_ZTSN7pr162141aE"
|
||||
// CHECK: [[A_MEM]] = !{[[A_I:![0-9]*]]}
|
||||
// CHECK: [[A_I]] = !DIDerivedType(tag: DW_TAG_member, name: "i"
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "b"
|
||||
// CHECK-SAME: DIFlagFwdDecl
|
||||
|
||||
}
|
||||
|
||||
void foo() {
|
||||
// CHECK: !DILocalVariable(name: "c"
|
||||
// CHECK-NOT: arg:
|
||||
// CHECK-SAME: )
|
||||
const wchar_t c = L'x';
|
||||
wchar_t d = c;
|
||||
}
|
||||
|
||||
// CHECK-NOT: !DIGlobalVariable(name: "c"
|
||||
|
||||
namespace pr9608 { // also pr9600
|
||||
struct incomplete;
|
||||
incomplete (*x)[3];
|
||||
// CHECK: !DIGlobalVariable(name: "x", linkageName: "_ZN6pr96081xE"
|
||||
// CHECK-SAME: type: [[INCARRAYPTR:![0-9]*]]
|
||||
// CHECK-SAME: variable: [3 x i8]** @_ZN6pr96081xE
|
||||
// CHECK: [[INCARRAYPTR]] = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: [[INCARRAY:![0-9]+]]
|
||||
// CHECK: [[INCARRAY]] = !DICompositeType(tag: DW_TAG_array_type
|
||||
// CHECK-NOT: line:
|
||||
// CHECK-NOT: size:
|
||||
// CHECK-NOT: align:
|
||||
// CHECK-NOT: offset:
|
||||
// CHECK-SAME: baseType: !"_ZTSN6pr960810incompleteE"
|
||||
}
|
||||
|
||||
// CHECK: [[FUNC:![0-9]+]] = distinct !DISubprogram(name: "func", linkageName: "_ZN7pr147634funcENS_3fooE"
|
||||
// CHECK-SAME: type: [[FUNC_TYPE:![0-9]*]]
|
||||
// CHECK-SAME: isDefinition: true
|
||||
|
||||
// For some reason function arguments ended up down here
|
||||
// CHECK: ![[F]] = !DILocalVariable(name: "f", arg: 1, scope: [[FUNC]]
|
||||
// CHECK-SAME: type: !"[[FOO]]"
|
||||
// CHECK: ![[EXPR]] = !DIExpression(DW_OP_deref)
|
||||
|
||||
// CHECK: !DILocalVariable(name: "c"
|
||||
// CHECK-NOT: arg:
|
||||
// CHECK-SAME: )
|
||||
|
||||
namespace pr16214 {
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "a"
|
||||
// CHECK-SAME: elements: [[A_MEM:![0-9]+]]
|
||||
// CHECK-SAME: identifier: "_ZTSN7pr162141aE"
|
||||
// CHECK: [[A_MEM]] = !{[[A_I:![0-9]*]]}
|
||||
struct a {
|
||||
// CHECK: [[A_I]] = !DIDerivedType(tag: DW_TAG_member, name: "i"
|
||||
int i;
|
||||
};
|
||||
|
||||
typedef a at;
|
||||
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "b"
|
||||
// CHECK-SAME: DIFlagFwdDecl
|
||||
struct b {
|
||||
};
|
||||
|
||||
|
@ -17,8 +17,6 @@ int d(int x) { D y[10]; return [x,y] { return y[x].x; }(); }
|
||||
// Randomness for file. -- 6
|
||||
// CHECK: [[FILE:.*]] = !DIFile(filename: "{{.*}}debug-lambda-expressions.cpp",
|
||||
|
||||
// CHECK: ![[INT:[0-9]+]] = !DIBasicType(name: "int"
|
||||
|
||||
// CVAR:
|
||||
// CHECK: !DIGlobalVariable(name: "cvar"
|
||||
// CHECK-SAME: line: [[CVAR_LINE:[0-9]+]]
|
||||
@ -37,6 +35,8 @@ int d(int x) { D y[10]; return [x,y] { return y[x].x; }(); }
|
||||
// CHECK-SAME: elements: ![[VAR_ARGS:[0-9]+]]
|
||||
// CHECK: ![[VAR_ARGS]] = !{!{{[0-9]+}}}
|
||||
|
||||
// CHECK: ![[INT:[0-9]+]] = !DIBasicType(name: "int"
|
||||
|
||||
// A: 10
|
||||
// CHECK: ![[A_FUNC:.*]] = distinct !DISubprogram(name: "a"{{.*}}, line: [[A_LINE:[0-9]+]]{{.*}}, isDefinition: true
|
||||
|
||||
|
@ -12,7 +12,8 @@ int D::d(int x) {
|
||||
}();
|
||||
}
|
||||
|
||||
// CHECK: ![[POINTER:.*]] = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !"_ZTS1D", size: 64, align: 64)
|
||||
// CHECK: ![[D:[0-9]+]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "D",
|
||||
// CHECK: ![[POINTER:.*]] = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: ![[D]], size: 64, align: 64)
|
||||
// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "this",
|
||||
// CHECK-SAME: line: 11
|
||||
// CHECK-SAME: baseType: ![[POINTER]]
|
||||
|
@ -10,10 +10,11 @@ int main(int argc, const char * argv[]) {
|
||||
return t.block();
|
||||
}
|
||||
|
||||
// CHECK: ![[TESTCT:[0-9]+]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "test"
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "__block_literal_1",
|
||||
// CHECK-SAME: elements: ![[ELEMS:.*]])
|
||||
// CHECK: ![[ELEMS]] = !{{{.*}}, ![[THIS:[0-9]+]]}
|
||||
// CHECK: ![[THIS]] = !DIDerivedType(tag: DW_TAG_member, name: "this",
|
||||
// CHECK-SAME: baseType: !"_ZTS4test",
|
||||
// CHECK-SAME: baseType: ![[TESTCT]],
|
||||
|
||||
|
||||
|
@ -1,13 +1,13 @@
|
||||
// RUN: %clang_cc1 -triple x86_64-apple-darwin -debug-info-kind=standalone -emit-llvm %s -o - | FileCheck %s
|
||||
|
||||
struct B {
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "B"
|
||||
// CHECK: ![[B:[0-9]+]] ={{.*}}!DICompositeType(tag: DW_TAG_structure_type, name: "B"
|
||||
// CHECK-SAME: line: [[@LINE-2]],
|
||||
// CHECK-SAME: size: 8, align: 8,
|
||||
// CHECK-NOT: offset:
|
||||
// CHECK-NOT: DIFlagFwdDecl
|
||||
// CHECK-SAME: elements: ![[BMEMBERS:[0-9]+]]
|
||||
// CHECK-SAME: identifier: [[B:.*]])
|
||||
// CHECK-SAME: identifier:
|
||||
// CHECK: ![[BMEMBERS]] = !{![[BB:[0-9]+]]}
|
||||
B(struct A *);
|
||||
// CHECK: ![[BB]] = !DISubprogram(name: "B", scope: ![[B]]
|
||||
|
@ -48,33 +48,32 @@ void foo() {
|
||||
anon.i = GlobalStruct.i = GlobalUnion.i = GlobalEnum;
|
||||
}
|
||||
|
||||
// CHECK: ![[NS:.*]] = !DINamespace(name: "DebugCXX", scope: ![[MOD:[0-9]+]],
|
||||
// CHECK: ![[MOD]] = !DIModule(scope: null, name: {{.*}}DebugCXX
|
||||
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "Struct",
|
||||
// CHECK-SAME: scope: ![[NS]],
|
||||
// CHECK: ![[STRUCT:[0-9]+]] = !DICompositeType(tag: DW_TAG_structure_type, name: "Struct",
|
||||
// CHECK-SAME: scope: ![[NS:[0-9]+]],
|
||||
// CHECK-SAME: flags: DIFlagFwdDecl,
|
||||
// CHECK-SAME: identifier: "_ZTSN8DebugCXX6StructE")
|
||||
|
||||
// CHECK: ![[NS]] = !DINamespace(name: "DebugCXX", scope: ![[MOD:[0-9]+]],
|
||||
// CHECK: ![[MOD]] = !DIModule(scope: null, name: {{.*}}DebugCXX
|
||||
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_enumeration_type, name: "Enum",
|
||||
// CHECK-SAME: scope: ![[NS]],
|
||||
// CHECK-SAME: flags: DIFlagFwdDecl,
|
||||
// CHECK-SAME: identifier: "_ZTSN8DebugCXX4EnumE")
|
||||
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_class_type,
|
||||
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_class_type,
|
||||
// CHECK-SAME: name: "Template<int, DebugCXX::traits<int> >",
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_class_type, name: "Template<int, DebugCXX::traits<int> >",
|
||||
// CHECK-SAME: scope: ![[NS]],
|
||||
// CHECK-SAME: flags: DIFlagFwdDecl,
|
||||
// CHECK-SAME: identifier: "_ZTSN8DebugCXX8TemplateIiNS_6traitsIiEEEE")
|
||||
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_class_type,
|
||||
// CHECK-SAME: name: "Template<float, DebugCXX::traits<float> >",
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_class_type, name: "Template<float, DebugCXX::traits<float> >",
|
||||
// CHECK-SAME: scope: ![[NS]],
|
||||
// CHECK-SAME: flags: DIFlagFwdDecl,
|
||||
// CHECK-SAME: identifier: "_ZTSN8DebugCXX8TemplateIfNS_6traitsIfEEEE")
|
||||
|
||||
// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "static_member",
|
||||
// CHECK-SAME: scope: ![[STRUCT]]
|
||||
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_union_type,
|
||||
// CHECK-SAME: flags: DIFlagFwdDecl, identifier: "_ZTS12TypedefUnion")
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_enumeration_type,
|
||||
@ -82,9 +81,6 @@ void foo() {
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_structure_type,
|
||||
// CHECK-SAME: flags: DIFlagFwdDecl, identifier: "_ZTS13TypedefStruct")
|
||||
|
||||
// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "static_member",
|
||||
// CHECK-SAME: scope: !"_ZTSN8DebugCXX6StructE"
|
||||
|
||||
// CHECK: !DIGlobalVariable(name: "anon_enum", {{.*}}, type: ![[ANON_ENUM:[0-9]+]]
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_enumeration_type, scope: ![[NS]],
|
||||
// CHECK-SAME: line: 16
|
||||
@ -104,7 +100,7 @@ void foo() {
|
||||
// CHECK-SAME: name: "InAnonymousNamespace", {{.*}}DIFlagFwdDecl)
|
||||
|
||||
|
||||
// CHECK: !DIImportedEntity(tag: DW_TAG_imported_declaration, scope: !0, entity: !"_ZTSN8DebugCXX6StructE", line: 27)
|
||||
// CHECK: !DIImportedEntity(tag: DW_TAG_imported_declaration, scope: !0, entity: ![[STRUCT]], line: 27)
|
||||
|
||||
// CHECK: !DICompileUnit(
|
||||
// CHECK-SAME: splitDebugFilename:
|
||||
|
@ -44,23 +44,24 @@
|
||||
// CHECK-SAME: )
|
||||
// CHECK: !DIEnumerator(name: "e5", value: 5)
|
||||
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "Struct"
|
||||
// CHECK-SAME: identifier: "_ZTSN8DebugCXX6StructE")
|
||||
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_class_type,
|
||||
// CHECK-SAME: name: "Template<int, DebugCXX::traits<int> >"
|
||||
// CHECK-SAME: identifier: "_ZTSN8DebugCXX8TemplateIiNS_6traitsIiEEEE")
|
||||
// CHECK: !DIDerivedType(tag: DW_TAG_typedef, name: "B",
|
||||
// no mangled name here yet.
|
||||
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_class_type, name: "A<void>"
|
||||
// CHECK-SAME: identifier: "_ZTSN8DebugCXX1AIJvEEE")
|
||||
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_class_type,
|
||||
// CHECK-SAME: name: "Template<float, DebugCXX::traits<float> >"
|
||||
// CHECK-SAME: identifier: "_ZTSN8DebugCXX8TemplateIfNS_6traitsIfEEEE")
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "Struct"
|
||||
// CHECK-SAME: identifier: "_ZTSN8DebugCXX6StructE")
|
||||
|
||||
// CHECK: !DIDerivedType(tag: DW_TAG_typedef, name: "B",
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_class_type, name: "Template<int, DebugCXX::traits<int> >"
|
||||
// CHECK-SAME: identifier: "_ZTSN8DebugCXX8TemplateIiNS_6traitsIiEEEE")
|
||||
|
||||
// CHECK: !DIDerivedType(tag: DW_TAG_typedef, name: "FloatInstatiation"
|
||||
// no mangled name here yet.
|
||||
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_class_type, name: "Template<float, DebugCXX::traits<float> >"
|
||||
// CHECK-SAME: identifier: "_ZTSN8DebugCXX8TemplateIfNS_6traitsIfEEEE")
|
||||
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_class_type, name: "FwdVirtual"
|
||||
// CHECK-SAME: elements:
|
||||
// CHECK-SAME: identifier: "_ZTS10FwdVirtual")
|
||||
@ -74,16 +75,6 @@
|
||||
// CHECK-NOT: name:
|
||||
// CHECK-SAME: identifier: "_ZTS13TypedefStruct")
|
||||
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_class_type, name: "Derived",
|
||||
// CHECK-SAME: identifier: "_ZTS7Derived")
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_class_type, name: "B", scope: !"_ZTS7Derived",
|
||||
// CHECK-SAME: elements: ![[B_MBRS:.*]], vtableHolder: !"_ZTS1A"
|
||||
// CHECK: ![[B_MBRS]] = !{{{.*}}, ![[GET_PARENT:.*]]}
|
||||
// CHECK: ![[GET_PARENT]] = !DISubprogram(name: "getParent"
|
||||
|
||||
// CHECK: !DIDerivedType(tag: DW_TAG_typedef, name: "FloatInstatiation"
|
||||
// no mangled name here yet.
|
||||
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_union_type,
|
||||
// CHECK-NOT: name:
|
||||
// CHECK-SAME: )
|
||||
@ -96,4 +87,12 @@
|
||||
// CHECK-SAME: name: "InAnonymousNamespace",
|
||||
// CHECK-SAME: elements: !{{[0-9]+}})
|
||||
|
||||
// CHECK: ![[A:[0-9]+]] = {{.*}}!DICompositeType(tag: DW_TAG_class_type, name: "A",
|
||||
// CHECK: ![[DERIVED:[0-9]+]] = {{.*}}!DICompositeType(tag: DW_TAG_class_type, name: "Derived",
|
||||
// CHECK-SAME: identifier: "_ZTS7Derived")
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_class_type, name: "B", scope: ![[DERIVED]],
|
||||
// CHECK-SAME: elements: ![[B_MBRS:.*]], vtableHolder: ![[A]]
|
||||
// CHECK: ![[B_MBRS]] = !{{{.*}}, ![[GET_PARENT:.*]]}
|
||||
// CHECK: ![[GET_PARENT]] = !DISubprogram(name: "getParent"
|
||||
|
||||
// CHECK-NEG-NOT: !DICompositeType(tag: DW_TAG_structure_type, name: "PureForwardDecl"
|
||||
|
Loading…
x
Reference in New Issue
Block a user