llvm.org GIT mirror llvm / 238d6fc
[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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@253186 91177308-0d34-0410-b5e6-96231b3b80d8 Keno Fischer 4 years ago
4 changed file(s) with 56 addition(s) and 4 deletion(s). Raw diff Collapse all Expand all
157157
158158 /// Create debugging information entry for a c++
159159 /// style reference or rvalue reference type.
160 DIDerivedType *createReferenceType(unsigned Tag, DIType *RTy);
160 DIDerivedType *createReferenceType(unsigned Tag, DIType *RTy,
161 uint64_t SizeInBits = 0,
162 uint64_t AlignInBits = 0);
161163
162164 /// Create debugging information entry for a typedef.
163165 /// \param Ty Original type.
852852
853853 // Add size if non-zero (derived types might be zero-sized.)
854854 if (Size && Tag != dwarf::DW_TAG_pointer_type
855 && Tag != dwarf::DW_TAG_ptr_to_member_type)
855 && Tag != dwarf::DW_TAG_ptr_to_member_type
856 && Tag != dwarf::DW_TAG_reference_type
857 && Tag != dwarf::DW_TAG_rvalue_reference_type)
856858 addUInt(Buffer, dwarf::DW_AT_byte_size, None, Size);
857859
858860 if (Tag == dwarf::DW_TAG_ptr_to_member_type)
254254 DITypeRef::get(Base));
255255 }
256256
257 DIDerivedType *DIBuilder::createReferenceType(unsigned Tag, DIType *RTy) {
257 DIDerivedType *DIBuilder::createReferenceType(unsigned Tag, DIType *RTy,
258 uint64_t SizeInBits,
259 uint64_t AlignInBits) {
258260 assert(RTy && "Unable to create reference type");
259261 return DIDerivedType::get(VMContext, Tag, "", nullptr, 0, nullptr,
260 DITypeRef::get(RTy), 0, 0, 0, 0);
262 DITypeRef::get(RTy), SizeInBits, AlignInBits, 0, 0);
261263 }
262264
263265 DIDerivedType *DIBuilder::createTypedef(DIType *Ty, StringRef Name,
0 ; REQUIRES: object-emission
1
2 ; RUN: %llc_dwarf -O0 -filetype=obj < %s > %t
3 ; RUN: llvm-dwarfdump %t | FileCheck %s
4
5 ; Check that pointers and references get emitted without size information in
6 ; DWARF, even if they are so specified in the IR
7
8 ; CHECK: 0x[[O1:[0-9a-f]+]]: DW_TAG_pointer_type
9 ; CHECK-NEXT: DW_AT_type [DW_FORM_ref4]
10 ; CHECK-NOT: DW_AT_byte_size
11 ; CHECK: 0x[[O2:[0-9a-f]+]]: DW_TAG_
12
13 ; CHECK: 0x[[O3:[0-9a-f]+]]: DW_TAG_reference_type
14 ; CHECK-NEXT: DW_AT_type [DW_FORM_ref4]
15 ; CHECK-NOT: DW_AT_byte_size
16
17 define i32 @foo() !dbg !4 {
18 entry:
19 ret i32 0, !dbg !13
20 }
21
22 define i32 @bar() !dbg !5 {
23 entry:
24 ret i32 0, !dbg !13
25 }
26
27 !llvm.dbg.cu = !{!0}
28 !llvm.module.flags = !{!11, !12}
29
30 !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)
31 !1 = !DIFile(filename: "dwarf-test.c", directory: "test")
32 !2 = !{}
33 !3 = !{!4, !5}
34 !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)
35 !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)
36 !6 = !DISubroutineType(types: !7)
37 !7 = !{!9}
38 !8 = !DIBasicType(name: "int", size: 32, align: 32, encoding: DW_ATE_signed)
39 !9 = !DIDerivedType(tag: DW_TAG_pointer_type, scope: !0, baseType: !8, size: 64, align: 64)
40 !10 = !DIDerivedType(tag: DW_TAG_reference_type, scope: !0, baseType: !8, size: 64, align: 64)
41 !11 = !{i32 2, !"Dwarf Version", i32 3}
42 !12 = !{i32 1, !"Debug Info Version", i32 3}
43 !13 = !DILocation(line: 7, scope: !4)
44 !14 = !{!10}
45 !15 = !DISubroutineType(types: !14)