diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp --- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -1227,17 +1227,6 @@ if (Processed.insert(GV).second) CU.getOrCreateGlobalVariableDIE(GV, sortGlobalExprs(GVMap[GV])); } - - for (auto *Ty : CUNode->getEnumTypes()) - CU.getOrCreateTypeDIE(cast(Ty)); - - for (auto *Ty : CUNode->getRetainedTypes()) { - // The retained types array by design contains pointers to - // MDNodes rather than DIRefs. Unique them here. - if (DIType *RT = dyn_cast(Ty)) - // There is no point in force-emitting a forward declaration. - CU.getOrCreateTypeDIE(RT); - } } } @@ -1416,6 +1405,16 @@ const auto *CUNode = cast(P.first); DwarfCompileUnit *CU = &*P.second; + // Emit types. + for (auto *Ty : CUNode->getEnumTypes()) + CU->getOrCreateTypeDIE(cast(Ty)); + + for (auto *Ty : CUNode->getRetainedTypes()) { + if (DIType *RT = dyn_cast(Ty)) + // There is no point in force-emitting a forward declaration. + CU->getOrCreateTypeDIE(RT); + } + // Emit imported entities. for (auto *IE : CUNode->getImportedEntities()) { assert(!isa_and_nonnull(IE->getScope()) && diff --git a/llvm/test/CodeGen/AMDGPU/dwarf-multi-register-use-crash.ll b/llvm/test/CodeGen/AMDGPU/dwarf-multi-register-use-crash.ll --- a/llvm/test/CodeGen/AMDGPU/dwarf-multi-register-use-crash.ll +++ b/llvm/test/CodeGen/AMDGPU/dwarf-multi-register-use-crash.ll @@ -11,6 +11,7 @@ define weak_odr void @test(i32 %0) !dbg !34 { ; CHECK-LABEL: test: ; CHECK: .Lfunc_begin0: +; CHECK-NEXT: .file 1 "dummy" "dummy" md5 0xb67bec84bdce3730b4a6f2ed8d50b85c ; CHECK-NEXT: .loc 1 288 0 ; dummy:288:0 ; CHECK-NEXT: .cfi_sections .debug_frame ; CHECK-NEXT: .cfi_startproc diff --git a/llvm/test/DebugInfo/Generic/debug-info-qualifiers.ll b/llvm/test/DebugInfo/Generic/debug-info-qualifiers.ll --- a/llvm/test/DebugInfo/Generic/debug-info-qualifiers.ll +++ b/llvm/test/DebugInfo/Generic/debug-info-qualifiers.ll @@ -18,6 +18,10 @@ ; CHECK-NEXT: DW_AT_reference DW_FORM_flag_present ; CHECK: DW_TAG_subroutine_type DW_CHILDREN_yes ; CHECK-NEXT: DW_AT_rvalue_reference DW_FORM_flag_present + +; CHECK: DW_TAG_subprogram +; CHECK-NOT: DW_TAG_subprogram +; CHECK: DW_AT_name {{.*}} "g") ; ; CHECK: DW_TAG_subprogram ; CHECK-NOT: DW_TAG_subprogram diff --git a/llvm/test/DebugInfo/Generic/enum-types.ll b/llvm/test/DebugInfo/Generic/enum-types.ll --- a/llvm/test/DebugInfo/Generic/enum-types.ll +++ b/llvm/test/DebugInfo/Generic/enum-types.ll @@ -6,12 +6,12 @@ ; rdar://17628609 ; CHECK: DW_TAG_compile_unit -; CHECK: 0x[[ENUM:.*]]: DW_TAG_enumeration_type -; CHECK-NEXT: DW_AT_name {{.*}}"EA" ; CHECK: DW_TAG_subprogram ; CHECK: DW_AT_MIPS_linkage_name {{.*}}"_Z4topA2EA" ; CHECK: DW_TAG_formal_parameter -; CHECK: DW_AT_type [DW_FORM_ref4] (cu + 0x{{.*}} => {0x[[ENUM]]} +; CHECK: DW_AT_type [DW_FORM_ref4] (cu + 0x{{.*}} => {0x[[ENUM:.*]]} +; CHECK: 0x[[ENUM]]: DW_TAG_enumeration_type +; CHECK-NEXT: DW_AT_name {{.*}}"EA" ; CHECK: DW_TAG_compile_unit ; CHECK: DW_TAG_subprogram diff --git a/llvm/test/DebugInfo/Generic/incorrect-variable-debugloc.ll b/llvm/test/DebugInfo/Generic/incorrect-variable-debugloc.ll --- a/llvm/test/DebugInfo/Generic/incorrect-variable-debugloc.ll +++ b/llvm/test/DebugInfo/Generic/incorrect-variable-debugloc.ll @@ -34,6 +34,9 @@ ; b.m_fn2(); ; } +; CHECK: DW_TAG_structure_type +; CHECK-NEXT: DW_AT_name ("B") + ; CHECK: DW_TAG_structure_type ; CHECK-NEXT: DW_AT_name ("C") ; CHECK: [[M_FN3_DECL:.*]]: DW_TAG_subprogram diff --git a/llvm/test/DebugInfo/Generic/namespace.ll b/llvm/test/DebugInfo/Generic/namespace.ll --- a/llvm/test/DebugInfo/Generic/namespace.ll +++ b/llvm/test/DebugInfo/Generic/namespace.ll @@ -18,12 +18,6 @@ ; CHECK: [[VAR_FWD:0x[0-9a-f]*]]:{{ *}}DW_TAG_variable ; CHECK: DW_AT_name ("var_fwd") -; CHECK: [[FOO:0x[0-9a-f]*]]:{{ *}}DW_TAG_structure_type -; CHECK: DW_AT_name ("foo") -; CHECK: DW_AT_declaration -; CHECK: [[BAR:0x[0-9a-f]*]]:{{ *}}DW_TAG_structure_type -; CHECK: DW_AT_name ("bar") - ; CHECK: DW_TAG_subprogram ; CHECK: DW_AT_MIPS_linkage_name ; CHECK: DW_AT_name ("f1") @@ -37,6 +31,12 @@ ; CHECK: DW_AT_name ("func_fwd") ; CHECK-NOT: DW_AT_declaration +; CHECK: [[FOO:0x[0-9a-f]*]]:{{ *}}DW_TAG_structure_type +; CHECK: DW_AT_name ("foo") +; CHECK: DW_AT_declaration +; CHECK: [[BAR:0x[0-9a-f]*]]:{{ *}}DW_TAG_structure_type +; CHECK: DW_AT_name ("bar") + ; CHECK: [[BAZ:0x[0-9a-f]*]]:{{.*}}DW_TAG_typedef ; CHECK: DW_AT_name ("baz") diff --git a/llvm/test/DebugInfo/Generic/varargs.ll b/llvm/test/DebugInfo/Generic/varargs.ll --- a/llvm/test/DebugInfo/Generic/varargs.ll +++ b/llvm/test/DebugInfo/Generic/varargs.ll @@ -12,23 +12,23 @@ ; ; CHECK: DW_TAG_subprogram ; CHECK-NOT: DW_TAG -; CHECK: DW_AT_name ("a") +; CHECK: DW_AT_name ("b") ; CHECK-NOT: DW_TAG ; CHECK: DW_TAG_formal_parameter ; CHECK-NOT: DW_TAG -; CHECK: DW_TAG_formal_parameter +; CHECK: DW_TAG_variable +; CHECK-NOT: DW_TAG +; CHECK: DW_TAG_variable ; CHECK-NOT: DW_TAG ; CHECK: DW_TAG_unspecified_parameters ; ; CHECK: DW_TAG_subprogram ; CHECK-NOT: DW_TAG -; CHECK: DW_AT_name ("b") +; CHECK: DW_AT_name ("a") ; CHECK-NOT: DW_TAG ; CHECK: DW_TAG_formal_parameter ; CHECK-NOT: DW_TAG -; CHECK: DW_TAG_variable -; CHECK-NOT: DW_TAG -; CHECK: DW_TAG_variable +; CHECK: DW_TAG_formal_parameter ; CHECK-NOT: DW_TAG ; CHECK: DW_TAG_unspecified_parameters ; diff --git a/llvm/test/DebugInfo/MIR/AArch64/implicit-def-dead-scope.mir b/llvm/test/DebugInfo/MIR/AArch64/implicit-def-dead-scope.mir --- a/llvm/test/DebugInfo/MIR/AArch64/implicit-def-dead-scope.mir +++ b/llvm/test/DebugInfo/MIR/AArch64/implicit-def-dead-scope.mir @@ -5,7 +5,7 @@ # encountering an IMPLICIT_DEF in its own lexical scope. # CHECK: .debug_info contents: -# CHECK: DW_TAG_formal_parameter [14] +# CHECK: DW_TAG_formal_parameter [13] # CHECK-NEXT: DW_AT_const_value [DW_FORM_udata] (0) # CHECK-NEXT: DW_AT_abstract_origin {{.*}} "name" --- | diff --git a/llvm/test/DebugInfo/NVPTX/debug-loc-offset.ll b/llvm/test/DebugInfo/NVPTX/debug-loc-offset.ll --- a/llvm/test/DebugInfo/NVPTX/debug-loc-offset.ll +++ b/llvm/test/DebugInfo/NVPTX/debug-loc-offset.ll @@ -154,15 +154,6 @@ ; CHECK-NEXT: .b8 0 // EOM(1) ; CHECK-NEXT: .b8 0 // EOM(2) ; CHECK-NEXT: .b8 2 // Abbreviation Code -; CHECK-NEXT: .b8 19 // DW_TAG_structure_type -; CHECK-NEXT: .b8 0 // DW_CHILDREN_no -; CHECK-NEXT: .b8 3 // DW_AT_name -; CHECK-NEXT: .b8 8 // DW_FORM_string -; CHECK-NEXT: .b8 60 // DW_AT_declaration -; CHECK-NEXT: .b8 12 // DW_FORM_flag -; CHECK-NEXT: .b8 0 // EOM(1) -; CHECK-NEXT: .b8 0 // EOM(2) -; CHECK-NEXT: .b8 3 // Abbreviation Code ; CHECK-NEXT: .b8 46 // DW_TAG_subprogram ; CHECK-NEXT: .b8 1 // DW_CHILDREN_yes ; CHECK-NEXT: .b8 17 // DW_AT_low_pc @@ -184,7 +175,7 @@ ; CHECK-NEXT: .b8 12 // DW_FORM_flag ; CHECK-NEXT: .b8 0 // EOM(1) ; CHECK-NEXT: .b8 0 // EOM(2) -; CHECK-NEXT: .b8 4 // Abbreviation Code +; CHECK-NEXT: .b8 3 // Abbreviation Code ; CHECK-NEXT: .b8 5 // DW_TAG_formal_parameter ; CHECK-NEXT: .b8 0 // DW_CHILDREN_no ; CHECK-NEXT: .b8 3 // DW_AT_name @@ -197,7 +188,7 @@ ; CHECK-NEXT: .b8 19 // DW_FORM_ref4 ; CHECK-NEXT: .b8 0 // EOM(1) ; CHECK-NEXT: .b8 0 // EOM(2) -; CHECK-NEXT: .b8 5 // Abbreviation Code +; CHECK-NEXT: .b8 4 // Abbreviation Code ; CHECK-NEXT: .b8 52 // DW_TAG_variable ; CHECK-NEXT: .b8 0 // DW_CHILDREN_no ; CHECK-NEXT: .b8 3 // DW_AT_name @@ -210,6 +201,15 @@ ; CHECK-NEXT: .b8 16 // DW_FORM_ref_addr ; CHECK-NEXT: .b8 0 // EOM(1) ; CHECK-NEXT: .b8 0 // EOM(2) +; CHECK-NEXT: .b8 5 // Abbreviation Code +; CHECK-NEXT: .b8 19 // DW_TAG_structure_type +; CHECK-NEXT: .b8 0 // DW_CHILDREN_no +; CHECK-NEXT: .b8 3 // DW_AT_name +; CHECK-NEXT: .b8 8 // DW_FORM_string +; CHECK-NEXT: .b8 60 // DW_AT_declaration +; CHECK-NEXT: .b8 12 // DW_FORM_flag +; CHECK-NEXT: .b8 0 // EOM(1) +; CHECK-NEXT: .b8 0 // EOM(2) ; CHECK-NEXT: .b8 6 // Abbreviation Code ; CHECK-NEXT: .b8 46 // DW_TAG_subprogram ; CHECK-NEXT: .b8 1 // DW_CHILDREN_yes @@ -326,11 +326,7 @@ ; CHECK-NEXT: .b8 0 ; CHECK-NEXT: .b64 $L__func_begin1 // DW_AT_low_pc ; CHECK-NEXT: .b64 $L__func_end1 // DW_AT_high_pc -; CHECK-NEXT: .b8 2 // Abbrev [2] 0x64:0x4 DW_TAG_structure_type -; CHECK-NEXT: .b8 65 // DW_AT_name -; CHECK-NEXT: .b8 0 -; CHECK-NEXT: .b8 1 // DW_AT_declaration -; CHECK-NEXT: .b8 3 // Abbrev [3] 0x68:0x3a DW_TAG_subprogram +; CHECK-NEXT: .b8 2 // Abbrev [2] 0x64:0x3a DW_TAG_subprogram ; CHECK-NEXT: .b64 $L__func_begin1 // DW_AT_low_pc ; CHECK-NEXT: .b64 $L__func_end1 // DW_AT_high_pc ; CHECK-NEXT: .b8 1 // DW_AT_frame_base @@ -351,19 +347,23 @@ ; CHECK-NEXT: .b8 2 // DW_AT_decl_file ; CHECK-NEXT: .b8 6 // DW_AT_decl_line ; CHECK-NEXT: .b8 1 // DW_AT_external -; CHECK-NEXT: .b8 4 // Abbrev [4] 0x8b:0x9 DW_TAG_formal_parameter +; CHECK-NEXT: .b8 3 // Abbrev [3] 0x87:0x9 DW_TAG_formal_parameter ; CHECK-NEXT: .b8 97 // DW_AT_name ; CHECK-NEXT: .b8 0 ; CHECK-NEXT: .b8 2 // DW_AT_decl_file ; CHECK-NEXT: .b8 6 // DW_AT_decl_line -; CHECK-NEXT: .b32 100 // DW_AT_type -; CHECK-NEXT: .b8 5 // Abbrev [5] 0x94:0xd DW_TAG_variable +; CHECK-NEXT: .b32 158 // DW_AT_type +; CHECK-NEXT: .b8 4 // Abbrev [4] 0x90:0xd DW_TAG_variable ; CHECK-NEXT: .b8 122 // DW_AT_name ; CHECK-NEXT: .b8 0 ; CHECK-NEXT: .b8 2 // DW_AT_decl_file ; CHECK-NEXT: .b8 7 // DW_AT_decl_line ; CHECK-NEXT: .b64 .debug_info+311 // DW_AT_type ; CHECK-NEXT: .b8 0 // End Of Children Mark +; CHECK-NEXT: .b8 5 // Abbrev [5] 0x9e:0x4 DW_TAG_structure_type +; CHECK-NEXT: .b8 65 // DW_AT_name +; CHECK-NEXT: .b8 0 +; CHECK-NEXT: .b8 1 // DW_AT_declaration ; CHECK-NEXT: .b8 0 // End Of Children Mark ; CHECK-NEXT: .b32 152 // Length of Unit ; CHECK-NEXT: .b8 2 // DWARF version number @@ -463,7 +463,7 @@ ; CHECK-NEXT: .b8 1 // DW_AT_decl_line ; CHECK-NEXT: .b32 148 // DW_AT_type ; CHECK-NEXT: .b8 1 // DW_AT_external -; CHECK-NEXT: .b8 4 // Abbrev [4] 0x8a:0x9 DW_TAG_formal_parameter +; CHECK-NEXT: .b8 3 // Abbrev [3] 0x8a:0x9 DW_TAG_formal_parameter ; CHECK-NEXT: .b8 98 // DW_AT_name ; CHECK-NEXT: .b8 0 ; CHECK-NEXT: .b8 1 // DW_AT_decl_file diff --git a/llvm/test/DebugInfo/X86/align_cpp11.ll b/llvm/test/DebugInfo/X86/align_cpp11.ll --- a/llvm/test/DebugInfo/X86/align_cpp11.ll +++ b/llvm/test/DebugInfo/X86/align_cpp11.ll @@ -47,12 +47,6 @@ ; CHECK: DW_AT_name{{.*}}"xx" ; CHECK: DW_AT_alignment{{.*}}128 -; CHECK: DW_TAG_enumeration_type -; CHECK: DW_AT_alignment{{.*}}16 -; CHECK: DW_TAG_enumerator -; CHECK: DW_TAG_enumerator -; CHECK: DW_TAG_enumerator - ; CHECK: DW_TAG_subprogram ; CHECK: DW_TAG_variable ; CHECK: DW_TAG_variable @@ -68,6 +62,12 @@ ; CHECK: DW_TAG_subprogram ; CHECK: DW_TAG_formal_parameter +; CHECK: DW_TAG_enumeration_type +; CHECK: DW_AT_alignment{{.*}}16 +; CHECK: DW_TAG_enumerator +; CHECK: DW_TAG_enumerator +; CHECK: DW_TAG_enumerator + ; CHECK: DW_TAG_class_type ; CHECK: DW_AT_name{{.*}}"C1" ; CHECK: DW_TAG_member diff --git a/llvm/test/DebugInfo/X86/debug-info-blocks.ll b/llvm/test/DebugInfo/X86/debug-info-blocks.ll --- a/llvm/test/DebugInfo/X86/debug-info-blocks.ll +++ b/llvm/test/DebugInfo/X86/debug-info-blocks.ll @@ -5,10 +5,6 @@ ; rdar://problem/9279956 ; test that the DW_AT_location of self is at ( fbreg +{{[0-9]+}}, deref, +{{[0-9]+}} ) -; CHECK: [[A:.*]]: DW_TAG_structure_type -; CHECK-NEXT: DW_AT_APPLE_objc_complete_type -; CHECK-NEXT: DW_AT_name{{.*}}"A" - ; CHECK: DW_TAG_subprogram ; CHECK: DW_TAG_subprogram ; CHECK: DW_TAG_subprogram @@ -35,6 +31,10 @@ ; CHECK-NOT: DW_TAG ; CHECK: DW_AT_artificial +; CHECK: [[A:.*]]: DW_TAG_structure_type +; CHECK-NEXT: DW_AT_APPLE_objc_complete_type +; CHECK-NEXT: DW_AT_name{{.*}}"A" + ; CHECK: [[APTR]]: DW_TAG_pointer_type ; CHECK-NEXT: {[[A]]} diff --git a/llvm/test/DebugInfo/X86/gnu-public-names.ll b/llvm/test/DebugInfo/X86/gnu-public-names.ll --- a/llvm/test/DebugInfo/X86/gnu-public-names.ll +++ b/llvm/test/DebugInfo/X86/gnu-public-names.ll @@ -150,6 +150,20 @@ ; CHECK: NULL ; CHECK: NULL +; CHECK: [[MEM_FUNC:0x[0-9a-f]+]]: DW_TAG_subprogram +; CHECK: DW_AT_specification {{.*}} "_ZN1C15member_functionEv" +; CHECK: DW_TAG_formal_parameter +; CHECK: NULL + +; CHECK: [[STATIC_MEM_FUNC:0x[0-9a-f]+]]: DW_TAG_subprogram +; CHECK: DW_AT_specification {{.*}} "_ZN1C22static_member_functionEv" + +; CHECK: [[GLOBAL_FUNC:0x[0-9a-f]+]]: DW_TAG_subprogram +; CHECK: DW_AT_linkage_name +; CHECK: DW_AT_name ("global_function") + +; CHECK: DW_TAG_subprogram + ; CHECK: DW_TAG_enumeration ; CHECK: [[UNNAMED_ENUM_ENUMERATOR:0x[0-9a-f]+]]: DW_TAG_enumerator ; CHECK: DW_AT_name ("unnamed_enum_enumerator") @@ -170,19 +184,6 @@ ; CHECK: DW_AT_name ("named_enum_class_enumerator") ; CHECK: NULL -; CHECK: [[MEM_FUNC:0x[0-9a-f]+]]: DW_TAG_subprogram -; CHECK: DW_AT_specification {{.*}} "_ZN1C15member_functionEv" -; CHECK: DW_TAG_formal_parameter -; CHECK: NULL - -; CHECK: [[STATIC_MEM_FUNC:0x[0-9a-f]+]]: DW_TAG_subprogram -; CHECK: DW_AT_specification {{.*}} "_ZN1C22static_member_functionEv" - -; CHECK: [[GLOBAL_FUNC:0x[0-9a-f]+]]: DW_TAG_subprogram -; CHECK: DW_AT_linkage_name -; CHECK: DW_AT_name ("global_function") - -; CHECK: DW_TAG_subprogram ; CHECK: DW_TAG_imported_declaration ; CHECK: DW_TAG_pointer_type ; CHECK: DW_TAG_pointer_type diff --git a/llvm/test/DebugInfo/X86/sret.ll b/llvm/test/DebugInfo/X86/sret.ll --- a/llvm/test/DebugInfo/X86/sret.ll +++ b/llvm/test/DebugInfo/X86/sret.ll @@ -3,8 +3,8 @@ ; Based on the debuginfo-tests/sret.cpp code. -; CHECK-DWO: DW_AT_GNU_dwo_id (0x7db1cc8453a47c44) -; CHECK-DWO: DW_AT_GNU_dwo_id (0x7db1cc8453a47c44) +; CHECK-DWO: DW_AT_GNU_dwo_id (0x1b2f2750df1fd599) +; CHECK-DWO: DW_AT_GNU_dwo_id (0x1b2f2750df1fd599) ; RUN: llc -O0 -fast-isel=true -mtriple=x86_64-apple-darwin -filetype=obj -o - %s | llvm-dwarfdump -debug-info - | FileCheck -check-prefixes=CHECK,FASTISEL %s ; RUN: llc -O0 -fast-isel=false -mtriple=x86_64-apple-darwin -filetype=obj -o - %s | llvm-dwarfdump -debug-info - | FileCheck -check-prefixes=CHECK,SDAG %s