[Lldb-commits] [lldb] 8c57bdb - [X86] Add dynamic tags support for llvm-readobj and lldb per psABI (#207661)
via lldb-commits
lldb-commits at lists.llvm.org
Sun Jul 26 20:42:23 PDT 2026
Author: Phoebe Wang
Date: 2026-07-27T11:42:18+08:00
New Revision: 8c57bdb49de322cd910ed6a6e2a873d64770006f
URL: https://github.com/llvm/llvm-project/commit/8c57bdb49de322cd910ed6a6e2a873d64770006f
DIFF: https://github.com/llvm/llvm-project/commit/8c57bdb49de322cd910ed6a6e2a873d64770006f.diff
LOG: [X86] Add dynamic tags support for llvm-readobj and lldb per psABI (#207661)
Added:
Modified:
lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
llvm/include/llvm/BinaryFormat/DynamicTags.def
llvm/lib/Object/ELF.cpp
llvm/test/tools/llvm-readobj/ELF/dynamic-tags-machine-specific.test
Removed:
################################################################################
diff --git a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
index 96b52f2f28d45..12739c17c0b65 100644
--- a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
+++ b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
@@ -3826,6 +3826,14 @@ std::string static getDynamicTagAsString(uint16_t Arch, uint64_t Type) {
#undef SPARC_DYNAMIC_TAG
}
break;
+
+ case llvm::ELF::EM_X86_64:
+ switch (Type) {
+#define X86_64_DYNAMIC_TAG(name, value) DYNAMIC_STRINGIFY_ENUM(name, value)
+#include "llvm/BinaryFormat/DynamicTags.def"
+#undef X86_64_DYNAMIC_TAG
+ }
+ break;
}
#undef DYNAMIC_TAG
switch (Type) {
@@ -3837,6 +3845,7 @@ std::string static getDynamicTagAsString(uint16_t Arch, uint64_t Type) {
#define PPC64_DYNAMIC_TAG(name, value)
#define RISCV_DYNAMIC_TAG(name, value)
#define SPARC_DYNAMIC_TAG(name, value)
+#define X86_64_DYNAMIC_TAG(name, value)
// Also ignore marker tags such as DT_HIOS (maps to DT_VERNEEDNUM), etc.
#define DYNAMIC_TAG_MARKER(name, value)
#define DYNAMIC_TAG(name, value) \
@@ -3851,6 +3860,7 @@ std::string static getDynamicTagAsString(uint16_t Arch, uint64_t Type) {
#undef PPC64_DYNAMIC_TAG
#undef RISCV_DYNAMIC_TAG
#undef SPARC_DYNAMIC_TAG
+#undef X86_64_DYNAMIC_TAG
#undef DYNAMIC_TAG_MARKER
#undef DYNAMIC_STRINGIFY_ENUM
default:
diff --git a/llvm/include/llvm/BinaryFormat/DynamicTags.def b/llvm/include/llvm/BinaryFormat/DynamicTags.def
index 75606e58da80d..c700044920575 100644
--- a/llvm/include/llvm/BinaryFormat/DynamicTags.def
+++ b/llvm/include/llvm/BinaryFormat/DynamicTags.def
@@ -41,6 +41,11 @@
#define SPARC_DYNAMIC_TAG_DEFINED
#endif
+#ifndef X86_64_DYNAMIC_TAG
+#define X86_64_DYNAMIC_TAG(name, value) DYNAMIC_TAG(name, value)
+#define X86_64_DYNAMIC_TAG_DEFINED
+#endif
+
#ifndef DYNAMIC_TAG_MARKER
#define DYNAMIC_TAG_MARKER(name, value) DYNAMIC_TAG(name, value)
#define DYNAMIC_TAG_MARKER_DEFINED
@@ -248,6 +253,12 @@ RISCV_DYNAMIC_TAG(RISCV_VARIANT_CC, 0x70000001)
SPARC_DYNAMIC_TAG(SPARC_REGISTER, 0x70000001)
+// x86-64 specific dynamic table entry tags.
+
+X86_64_DYNAMIC_TAG(X86_64_PLT, 0x70000000) // Address of PLT table.
+X86_64_DYNAMIC_TAG(X86_64_PLTSZ, 0x70000001) // Size of PLT table in bytes.
+X86_64_DYNAMIC_TAG(X86_64_PLTENT, 0x70000003) // Size of a PLT entry in bytes.
+
// Sun machine-independent extensions.
DYNAMIC_TAG(AUXILIARY, 0x7FFFFFFD) // Shared object to load before self
DYNAMIC_TAG(USED, 0x7FFFFFFE) // Same as DT_NEEDED
@@ -286,3 +297,7 @@ DYNAMIC_TAG(FILTER, 0x7FFFFFFF) // Shared object to get values from
#undef SPARC_DYNAMIC_TAG
#undef SPARC_DYNAMIC_TAG_DEFINED
#endif
+#ifdef X86_64_DYNAMIC_TAG_DEFINED
+#undef X86_64_DYNAMIC_TAG
+#undef X86_64_DYNAMIC_TAG_DEFINED
+#endif
diff --git a/llvm/lib/Object/ELF.cpp b/llvm/lib/Object/ELF.cpp
index 5dbdecc9915b0..48dd225932ba8 100644
--- a/llvm/lib/Object/ELF.cpp
+++ b/llvm/lib/Object/ELF.cpp
@@ -598,6 +598,14 @@ std::string ELFFile<ELFT>::getDynamicTagAsString(unsigned Arch,
#undef SPARC_DYNAMIC_TAG
}
break;
+
+ case ELF::EM_X86_64:
+ switch (Type) {
+#define X86_64_DYNAMIC_TAG(name, value) DYNAMIC_STRINGIFY_ENUM(name, value)
+#include "llvm/BinaryFormat/DynamicTags.def"
+#undef X86_64_DYNAMIC_TAG
+ }
+ break;
}
#undef DYNAMIC_TAG
switch (Type) {
@@ -609,6 +617,7 @@ std::string ELFFile<ELFT>::getDynamicTagAsString(unsigned Arch,
#define PPC64_DYNAMIC_TAG(name, value)
#define RISCV_DYNAMIC_TAG(name, value)
#define SPARC_DYNAMIC_TAG(name, value)
+#define X86_64_DYNAMIC_TAG(name, value)
// Also ignore marker tags such as DT_HIOS (maps to DT_VERNEEDNUM), etc.
#define DYNAMIC_TAG_MARKER(name, value)
#define DYNAMIC_TAG(name, value) case value: return #name;
@@ -621,6 +630,7 @@ std::string ELFFile<ELFT>::getDynamicTagAsString(unsigned Arch,
#undef PPC64_DYNAMIC_TAG
#undef RISCV_DYNAMIC_TAG
#undef SPARC_DYNAMIC_TAG
+#undef X86_64_DYNAMIC_TAG
#undef DYNAMIC_TAG_MARKER
#undef DYNAMIC_STRINGIFY_ENUM
default:
diff --git a/llvm/test/tools/llvm-readobj/ELF/dynamic-tags-machine-specific.test b/llvm/test/tools/llvm-readobj/ELF/dynamic-tags-machine-specific.test
index 9a338a852ffe7..fcc365e528dea 100644
--- a/llvm/test/tools/llvm-readobj/ELF/dynamic-tags-machine-specific.test
+++ b/llvm/test/tools/llvm-readobj/ELF/dynamic-tags-machine-specific.test
@@ -483,3 +483,49 @@ ProgramHeaders:
- Type: PT_DYNAMIC
FirstSec: .dynamic
LastSec: .dynamic
+
+## Case 8: Test that x86-64 machine-specific tags can be dumped.
+# RUN: yaml2obj --docnum=8 %s -o %t.x86_64
+# RUN: llvm-readobj --dynamic-table %t.x86_64 | FileCheck %s --check-prefix=LLVM-X86_64
+# RUN: llvm-readelf --dynamic-table %t.x86_64 | FileCheck %s --check-prefix=GNU-X86_64
+
+# LLVM-X86_64: DynamicSection [ (4 entries)
+# LLVM-X86_64-NEXT: Tag Type Name/Value
+# LLVM-X86_64-NEXT: 0x0000000070000000 X86_64_PLT 0x401020
+# LLVM-X86_64-NEXT: 0x0000000070000001 X86_64_PLTSZ 0x20
+# LLVM-X86_64-NEXT: 0x0000000070000003 X86_64_PLTENT 0x10
+# LLVM-X86_64-NEXT: 0x0000000000000000 NULL 0x0
+# LLVM-X86_64-NEXT: ]
+
+# GNU-X86_64: Dynamic section at offset {{.*}} contains 4 entries:
+# GNU-X86_64-NEXT: Tag Type Name/Value
+# GNU-X86_64-NEXT: 0x0000000070000000 (X86_64_PLT) 0x401020
+# GNU-X86_64-NEXT: 0x0000000070000001 (X86_64_PLTSZ) 0x20
+# GNU-X86_64-NEXT: 0x0000000070000003 (X86_64_PLTENT) 0x10
+# GNU-X86_64-NEXT: 0x0000000000000000 (NULL) 0x0
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .dynamic
+ Type: SHT_DYNAMIC
+ Entries:
+ - Tag: DT_X86_64_PLT
+ Value: 0x401020
+ - Tag: DT_X86_64_PLTSZ
+ Value: 0x20
+ - Tag: DT_X86_64_PLTENT
+ Value: 0x10
+ - Tag: DT_NULL
+ Value: 0
+ProgramHeaders:
+ - Type: PT_LOAD
+ FirstSec: .dynamic
+ LastSec: .dynamic
+ - Type: PT_DYNAMIC
+ FirstSec: .dynamic
+ LastSec: .dynamic
More information about the lldb-commits
mailing list