From 238d6fc46f06f35142b4ccef46d39258052ef1da Mon Sep 17 00:00:00 2001 From: Keno Fischer Date: Mon, 16 Nov 2015 07:57:32 +0000 Subject: [PATCH] [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 --- include/llvm/IR/DIBuilder.h | 4 ++- lib/CodeGen/AsmPrinter/DwarfUnit.cpp | 4 ++- lib/IR/DIBuilder.cpp | 6 ++-- test/DebugInfo/Generic/ptrsize.ll | 46 ++++++++++++++++++++++++++++ 4 files changed, 56 insertions(+), 4 deletions(-) create mode 100755 test/DebugInfo/Generic/ptrsize.ll diff --git a/include/llvm/IR/DIBuilder.h b/include/llvm/IR/DIBuilder.h index fa8b7a78b92..aeec3954115 100644 --- a/include/llvm/IR/DIBuilder.h +++ b/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/lib/CodeGen/AsmPrinter/DwarfUnit.cpp b/lib/CodeGen/AsmPrinter/DwarfUnit.cpp index c441a67a5d7..d75fea5d8c8 100644 --- a/lib/CodeGen/AsmPrinter/DwarfUnit.cpp +++ b/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/lib/IR/DIBuilder.cpp b/lib/IR/DIBuilder.cpp index 7fc0652bf65..09b540350c2 100644 --- a/lib/IR/DIBuilder.cpp +++ b/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/test/DebugInfo/Generic/ptrsize.ll b/test/DebugInfo/Generic/ptrsize.ll new file mode 100755 index 00000000000..694aa0bbf3e --- /dev/null +++ b/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) -- 2.34.1