[llvm] d613d8e - [yaml2obj] Handle NT_* string values in for ELF note types
Alex Richardson via llvm-commits
llvm-commits at lists.llvm.org
Tue Feb 9 08:59:49 PST 2021
Author: Alex Richardson
Date: 2021-02-09T16:59:22Z
New Revision: d613d8eb0eb84ad3cc494a5b45ad9f1f37eca88b
URL: https://github.com/llvm/llvm-project/commit/d613d8eb0eb84ad3cc494a5b45ad9f1f37eca88b
DIFF: https://github.com/llvm/llvm-project/commit/d613d8eb0eb84ad3cc494a5b45ad9f1f37eca88b.diff
LOG: [yaml2obj] Handle NT_* string values in for ELF note types
This is required for D74393.
Reviewed By: jhenderson
Differential Revision: https://reviews.llvm.org/D95953
Added:
Modified:
llvm/include/llvm/BinaryFormat/ELF.h
llvm/include/llvm/ObjectYAML/ELFYAML.h
llvm/lib/ObjectYAML/ELFYAML.cpp
llvm/test/tools/yaml2obj/ELF/note-section.yaml
llvm/tools/obj2yaml/elf2yaml.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/BinaryFormat/ELF.h b/llvm/include/llvm/BinaryFormat/ELF.h
index 2c426cd8f05d..6650eec934f0 100644
--- a/llvm/include/llvm/BinaryFormat/ELF.h
+++ b/llvm/include/llvm/BinaryFormat/ELF.h
@@ -1372,21 +1372,9 @@ enum {
// ElfXX_VerNeed structure version (GNU versioning)
enum { VER_NEED_NONE = 0, VER_NEED_CURRENT = 1 };
-// SHT_NOTE section types
-enum {
- NT_FREEBSD_THRMISC = 7,
- NT_FREEBSD_PROCSTAT_PROC = 8,
- NT_FREEBSD_PROCSTAT_FILES = 9,
- NT_FREEBSD_PROCSTAT_VMMAP = 10,
- NT_FREEBSD_PROCSTAT_GROUPS = 11,
- NT_FREEBSD_PROCSTAT_UMASK = 12,
- NT_FREEBSD_PROCSTAT_RLIMIT = 13,
- NT_FREEBSD_PROCSTAT_OSREL = 14,
- NT_FREEBSD_PROCSTAT_PSSTRINGS = 15,
- NT_FREEBSD_PROCSTAT_AUXV = 16,
-};
+// SHT_NOTE section types.
-// Generic note types
+// Generic note types.
enum : unsigned {
NT_VERSION = 1,
NT_ARCH = 2,
@@ -1394,7 +1382,7 @@ enum : unsigned {
NT_GNU_BUILD_ATTRIBUTE_FUNC = 0x101,
};
-// Core note types
+// Core note types.
enum : unsigned {
NT_PRSTATUS = 1,
NT_FPREGSET = 2,
@@ -1459,7 +1447,7 @@ enum {
NT_LLVM_HWASAN_GLOBALS = 3,
};
-// GNU note types
+// GNU note types.
enum {
NT_GNU_ABI_TAG = 1,
NT_GNU_HWCAP = 2,
@@ -1528,6 +1516,20 @@ enum : unsigned {
GNU_PROPERTY_X86_FEATURE_2_XSAVEC = 1 << 9,
};
+// FreeBSD core note types.
+enum {
+ NT_FREEBSD_THRMISC = 7,
+ NT_FREEBSD_PROCSTAT_PROC = 8,
+ NT_FREEBSD_PROCSTAT_FILES = 9,
+ NT_FREEBSD_PROCSTAT_VMMAP = 10,
+ NT_FREEBSD_PROCSTAT_GROUPS = 11,
+ NT_FREEBSD_PROCSTAT_UMASK = 12,
+ NT_FREEBSD_PROCSTAT_RLIMIT = 13,
+ NT_FREEBSD_PROCSTAT_OSREL = 14,
+ NT_FREEBSD_PROCSTAT_PSSTRINGS = 15,
+ NT_FREEBSD_PROCSTAT_AUXV = 16,
+};
+
// AMDGPU-specific section indices.
enum {
SHN_AMDGPU_LDS = 0xff00, // Variable in LDS; symbol encoded like SHN_COMMON
diff --git a/llvm/include/llvm/ObjectYAML/ELFYAML.h b/llvm/include/llvm/ObjectYAML/ELFYAML.h
index 5ae04a1a418c..b3b0cbb96755 100644
--- a/llvm/include/llvm/ObjectYAML/ELFYAML.h
+++ b/llvm/include/llvm/ObjectYAML/ELFYAML.h
@@ -60,6 +60,7 @@ LLVM_YAML_STRONG_TYPEDEF(uint64_t, ELF_SHF)
LLVM_YAML_STRONG_TYPEDEF(uint16_t, ELF_SHN)
LLVM_YAML_STRONG_TYPEDEF(uint8_t, ELF_STB)
LLVM_YAML_STRONG_TYPEDEF(uint8_t, ELF_STT)
+LLVM_YAML_STRONG_TYPEDEF(uint32_t, ELF_NT)
LLVM_YAML_STRONG_TYPEDEF(uint8_t, MIPS_AFL_REG)
LLVM_YAML_STRONG_TYPEDEF(uint8_t, MIPS_ABI_FP)
@@ -171,7 +172,7 @@ struct StackSizeEntry {
struct NoteEntry {
StringRef Name;
yaml::BinaryRef Desc;
- llvm::yaml::Hex32 Type;
+ ELF_NT Type;
};
struct Chunk {
@@ -768,6 +769,10 @@ template <> struct ScalarEnumerationTraits<ELFYAML::ELF_PT> {
static void enumeration(IO &IO, ELFYAML::ELF_PT &Value);
};
+template <> struct ScalarEnumerationTraits<ELFYAML::ELF_NT> {
+ static void enumeration(IO &IO, ELFYAML::ELF_NT &Value);
+};
+
template <>
struct ScalarEnumerationTraits<ELFYAML::ELF_EM> {
static void enumeration(IO &IO, ELFYAML::ELF_EM &Value);
diff --git a/llvm/lib/ObjectYAML/ELFYAML.cpp b/llvm/lib/ObjectYAML/ELFYAML.cpp
index 10a19fa58d2e..43d27beeb1e1 100644
--- a/llvm/lib/ObjectYAML/ELFYAML.cpp
+++ b/llvm/lib/ObjectYAML/ELFYAML.cpp
@@ -70,6 +70,95 @@ void ScalarEnumerationTraits<ELFYAML::ELF_PT>::enumeration(
IO.enumFallback<Hex32>(Value);
}
+void ScalarEnumerationTraits<ELFYAML::ELF_NT>::enumeration(
+ IO &IO, ELFYAML::ELF_NT &Value) {
+#define ECase(X) IO.enumCase(Value, #X, ELF::X)
+ // Generic note types.
+ ECase(NT_VERSION);
+ ECase(NT_ARCH);
+ ECase(NT_GNU_BUILD_ATTRIBUTE_OPEN);
+ ECase(NT_GNU_BUILD_ATTRIBUTE_FUNC);
+ // Core note types.
+ ECase(NT_PRSTATUS);
+ ECase(NT_FPREGSET);
+ ECase(NT_PRPSINFO);
+ ECase(NT_TASKSTRUCT);
+ ECase(NT_AUXV);
+ ECase(NT_PSTATUS);
+ ECase(NT_FPREGS);
+ ECase(NT_PSINFO);
+ ECase(NT_LWPSTATUS);
+ ECase(NT_LWPSINFO);
+ ECase(NT_WIN32PSTATUS);
+ ECase(NT_PPC_VMX);
+ ECase(NT_PPC_VSX);
+ ECase(NT_PPC_TAR);
+ ECase(NT_PPC_PPR);
+ ECase(NT_PPC_DSCR);
+ ECase(NT_PPC_EBB);
+ ECase(NT_PPC_PMU);
+ ECase(NT_PPC_TM_CGPR);
+ ECase(NT_PPC_TM_CFPR);
+ ECase(NT_PPC_TM_CVMX);
+ ECase(NT_PPC_TM_CVSX);
+ ECase(NT_PPC_TM_SPR);
+ ECase(NT_PPC_TM_CTAR);
+ ECase(NT_PPC_TM_CPPR);
+ ECase(NT_PPC_TM_CDSCR);
+ ECase(NT_386_TLS);
+ ECase(NT_386_IOPERM);
+ ECase(NT_X86_XSTATE);
+ ECase(NT_S390_HIGH_GPRS);
+ ECase(NT_S390_TIMER);
+ ECase(NT_S390_TODCMP);
+ ECase(NT_S390_TODPREG);
+ ECase(NT_S390_CTRS);
+ ECase(NT_S390_PREFIX);
+ ECase(NT_S390_LAST_BREAK);
+ ECase(NT_S390_SYSTEM_CALL);
+ ECase(NT_S390_TDB);
+ ECase(NT_S390_VXRS_LOW);
+ ECase(NT_S390_VXRS_HIGH);
+ ECase(NT_S390_GS_CB);
+ ECase(NT_S390_GS_BC);
+ ECase(NT_ARM_VFP);
+ ECase(NT_ARM_TLS);
+ ECase(NT_ARM_HW_BREAK);
+ ECase(NT_ARM_HW_WATCH);
+ ECase(NT_ARM_SVE);
+ ECase(NT_ARM_PAC_MASK);
+ ECase(NT_FILE);
+ ECase(NT_PRXFPREG);
+ ECase(NT_SIGINFO);
+ // LLVM-specific notes.
+ ECase(NT_LLVM_HWASAN_GLOBALS);
+ // GNU note types
+ ECase(NT_GNU_ABI_TAG);
+ ECase(NT_GNU_HWCAP);
+ ECase(NT_GNU_BUILD_ID);
+ ECase(NT_GNU_GOLD_VERSION);
+ ECase(NT_GNU_PROPERTY_TYPE_0);
+ // FreeBSD core note types.
+ ECase(NT_FREEBSD_THRMISC);
+ ECase(NT_FREEBSD_PROCSTAT_PROC);
+ ECase(NT_FREEBSD_PROCSTAT_FILES);
+ ECase(NT_FREEBSD_PROCSTAT_VMMAP);
+ ECase(NT_FREEBSD_PROCSTAT_GROUPS);
+ ECase(NT_FREEBSD_PROCSTAT_UMASK);
+ ECase(NT_FREEBSD_PROCSTAT_RLIMIT);
+ ECase(NT_FREEBSD_PROCSTAT_OSREL);
+ ECase(NT_FREEBSD_PROCSTAT_PSSTRINGS);
+ ECase(NT_FREEBSD_PROCSTAT_AUXV);
+ // AMD specific notes. (Code Object V2)
+ ECase(NT_AMD_AMDGPU_HSA_METADATA);
+ ECase(NT_AMD_AMDGPU_ISA);
+ ECase(NT_AMD_AMDGPU_PAL_METADATA);
+ // AMDGPU specific notes. (Code Object V3)
+ ECase(NT_AMDGPU_METADATA);
+#undef ECase
+ IO.enumFallback<Hex32>(Value);
+}
+
void ScalarEnumerationTraits<ELFYAML::ELF_EM>::enumeration(
IO &IO, ELFYAML::ELF_EM &Value) {
#define ECase(X) IO.enumCase(Value, #X, ELF::X)
diff --git a/llvm/test/tools/yaml2obj/ELF/note-section.yaml b/llvm/test/tools/yaml2obj/ELF/note-section.yaml
index b52050ef428f..80359c4ec018 100644
--- a/llvm/test/tools/yaml2obj/ELF/note-section.yaml
+++ b/llvm/test/tools/yaml2obj/ELF/note-section.yaml
@@ -303,3 +303,33 @@ Sections:
Type: SHT_NOTE
Size: 0x1
Notes: []
+
+## Check that we can use NT_* names for the note type.
+
+# RUN: yaml2obj --docnum=15 %s -o %t15
+# RUN: llvm-readobj --sections --section-data %t15 | FileCheck %s --check-prefix=TEXTUAL-TYPE
+
+# TEXTUAL-TYPE: Name: .note.foo
+# TEXTUAL-TYPE: SectionData (
+# TEXTUAL-TYPE-NEXT: 0000: 03000000 00000000 03000000 41420000 |............AB..|
+# TEXTUAL-TYPE-NEXT: 0010: 04000000 03000000 01000000 41424300 |............ABC.|
+# TEXTUAL-TYPE-NEXT: 0020: 12345600 |.4V.|
+# TEXTUAL-TYPE-NEXT: )
+
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+Sections:
+ - Name: .note.foo
+ Type: SHT_NOTE
+ Flags: [ SHF_ALLOC ]
+ Notes:
+ - Name: AB
+ Desc: ''
+ Type: NT_GNU_BUILD_ID
+ - Name: ABC
+ Desc: '123456'
+ Type: NT_VERSION
diff --git a/llvm/tools/obj2yaml/elf2yaml.cpp b/llvm/tools/obj2yaml/elf2yaml.cpp
index 31034299b010..23b59f386675 100644
--- a/llvm/tools/obj2yaml/elf2yaml.cpp
+++ b/llvm/tools/obj2yaml/elf2yaml.cpp
@@ -1191,7 +1191,7 @@ ELFDumper<ELFT>::dumpNoteSection(const Elf_Shdr *Shdr) {
Elf_Note Note(*Header);
Entries.push_back(
- {Note.getName(), Note.getDesc(), (llvm::yaml::Hex32)Note.getType()});
+ {Note.getName(), Note.getDesc(), (ELFYAML::ELF_NT)Note.getType()});
Content = Content.drop_front(Header->getSize());
}
More information about the llvm-commits
mailing list