diff options
-rw-r--r-- | llvm/include/llvm/IR/DIBuilder.h | 4 | ||||
-rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp | 4 | ||||
-rw-r--r-- | llvm/lib/IR/DIBuilder.cpp | 6 | ||||
-rwxr-xr-x | llvm/test/DebugInfo/Generic/ptrsize.ll | 46 |
4 files changed, 56 insertions, 4 deletions
diff --git a/llvm/include/llvm/IR/DIBuilder.h b/llvm/include/llvm/IR/DIBuilder.h index fa8b7a78b92..aeec3954115 100644 --- a/llvm/include/llvm/IR/DIBuilder.h +++ b/llvm/include/llvm/IR/DIBuilder.h @@ -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. diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp index c441a67a5d7..d75fea5d8c8 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp @@ -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) diff --git a/llvm/lib/IR/DIBuilder.cpp b/llvm/lib/IR/DIBuilder.cpp index 7fc0652bf65..09b540350c2 100644 --- a/llvm/lib/IR/DIBuilder.cpp +++ b/llvm/lib/IR/DIBuilder.cpp @@ -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, diff --git a/llvm/test/DebugInfo/Generic/ptrsize.ll b/llvm/test/DebugInfo/Generic/ptrsize.ll new file mode 100755 index 00000000000..694aa0bbf3e --- /dev/null +++ b/llvm/test/DebugInfo/Generic/ptrsize.ll @@ -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) |