From e6e8db5e9bc5720f3ce29c17d334d156bd812947 Mon Sep 17 00:00:00 2001 From: Adrian Prantl Date: Tue, 7 May 2019 17:42:38 +0000 Subject: [PATCH] Debug Info: Support address space attributes on rvalue references. DWARF5, 2.12 20ff says that Any debugging information entry representing a pointer or reference type [may have a DW_AT_address_class attribute]. The existing code (https://reviews.llvm.org/D29670) seems to take a quite literal interpretation of that wording. I don't see a reason why an rvalue reference isn't a reference type in the spirit of that paragraph. This patch allows rvalue references to also have address spaces. rdar://problem/50511483 Differential Revision: https://reviews.llvm.org/D61625 llvm-svn: 360176 --- llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp | 8 +++---- llvm/lib/IR/Verifier.cpp | 3 ++- .../test/DebugInfo/Generic/address_space_rvalue.ll | 26 ++++++++++++++++++++++ ...ivedtype-address-space-rvalue-reference-type.ll | 4 ++-- 4 files changed, 34 insertions(+), 7 deletions(-) create mode 100644 llvm/test/DebugInfo/Generic/address_space_rvalue.ll diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp index 0ab0a1e..3aa404e 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp @@ -794,10 +794,10 @@ void DwarfUnit::constructTypeDIE(DIE &Buffer, const DIDerivedType *DTy) { if (!DTy->isForwardDecl()) addSourceLine(Buffer, DTy); - // If DWARF address space value is other than None, add it for pointer and - // reference types as DW_AT_address_class. - if (DTy->getDWARFAddressSpace() && (Tag == dwarf::DW_TAG_pointer_type || - Tag == dwarf::DW_TAG_reference_type)) + // If DWARF address space value is other than None, add it. The IR + // verifier checks that DWARF address space only exists for pointer + // or reference types. + if (DTy->getDWARFAddressSpace()) addUInt(Buffer, dwarf::DW_AT_address_class, dwarf::DW_FORM_data4, DTy->getDWARFAddressSpace().getValue()); } diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp index 837f2d0..8c77e8d 100644 --- a/llvm/lib/IR/Verifier.cpp +++ b/llvm/lib/IR/Verifier.cpp @@ -926,7 +926,8 @@ void Verifier::visitDIDerivedType(const DIDerivedType &N) { if (N.getDWARFAddressSpace()) { AssertDI(N.getTag() == dwarf::DW_TAG_pointer_type || - N.getTag() == dwarf::DW_TAG_reference_type, + N.getTag() == dwarf::DW_TAG_reference_type || + N.getTag() == dwarf::DW_TAG_rvalue_reference_type, "DWARF address space only applies to pointer or reference types", &N); } diff --git a/llvm/test/DebugInfo/Generic/address_space_rvalue.ll b/llvm/test/DebugInfo/Generic/address_space_rvalue.ll new file mode 100644 index 0000000..c73df5b --- /dev/null +++ b/llvm/test/DebugInfo/Generic/address_space_rvalue.ll @@ -0,0 +1,26 @@ +; REQUIRES: object-emission + +; RUN: %llc_dwarf -O0 -filetype=obj < %s | llvm-dwarfdump -debug-info - | FileCheck %s + +; This nonsensical example tests that address spaces for rvalue +; references are produced. + +; CHECK: DW_TAG_rvalue_reference_type +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_address_class (0x00000001) + +@y = global i8* null, align 8, !dbg !0 + +!llvm.dbg.cu = !{!5} +!llvm.module.flags = !{!8, !9} + +!0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression()) +!1 = !DIGlobalVariable(name: "x", scope: null, file: !2, line: 2, type: !3, isLocal: false, isDefinition: true) +!2 = !DIFile(filename: "test.cpp", directory: "/") +!3 = !DIDerivedType(tag: DW_TAG_rvalue_reference_type, baseType: !4, size: 64, align: 64, dwarfAddressSpace: 1) +!4 = !DIBasicType(name: "long long unsigned int", size: 64, encoding: DW_ATE_unsigned) +!5 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !2, producer: "clang version 3.5.0 ", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !6, retainedTypes: !6, globals: !7, imports: !6) +!6 = !{} +!7 = !{!0} +!8 = !{i32 2, !"Dwarf Version", i32 5} +!9 = !{i32 1, !"Debug Info Version", i32 3} diff --git a/llvm/test/Verifier/diderivedtype-address-space-rvalue-reference-type.ll b/llvm/test/Verifier/diderivedtype-address-space-rvalue-reference-type.ll index 5bcdc3b..1e1586e 100644 --- a/llvm/test/Verifier/diderivedtype-address-space-rvalue-reference-type.ll +++ b/llvm/test/Verifier/diderivedtype-address-space-rvalue-reference-type.ll @@ -1,6 +1,6 @@ -; RUN: not opt -S < %s 2>&1 | FileCheck %s +; RUN: opt -S < %s 2>&1 | FileCheck %s !named = !{!0, !1} !0 = !DIBasicType(tag: DW_TAG_base_type, name: "name", size: 1, align: 2, encoding: DW_ATE_unsigned_char) -; CHECK: DWARF address space only applies to pointer or reference types +; CHECK: !DIDerivedType(tag: DW_TAG_rvalue_reference_type, {{.*}}, dwarfAddressSpace: 1) !1 = !DIDerivedType(tag: DW_TAG_rvalue_reference_type, baseType: !0, size: 32, align: 32, dwarfAddressSpace: 1) -- 2.7.4