[llvm] e61776a - [SPARC][Utilities] Add names for SPARC ELF flags in LLVM binary utilities (#102843)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Aug 15 09:49:05 PDT 2024
Author: Koakuma
Date: 2024-08-15T23:49:01+07:00
New Revision: e61776a0edce86ef01efaa708f43476c58173cae
URL: https://github.com/llvm/llvm-project/commit/e61776a0edce86ef01efaa708f43476c58173cae
DIFF: https://github.com/llvm/llvm-project/commit/e61776a0edce86ef01efaa708f43476c58173cae.diff
LOG: [SPARC][Utilities] Add names for SPARC ELF flags in LLVM binary utilities (#102843)
This allows us to use and print readable names in LLVM binary utilities.
Added:
llvm/test/tools/llvm-readobj/ELF/Sparc/elf-headers.test
Modified:
llvm/include/llvm/BinaryFormat/ELF.h
llvm/lib/ObjectYAML/ELFYAML.cpp
llvm/tools/llvm-readobj/ELFDumper.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/BinaryFormat/ELF.h b/llvm/include/llvm/BinaryFormat/ELF.h
index 6827b5d95abfe0..2c9f7087296273 100644
--- a/llvm/include/llvm/BinaryFormat/ELF.h
+++ b/llvm/include/llvm/BinaryFormat/ELF.h
@@ -699,11 +699,19 @@ enum {
// SPARC Specific e_flags
enum : unsigned {
+ // ELF extension mask.
+ // All values are available for EM_SPARC32PLUS & EM_SPARCV9 objects, except
+ // EF_SPARC_32PLUS which is a EM_SPARC32PLUS-only flag.
+ //
+ // Note that those features are not mutually exclusive (one can set more than
+ // one flag in this group).
EF_SPARC_EXT_MASK = 0xffff00,
EF_SPARC_32PLUS = 0x000100,
EF_SPARC_SUN_US1 = 0x000200,
EF_SPARC_HAL_R1 = 0x000400,
EF_SPARC_SUN_US3 = 0x000800,
+
+ // Memory model selection mask for EM_SPARCV9 objects.
EF_SPARCV9_MM = 0x3,
EF_SPARCV9_TSO = 0x0,
EF_SPARCV9_PSO = 0x1,
diff --git a/llvm/lib/ObjectYAML/ELFYAML.cpp b/llvm/lib/ObjectYAML/ELFYAML.cpp
index 1a192f72ae4d60..89ffc383a4a6ec 100644
--- a/llvm/lib/ObjectYAML/ELFYAML.cpp
+++ b/llvm/lib/ObjectYAML/ELFYAML.cpp
@@ -547,6 +547,20 @@ void ScalarBitSetTraits<ELFYAML::ELF_EF>::bitset(IO &IO,
BCase(EF_RISCV_RVE);
BCase(EF_RISCV_TSO);
break;
+ case ELF::EM_SPARC32PLUS:
+ BCase(EF_SPARC_32PLUS);
+ BCase(EF_SPARC_SUN_US1);
+ BCase(EF_SPARC_SUN_US3);
+ BCase(EF_SPARC_HAL_R1);
+ break;
+ case ELF::EM_SPARCV9:
+ BCase(EF_SPARC_SUN_US1);
+ BCase(EF_SPARC_SUN_US3);
+ BCase(EF_SPARC_HAL_R1);
+ BCaseMask(EF_SPARCV9_RMO, EF_SPARCV9_MM);
+ BCaseMask(EF_SPARCV9_PSO, EF_SPARCV9_MM);
+ BCaseMask(EF_SPARCV9_TSO, EF_SPARCV9_MM);
+ break;
case ELF::EM_XTENSA:
BCase(EF_XTENSA_XT_INSN);
BCaseMask(EF_XTENSA_MACH_NONE, EF_XTENSA_MACH);
diff --git a/llvm/test/tools/llvm-readobj/ELF/Sparc/elf-headers.test b/llvm/test/tools/llvm-readobj/ELF/Sparc/elf-headers.test
new file mode 100644
index 00000000000000..c05cd76640ed3e
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/Sparc/elf-headers.test
@@ -0,0 +1,78 @@
+## Test various combinations of ELF flag values for SPARC.
+
+# RUN: yaml2obj %s -o %t -DCLASS_NAME="ELFCLASS32" -DMACHINE_NAME="EM_SPARC" -DFLAG_NAME=""
+# RUN: llvm-readobj -h %t | FileCheck %s --check-prefixes=LLVM-COMMON -DFLAG_VALUE=0x0
+# RUN: llvm-readelf -h %t | FileCheck %s --match-full-lines --check-prefix=GNU \
+# RUN: -DFLAG_VALUE=0x0 -DGNU_FLAG_NAME=""
+
+# RUN: yaml2obj %s -o %t -DCLASS_NAME="ELFCLASS32" -DMACHINE_NAME="EM_SPARC32PLUS" -DFLAG_NAME="EF_SPARC_32PLUS"
+# RUN: llvm-readobj -h %t | FileCheck %s --check-prefixes=LLVM-COMMON,LLVM-FLAG0 \
+# RUN: -DFLAG0_NAME=EF_SPARC_32PLUS -DFLAG_VALUE=0x100
+# RUN: llvm-readelf -h %t | FileCheck %s --match-full-lines --check-prefix=GNU \
+# RUN: -DFLAG_VALUE=0x100 -DGNU_FLAG_NAME=", V8+ ABI"
+
+# RUN: yaml2obj %s -o %t -DCLASS_NAME="ELFCLASS32" -DMACHINE_NAME="EM_SPARC32PLUS" \
+# RUN: -DFLAG_NAME="EF_SPARC_32PLUS, EF_SPARC_SUN_US1"
+# RUN: llvm-readobj -h %t | FileCheck %s --check-prefixes=LLVM-COMMON,LLVM-FLAG0,LLVM-FLAG1\
+# RUN: -DFLAG_VALUE=0x300 \
+# RUN: -DFLAG0_NAME=EF_SPARC_32PLUS -DFLAG1_NAME=EF_SPARC_SUN_US1
+# RUN: llvm-readelf -h %t | FileCheck %s --match-full-lines --check-prefix=GNU \
+# RUN: -DFLAG_VALUE=0x300 \
+# RUN: -DGNU_FLAG_NAME=", V8+ ABI, Sun UltraSPARC I extensions"
+
+# RUN: yaml2obj %s -o %t -DCLASS_NAME="ELFCLASS32" -DMACHINE_NAME="EM_SPARC32PLUS" \
+# RUN: -DFLAG_NAME="EF_SPARC_32PLUS, EF_SPARC_SUN_US1, EF_SPARC_HAL_R1, EF_SPARC_SUN_US3"
+# RUN: llvm-readobj -h %t | FileCheck %s --check-prefixes=LLVM-COMMON,LLVM-FLAG0,LLVM-FLAG1,LLVM-FLAG2,LLVM-FLAG3 \
+# RUN: -DFLAG_VALUE=0xF00 \
+# RUN: -DFLAG0_NAME=EF_SPARC_32PLUS -DFLAG1_NAME=EF_SPARC_HAL_R1 \
+# RUN: -DFLAG2_NAME=EF_SPARC_SUN_US1 -DFLAG3_NAME=EF_SPARC_SUN_US3
+# RUN: llvm-readelf -h %t | FileCheck %s --match-full-lines --check-prefix=GNU \
+# RUN: -DFLAG_VALUE=0xF00 \
+# RUN: -DGNU_FLAG_NAME=", V8+ ABI, Sun UltraSPARC I extensions, HAL/Fujitsu R1 extensions, Sun UltraSPARC III extensions"
+
+# RUN: yaml2obj %s -o %t -DCLASS_NAME="ELFCLASS64" -DMACHINE_NAME="EM_SPARCV9" -DFLAG_NAME=""
+# RUN: llvm-readobj -h %t | FileCheck %s --check-prefixes=LLVM-COMMON -DFLAG_VALUE=0x0
+# RUN: llvm-readelf -h %t | FileCheck %s --match-full-lines --check-prefix=GNU \
+# RUN: -DFLAG_VALUE=0x0 -DGNU_FLAG_NAME=""
+
+# RUN: yaml2obj %s -o %t -DCLASS_NAME="ELFCLASS64" -DMACHINE_NAME="EM_SPARCV9" -DFLAG_NAME="EF_SPARC_SUN_US1"
+# RUN: llvm-readobj -h %t | FileCheck %s --check-prefixes=LLVM-COMMON,LLVM-FLAG0 \
+# RUN: -DFLAG_VALUE=0x200 -DFLAG0_NAME=EF_SPARC_SUN_US1
+# RUN: llvm-readelf -h %t | FileCheck %s --match-full-lines --check-prefix=GNU \
+# RUN: -DFLAG_VALUE=0x200 -DGNU_FLAG_NAME=", Sun UltraSPARC I extensions"
+
+# RUN: yaml2obj %s -o %t -DCLASS_NAME="ELFCLASS64" -DMACHINE_NAME="EM_SPARCV9" \
+# RUN: -DFLAG_NAME="EF_SPARC_SUN_US1, EF_SPARCV9_RMO"
+# RUN: llvm-readobj -h %t | FileCheck %s --check-prefixes=LLVM-COMMON,LLVM-FLAG0,LLVM-FLAG1 \
+# RUN: -DFLAG_VALUE=0x202 \
+# RUN: -DFLAG0_NAME=EF_SPARCV9_RMO -DFLAG1_NAME=EF_SPARC_SUN_US1
+# RUN: llvm-readelf -h %t | FileCheck %s --match-full-lines --check-prefix=GNU \
+# RUN: -DFLAG_VALUE=0x202 \
+# RUN: -DGNU_FLAG_NAME=", Sun UltraSPARC I extensions, Relaxed Memory Ordering"
+
+# RUN: yaml2obj %s -o %t -DCLASS_NAME="ELFCLASS64" -DMACHINE_NAME="EM_SPARCV9" \
+# RUN: -DFLAG_NAME="EF_SPARC_SUN_US1, EF_SPARC_HAL_R1, EF_SPARC_SUN_US3, EF_SPARCV9_PSO"
+# RUN: llvm-readobj -h %t | FileCheck %s --check-prefixes=LLVM-COMMON,LLVM-FLAG0,LLVM-FLAG1,LLVM-FLAG2,LLVM-FLAG3 \
+# RUN: -DFLAG_VALUE=0xE01 \
+# RUN: -DFLAG0_NAME=EF_SPARCV9_PSO -DFLAG1_NAME=EF_SPARC_HAL_R1 \
+# RUN: -DFLAG2_NAME=EF_SPARC_SUN_US1 -DFLAG3_NAME=EF_SPARC_SUN_US3
+# RUN: llvm-readelf -h %t | FileCheck %s --match-full-lines --check-prefix=GNU \
+# RUN: -DFLAG_VALUE=0xE01\
+# RUN: -DGNU_FLAG_NAME=", Sun UltraSPARC I extensions, HAL/Fujitsu R1 extensions, Sun UltraSPARC III extensions, Partial Store Ordering"
+
+--- !ELF
+FileHeader:
+ Class: [[CLASS_NAME]]
+ Data: ELFDATA2MSB
+ Type: ET_REL
+ Machine: [[MACHINE_NAME]]
+ Flags: [ [[FLAG_NAME]] ]
+
+# LLVM-COMMON: Flags [ ([[FLAG_VALUE]])
+# LLVM-FLAG0-NEXT: [[FLAG0_NAME]]
+# LLVM-FLAG1-NEXT: [[FLAG1_NAME]]
+# LLVM-FLAG2-NEXT: [[FLAG2_NAME]]
+# LLVM-FLAG3-NEXT: [[FLAG3_NAME]]
+# LLVM-COMMON-NEXT: ]
+
+# GNU: Flags: [[FLAG_VALUE]][[GNU_FLAG_NAME]]
diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp
index 2b5e2f4a9d347e..b4804246875c60 100644
--- a/llvm/tools/llvm-readobj/ELFDumper.cpp
+++ b/llvm/tools/llvm-readobj/ELFDumper.cpp
@@ -1684,6 +1684,16 @@ const EnumEntry<unsigned> ElfHeaderRISCVFlags[] = {
ENUM_ENT(EF_RISCV_TSO, "TSO"),
};
+const EnumEntry<unsigned> ElfHeaderSPARCFlags[] = {
+ ENUM_ENT(EF_SPARC_32PLUS, "V8+ ABI"),
+ ENUM_ENT(EF_SPARC_SUN_US1, "Sun UltraSPARC I extensions"),
+ ENUM_ENT(EF_SPARC_HAL_R1, "HAL/Fujitsu R1 extensions"),
+ ENUM_ENT(EF_SPARC_SUN_US3, "Sun UltraSPARC III extensions"),
+ ENUM_ENT(EF_SPARCV9_TSO, "Total Store Ordering"),
+ ENUM_ENT(EF_SPARCV9_PSO, "Partial Store Ordering"),
+ ENUM_ENT(EF_SPARCV9_RMO, "Relaxed Memory Ordering"),
+};
+
const EnumEntry<unsigned> ElfHeaderAVRFlags[] = {
LLVM_READOBJ_ENUM_ENT(ELF, EF_AVR_ARCH_AVR1),
LLVM_READOBJ_ENUM_ENT(ELF, EF_AVR_ARCH_AVR2),
@@ -3625,6 +3635,9 @@ template <class ELFT> void GNUELFDumper<ELFT>::printFileHeaders() {
unsigned(ELF::EF_MIPS_ABI), unsigned(ELF::EF_MIPS_MACH));
else if (e.e_machine == EM_RISCV)
ElfFlags = printFlags(e.e_flags, ArrayRef(ElfHeaderRISCVFlags));
+ else if (e.e_machine == EM_SPARC32PLUS || e.e_machine == EM_SPARCV9)
+ ElfFlags = printFlags(e.e_flags, ArrayRef(ElfHeaderSPARCFlags),
+ unsigned(ELF::EF_SPARCV9_MM));
else if (e.e_machine == EM_AVR)
ElfFlags = printFlags(e.e_flags, ArrayRef(ElfHeaderAVRFlags),
unsigned(ELF::EF_AVR_ARCH_MASK));
@@ -7118,6 +7131,9 @@ template <class ELFT> void LLVMELFDumper<ELFT>::printFileHeaders() {
}
} else if (E.e_machine == EM_RISCV)
W.printFlags("Flags", E.e_flags, ArrayRef(ElfHeaderRISCVFlags));
+ else if (E.e_machine == EM_SPARC32PLUS || E.e_machine == EM_SPARCV9)
+ W.printFlags("Flags", E.e_flags, ArrayRef(ElfHeaderSPARCFlags),
+ unsigned(ELF::EF_SPARCV9_MM));
else if (E.e_machine == EM_AVR)
W.printFlags("Flags", E.e_flags, ArrayRef(ElfHeaderAVRFlags),
unsigned(ELF::EF_AVR_ARCH_MASK));
More information about the llvm-commits
mailing list