mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-28 04:33:05 +00:00
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
This commit is contained in:
parent
49323774b4
commit
c10a1edf3f
@ -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));
|
||||
}
|
||||
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 this DIE is going to refer declaration info using AT_specification
|
||||
// then there is no need to add other attributes.
|
||||
if (DeclDie)
|
||||
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())
|
||||
|
@ -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"
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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 }
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user