mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-21 21:29:41 +00:00
Implement DW_TAG_subrange_type with DW_AT_count rather than DW_AT_upper_bound
This allows proper disambiguation of unbounded arrays and arrays of zero bound ("struct foo { int x[]; };" and "struct foo { int x[0]; }"). GCC instead produces an upper bound of -1 in the latter situation, but count seems tidier. This way lower_bound is provided if it's not the language default and count is provided if the count is known, otherwise it's omitted. Simple. If someone wants to look at rdar://problem/12566646 and see if this change is acceptable to that bug/fix, that might be helpful (see the empty-and-one-elem-array.ll test case which cites that radar). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@218726 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
d0d5b08fbd
commit
06c1373053
@ -1748,9 +1748,7 @@ void DwarfUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy) {
|
|||||||
// The LowerBound value defines the lower bounds which is typically zero for
|
// The LowerBound value defines the lower bounds which is typically zero for
|
||||||
// C/C++. The Count value is the number of elements. Values are 64 bit. If
|
// C/C++. The Count value is the number of elements. Values are 64 bit. If
|
||||||
// Count == -1 then the array is unbounded and we do not emit
|
// Count == -1 then the array is unbounded and we do not emit
|
||||||
// DW_AT_lower_bound and DW_AT_upper_bound attributes. If LowerBound == 0 and
|
// DW_AT_lower_bound and DW_AT_count attributes.
|
||||||
// Count == 0, then the array has zero elements in which case we do not emit
|
|
||||||
// an upper bound.
|
|
||||||
int64_t LowerBound = SR.getLo();
|
int64_t LowerBound = SR.getLo();
|
||||||
int64_t DefaultLowerBound = getDefaultLowerBound();
|
int64_t DefaultLowerBound = getDefaultLowerBound();
|
||||||
int64_t Count = SR.getCount();
|
int64_t Count = SR.getCount();
|
||||||
@ -1758,11 +1756,10 @@ void DwarfUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy) {
|
|||||||
if (DefaultLowerBound == -1 || LowerBound != DefaultLowerBound)
|
if (DefaultLowerBound == -1 || LowerBound != DefaultLowerBound)
|
||||||
addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, None, LowerBound);
|
addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, None, LowerBound);
|
||||||
|
|
||||||
if (Count != -1 && Count != 0)
|
if (Count != -1)
|
||||||
// FIXME: An unbounded array should reference the expression that defines
|
// FIXME: An unbounded array should reference the expression that defines
|
||||||
// the array.
|
// the array.
|
||||||
addUInt(DW_Subrange, dwarf::DW_AT_upper_bound, None,
|
addUInt(DW_Subrange, dwarf::DW_AT_count, None, Count);
|
||||||
LowerBound + Count - 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
|
/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
|
||||||
|
@ -4,7 +4,7 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f3
|
|||||||
target triple = "x86_64-apple-macosx10.7.2"
|
target triple = "x86_64-apple-macosx10.7.2"
|
||||||
|
|
||||||
@s = common global [4294967296 x i8] zeroinitializer, align 16
|
@s = common global [4294967296 x i8] zeroinitializer, align 16
|
||||||
;CHECK: .long 4294967295
|
; CHECK: .quad 4294967296 ## DW_AT_count
|
||||||
|
|
||||||
define void @bar() nounwind uwtable ssp {
|
define void @bar() nounwind uwtable ssp {
|
||||||
entry:
|
entry:
|
||||||
|
@ -25,9 +25,6 @@ entry:
|
|||||||
|
|
||||||
declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone
|
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
|
|
||||||
; should.
|
|
||||||
|
|
||||||
; CHECK: DW_TAG_base_type
|
; 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] (DW_ATE_signed)
|
; CHECK-NEXT: DW_AT_encoding [DW_FORM_data1] (DW_ATE_signed)
|
||||||
@ -46,7 +43,7 @@ declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone
|
|||||||
; CHECK-NEXT: DW_AT_type [DW_FORM_ref4]
|
; CHECK-NEXT: DW_AT_type [DW_FORM_ref4]
|
||||||
; CHECK: DW_TAG_subrange_type [{{.*}}]
|
; 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_count [DW_FORM_data1] (0x01)
|
||||||
|
|
||||||
; int bar::b[0]:
|
; int bar::b[0]:
|
||||||
; CHECK: DW_TAG_structure_type
|
; CHECK: DW_TAG_structure_type
|
||||||
@ -59,9 +56,9 @@ declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone
|
|||||||
; int[0]:
|
; int[0]:
|
||||||
; CHECK: DW_TAG_array_type [{{.*}}] *
|
; 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
|
||||||
; CHECK-NEXT: DW_AT_type [DW_FORM_ref4]
|
; CHECK-NEXT: DW_AT_type [DW_FORM_ref4]
|
||||||
; CHECK-NOT: DW_AT_upper_bound
|
; CHECK: DW_AT_count [DW_FORM_data1] (0x00)
|
||||||
|
|
||||||
!llvm.dbg.cu = !{!0}
|
!llvm.dbg.cu = !{!0}
|
||||||
!llvm.module.flags = !{!33}
|
!llvm.module.flags = !{!33}
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
; CHECK: DW_TAG_subrange_type
|
; CHECK: DW_TAG_subrange_type
|
||||||
; CHECK-NEXT: DW_AT_type [DW_FORM_ref4] (cu + 0x{{[0-9a-f]*}} => {[[BASE2:0x[0-9a-f]*]]})
|
; 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_count [DW_FORM_data1] (0x2a)
|
||||||
|
|
||||||
; CHECK: [[BASE]]: DW_TAG_base_type
|
; CHECK: [[BASE]]: DW_TAG_base_type
|
||||||
; CHECK: [[BASE2]]: DW_TAG_base_type
|
; CHECK: [[BASE2]]: DW_TAG_base_type
|
||||||
|
Loading…
x
Reference in New Issue
Block a user