mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-26 14:16:12 +00:00
[DIBuilder] Make createReferenceType take size and align
Summary: Since we're passing references to dbg.value as pointers, we need to have the frontend properly declare their sizes and alignments (as it already does for regular pointers) in preparation for my upcoming patch to have the verifer check that the sizes agree. Also augment the backend logic that skips actually emitting this information into DWARF such that it also handles reference types. Reviewers: aprantl, dexonsmith, dblaikie Subscribers: dblaikie, llvm-commits Differential Revision: http://reviews.llvm.org/D14275 llvm-svn: 253186
This commit is contained in:
parent
06ae954df6
commit
0118e7cd94
@ -158,7 +158,9 @@ namespace llvm {
|
||||
|
||||
/// Create debugging information entry for a c++
|
||||
/// style reference or rvalue reference type.
|
||||
DIDerivedType *createReferenceType(unsigned Tag, DIType *RTy);
|
||||
DIDerivedType *createReferenceType(unsigned Tag, DIType *RTy,
|
||||
uint64_t SizeInBits = 0,
|
||||
uint64_t AlignInBits = 0);
|
||||
|
||||
/// Create debugging information entry for a typedef.
|
||||
/// \param Ty Original type.
|
||||
|
@ -853,7 +853,9 @@ void DwarfUnit::constructTypeDIE(DIE &Buffer, const DIDerivedType *DTy) {
|
||||
|
||||
// Add size if non-zero (derived types might be zero-sized.)
|
||||
if (Size && Tag != dwarf::DW_TAG_pointer_type
|
||||
&& Tag != dwarf::DW_TAG_ptr_to_member_type)
|
||||
&& Tag != dwarf::DW_TAG_ptr_to_member_type
|
||||
&& Tag != dwarf::DW_TAG_reference_type
|
||||
&& Tag != dwarf::DW_TAG_rvalue_reference_type)
|
||||
addUInt(Buffer, dwarf::DW_AT_byte_size, None, Size);
|
||||
|
||||
if (Tag == dwarf::DW_TAG_ptr_to_member_type)
|
||||
|
@ -255,10 +255,12 @@ DIDerivedType *DIBuilder::createMemberPointerType(DIType *PointeeTy,
|
||||
DITypeRef::get(Base));
|
||||
}
|
||||
|
||||
DIDerivedType *DIBuilder::createReferenceType(unsigned Tag, DIType *RTy) {
|
||||
DIDerivedType *DIBuilder::createReferenceType(unsigned Tag, DIType *RTy,
|
||||
uint64_t SizeInBits,
|
||||
uint64_t AlignInBits) {
|
||||
assert(RTy && "Unable to create reference type");
|
||||
return DIDerivedType::get(VMContext, Tag, "", nullptr, 0, nullptr,
|
||||
DITypeRef::get(RTy), 0, 0, 0, 0);
|
||||
DITypeRef::get(RTy), SizeInBits, AlignInBits, 0, 0);
|
||||
}
|
||||
|
||||
DIDerivedType *DIBuilder::createTypedef(DIType *Ty, StringRef Name,
|
||||
|
46
test/DebugInfo/Generic/ptrsize.ll
Executable file
46
test/DebugInfo/Generic/ptrsize.ll
Executable file
@ -0,0 +1,46 @@
|
||||
; REQUIRES: object-emission
|
||||
|
||||
; RUN: %llc_dwarf -O0 -filetype=obj < %s > %t
|
||||
; RUN: llvm-dwarfdump %t | FileCheck %s
|
||||
|
||||
; Check that pointers and references get emitted without size information in
|
||||
; DWARF, even if they are so specified in the IR
|
||||
|
||||
; CHECK: 0x[[O1:[0-9a-f]+]]: DW_TAG_pointer_type
|
||||
; CHECK-NEXT: DW_AT_type [DW_FORM_ref4]
|
||||
; CHECK-NOT: DW_AT_byte_size
|
||||
; CHECK: 0x[[O2:[0-9a-f]+]]: DW_TAG_
|
||||
|
||||
; CHECK: 0x[[O3:[0-9a-f]+]]: DW_TAG_reference_type
|
||||
; CHECK-NEXT: DW_AT_type [DW_FORM_ref4]
|
||||
; CHECK-NOT: DW_AT_byte_size
|
||||
|
||||
define i32 @foo() !dbg !4 {
|
||||
entry:
|
||||
ret i32 0, !dbg !13
|
||||
}
|
||||
|
||||
define i32 @bar() !dbg !5 {
|
||||
entry:
|
||||
ret i32 0, !dbg !13
|
||||
}
|
||||
|
||||
!llvm.dbg.cu = !{!0}
|
||||
!llvm.module.flags = !{!11, !12}
|
||||
|
||||
!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang", isOptimized: false, runtimeVersion: 0, emissionKind: 0, enums: !2, retainedTypes: !2, subprograms: !3, globals: !2, imports: !2)
|
||||
!1 = !DIFile(filename: "dwarf-test.c", directory: "test")
|
||||
!2 = !{}
|
||||
!3 = !{!4, !5}
|
||||
!4 = distinct !DISubprogram(name: "foo", scope: !0, file: !1, line: 6, type: !6, isLocal: false, isDefinition: true, scopeLine: 6, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, variables: !2)
|
||||
!5 = distinct !DISubprogram(name: "bar", scope: !0, file: !1, line: 6, type: !15, isLocal: false, isDefinition: true, scopeLine: 6, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, variables: !2)
|
||||
!6 = !DISubroutineType(types: !7)
|
||||
!7 = !{!9}
|
||||
!8 = !DIBasicType(name: "int", size: 32, align: 32, encoding: DW_ATE_signed)
|
||||
!9 = !DIDerivedType(tag: DW_TAG_pointer_type, scope: !0, baseType: !8, size: 64, align: 64)
|
||||
!10 = !DIDerivedType(tag: DW_TAG_reference_type, scope: !0, baseType: !8, size: 64, align: 64)
|
||||
!11 = !{i32 2, !"Dwarf Version", i32 3}
|
||||
!12 = !{i32 1, !"Debug Info Version", i32 3}
|
||||
!13 = !DILocation(line: 7, scope: !4)
|
||||
!14 = !{!10}
|
||||
!15 = !DISubroutineType(types: !14)
|
Loading…
x
Reference in New Issue
Block a user