From: Adrian Prantl Date: Tue, 7 May 2019 17:42:38 +0000 (+0000) Subject: Debug Info: Support address space attributes on rvalue references. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e38ba1b089b70e70d09ea6b045f8bc4ed5ab3737;p=llvm 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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@360176 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/AsmPrinter/DwarfUnit.cpp b/lib/CodeGen/AsmPrinter/DwarfUnit.cpp index 0ab0a1ed04c..3aa404ed4e9 100644 --- a/lib/CodeGen/AsmPrinter/DwarfUnit.cpp +++ b/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/lib/IR/Verifier.cpp b/lib/IR/Verifier.cpp index 837f2d0e9c8..8c77e8deaf8 100644 --- a/lib/IR/Verifier.cpp +++ b/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/test/DebugInfo/Generic/address_space_rvalue.ll b/test/DebugInfo/Generic/address_space_rvalue.ll new file mode 100644 index 00000000000..c73df5b7345 --- /dev/null +++ b/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/test/Verifier/diderivedtype-address-space-rvalue-reference-type.ll b/test/Verifier/diderivedtype-address-space-rvalue-reference-type.ll index 5bcdc3b8d52..1e1586efe0b 100644 --- a/test/Verifier/diderivedtype-address-space-rvalue-reference-type.ll +++ b/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)