Debug Info: instead of calling addToContextOwner which constructs the context

after the DIE creation, we construct the context first.

Ensure that we create the context before we create a type so that we can add
the newly created type to the parent. Remove last use of addToContextOwner
now that it's not needed.

We use createAndAddDIE to wrap around "new DIE(". Now all shareable DIEs
should be added to their parents right after the creation.

Reviewed off-list by Eric, Thanks.

llvm-svn: 193657
This commit is contained in:
Manman Ren 2013-10-29 22:49:29 +00:00
parent b504f49448
commit f4c339e04a
11 changed files with 66 additions and 71 deletions

View File

@ -826,34 +826,26 @@ DIE *CompileUnit::getOrCreateContextDIE(DIScope Context) {
return getDIE(Context); return getDIE(Context);
} }
/// addToContextOwner - Add Die into the list of its context owner's children.
void CompileUnit::addToContextOwner(DIE *Die, DIScope Context) {
assert(!Die->getParent());
if (DIE *ContextDIE = getOrCreateContextDIE(Context)) {
if (Die->getParent()) {
// While creating the context, if this is a type member, we will have
// added the child to the context already.
assert(Die->getParent() == ContextDIE);
return;
}
ContextDIE->addChild(Die);
} else
addDie(Die);
}
/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the /// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
/// given DIType. /// given DIType.
DIE *CompileUnit::getOrCreateTypeDIE(const MDNode *TyNode) { DIE *CompileUnit::getOrCreateTypeDIE(const MDNode *TyNode) {
DIType Ty(TyNode); DIType Ty(TyNode);
if (!Ty.isType()) if (!Ty.isType())
return NULL; return NULL;
// Construct the context before querying for the existence of the DIE in case
// such construction creates the DIE.
DIE *ContextDIE = getOrCreateContextDIE(resolve(Ty.getContext()));
if (!ContextDIE)
ContextDIE = CUDie.get();
DIE *TyDIE = getDIE(Ty); DIE *TyDIE = getDIE(Ty);
if (TyDIE) if (TyDIE)
return TyDIE; return TyDIE;
// Create new type. // Create new type.
TyDIE = new DIE(Ty.getTag()); TyDIE = createAndAddDIE(Ty.getTag(), *ContextDIE, Ty);
insertDIE(Ty, TyDIE);
if (Ty.isBasicType()) if (Ty.isBasicType())
constructTypeDIE(*TyDIE, DIBasicType(Ty)); constructTypeDIE(*TyDIE, DIBasicType(Ty));
else if (Ty.isCompositeType()) else if (Ty.isCompositeType())
@ -876,7 +868,6 @@ DIE *CompileUnit::getOrCreateTypeDIE(const MDNode *TyNode) {
addAccelType(Ty.getName(), std::make_pair(TyDIE, Flags)); addAccelType(Ty.getName(), std::make_pair(TyDIE, Flags));
} }
addToContextOwner(TyDIE, resolve(Ty.getContext()));
return TyDIE; return TyDIE;
} }

View File

@ -280,9 +280,6 @@ public:
void addVariableAddress(const DbgVariable &DV, DIE *Die, void addVariableAddress(const DbgVariable &DV, DIE *Die,
MachineLocation Location); MachineLocation Location);
/// addToContextOwner - Add Die into the list of its context owner's children.
void addToContextOwner(DIE *Die, DIScope Context);
/// addType - Add a new type attribute to the specified entity. This takes /// addType - Add a new type attribute to the specified entity. This takes
/// and attribute parameter because DW_AT_friend attributes are also /// and attribute parameter because DW_AT_friend attributes are also
/// type references. /// type references.

View File

@ -5,6 +5,7 @@
; CHECK: DW_TAG_pointer_type ; CHECK: DW_TAG_pointer_type
; CHECK-NEXT: DW_AT_type ; CHECK-NEXT: DW_AT_type
; CHECK-NOT: DW_AT_byte_size ; CHECK-NOT: DW_AT_byte_size
; CHECK: DW_TAG
; CHECK: .debug_info contents ; CHECK: .debug_info contents
%struct.A = type { i32 } %struct.A = type { i32 }

View File

