https://github.com/doru1004 updated https://github.com/llvm/llvm-project/pull/220789
>From f0c90e5300bd3015f1a73cc183b0a61c4007aab7 Mon Sep 17 00:00:00 2001 From: Gheorghe-Teodor Bercea <[email protected]> Date: Wed, 2 Sep 2026 22:41:51 -0400 Subject: [PATCH 1/5] Use DW_AT_LLVM_address_space instead of DW_AT_address_class --- llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp | 5 +- .../AMDGPU/dwarfdump-address-spaces.ll | 91 +++++++++++++++++++ .../DebugInfo/Generic/address_space_rvalue.ll | 3 +- 3 files changed, 95 insertions(+), 4 deletions(-) create mode 100644 llvm/test/DebugInfo/AMDGPU/dwarfdump-address-spaces.ll diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp index 634f0d90fa712..11cd2482d3199 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp @@ -913,9 +913,8 @@ void DwarfUnit::constructTypeDIE(DIE &Buffer, const DIDerivedType *DTy) { // 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()); + if (auto AS = DTy->getDWARFAddressSpace()) + addUInt(Buffer, dwarf::DW_AT_LLVM_address_space, dwarf::DW_FORM_data4, *AS); // Add template alias template parameters. if (Tag == dwarf::DW_TAG_template_alias) diff --git a/llvm/test/DebugInfo/AMDGPU/dwarfdump-address-spaces.ll b/llvm/test/DebugInfo/AMDGPU/dwarfdump-address-spaces.ll new file mode 100644 index 0000000000000..b0342edc2be69 --- /dev/null +++ b/llvm/test/DebugInfo/AMDGPU/dwarfdump-address-spaces.ll @@ -0,0 +1,91 @@ +; RUN: llc -mtriple=x86_64--gnu -filetype=obj --verify-machineinstrs < %s | llvm-dwarfdump - 2>&1 | FileCheck %s --check-prefixes=COMMON,X86 +; RUN: llc -mtriple=amdgcn--amdhsa -mcpu=gfx900 -filetype=obj --verify-machineinstrs < %s | llvm-dwarfdump - 2>&1 | FileCheck %s --check-prefixes=COMMON,AMDGPU + +; Check that the address spaces are correctly printed for AMDGPU. +; The interpretation of the address space is dependent on the target. + +;COMMON: DW_TAG_compile_unit +;COMMON: DW_TAG_subprogram +;COMMON: DW_TAG_variable +;COMMON: DW_AT_name ("A_none") +;COMMON: DW_AT_type ([[PTR_NONE:0x[0-9a-f]+]] +;COMMON: DW_TAG_variable +;COMMON: DW_AT_name ("A_generic") +;COMMON: DW_AT_type ([[PTR_FLAT:0x[0-9a-f]+]] +;COMMON: DW_TAG_variable +;COMMON: DW_AT_name ("A_region") +;COMMON: DW_AT_type ([[PTR_REGION:0x[0-9a-f]+]] +;COMMON: DW_TAG_variable +;COMMON: DW_AT_name ("A_local") +;COMMON: DW_AT_type ([[PTR_LOCAL:0x[0-9a-f]+]] +;COMMON: DW_TAG_variable +;COMMON: DW_AT_name ("A_private_lane") +;COMMON: DW_AT_type ([[PTR_PRIVATE_LANE:0x[0-9a-f]+]] +;COMMON: DW_TAG_variable +;COMMON: DW_AT_name ("A_private_wave") +;COMMON: DW_AT_type ([[PTR_PRIVATE_WAVE:0x[0-9a-f]+]] + +;COMMON: [[PTR_NONE]]: DW_TAG_pointer_type +;COMMON: DW_AT_type ([[INT:0x[0-9a-f]+]] "int") +;AMDGPU: DW_AT_LLVM_address_space (0x00000000 "DW_ASPACE_LLVM_none") +;X86: DW_AT_LLVM_address_space (0x00000000 "DW_ASPACE_LLVM_none") + +;COMMON: [[INT]]: DW_TAG_base_type +;COMMON: DW_AT_name ("int") + +;COMMON: [[PTR_FLAT]]: DW_TAG_pointer_type +;COMMON: DW_AT_type ([[INT]] "int") +;AMDGPU: DW_AT_LLVM_address_space (0x00000001 "DW_ASPACE_LLVM_AMDGPU_generic") +;X86: DW_AT_LLVM_address_space (0x00000001) + +;COMMON: [[PTR_REGION]]: DW_TAG_pointer_type +;COMMON: DW_AT_type ([[INT]] "int") +;AMDGPU: DW_AT_LLVM_address_space (0x00000002 "DW_ASPACE_LLVM_AMDGPU_region") +;X86: DW_AT_LLVM_address_space (0x00000002) + +;COMMON: [[PTR_LOCAL]]: DW_TAG_pointer_type +;COMMON: DW_AT_type ([[INT]] "int") +;AMDGPU: DW_AT_LLVM_address_space (0x00000003 "DW_ASPACE_LLVM_AMDGPU_local") +;X86: DW_AT_LLVM_address_space (0x00000003) + +;COMMON: [[PTR_PRIVATE_LANE]]: DW_TAG_pointer_type +;COMMON: DW_AT_type ([[INT]] "int") +;AMDGPU: DW_AT_LLVM_address_space (0x00000005 "DW_ASPACE_LLVM_AMDGPU_private_lane") +;X86: DW_AT_LLVM_address_space (0x00000005) + +;COMMON: [[PTR_PRIVATE_WAVE]]: DW_TAG_pointer_type +;COMMON: DW_AT_type ([[INT]] "int") +;AMDGPU: DW_AT_LLVM_address_space (0x00000006 "DW_ASPACE_LLVM_AMDGPU_private_wave") +;X86: DW_AT_LLVM_address_space (0x00000006) + +define void @kernel() !dbg !7 { +entry: + ret void, !dbg !6 +} + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!4, !5} + +!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2) +!1 = !DIFile(filename: "dummy.cl", directory: "/some/random/directory") +!2 = !{} +!3 = !{!20, !21, !22, !23, !24, !25} +!4 = !{i32 2, !"Dwarf Version", i32 2} +!5 = !{i32 2, !"Debug Info Version", i32 3} +!6 = !DILocation(line: 3, column: 1, scope: !7) +!7 = distinct !DISubprogram(name: "kernel", scope: !1, file: !1, line: 1, type: !8, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: false, unit: !0, retainedNodes: !3) +!8 = !DISubroutineType(types: !9) +!9 = !{null} +!10 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) +!20 = !DILocalVariable(name: "A_none", scope: !7, file: !1, line: 1, type: !30) +!21 = !DILocalVariable(name: "A_generic", scope: !7, file: !1, line: 1, type: !31) +!22 = !DILocalVariable(name: "A_region", scope: !7, file: !1, line: 1, type: !32) +!23 = !DILocalVariable(name: "A_local", scope: !7, file: !1, line: 1, type: !33) +!24 = !DILocalVariable(name: "A_private_lane", scope: !7, file: !1, line: 1, type: !34) +!25 = !DILocalVariable(name: "A_private_wave", scope: !7, file: !1, line: 1, type: !35) +!30 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !10, size: 64, dwarfAddressSpace: 0) +!31 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !10, size: 64, dwarfAddressSpace: 1) +!32 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !10, size: 64, dwarfAddressSpace: 2) +!33 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !10, size: 64, dwarfAddressSpace: 3) +!34 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !10, size: 64, dwarfAddressSpace: 5) +!35 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !10, size: 64, dwarfAddressSpace: 6) diff --git a/llvm/test/DebugInfo/Generic/address_space_rvalue.ll b/llvm/test/DebugInfo/Generic/address_space_rvalue.ll index ff39188b6419c..331677f23004d 100644 --- a/llvm/test/DebugInfo/Generic/address_space_rvalue.ll +++ b/llvm/test/DebugInfo/Generic/address_space_rvalue.ll @@ -6,7 +6,8 @@ ; CHECK: DW_TAG_rvalue_reference_type ; CHECK-NOT: DW_TAG -; CHECK: DW_AT_address_class (0x00000001) +; CHECK-NOT: DW_AT_address_class +; CHECK: DW_AT_LLVM_address_space (0x00000001) @y = global ptr null, align 8, !dbg !0 >From 77051825523ea307aa3a04c53d1ba25616f719e6 Mon Sep 17 00:00:00 2001 From: Gheorghe-Teodor Bercea <[email protected]> Date: Tue, 8 Sep 2026 21:28:44 -0400 Subject: [PATCH 2/5] Address review comment: simplify the AMDGPU RUN line --- llvm/test/DebugInfo/AMDGPU/dwarfdump-address-spaces.ll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llvm/test/DebugInfo/AMDGPU/dwarfdump-address-spaces.ll b/llvm/test/DebugInfo/AMDGPU/dwarfdump-address-spaces.ll index b0342edc2be69..4753bb0188f99 100644 --- a/llvm/test/DebugInfo/AMDGPU/dwarfdump-address-spaces.ll +++ b/llvm/test/DebugInfo/AMDGPU/dwarfdump-address-spaces.ll @@ -1,5 +1,5 @@ ; RUN: llc -mtriple=x86_64--gnu -filetype=obj --verify-machineinstrs < %s | llvm-dwarfdump - 2>&1 | FileCheck %s --check-prefixes=COMMON,X86 -; RUN: llc -mtriple=amdgcn--amdhsa -mcpu=gfx900 -filetype=obj --verify-machineinstrs < %s | llvm-dwarfdump - 2>&1 | FileCheck %s --check-prefixes=COMMON,AMDGPU +; RUN: llc -mtriple=amdgpu9.00--amdhsa -filetype=obj < %s | llvm-dwarfdump - 2>&1 | FileCheck %s --check-prefixes=COMMON,AMDGPU ; Check that the address spaces are correctly printed for AMDGPU. ; The interpretation of the address space is dependent on the target. >From 5e5a78be1c2b0899a70617afc8a3964041c08168 Mon Sep 17 00:00:00 2001 From: Gheorghe-Teodor Bercea <[email protected]> Date: Tue, 8 Sep 2026 22:23:23 -0400 Subject: [PATCH 3/5] Emit DW_AT_LLVM_address_space only for AMDGPU --- llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp | 11 +++++++++-- .../DebugInfo/AMDGPU/dwarfdump-address-spaces.ll | 12 ++++++------ llvm/test/DebugInfo/AMDGPU/pointer-address-space.ll | 6 +++--- llvm/test/DebugInfo/Generic/address_space_rvalue.ll | 3 +-- 4 files changed, 19 insertions(+), 13 deletions(-) diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp index 11cd2482d3199..4a1088ea8a1ba 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp @@ -913,8 +913,15 @@ void DwarfUnit::constructTypeDIE(DIE &Buffer, const DIDerivedType *DTy) { // 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 (auto AS = DTy->getDWARFAddressSpace()) - addUInt(Buffer, dwarf::DW_AT_LLVM_address_space, dwarf::DW_FORM_data4, *AS); + if (auto AS = DTy->getDWARFAddressSpace()) { + // The AMDGPU DWARF extensions define DW_AT_LLVM_address_space for these + // values. Other targets keep DW_AT_address_class; NVPTX in particular + // emits values there that cuda-gdb consumes. + dwarf::Attribute Attr = Asm->TM.getTargetTriple().isAMDGPU() + ? dwarf::DW_AT_LLVM_address_space + : dwarf::DW_AT_address_class; + addUInt(Buffer, Attr, dwarf::DW_FORM_data4, *AS); + } // Add template alias template parameters. if (Tag == dwarf::DW_TAG_template_alias) diff --git a/llvm/test/DebugInfo/AMDGPU/dwarfdump-address-spaces.ll b/llvm/test/DebugInfo/AMDGPU/dwarfdump-address-spaces.ll index 4753bb0188f99..84f8af9e3051c 100644 --- a/llvm/test/DebugInfo/AMDGPU/dwarfdump-address-spaces.ll +++ b/llvm/test/DebugInfo/AMDGPU/dwarfdump-address-spaces.ll @@ -28,7 +28,7 @@ ;COMMON: [[PTR_NONE]]: DW_TAG_pointer_type ;COMMON: DW_AT_type ([[INT:0x[0-9a-f]+]] "int") ;AMDGPU: DW_AT_LLVM_address_space (0x00000000 "DW_ASPACE_LLVM_none") -;X86: DW_AT_LLVM_address_space (0x00000000 "DW_ASPACE_LLVM_none") +;X86: DW_AT_address_class (0x00000000) ;COMMON: [[INT]]: DW_TAG_base_type ;COMMON: DW_AT_name ("int") @@ -36,27 +36,27 @@ ;COMMON: [[PTR_FLAT]]: DW_TAG_pointer_type ;COMMON: DW_AT_type ([[INT]] "int") ;AMDGPU: DW_AT_LLVM_address_space (0x00000001 "DW_ASPACE_LLVM_AMDGPU_generic") -;X86: DW_AT_LLVM_address_space (0x00000001) +;X86: DW_AT_address_class (0x00000001) ;COMMON: [[PTR_REGION]]: DW_TAG_pointer_type ;COMMON: DW_AT_type ([[INT]] "int") ;AMDGPU: DW_AT_LLVM_address_space (0x00000002 "DW_ASPACE_LLVM_AMDGPU_region") -;X86: DW_AT_LLVM_address_space (0x00000002) +;X86: DW_AT_address_class (0x00000002) ;COMMON: [[PTR_LOCAL]]: DW_TAG_pointer_type ;COMMON: DW_AT_type ([[INT]] "int") ;AMDGPU: DW_AT_LLVM_address_space (0x00000003 "DW_ASPACE_LLVM_AMDGPU_local") -;X86: DW_AT_LLVM_address_space (0x00000003) +;X86: DW_AT_address_class (0x00000003) ;COMMON: [[PTR_PRIVATE_LANE]]: DW_TAG_pointer_type ;COMMON: DW_AT_type ([[INT]] "int") ;AMDGPU: DW_AT_LLVM_address_space (0x00000005 "DW_ASPACE_LLVM_AMDGPU_private_lane") -;X86: DW_AT_LLVM_address_space (0x00000005) +;X86: DW_AT_address_class (0x00000005) ;COMMON: [[PTR_PRIVATE_WAVE]]: DW_TAG_pointer_type ;COMMON: DW_AT_type ([[INT]] "int") ;AMDGPU: DW_AT_LLVM_address_space (0x00000006 "DW_ASPACE_LLVM_AMDGPU_private_wave") -;X86: DW_AT_LLVM_address_space (0x00000006) +;X86: DW_AT_address_class (0x00000006) define void @kernel() !dbg !7 { entry: diff --git a/llvm/test/DebugInfo/AMDGPU/pointer-address-space.ll b/llvm/test/DebugInfo/AMDGPU/pointer-address-space.ll index a289d83951c7a..9bc910fafaf3e 100644 --- a/llvm/test/DebugInfo/AMDGPU/pointer-address-space.ll +++ b/llvm/test/DebugInfo/AMDGPU/pointer-address-space.ll @@ -39,15 +39,15 @@ ; CHECK: 0x[[NONE]]: DW_TAG_pointer_type ; CHECK-NEXT: DW_AT_type -; CHECK-NOT: DW_AT_address_class +; CHECK-NOT: DW_AT_LLVM_address_space ; CHECK: 0x[[LOCAL]]: DW_TAG_pointer_type ; CHECK-NEXT: DW_AT_type -; CHECK-NEXT: DW_AT_address_class [DW_FORM_data4] (0x00000002) +; CHECK-NEXT: DW_AT_LLVM_address_space [DW_FORM_data4] (0x00000002 "DW_ASPACE_LLVM_AMDGPU_region") ; CHECK: 0x[[PRIVATE]]: DW_TAG_pointer_type ; CHECK-NEXT: DW_AT_type -; CHECK-NEXT: DW_AT_address_class [DW_FORM_data4] (0x00000001) +; CHECK-NEXT: DW_AT_LLVM_address_space [DW_FORM_data4] (0x00000001 "DW_ASPACE_LLVM_AMDGPU_generic") declare void @llvm.dbg.declare(metadata, metadata, metadata) diff --git a/llvm/test/DebugInfo/Generic/address_space_rvalue.ll b/llvm/test/DebugInfo/Generic/address_space_rvalue.ll index 331677f23004d..ff39188b6419c 100644 --- a/llvm/test/DebugInfo/Generic/address_space_rvalue.ll +++ b/llvm/test/DebugInfo/Generic/address_space_rvalue.ll @@ -6,8 +6,7 @@ ; CHECK: DW_TAG_rvalue_reference_type ; CHECK-NOT: DW_TAG -; CHECK-NOT: DW_AT_address_class -; CHECK: DW_AT_LLVM_address_space (0x00000001) +; CHECK: DW_AT_address_class (0x00000001) @y = global ptr null, align 8, !dbg !0 >From 9c6a379f4d32c73b97f88be6dc1bad4a252c95e7 Mon Sep 17 00:00:00 2001 From: Gheorghe-Teodor Bercea <[email protected]> Date: Thu, 10 Sep 2026 19:21:37 -0400 Subject: [PATCH 4/5] Address review comments: add a DwarfDebug target hook, gate the test on x86 --- llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h | 7 ++++ llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp | 12 ++----- llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp | 6 ++++ llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.h | 3 ++ llvm/lib/Target/AMDGPU/AMDGPUDwarfDebug.h | 35 +++++++++++++++++++ .../AMDGPU/dwarfdump-address-spaces.ll | 1 + 6 files changed, 55 insertions(+), 9 deletions(-) create mode 100644 llvm/lib/Target/AMDGPU/AMDGPUDwarfDebug.h diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h index 73285711d0aa9..d26d0806ffecb 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h @@ -772,6 +772,13 @@ class DwarfDebug : public DebugHandlerBase { VariableLocationKind VarLocKind, const GlobalVariable *GV = nullptr) const {} + /// The attribute describing the DWARF address space of a pointer or + /// reference type. Targets whose DWARF extensions define their own + /// attribute for this can override it. + virtual dwarf::Attribute getTypeAddressSpaceAttribute() const { + return dwarf::DW_AT_address_class; + } + //===--------------------------------------------------------------------===// // Main entry points. // diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp index 4a1088ea8a1ba..5507a4e20cff8 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp @@ -913,15 +913,9 @@ void DwarfUnit::constructTypeDIE(DIE &Buffer, const DIDerivedType *DTy) { // 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 (auto AS = DTy->getDWARFAddressSpace()) { - // The AMDGPU DWARF extensions define DW_AT_LLVM_address_space for these - // values. Other targets keep DW_AT_address_class; NVPTX in particular - // emits values there that cuda-gdb consumes. - dwarf::Attribute Attr = Asm->TM.getTargetTriple().isAMDGPU() - ? dwarf::DW_AT_LLVM_address_space - : dwarf::DW_AT_address_class; - addUInt(Buffer, Attr, dwarf::DW_FORM_data4, *AS); - } + if (auto AS = DTy->getDWARFAddressSpace()) + addUInt(Buffer, DD->getTypeAddressSpaceAttribute(), dwarf::DW_FORM_data4, + *AS); // Add template alias template parameters. if (Tag == dwarf::DW_TAG_template_alias) diff --git a/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp b/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp index 11c482c83f1e1..3d097dc800ff4 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp @@ -17,6 +17,7 @@ #include "AMDGPUAsmPrinter.h" #include "AMDGPU.h" +#include "AMDGPUDwarfDebug.h" #include "AMDGPUHSAMetadataStreamer.h" #include "AMDGPUMCResourceInfo.h" #include "AMDGPUResourceUsageAnalysis.h" @@ -131,6 +132,11 @@ StringRef AMDGPUAsmPrinter::getPassName() const { return "AMDGPU Assembly Printer"; } +/// Create AMDGPU-specific DwarfDebug handler. +DwarfDebug *AMDGPUAsmPrinter::createDwarfDebug() { + return new AMDGPUDwarfDebug(this); +} + const MCSubtargetInfo *AMDGPUAsmPrinter::getGlobalSTI() const { return &TM.getMCSubtargetInfo(); } diff --git a/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.h b/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.h index 4394cde308665..60e8b0529fe9f 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.h +++ b/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.h @@ -120,6 +120,9 @@ class AMDGPUAsmPrinter final : public AsmPrinter { bool doFinalization(Module &M) override; bool runOnMachineFunction(MachineFunction &MF) override; + /// Create AMDGPU-specific DwarfDebug handler. + DwarfDebug *createDwarfDebug() override; + /// Wrapper for MCInstLowering.lowerOperand() for the tblgen'erated /// pseudo lowering. bool lowerOperand(const MachineOperand &MO, MCOperand &MCOp) const; diff --git a/llvm/lib/Target/AMDGPU/AMDGPUDwarfDebug.h b/llvm/lib/Target/AMDGPU/AMDGPUDwarfDebug.h new file mode 100644 index 0000000000000..54c4dc7ff13a8 --- /dev/null +++ b/llvm/lib/Target/AMDGPU/AMDGPUDwarfDebug.h @@ -0,0 +1,35 @@ +//===-- AMDGPUDwarfDebug.h - AMDGPU DwarfDebug Implementation -*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file declares the AMDGPUDwarfDebug class, the AMDGPU-specific subclass +// of DwarfDebug. It customizes DWARF emission for the AMDGPU DWARF extensions. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUDWARFDEBUG_H +#define LLVM_LIB_TARGET_AMDGPU_AMDGPUDWARFDEBUG_H + +#include "../../CodeGen/AsmPrinter/DwarfDebug.h" + +namespace llvm { + +/// AMDGPU-specific DwarfDebug implementation. +class AMDGPUDwarfDebug : public DwarfDebug { +public: + AMDGPUDwarfDebug(AsmPrinter *A) : DwarfDebug(A) {} + + /// The AMDGPU DWARF extensions describe a pointer type's address space with + /// DW_AT_LLVM_address_space rather than DW_AT_address_class. + dwarf::Attribute getTypeAddressSpaceAttribute() const override { + return dwarf::DW_AT_LLVM_address_space; + } +}; + +} // end namespace llvm + +#endif // LLVM_LIB_TARGET_AMDGPU_AMDGPUDWARFDEBUG_H diff --git a/llvm/test/DebugInfo/AMDGPU/dwarfdump-address-spaces.ll b/llvm/test/DebugInfo/AMDGPU/dwarfdump-address-spaces.ll index 84f8af9e3051c..6e10ec8aeca26 100644 --- a/llvm/test/DebugInfo/AMDGPU/dwarfdump-address-spaces.ll +++ b/llvm/test/DebugInfo/AMDGPU/dwarfdump-address-spaces.ll @@ -1,3 +1,4 @@ +; REQUIRES: x86-registered-target ; RUN: llc -mtriple=x86_64--gnu -filetype=obj --verify-machineinstrs < %s | llvm-dwarfdump - 2>&1 | FileCheck %s --check-prefixes=COMMON,X86 ; RUN: llc -mtriple=amdgpu9.00--amdhsa -filetype=obj < %s | llvm-dwarfdump - 2>&1 | FileCheck %s --check-prefixes=COMMON,AMDGPU >From 72dae9cef34a7a394f7a16234d9b949c5a736e97 Mon Sep 17 00:00:00 2001 From: Gheorghe-Teodor Bercea <[email protected]> Date: Mon, 14 Sep 2026 11:30:23 -0400 Subject: [PATCH 5/5] Address review comments: move the hook to AsmPrinter --- llvm/include/llvm/CodeGen/AsmPrinter.h | 5 +++ llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h | 7 ----- llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp | 2 +- llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp | 6 ---- llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.h | 5 +-- llvm/lib/Target/AMDGPU/AMDGPUDwarfDebug.h | 35 --------------------- 6 files changed, 9 insertions(+), 51 deletions(-) delete mode 100644 llvm/lib/Target/AMDGPU/AMDGPUDwarfDebug.h diff --git a/llvm/include/llvm/CodeGen/AsmPrinter.h b/llvm/include/llvm/CodeGen/AsmPrinter.h index f6c19280030a9..6895992871a63 100644 --- a/llvm/include/llvm/CodeGen/AsmPrinter.h +++ b/llvm/include/llvm/CodeGen/AsmPrinter.h @@ -285,6 +285,11 @@ class LLVM_ABI AsmPrinter : public MachineFunctionPass { virtual DwarfDebug *createDwarfDebug(); public: + /// The attribute used for a pointer type's DWARF address space. + virtual dwarf::Attribute getTypeAddressSpaceAttribute() const { + return dwarf::DW_AT_address_class; + } + ~AsmPrinter() override; DwarfDebug *getDwarfDebug() { return DD; } diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h index d26d0806ffecb..73285711d0aa9 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h @@ -772,13 +772,6 @@ class DwarfDebug : public DebugHandlerBase { VariableLocationKind VarLocKind, const GlobalVariable *GV = nullptr) const {} - /// The attribute describing the DWARF address space of a pointer or - /// reference type. Targets whose DWARF extensions define their own - /// attribute for this can override it. - virtual dwarf::Attribute getTypeAddressSpaceAttribute() const { - return dwarf::DW_AT_address_class; - } - //===--------------------------------------------------------------------===// // Main entry points. // diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp index 5507a4e20cff8..4f847327ec5c2 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp @@ -914,7 +914,7 @@ void DwarfUnit::constructTypeDIE(DIE &Buffer, const DIDerivedType *DTy) { // verifier checks that DWARF address space only exists for pointer // or reference types. if (auto AS = DTy->getDWARFAddressSpace()) - addUInt(Buffer, DD->getTypeAddressSpaceAttribute(), dwarf::DW_FORM_data4, + addUInt(Buffer, Asm->getTypeAddressSpaceAttribute(), dwarf::DW_FORM_data4, *AS); // Add template alias template parameters. diff --git a/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp b/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp index 3d097dc800ff4..11c482c83f1e1 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp @@ -17,7 +17,6 @@ #include "AMDGPUAsmPrinter.h" #include "AMDGPU.h" -#include "AMDGPUDwarfDebug.h" #include "AMDGPUHSAMetadataStreamer.h" #include "AMDGPUMCResourceInfo.h" #include "AMDGPUResourceUsageAnalysis.h" @@ -132,11 +131,6 @@ StringRef AMDGPUAsmPrinter::getPassName() const { return "AMDGPU Assembly Printer"; } -/// Create AMDGPU-specific DwarfDebug handler. -DwarfDebug *AMDGPUAsmPrinter::createDwarfDebug() { - return new AMDGPUDwarfDebug(this); -} - const MCSubtargetInfo *AMDGPUAsmPrinter::getGlobalSTI() const { return &TM.getMCSubtargetInfo(); } diff --git a/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.h b/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.h index 60e8b0529fe9f..96da255f76896 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.h +++ b/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.h @@ -120,8 +120,9 @@ class AMDGPUAsmPrinter final : public AsmPrinter { bool doFinalization(Module &M) override; bool runOnMachineFunction(MachineFunction &MF) override; - /// Create AMDGPU-specific DwarfDebug handler. - DwarfDebug *createDwarfDebug() override; + dwarf::Attribute getTypeAddressSpaceAttribute() const override { + return dwarf::DW_AT_LLVM_address_space; + } /// Wrapper for MCInstLowering.lowerOperand() for the tblgen'erated /// pseudo lowering. diff --git a/llvm/lib/Target/AMDGPU/AMDGPUDwarfDebug.h b/llvm/lib/Target/AMDGPU/AMDGPUDwarfDebug.h deleted file mode 100644 index 54c4dc7ff13a8..0000000000000 --- a/llvm/lib/Target/AMDGPU/AMDGPUDwarfDebug.h +++ /dev/null @@ -1,35 +0,0 @@ -//===-- AMDGPUDwarfDebug.h - AMDGPU DwarfDebug Implementation -*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// -// -// This file declares the AMDGPUDwarfDebug class, the AMDGPU-specific subclass -// of DwarfDebug. It customizes DWARF emission for the AMDGPU DWARF extensions. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUDWARFDEBUG_H -#define LLVM_LIB_TARGET_AMDGPU_AMDGPUDWARFDEBUG_H - -#include "../../CodeGen/AsmPrinter/DwarfDebug.h" - -namespace llvm { - -/// AMDGPU-specific DwarfDebug implementation. -class AMDGPUDwarfDebug : public DwarfDebug { -public: - AMDGPUDwarfDebug(AsmPrinter *A) : DwarfDebug(A) {} - - /// The AMDGPU DWARF extensions describe a pointer type's address space with - /// DW_AT_LLVM_address_space rather than DW_AT_address_class. - dwarf::Attribute getTypeAddressSpaceAttribute() const override { - return dwarf::DW_AT_LLVM_address_space; - } -}; - -} // end namespace llvm - -#endif // LLVM_LIB_TARGET_AMDGPU_AMDGPUDWARFDEBUG_H _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
