[llvm] 4698a51 - [DWARF] Add DW_MSPACE_LLVM_* memory space encodings (#220766)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Sep 14 14:51:57 PDT 2026
Author: Gheorghe-Teodor Bercea
Date: 2026-09-14T17:51:50-04:00
New Revision: 4698a5193eccf41f2f81bdb4c1004b1e05811d95
URL: https://github.com/llvm/llvm-project/commit/4698a5193eccf41f2f81bdb4c1004b1e05811d95
DIFF: https://github.com/llvm/llvm-project/commit/4698a5193eccf41f2f81bdb4c1004b1e05811d95.diff
LOG: [DWARF] Add DW_MSPACE_LLVM_* memory space encodings (#220766)
DW_AT_LLVM_memory_space is already defined in Dwarf.def, and the memory
space encodings it takes are already specified in
docs/AMDGPUDwarfExtensionsForHeterogeneousDebugging.rst, but the values
had no names in the source, so llvm-dwarfdump printed the attribute as a
bare integer.
Add the encodings via a HANDLE_DW_MSPACE macro alongside the existing
HANDLE_DW_ASPACE, define the MemorySpace enum, and add MemorySpaceString
and getMemorySpace. AttributeValueString then resolves the attribute, so
no changes are needed in the DWARF consumers themselves.
Unlike address spaces, memory space encodings are target-independent, so
MemorySpaceString takes no triple.
Added:
llvm/test/tools/llvm-dwarfdump/AMDGPU/DW_AT_LLVM_memory_space.yaml
Modified:
llvm/include/llvm/BinaryFormat/Dwarf.def
llvm/include/llvm/BinaryFormat/Dwarf.h
llvm/lib/BinaryFormat/Dwarf.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/BinaryFormat/Dwarf.def b/llvm/include/llvm/BinaryFormat/Dwarf.def
index 26d459086266b..4c8ced7f7a87d 100644
--- a/llvm/include/llvm/BinaryFormat/Dwarf.def
+++ b/llvm/include/llvm/BinaryFormat/Dwarf.def
@@ -26,6 +26,7 @@
defined HANDLE_DWARF_SECTION || defined HANDLE_DW_IDX || \
defined HANDLE_DW_END || defined HANDLE_DW_SECT || \
defined HANDLE_DW_APPLE_ENUM_KIND || \
+ defined HANDLE_DW_MSPACE || \
defined HANDLE_DW_LLVM_LANG_DIALECT || \
( defined HANDLE_DW_ASPACE && defined HANDLE_DW_ASPACE_PRED) )
#error "Missing macro definition of HANDLE_DW*"
@@ -153,6 +154,10 @@
#define HANDLE_DW_APPLE_ENUM_KIND(ID, NAME)
#endif
+#ifndef HANDLE_DW_MSPACE
+#define HANDLE_DW_MSPACE(ID, NAME)
+#endif
+
#ifndef HANDLE_DW_LLVM_LANG_DIALECT
#define HANDLE_DW_LLVM_LANG_DIALECT(ID, NAME)
#endif
@@ -661,6 +666,13 @@ HANDLE_DW_AT(0x3e13, LLVM_vector_size, 0, LLVM)
HANDLE_DW_AT(0x3e14, LLVM_virtual_call_origin, 0, LLVM)
HANDLE_DW_AT(0x3e15, LLVM_language_dialect, 0, LLVM)
+// https://www.llvm.org/docs/AMDGPUDwarfExtensionsForHeterogeneousDebugging.html#a-7-15-memory-space-encodings
+HANDLE_DW_MSPACE(0x0, none)
+HANDLE_DW_MSPACE(0x1, global)
+HANDLE_DW_MSPACE(0x2, constant)
+HANDLE_DW_MSPACE(0x3, group)
+HANDLE_DW_MSPACE(0x4, private)
+
// https://llvm.org/docs/AMDGPUUsage.html#address-space-identifier
HANDLE_DW_ASPACE(0x0, none)
HANDLE_DW_ASPACE_PRED(AMDGPU::DWARFAS::GENERIC, AMDGPU_generic, SELECT_AMDGPU)
@@ -1473,6 +1485,7 @@ HANDLE_DW_SECT(8, RNGLISTS)
#undef HANDLE_DW_END
#undef HANDLE_DW_SECT
#undef HANDLE_DW_APPLE_ENUM_KIND
+#undef HANDLE_DW_MSPACE
#undef HANDLE_DW_LLVM_LANG_DIALECT
#undef HANDLE_DW_ASPACE
#undef HANDLE_DW_ASPACE_PRED
diff --git a/llvm/include/llvm/BinaryFormat/Dwarf.h b/llvm/include/llvm/BinaryFormat/Dwarf.h
index 46124019206f2..502f42b9ddc7e 100644
--- a/llvm/include/llvm/BinaryFormat/Dwarf.h
+++ b/llvm/include/llvm/BinaryFormat/Dwarf.h
@@ -848,6 +848,13 @@ enum CallingConvention {
DW_CC_hi_user = 0xff
};
+enum MemorySpace {
+#define HANDLE_DW_MSPACE(ID, NAME) DW_MSPACE_LLVM_##NAME = ID,
+#include "llvm/BinaryFormat/Dwarf.def"
+ DW_MSPACE_LLVM_lo_user = 0x8000,
+ DW_MSPACE_LLVM_hi_user = 0xffff
+};
+
enum AddressSpace {
#define HANDLE_DW_ASPACE(ID, NAME) DW_ASPACE_LLVM_##NAME = ID,
#define HANDLE_DW_ASPACE_PRED(ID, NAME, PRED) DW_ASPACE_LLVM_##NAME = ID,
@@ -1110,6 +1117,7 @@ LLVM_ABI StringRef IndexString(unsigned Idx);
LLVM_ABI StringRef FormatString(DwarfFormat Format);
LLVM_ABI StringRef FormatString(bool IsDWARF64);
LLVM_ABI StringRef RLEString(unsigned RLE);
+LLVM_ABI StringRef MemorySpaceString(unsigned MS);
LLVM_ABI StringRef AddressSpaceString(unsigned AS, const llvm::Triple &TT);
/// @}
@@ -1130,6 +1138,7 @@ LLVM_ABI unsigned getSubOperationEncoding(unsigned OpEncoding,
LLVM_ABI unsigned getVirtuality(StringRef VirtualityString);
LLVM_ABI unsigned getEnumKind(StringRef EnumKindString);
LLVM_ABI unsigned getLanguage(StringRef LanguageString);
+LLVM_ABI unsigned getMemorySpace(StringRef MSString);
LLVM_ABI unsigned getSourceLanguageName(StringRef SourceLanguageNameString);
LLVM_ABI unsigned getLanguageDialect(StringRef LanguageDialectString);
LLVM_ABI unsigned getCallingConvention(StringRef LanguageString);
diff --git a/llvm/lib/BinaryFormat/Dwarf.cpp b/llvm/lib/BinaryFormat/Dwarf.cpp
index d130af6cc3adc..2b9ae52772880 100644
--- a/llvm/lib/BinaryFormat/Dwarf.cpp
+++ b/llvm/lib/BinaryFormat/Dwarf.cpp
@@ -933,6 +933,8 @@ StringRef llvm::dwarf::AttributeValueString(uint16_t Attr, unsigned Val) {
return DefaultedMemberString(Val);
case DW_AT_APPLE_enum_kind:
return EnumKindString(Val);
+ case DW_AT_LLVM_memory_space:
+ return MemorySpaceString(Val);
case DW_AT_language_name:
return SourceLanguageNameString(static_cast<SourceLanguageName>(Val));
}
@@ -1084,6 +1086,29 @@ StringRef llvm::dwarf::RLEString(unsigned RLE) {
}
}
+unsigned llvm::dwarf::getMemorySpace(StringRef MSString) {
+ return StringSwitch<unsigned>(MSString)
+#define HANDLE_DW_MSPACE(ID, NAME) \
+ .Case("DW_MSPACE_LLVM_" #NAME, DW_MSPACE_LLVM_##NAME)
+#include "llvm/BinaryFormat/Dwarf.def"
+ .Default(0);
+}
+
+StringRef llvm::dwarf::MemorySpaceString(unsigned MS) {
+ switch (MS) {
+ default:
+ return StringRef();
+#define HANDLE_DW_MSPACE(ID, NAME) \
+ case DW_MSPACE_LLVM_##NAME: \
+ return "DW_MSPACE_LLVM_" #NAME;
+#include "llvm/BinaryFormat/Dwarf.def"
+ case DW_MSPACE_LLVM_lo_user:
+ return "DW_MSPACE_LLVM_lo_user";
+ case DW_MSPACE_LLVM_hi_user:
+ return "DW_MSPACE_LLVM_hi_user";
+ }
+}
+
StringRef llvm::dwarf::AddressSpaceString(unsigned AS, const llvm::Triple &TT) {
switch (AS) {
#define HANDLE_DW_ASPACE(ID, NAME) \
diff --git a/llvm/test/tools/llvm-dwarfdump/AMDGPU/DW_AT_LLVM_memory_space.yaml b/llvm/test/tools/llvm-dwarfdump/AMDGPU/DW_AT_LLVM_memory_space.yaml
new file mode 100644
index 0000000000000..d7ef32a9021e1
--- /dev/null
+++ b/llvm/test/tools/llvm-dwarfdump/AMDGPU/DW_AT_LLVM_memory_space.yaml
@@ -0,0 +1,69 @@
+# Test that DW_AT_LLVM_memory_space values are printed with their symbolic
+# names. Unlike address spaces, memory space encodings are target-independent.
+# Values outside the defined encodings are printed as plain integers.
+
+# RUN: yaml2obj %s | llvm-dwarfdump - | FileCheck %s
+
+# CHECK: DW_TAG_variable
+# CHECK-NEXT: DW_AT_LLVM_memory_space (DW_MSPACE_LLVM_none)
+# CHECK: DW_TAG_variable
+# CHECK-NEXT: DW_AT_LLVM_memory_space (DW_MSPACE_LLVM_global)
+# CHECK: DW_TAG_variable
+# CHECK-NEXT: DW_AT_LLVM_memory_space (DW_MSPACE_LLVM_constant)
+# CHECK: DW_TAG_variable
+# CHECK-NEXT: DW_AT_LLVM_memory_space (DW_MSPACE_LLVM_group)
+# CHECK: DW_TAG_variable
+# CHECK-NEXT: DW_AT_LLVM_memory_space (DW_MSPACE_LLVM_private)
+# CHECK: DW_TAG_variable
+# CHECK-NEXT: DW_AT_LLVM_memory_space (0x00000007)
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_AMDGPU_HSA
+ ABIVersion: 0x02
+ Type: ET_REL
+ Machine: EM_AMDGPU
+ Flags: [ EF_AMDGPU_MACH_AMDGCN_GFX900 ]
+DWARF:
+ debug_abbrev:
+ - Table:
+ - Code: 0x00000001
+ Tag: DW_TAG_compile_unit
+ Children: DW_CHILDREN_yes
+ - Code: 0x00000002
+ Tag: DW_TAG_variable
+ Children: DW_CHILDREN_no
+ Attributes:
+ - Attribute: DW_AT_LLVM_memory_space
+ Form: DW_FORM_data4
+ debug_info:
+ - Version: 5
+ UnitType: DW_UT_compile
+ AbbrOffset: 0
+ AddrSize: 8
+ Entries:
+ - AbbrCode: 0x00000001
+ Values: []
+ - AbbrCode: 0x00000002
+ Values:
+ - Value: 0x0000000000000000
+ - AbbrCode: 0x00000002
+ Values:
+ - Value: 0x0000000000000001
+ - AbbrCode: 0x00000002
+ Values:
+ - Value: 0x0000000000000002
+ - AbbrCode: 0x00000002
+ Values:
+ - Value: 0x0000000000000003
+ - AbbrCode: 0x00000002
+ Values:
+ - Value: 0x0000000000000004
+ - AbbrCode: 0x00000002
+ Values:
+ - Value: 0x0000000000000007
+ - AbbrCode: 0x00000000
+ Values: []
+...
More information about the llvm-commits
mailing list