diff --git a/llvm/include/llvm/BinaryFormat/ELF.h b/llvm/include/llvm/BinaryFormat/ELF.h --- a/llvm/include/llvm/BinaryFormat/ELF.h +++ b/llvm/include/llvm/BinaryFormat/ELF.h @@ -1372,21 +1372,9 @@ // 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 @@ NT_GNU_BUILD_ATTRIBUTE_FUNC = 0x101, }; -// Core note types +// Core note types. enum : unsigned { NT_PRSTATUS = 1, NT_FPREGSET = 2, @@ -1459,7 +1447,7 @@ 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 @@ 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 --- a/llvm/include/llvm/ObjectYAML/ELFYAML.h +++ b/llvm/include/llvm/ObjectYAML/ELFYAML.h @@ -60,6 +60,7 @@ 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 NoteEntry { StringRef Name; yaml::BinaryRef Desc; - llvm::yaml::Hex32 Type; + ELF_NT Type; }; struct Chunk { @@ -768,6 +769,10 @@ static void enumeration(IO &IO, ELFYAML::ELF_PT &Value); }; +template <> struct ScalarEnumerationTraits { + static void enumeration(IO &IO, ELFYAML::ELF_NT &Value); +}; + template <> struct ScalarEnumerationTraits { static void enumeration(IO &IO, ELFYAML::ELF_EM &Value); diff --git a/llvm/lib/ObjectYAML/ELFYAML.cpp b/llvm/lib/ObjectYAML/ELFYAML.cpp --- a/llvm/lib/ObjectYAML/ELFYAML.cpp +++ b/llvm/lib/ObjectYAML/ELFYAML.cpp @@ -70,6 +70,95 @@ IO.enumFallback(Value); } +void ScalarEnumerationTraits::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(Value); +} + void ScalarEnumerationTraits::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 --- a/llvm/test/tools/yaml2obj/ELF/note-section.yaml +++ b/llvm/test/tools/yaml2obj/ELF/note-section.yaml @@ -303,3 +303,33 @@ 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 --- a/llvm/tools/obj2yaml/elf2yaml.cpp +++ b/llvm/tools/obj2yaml/elf2yaml.cpp @@ -1191,7 +1191,7 @@ 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()); }