@ -26,7 +26,7 @@
; 0x23 = DW_OP_uconst ; 0x23 = DW_OP_uconst
; 0x91 = DW_OP_fbreg ; 0x91 = DW_OP_fbreg
; CHECK: DW_AT_location{{.*}}91 {{[0-9]+}} 06 23 {{[0-9]+}} ) ; CHECK: DW_AT_location{{.*}}91 {{[0-9]+}} 06 23 {{[0-9]+}} )
; CHECK: DW_TAG_structure_type
; CHECK: [[A:.*]]: DW_TAG_structure_type ; CHECK: [[A:.*]]: DW_TAG_structure_type
; CHECK-NEXT: DW_AT_APPLE_objc_complete_type ; CHECK-NEXT: DW_AT_APPLE_objc_complete_type
; CHECK-NEXT: DW_AT_name{{.*}}"A" ; CHECK-NEXT: DW_AT_name{{.*}}"A"

View File

@ -28,37 +28,41 @@ declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone
; An empty array should not have an AT_upper_bound attribute. But an array of 1 ; An empty array should not have an AT_upper_bound attribute. But an array of 1
; should. ; should.
; CHECK: DW_TAG_base_type [5] ; CHECK: DW_TAG_base_type
; CHECK-NEXT: DW_AT_name [DW_FORM_strp] ( .debug_str[{{.*}}] = "int") ; CHECK-NEXT: DW_AT_name [DW_FORM_strp] ( .debug_str[{{.*}}] = "int")
; CHECK-NEXT: DW_AT_encoding [DW_FORM_data1] (0x05) ; CHECK-NEXT: DW_AT_encoding [DW_FORM_data1] (0x05)
; CHECK-NEXT: DW_AT_byte_size [DW_FORM_data1] (0x04) ; CHECK-NEXT: DW_AT_byte_size [DW_FORM_data1] (0x04)
; int[1]: ; int foo::b[1]:
; CHECK: DW_TAG_array_type [7] * ; CHECK: DW_TAG_structure_type
; CHECK: DW_AT_name{{.*}}"foo"
; CHECK: DW_TAG_member
; CHECK: DW_TAG_member
; CHECK-NEXT: DW_AT_name [DW_FORM_strp] ( .debug_str[{{.*}}] = "b")
; CHECK-NEXT: DW_AT_type [DW_FORM_ref4] ; CHECK-NEXT: DW_AT_type [DW_FORM_ref4]
; CHECK: DW_TAG_subrange_type [8]
; int[1]:
; CHECK: DW_TAG_array_type [{{.*}}] *
; CHECK-NEXT: DW_AT_type [DW_FORM_ref4]
; CHECK: DW_TAG_subrange_type [{{.*}}]
; CHECK-NEXT: DW_AT_type [DW_FORM_ref4] ; CHECK-NEXT: DW_AT_type [DW_FORM_ref4]
; CHECK-NEXT: DW_AT_upper_bound [DW_FORM_data1] (0x00) ; CHECK-NEXT: DW_AT_upper_bound [DW_FORM_data1] (0x00)
; int foo::b[1]: ; int bar::b[0]:
; CHECK: DW_TAG_member [10] ; CHECK: DW_TAG_structure_type
; CHECK: DW_TAG_member [10] ; CHECK: DW_AT_name{{.*}}"bar"
; CHECK: DW_TAG_member
; CHECK: DW_TAG_member
; CHECK-NEXT: DW_AT_name [DW_FORM_strp] ( .debug_str[{{.*}}] = "b") ; CHECK-NEXT: DW_AT_name [DW_FORM_strp] ( .debug_str[{{.*}}] = "b")
; CHECK-NEXT: DW_AT_type [DW_FORM_ref4] ; CHECK-NEXT: DW_AT_type [DW_FORM_ref4]
; int[0]: ; int[0]:
; CHECK: DW_TAG_array_type [7] * ; CHECK: DW_TAG_array_type [{{.*}}] *
; CHECK-NEXT: DW_AT_type [DW_FORM_ref4] ; CHECK-NEXT: DW_AT_type [DW_FORM_ref4]
; CHECK: DW_TAG_subrange_type [11] ; CHECK: DW_TAG_subrange_type [11]
; CHECK-NEXT: DW_AT_type [DW_FORM_ref4] ; CHECK-NEXT: DW_AT_type [DW_FORM_ref4]
; CHECK-NOT: DW_AT_upper_bound ; CHECK-NOT: DW_AT_upper_bound
; int bar::b[0]:
; CHECK: DW_TAG_member [10]
; CHECK: DW_TAG_member [10]
; CHECK-NEXT: DW_AT_name [DW_FORM_strp] ( .debug_str[{{.*}}] = "b")
; CHECK-NEXT: DW_AT_type [DW_FORM_ref4]
!llvm.dbg.cu = !{!0} !llvm.dbg.cu = !{!0}
!0 = metadata !{i32 786449, metadata !32, i32 12, metadata !"clang version 3.3 (trunk 169136)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] [/Volumes/Sandbox/llvm/test.c] [DW_LANG_C99] !0 = metadata !{i32 786449, metadata !32, i32 12, metadata !"clang version 3.3 (trunk 169136)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] [/Volumes/Sandbox/llvm/test.c] [DW_LANG_C99]

