https://github.com/phoebewang created https://github.com/llvm/llvm-project/pull/207661
None >From 562f703f116babe44ac1461daadc3a91b642e0e2 Mon Sep 17 00:00:00 2001 From: Phoebe Wang <[email protected]> Date: Mon, 6 Jul 2026 14:47:34 +0800 Subject: [PATCH] [X86] Add dynamic tags support for llvm-readobj and lldb per psABI --- .../Plugins/ObjectFile/ELF/ObjectFileELF.cpp | 10 ++++ .../include/llvm/BinaryFormat/DynamicTags.def | 15 ++++++ llvm/lib/Object/ELF.cpp | 10 ++++ .../ELF/dynamic-tags-machine-specific.test | 46 +++++++++++++++++++ 4 files changed, 81 insertions(+) diff --git a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp index daf74bd3ba48e..d7eb03506cd9f 100644 --- a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp +++ b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp @@ -3828,6 +3828,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) { @@ -3839,6 +3847,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) \ @@ -3853,6 +3862,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 _______________________________________________ lldb-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
