From: David Blaikie Date: Wed, 21 May 2014 18:04:33 +0000 (+0000) Subject: DebugInfo: Simplify subprogram declaration creation/references and accidentally refix... X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=c10a1edf3f6f86f8df973fe9de9432d5d4da6219;p=oota-llvm.git DebugInfo: Simplify subprogram declaration creation/references and accidentally refix PR11300. Also simplifies the linkage name handling a little too. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@209311 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/AsmPrinter/DwarfUnit.cpp b/lib/CodeGen/AsmPrinter/DwarfUnit.cpp index f09cb6ade63..8382990a6c3 100644 --- a/lib/CodeGen/AsmPrinter/DwarfUnit.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfUnit.cpp @@ -1384,40 +1384,37 @@ DIE *DwarfUnit::getOrCreateSubprogramDIE(DISubprogram SP) { if (DIE *SPDie = getDIE(SP)) return SPDie; - DISubprogram SPDecl = SP.getFunctionDeclaration(); - if (SPDecl.isSubprogram()) + DIE *DeclDie = nullptr; + StringRef DeclLinkageName; + if (DISubprogram SPDecl = SP.getFunctionDeclaration()) { // Add subprogram definitions to the CU die directly. ContextDIE = &getUnitDie(); + DeclDie = getOrCreateSubprogramDIE(SPDecl); + DeclLinkageName = SPDecl.getLinkageName(); + } // DW_TAG_inlined_subroutine may refer to this DIE. DIE &SPDie = createAndAddDIE(dwarf::DW_TAG_subprogram, *ContextDIE, SP); - DIE *DeclDie = nullptr; - if (SPDecl.isSubprogram()) - DeclDie = getOrCreateSubprogramDIE(SPDecl); // Add function template parameters. addTemplateParams(SPDie, SP.getTemplateParams()); - if (DeclDie) - // Refer function declaration directly. - addDIEEntry(SPDie, dwarf::DW_AT_specification, *DeclDie); - // Add the linkage name if we have one and it isn't in the Decl. StringRef LinkageName = SP.getLinkageName(); - if (!LinkageName.empty()) { - if (SPDecl.isSubprogram() && !SPDecl.getLinkageName().empty()) - assert(SPDecl.getLinkageName() == SP.getLinkageName() && - "decl has a linkage name and it is different"); - else - addString(SPDie, dwarf::DW_AT_MIPS_linkage_name, - GlobalValue::getRealLinkageName(LinkageName)); - } - - // If this DIE is going to refer declaration info using AT_specification - // then there is no need to add other attributes. - if (DeclDie) + assert(((LinkageName.empty() || DeclLinkageName.empty()) || + LinkageName == DeclLinkageName) && + "decl has a linkage name and it is different"); + if (!LinkageName.empty() && DeclLinkageName.empty()) + addString(SPDie, dwarf::DW_AT_MIPS_linkage_name, + GlobalValue::getRealLinkageName(LinkageName)); + + if (DeclDie) { + // Refer to the function declaration where all the other attributes will be + // found. + addDIEEntry(SPDie, dwarf::DW_AT_specification, *DeclDie); return &SPDie; + } // Constructors and operators for anonymous aggregates do not have names. if (!SP.getName().empty()) diff --git a/test/DebugInfo/X86/DW_AT_linkage_name.ll b/test/DebugInfo/X86/DW_AT_linkage_name.ll index 4aa69f2aa20..76d3abbe358 100644 --- a/test/DebugInfo/X86/DW_AT_linkage_name.ll +++ b/test/DebugInfo/X86/DW_AT_linkage_name.ll @@ -18,12 +18,12 @@ ; Test that we do emit a linkage name for a specific instance of it. ; CHECK: DW_TAG_subprogram -; CHECK: [[A:.*]]: DW_TAG_subprogram +; CHECK: [[A_DTOR:.*]]: DW_TAG_subprogram ; CHECK: DW_AT_name {{.*}} "~A" ; CHECK-NOT: DW_AT_MIPS_linkage_name ; CHECK: DW_TAG_subprogram -; CHECK-NEXT: DW_AT_specification {{.*}}[[A]] ; CHECK-NEXT: DW_AT_MIPS_linkage_name {{.*}} "_ZN1AD2Ev" +; CHECK-NEXT: DW_AT_specification {{.*}}[[A_DTOR]] target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" diff --git a/test/DebugInfo/X86/DW_AT_specification.ll b/test/DebugInfo/X86/DW_AT_specification.ll index 64b00800d63..b93cdf081df 100644 --- a/test/DebugInfo/X86/DW_AT_specification.ll +++ b/test/DebugInfo/X86/DW_AT_specification.ll @@ -3,10 +3,10 @@ ; test that the DW_AT_specification is a back edge in the file. -; CHECK: DW_TAG_subprogram [{{[0-9]+}}] * -; CHECK: DW_AT_specification [DW_FORM_ref4] (cu + 0x[[OFFSET:[0-9a-f]*]] => {0x0000[[OFFSET]]}) -; CHECK: 0x0000[[OFFSET]]: DW_TAG_subprogram [{{[0-9]+}}] * -; CHECK: DW_AT_name [DW_FORM_strp] ( .debug_str[0x{{[0-9a-f]*}}] = "bar") +; CHECK: [[BAR_DECL:0x[0-9a-f]*]]: DW_TAG_subprogram +; CHECK-NEXT: DW_AT_MIPS_linkage_name {{.*}} "_ZN3foo3barEv" +; CHECK: DW_TAG_subprogram +; CHECK-NEXT: DW_AT_specification {{.*}} {[[BAR_DECL]]} @_ZZN3foo3barEvE1x = constant i32 0, align 4 diff --git a/test/DebugInfo/X86/concrete_out_of_line.ll b/test/DebugInfo/X86/concrete_out_of_line.ll index ae025ad0de3..baa819de85d 100644 --- a/test/DebugInfo/X86/concrete_out_of_line.ll +++ b/test/DebugInfo/X86/concrete_out_of_line.ll @@ -11,8 +11,12 @@ ; CHECK: DW_TAG_subprogram ; CHECK: [[ASSIGN_DECL:0x........]]: DW_TAG_subprogram +; CHECK: DW_TAG_class_type +; CHECK: [[RELEASE_DECL:0x........]]: DW_TAG_subprogram +; CHECK: [[DTOR_DECL:0x........]]: DW_TAG_subprogram + ; CHECK: [[RELEASE:0x........]]: DW_TAG_subprogram -; CHECK-NEXT: DW_AT_specification {{.*}} {[[RELEASE_DECL:0x........]]} +; CHECK: DW_AT_specification {{.*}} {[[RELEASE_DECL]]} ; CHECK: DW_TAG_formal_parameter ; CHECK-NOT: NULL ; CHECK-NOT: DW_TAG @@ -30,19 +34,14 @@ ; CHECK: DW_TAG_inlined_subroutine ; CHECK-NEXT: DW_AT_abstract_origin {{.*}} {[[D2_ABS:0x........]]} -; CHECK: DW_TAG_class_type -; CHECK: [[RELEASE_DECL]]: DW_TAG_subprogram -; CHECK: [[DTOR_DECL:0x........]]: DW_TAG_subprogram - - ; CHECK: [[D1_ABS]]: DW_TAG_subprogram -; CHECK-NEXT: DW_AT_specification {{.*}} {[[DTOR_DECL]]} ; CHECK-NEXT: DW_AT_{{.*}}linkage_name +; CHECK-NEXT: DW_AT_specification {{.*}} {[[DTOR_DECL]]} ; CHECK-NEXT: DW_AT_inline ; CHECK-NOT: DW_AT_inline ; CHECK: [[D2_ABS]]: DW_TAG_subprogram -; CHECK-NEXT: DW_AT_specification {{.*}} {[[DTOR_DECL]]} ; CHECK-NEXT: DW_AT_{{.*}}linkage_name +; CHECK-NEXT: DW_AT_specification {{.*}} {[[DTOR_DECL]]} ; CHECK-NEXT: DW_AT_inline ; CHECK-NOT: DW_AT_inline ; CHECK: DW_TAG diff --git a/test/DebugInfo/X86/pr11300.ll b/test/DebugInfo/X86/pr11300.ll index 772861a69bb..b3c911252d8 100644 --- a/test/DebugInfo/X86/pr11300.ll +++ b/test/DebugInfo/X86/pr11300.ll @@ -3,11 +3,13 @@ ; test that the DW_AT_specification is a back edge in the file. +; Skip the definition of zed(foo*) ; CHECK: DW_TAG_subprogram -; CHECK: DW_AT_name [DW_FORM_strp] ( .debug_str[0x{{[0-9a-f]*}}] = "zed") +; CHECK: DW_TAG_class_type +; CHECK: [[BAR_DECL:0x[0-9a-f]*]]: DW_TAG_subprogram +; CHECK: DW_AT_MIPS_linkage_name {{.*}} "_ZN3foo3barEv" ; CHECK: DW_TAG_subprogram -; CHECK-NEXT: DW_AT_specification [DW_FORM_ref4] (cu + {{.*}} => {[[BACK:0x[0-9a-f]*]]}) -; CHECK: [[BACK]]: DW_TAG_subprogram +; CHECK-NEXT: DW_AT_specification {{.*}} {[[BAR_DECL]]} %struct.foo = type { i8 }