View File

@ -6,23 +6,24 @@
@a = global %class.A zeroinitializer, align 4 @a = global %class.A zeroinitializer, align 4
; CHECK: [[BASETYPE:0x[0-9a-f]*]]: DW_TAG_base_type ; CHECK: DW_TAG_class_type
; CHECK: [[BASE2:0x[0-9a-f]*]]: DW_TAG_base_type ; CHECK: DW_TAG_member
; CHECK-NEXT: DW_AT_name [DW_FORM_strp] ( .debug_str[0x{{[0-9a-f]*}}] = "x")
; CHECK-NEXT: DW_AT_type [DW_FORM_ref4] (cu + 0x{{[0-9a-f]*}} => {[[ARRAY:0x[0-9a-f]*]]})
; CHECK: [[ARRAY]]: DW_TAG_array_type [{{.*}}] *
; CHECK-NEXT: DW_AT_type [DW_FORM_ref4] (cu + 0x{{[0-9a-f]*}} => {[[BASETYPE:0x[0-9a-f]*]]})
; CHECK: DW_TAG_subrange_type
; CHECK-NEXT: DW_AT_type [DW_FORM_ref4] (cu + 0x{{[0-9a-f]*}} => {[[BASE2:0x[0-9a-f]*]]})
; CHECK-NOT: DW_AT_upper_bound
; CHECK: [[BASETYPE]]: DW_TAG_base_type
; CHECK: [[BASE2]]: DW_TAG_base_type
; CHECK-NEXT: DW_AT_name ; CHECK-NEXT: DW_AT_name
; CHECK-NEXT: DW_AT_byte_size [DW_FORM_data1] (0x04) ; CHECK-NEXT: DW_AT_byte_size [DW_FORM_data1] (0x04)
; CHECK-NEXT: DW_AT_encoding [DW_FORM_data1] (0x05) ; CHECK-NEXT: DW_AT_encoding [DW_FORM_data1] (0x05)
; CHECK: [[ARRAY:0x[0-9a-f]*]]: DW_TAG_array_type [{{.*}}] *
; CHECK-NEXT: DW_AT_type [DW_FORM_ref4] (cu + 0x{{[0-9a-f]*}} => {[[BASETYPE]]})
; CHECK: DW_TAG_subrange_type
; CHECK-NEXT: DW_AT_type [DW_FORM_ref4] (cu + 0x{{[0-9a-f]*}} => {[[BASE2]]})
; CHECK-NOT: DW_AT_upper_bound
; CHECK: DW_TAG_member
; CHECK-NEXT: DW_AT_name [DW_FORM_strp] ( .debug_str[0x{{[0-9a-f]*}}] = "x")
; CHECK-NEXT: DW_AT_type [DW_FORM_ref4] (cu + 0x{{[0-9a-f]*}} => {[[ARRAY]]})
!llvm.dbg.cu = !{!0} !llvm.dbg.cu = !{!0}
!0 = metadata !{i32 786449, metadata !20, i32 4, metadata !"clang version 3.3 (trunk 169136)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !1, metadata !3, metadata !3, metadata !""} ; [ DW_TAG_compile_unit ] [/Volumes/Sandbox/llvm/t.cpp] [DW_LANG_C_plus_plus] !0 = metadata !{i32 786449, metadata !20, i32 4, metadata !"clang version 3.3 (trunk 169136)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !1, metadata !3, metadata !3, metadata !""} ; [ DW_TAG_compile_unit ] [/Volumes/Sandbox/llvm/t.cpp] [DW_LANG_C_plus_plus]

View File

@ -48,9 +48,6 @@
; CHECK: DW_AT_GNU_pubnames [DW_FORM_sec_offset] (0x00000000) ; CHECK: DW_AT_GNU_pubnames [DW_FORM_sec_offset] (0x00000000)
; CHECK: DW_AT_GNU_pubtypes [DW_FORM_sec_offset] (0x00000000) ; CHECK: DW_AT_GNU_pubtypes [DW_FORM_sec_offset] (0x00000000)
; CHECK: [[INT:[0-9a-f]+]]: DW_TAG_base_type
; CHECK-NEXT: DW_AT_name {{.*}} "int"
; CHECK: [[C:[0-9a-f]+]]: DW_TAG_structure_type ; CHECK: [[C:[0-9a-f]+]]: DW_TAG_structure_type
; CHECK-NEXT: DW_AT_name {{.*}} "C" ; CHECK-NEXT: DW_AT_name {{.*}} "C"
@ -65,6 +62,9 @@
; CHECK-NEXT: DW_AT_MIPS_linkage_name ; CHECK-NEXT: DW_AT_MIPS_linkage_name
; CHECK-NEXT: DW_AT_name {{.*}} "static_member_function" ; CHECK-NEXT: DW_AT_name {{.*}} "static_member_function"
; CHECK: [[INT:[0-9a-f]+]]: DW_TAG_base_type
; CHECK-NEXT: DW_AT_name {{.*}} "int"
; CHECK: [[STATIC_MEM_VAR:[0-9a-f]+]]: DW_TAG_variable ; CHECK: [[STATIC_MEM_VAR:[0-9a-f]+]]: DW_TAG_variable
; CHECK-NEXT: DW_AT_specification {{.*}}[[STATIC_MEM_DECL]] ; CHECK-NEXT: DW_AT_specification {{.*}}[[STATIC_MEM_DECL]]

View File

@ -8,23 +8,24 @@
; Check that we can handle non-default array bounds. In this case, the array ; Check that we can handle non-default array bounds. In this case, the array
; goes from [-3, 38]. ; goes from [-3, 38].
; CHECK: [[BASE:0x[0-9a-f]*]]: DW_TAG_base_type ; CHECK: DW_TAG_class_type
; CHECK: [[BASE2:0x[0-9a-f]*]]: DW_TAG_base_type ; CHECK: DW_TAG_member
; CHECK-NEXT: DW_AT_name [DW_FORM_strp] ( .debug_str[0x{{[0-9a-f]*}}] = "int") ; CHECK-NEXT: DW_AT_name [DW_FORM_strp] ( .debug_str[0x{{[0-9a-f]*}}] = "x")
; CHECK-NEXT: DW_AT_byte_size [DW_FORM_data1] (0x04) ; CHECK-NEXT: DW_AT_type [DW_FORM_ref4] (cu + 0x{{[0-9a-f]*}} => {[[ARRAY:0x[0-9a-f]*]]})
; CHECK-NEXT: DW_AT_encoding [DW_FORM_data1] (0x05)
; CHECK: [[ARRAY:0x[0-9a-f]*]]: DW_TAG_array_type [{{.*}}] * ; CHECK: [[ARRAY]]: DW_TAG_array_type [{{.*}}] *
; CHECK-NEXT: DW_AT_type [DW_FORM_ref4] (cu + 0x{{[0-9a-f]*}} => {[[BASE]]}) ; CHECK-NEXT: DW_AT_type [DW_FORM_ref4] (cu + 0x{{[0-9a-f]*}} => {[[BASE:0x[0-9a-f]*]]})
; CHECK: DW_TAG_subrange_type ; CHECK: DW_TAG_subrange_type
; CHECK-NEXT: DW_AT_type [DW_FORM_ref4] (cu + 0x{{[0-9a-f]*}} => {[[BASE2]]}) ; CHECK-NEXT: DW_AT_type [DW_FORM_ref4] (cu + 0x{{[0-9a-f]*}} => {[[BASE2:0x[0-9a-f]*]]})
; CHECK-NEXT: DW_AT_lower_bound [DW_FORM_data8] (0xfffffffffffffffd) ; CHECK-NEXT: DW_AT_lower_bound [DW_FORM_data8] (0xfffffffffffffffd)
; CHECK-NEXT: DW_AT_upper_bound [DW_FORM_data1] (0x26) ; CHECK-NEXT: DW_AT_upper_bound [DW_FORM_data1] (0x26)
; CHECK: DW_TAG_member ; CHECK: [[BASE]]: DW_TAG_base_type
; CHECK-NEXT: DW_AT_name [DW_FORM_strp] ( .debug_str[0x{{[0-9a-f]*}}] = "x") ; CHECK: [[BASE2]]: DW_TAG_base_type
; CHECK-NEXT: DW_AT_type [DW_FORM_ref4] (cu + 0x{{[0-9a-f]*}} => {[[ARRAY]]}) ; CHECK-NEXT: DW_AT_name [DW_FORM_strp] ( .debug_str[0x{{[0-9a-f]*}}] = "int")
; CHECK-NEXT: DW_AT_byte_size [DW_FORM_data1] (0x04)
; CHECK-NEXT: DW_AT_encoding [DW_FORM_data1] (0x05)
!llvm.dbg.cu = !{!0} !llvm.dbg.cu = !{!0}

View File

@ -2,10 +2,10 @@
; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s ; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s
; Make sure that the base type from the subrange type has a name. ; Make sure that the base type from the subrange type has a name.
; CHECK: 0x0000006b: DW_TAG_base_type [6] ; CHECK: DW_TAG_subrange_type
; CHECK-NEXT: DW_AT_type [DW_FORM_ref4] (cu + 0x{{[0-9a-f]+}} => {[[SUBTYPE:0x[0-9a-f]*]]})
; CHECK: [[SUBTYPE]]: DW_TAG_base_type
; CHECK-NEXT: DW_AT_name ; CHECK-NEXT: DW_AT_name
; CHECK: DW_TAG_subrange_type [8]
; CHECK-NEXT: DW_AT_type [DW_FORM_ref4] (cu + 0x006b => {0x0000006b})
define i32 @main() nounwind uwtable { define i32 @main() nounwind uwtable {
entry: entry:

View File

@ -4,12 +4,12 @@
; RUN: llc -filetype=obj -O0 < %s > %t ; RUN: llc -filetype=obj -O0 < %s > %t
; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s ; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s
; CHECK: DW_TAG_ptr_to_member_type ; CHECK: DW_TAG_ptr_to_member_type
; CHECK: [[TYPE:.*]]: DW_TAG_subroutine_type ; CHECK: DW_TAG_ptr_to_member_type
; CHECK-NEXT: DW_AT_type [DW_FORM_ref4] (cu + {{.*}} => {[[TYPE:0x[0-9a-f]+]]})
; CHECK: [[TYPE]]: DW_TAG_subroutine_type
; CHECK: DW_TAG_formal_parameter ; CHECK: DW_TAG_formal_parameter
; CHECK-NEXT: DW_AT_type ; CHECK-NEXT: DW_AT_type
; CHECK-NEXT: DW_AT_artificial [DW_FORM_flag ; CHECK-NEXT: DW_AT_artificial [DW_FORM_flag
; CHECK: DW_TAG_ptr_to_member_type
; CHECK-NEXT: DW_AT_type [DW_FORM_ref4] (cu + {{.*}} => {[[TYPE]]})
; IR generated from clang -g with the following source: ; IR generated from clang -g with the following source:
; struct S { ; struct S {
; }; ; };

View File

@ -2,9 +2,9 @@
; RUN: llc -filetype=obj -O0 < %s > %t ; RUN: llc -filetype=obj -O0 < %s > %t
; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s ; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s
; CHECK: [[TYPE:.*]]: DW_TAG_base_type
; CHECK: DW_TAG_ptr_to_member_type ; CHECK: DW_TAG_ptr_to_member_type
; CHECK-NEXT: DW_AT_type [DW_FORM_ref4] (cu + {{.*}} => {[[TYPE]]}) ; CHECK-NEXT: DW_AT_type [DW_FORM_ref4] (cu + {{.*}} => {[[TYPE:0x[0-9a-f]+]]})
; CHECK: [[TYPE]]: DW_TAG_base_type
; IR generated from clang -g with the following source: ; IR generated from clang -g with the following source:
; struct Foo { ; struct Foo {
; int e; ; int e;