From 4e2dfd3589bd8eae6acd5a3aa895199cedd7efc9 Mon Sep 17 00:00:00 2001 From: WANG Xuerui Date: Thu, 13 Oct 2022 14:56:52 +0800 Subject: [PATCH] [LoongArch] Updates for the LoongArch ELF psABI v2.01 revision The e_flags of existing object files are all 0x3 which happens to be compatible. From this commit on, all LoongArch objects produced with upstream LLVM will be of object file ABI v1, which is already supported by binutils' master branch (to be released as 2.40), and is allowed by the same binutils version to interlink with v0 objects so the existing distributions have time to migrate. Differential Revision: https://reviews.llvm.org/D134601 --- llvm/include/llvm/BinaryFormat/ELF.h | 30 ++--- llvm/lib/ObjectYAML/ELFYAML.cpp | 11 +- .../MCTargetDesc/LoongArchELFStreamer.cpp | 31 ++--- llvm/test/CodeGen/LoongArch/e_flags.ll | 10 +- .../llvm-readobj/ELF/loongarch-eflags.test | 127 ++++++++++++------ .../tools/obj2yaml/ELF/loongarch-eflags.yaml | 50 +++++-- llvm/tools/llvm-readobj/ELFDumper.cpp | 17 +-- 7 files changed, 166 insertions(+), 110 deletions(-) diff --git a/llvm/include/llvm/BinaryFormat/ELF.h b/llvm/include/llvm/BinaryFormat/ELF.h index 16cc9a092155..8387f96394a3 100644 --- a/llvm/include/llvm/BinaryFormat/ELF.h +++ b/llvm/include/llvm/BinaryFormat/ELF.h @@ -903,22 +903,20 @@ enum { // LoongArch Specific e_flags enum : unsigned { - // Reference: https://github.com/loongson/LoongArch-Documentation. - // The last commit hash (main branch) is - // 99016636af64d02dee05e39974d4c1e55875c45b. - // Note that there is an open PR - // https://github.com/loongson/LoongArch-Documentation/pull/47 - // talking about using 0x1, 0x2, 0x3 for ILP32S/F/D and use EI_CLASS to - // distinguish LP64 and ILP32. If this PR get merged, we will update - // the definition here. - // Base ABI Types. - EF_LOONGARCH_BASE_ABI_LP64S = 0x1, // LP64 soft-float ABI - EF_LOONGARCH_BASE_ABI_LP64F = 0x2, // LP64 single-float ABI - EF_LOONGARCH_BASE_ABI_LP64D = 0x3, // LP64 double-float ABI - EF_LOONGARCH_BASE_ABI_ILP32S = 0x5, // ILP32 soft-float ABI - EF_LOONGARCH_BASE_ABI_ILP32F = 0x6, // ILP32 single-float ABI - EF_LOONGARCH_BASE_ABI_ILP32D = 0x7, // ILP32 double-float ABI - EF_LOONGARCH_BASE_ABI_MASK = 0x7, // Mask for selecting base ABI + // Definitions from LoongArch ELF psABI v2.01. + // Reference: https://github.com/loongson/LoongArch-Documentation + // (commit hash 296de4def055c871809068e0816325a4ac04eb12) + + // Base ABI Modifiers + EF_LOONGARCH_ABI_SOFT_FLOAT = 0x1, + EF_LOONGARCH_ABI_SINGLE_FLOAT = 0x2, + EF_LOONGARCH_ABI_DOUBLE_FLOAT = 0x3, + EF_LOONGARCH_ABI_MODIFIER_MASK = 0x7, + + // Object file ABI versions + EF_LOONGARCH_OBJABI_V0 = 0x0, + EF_LOONGARCH_OBJABI_V1 = 0x40, + EF_LOONGARCH_OBJABI_MASK = 0xC0, }; // ELF Relocation types for LoongArch diff --git a/llvm/lib/ObjectYAML/ELFYAML.cpp b/llvm/lib/ObjectYAML/ELFYAML.cpp index 82cb8cbb7c06..7e95ee084940 100644 --- a/llvm/lib/ObjectYAML/ELFYAML.cpp +++ b/llvm/lib/ObjectYAML/ELFYAML.cpp @@ -520,12 +520,11 @@ void ScalarBitSetTraits::bitset(IO &IO, BCase(EF_AVR_LINKRELAX_PREPARED); break; case ELF::EM_LOONGARCH: - BCaseMask(EF_LOONGARCH_BASE_ABI_ILP32S, EF_LOONGARCH_BASE_ABI_MASK); - BCaseMask(EF_LOONGARCH_BASE_ABI_ILP32F, EF_LOONGARCH_BASE_ABI_MASK); - BCaseMask(EF_LOONGARCH_BASE_ABI_ILP32D, EF_LOONGARCH_BASE_ABI_MASK); - BCaseMask(EF_LOONGARCH_BASE_ABI_LP64S, EF_LOONGARCH_BASE_ABI_MASK); - BCaseMask(EF_LOONGARCH_BASE_ABI_LP64F, EF_LOONGARCH_BASE_ABI_MASK); - BCaseMask(EF_LOONGARCH_BASE_ABI_LP64D, EF_LOONGARCH_BASE_ABI_MASK); + BCaseMask(EF_LOONGARCH_ABI_SOFT_FLOAT, EF_LOONGARCH_ABI_MODIFIER_MASK); + BCaseMask(EF_LOONGARCH_ABI_SINGLE_FLOAT, EF_LOONGARCH_ABI_MODIFIER_MASK); + BCaseMask(EF_LOONGARCH_ABI_DOUBLE_FLOAT, EF_LOONGARCH_ABI_MODIFIER_MASK); + BCaseMask(EF_LOONGARCH_OBJABI_V0, EF_LOONGARCH_OBJABI_MASK); + BCaseMask(EF_LOONGARCH_OBJABI_V1, EF_LOONGARCH_OBJABI_MASK); break; case ELF::EM_RISCV: BCase(EF_RISCV_RVC); diff --git a/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchELFStreamer.cpp b/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchELFStreamer.cpp index 1b289a450acc..3410c8f4277d 100644 --- a/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchELFStreamer.cpp +++ b/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchELFStreamer.cpp @@ -37,33 +37,28 @@ void LoongArchTargetELFStreamer::finish() { MCAssembler &MCA = getStreamer().getAssembler(); LoongArchABI::ABI ABI = getTargetABI(); - // FIXME: - // There are several PRs [1][2][3] that may affect the e_flags. - // After they got closed or merged, we should update the implementation here - // accordingly. + // Figure out the e_flags. // - // [1] https://github.com/loongson/LoongArch-Documentation/pull/33 - // [2] https://github.com/loongson/LoongArch-Documentation/pull/47 - // [2] https://github.com/loongson/LoongArch-Documentation/pull/61 + // Bitness is already represented with the EI_CLASS byte in the current spec, + // so here we only record the base ABI modifier. Also set the object file ABI + // version to v1, as upstream LLVM cannot handle the previous stack-machine- + // based relocs from day one. + // + // Refer to LoongArch ELF psABI v2.01 for details. unsigned EFlags = MCA.getELFHeaderEFlags(); + EFlags |= ELF::EF_LOONGARCH_OBJABI_V1; switch (ABI) { case LoongArchABI::ABI_ILP32S: - EFlags |= ELF::EF_LOONGARCH_BASE_ABI_ILP32S; + case LoongArchABI::ABI_LP64S: + EFlags |= ELF::EF_LOONGARCH_ABI_SOFT_FLOAT; break; case LoongArchABI::ABI_ILP32F: - EFlags |= ELF::EF_LOONGARCH_BASE_ABI_ILP32F; + case LoongArchABI::ABI_LP64F: + EFlags |= ELF::EF_LOONGARCH_ABI_SINGLE_FLOAT; break; case LoongArchABI::ABI_ILP32D: - EFlags |= ELF::EF_LOONGARCH_BASE_ABI_ILP32D; - break; - case LoongArchABI::ABI_LP64S: - EFlags |= ELF::EF_LOONGARCH_BASE_ABI_LP64S; - break; - case LoongArchABI::ABI_LP64F: - EFlags |= ELF::EF_LOONGARCH_BASE_ABI_LP64F; - break; case LoongArchABI::ABI_LP64D: - EFlags |= ELF::EF_LOONGARCH_BASE_ABI_LP64D; + EFlags |= ELF::EF_LOONGARCH_ABI_DOUBLE_FLOAT; break; case LoongArchABI::ABI_Unknown: llvm_unreachable("Improperly initialized target ABI"); diff --git a/llvm/test/CodeGen/LoongArch/e_flags.ll b/llvm/test/CodeGen/LoongArch/e_flags.ll index 21ce7f113f0d..d55b9b726748 100644 --- a/llvm/test/CodeGen/LoongArch/e_flags.ll +++ b/llvm/test/CodeGen/LoongArch/e_flags.ll @@ -1,14 +1,16 @@ ; RUN: llc --mtriple=loongarch32 --filetype=obj %s -o %t-la32 -; RUN: llvm-readelf -h %t-la32 | FileCheck %s --check-prefix=ILP32D --match-full-lines +; RUN: llvm-readelf -h %t-la32 | FileCheck %s --check-prefixes=ILP32,ABI-D --match-full-lines ; RUN: llc --mtriple=loongarch64 --filetype=obj %s -o %t-la64 -; RUN: llvm-readelf -h %t-la64 | FileCheck %s --check-prefix=LP64D --match-full-lines +; RUN: llvm-readelf -h %t-la64 | FileCheck %s --check-prefixes=LP64,ABI-D --match-full-lines ;; Note that we have not support the -target-abi option to select specific ABI. ;; See comments in LoongArchELFStreamer.cpp. So here we only check the default behaviour. ;; After -target-abi is supported, we can add more tests. -; LP64D: Flags: 0x3, LP64, DOUBLE-FLOAT -; ILP32D: Flags: 0x7, ILP32, DOUBLE-FLOAT +; LP64: Class: ELF64 +; ILP32: Class: ELF32 + +; ABI-D: Flags: 0x43, DOUBLE-FLOAT, OBJ-v1 define void @foo() { ret void diff --git a/llvm/test/tools/llvm-readobj/ELF/loongarch-eflags.test b/llvm/test/tools/llvm-readobj/ELF/loongarch-eflags.test index b6627364054b..824dcb2c05af 100644 --- a/llvm/test/tools/llvm-readobj/ELF/loongarch-eflags.test +++ b/llvm/test/tools/llvm-readobj/ELF/loongarch-eflags.test @@ -1,59 +1,95 @@ -## Check llvm-readobj is able to decode all possible LoongArch e_flags field values. +## Check llvm-readobj's ability to decode all possible LoongArch e_flags field +## values. -# RUN: yaml2obj %s -o %t-lp64s -DCLASS=64 -DFLAG=LP64S -# RUN: llvm-readobj -h %t-lp64s | FileCheck --check-prefix=READOBJ-LP64S %s -# RUN: llvm-readelf -h %t-lp64s | FileCheck --check-prefix=READELF-LP64S --match-full-lines %s +## Not all combinations covered here exist in reality (such as the v0 ILP32* +## objects) but they are included nevertheless for completeness. -# RUN: yaml2obj %s -o %t-lp64f -DCLASS=64 -DFLAG=LP64F -# RUN: llvm-readobj -h %t-lp64f | FileCheck --check-prefix=READOBJ-LP64F %s -# RUN: llvm-readelf -h %t-lp64f | FileCheck --check-prefix=READELF-LP64F --match-full-lines %s +# RUN: yaml2obj %s -o %t-lp64s -DCLASS=64 -DABI_MODIFIER=SOFT -DOBJABI_VER=0 +# RUN: llvm-readobj -h %t-lp64s | FileCheck --check-prefixes=READOBJ-LP64,READOBJ-SOFT-V0 %s +# RUN: llvm-readelf -h %t-lp64s | FileCheck --check-prefixes=READELF-LP64,READELF-SOFT-V0 --match-full-lines %s -# RUN: yaml2obj %s -o %t-lp64d -DCLASS=64 -DFLAG=LP64D -# RUN: llvm-readobj -h %t-lp64d | FileCheck --check-prefix=READOBJ-LP64D %s -# RUN: llvm-readelf -h %t-lp64d | FileCheck --check-prefix=READELF-LP64D --match-full-lines %s +# RUN: yaml2obj %s -o %t-lp64f -DCLASS=64 -DABI_MODIFIER=SINGLE -DOBJABI_VER=0 +# RUN: llvm-readobj -h %t-lp64f | FileCheck --check-prefixes=READOBJ-LP64,READOBJ-SINGLE-V0 %s +# RUN: llvm-readelf -h %t-lp64f | FileCheck --check-prefixes=READELF-LP64,READELF-SINGLE-V0 --match-full-lines %s -# RUN: yaml2obj %s -o %t-ilp32s -DCLASS=32 -DFLAG=ILP32S -# RUN: llvm-readobj -h %t-ilp32s | FileCheck --check-prefix=READOBJ-ILP32S %s -# RUN: llvm-readelf -h %t-ilp32s | FileCheck --check-prefix=READELF-ILP32S --match-full-lines %s +# RUN: yaml2obj %s -o %t-lp64d -DCLASS=64 -DABI_MODIFIER=DOUBLE -DOBJABI_VER=0 +# RUN: llvm-readobj -h %t-lp64d | FileCheck --check-prefixes=READOBJ-LP64,READOBJ-DOUBLE-V0 %s +# RUN: llvm-readelf -h %t-lp64d | FileCheck --check-prefixes=READELF-LP64,READELF-DOUBLE-V0 --match-full-lines %s -# RUN: yaml2obj %s -o %t-ilp32f -DCLASS=32 -DFLAG=ILP32F -# RUN: llvm-readobj -h %t-ilp32f | FileCheck --check-prefix=READOBJ-ILP32F %s -# RUN: llvm-readelf -h %t-ilp32f | FileCheck --check-prefix=READELF-ILP32F --match-full-lines %s +# RUN: yaml2obj %s -o %t-ilp32s -DCLASS=32 -DABI_MODIFIER=SOFT -DOBJABI_VER=0 +# RUN: llvm-readobj -h %t-ilp32s | FileCheck --check-prefixes=READOBJ-ILP32,READOBJ-SOFT-V0 %s +# RUN: llvm-readelf -h %t-ilp32s | FileCheck --check-prefixes=READELF-ILP32,READELF-SOFT-V0 --match-full-lines %s -# RUN: yaml2obj %s -o %t-ilp32d -DCLASS=32 -DFLAG=ILP32D -# RUN: llvm-readobj -h %t-ilp32d | FileCheck --check-prefix=READOBJ-ILP32D %s -# RUN: llvm-readelf -h %t-ilp32d | FileCheck --check-prefix=READELF-ILP32D --match-full-lines %s +# RUN: yaml2obj %s -o %t-ilp32f -DCLASS=32 -DABI_MODIFIER=SINGLE -DOBJABI_VER=0 +# RUN: llvm-readobj -h %t-ilp32f | FileCheck --check-prefixes=READOBJ-ILP32,READOBJ-SINGLE-V0 %s +# RUN: llvm-readelf -h %t-ilp32f | FileCheck --check-prefixes=READELF-ILP32,READELF-SINGLE-V0 --match-full-lines %s -# READOBJ-LP64S: Flags [ (0x1) -# READOBJ-LP64S-NEXT: EF_LOONGARCH_BASE_ABI_LP64S (0x1) -# READOBJ-LP64S-NEXT: ] +# RUN: yaml2obj %s -o %t-ilp32d -DCLASS=32 -DABI_MODIFIER=DOUBLE -DOBJABI_VER=0 +# RUN: llvm-readobj -h %t-ilp32d | FileCheck --check-prefixes=READOBJ-ILP32,READOBJ-DOUBLE-V0 %s +# RUN: llvm-readelf -h %t-ilp32d | FileCheck --check-prefixes=READELF-ILP32,READELF-DOUBLE-V0 --match-full-lines %s -# READOBJ-LP64F: Flags [ (0x2) -# READOBJ-LP64F-NEXT: EF_LOONGARCH_BASE_ABI_LP64F (0x2) -# READOBJ-LP64F-NEXT: ] +# RUN: yaml2obj %s -o %t-lp64s -DCLASS=64 -DABI_MODIFIER=SOFT -DOBJABI_VER=1 +# RUN: llvm-readobj -h %t-lp64s | FileCheck --check-prefixes=READOBJ-LP64,READOBJ-SOFT-V1 %s +# RUN: llvm-readelf -h %t-lp64s | FileCheck --check-prefixes=READELF-LP64,READELF-SOFT-V1 --match-full-lines %s -# READOBJ-LP64D: Flags [ (0x3) -# READOBJ-LP64D-NEXT: EF_LOONGARCH_BASE_ABI_LP64D (0x3) -# READOBJ-LP64D-NEXT: ] +# RUN: yaml2obj %s -o %t-lp64f -DCLASS=64 -DABI_MODIFIER=SINGLE -DOBJABI_VER=1 +# RUN: llvm-readobj -h %t-lp64f | FileCheck --check-prefixes=READOBJ-LP64,READOBJ-SINGLE-V1 %s +# RUN: llvm-readelf -h %t-lp64f | FileCheck --check-prefixes=READELF-LP64,READELF-SINGLE-V1 --match-full-lines %s -# READOBJ-ILP32S: Flags [ (0x5) -# READOBJ-ILP32S-NEXT: EF_LOONGARCH_BASE_ABI_ILP32S (0x5) -# READOBJ-ILP32S-NEXT: ] +# RUN: yaml2obj %s -o %t-lp64d -DCLASS=64 -DABI_MODIFIER=DOUBLE -DOBJABI_VER=1 +# RUN: llvm-readobj -h %t-lp64d | FileCheck --check-prefixes=READOBJ-LP64,READOBJ-DOUBLE-V1 %s +# RUN: llvm-readelf -h %t-lp64d | FileCheck --check-prefixes=READELF-LP64,READELF-DOUBLE-V1 --match-full-lines %s -# READOBJ-ILP32F: Flags [ (0x6) -# READOBJ-ILP32F-NEXT: EF_LOONGARCH_BASE_ABI_ILP32F (0x6) -# READOBJ-ILP32F-NEXT: ] +# RUN: yaml2obj %s -o %t-ilp32s -DCLASS=32 -DABI_MODIFIER=SOFT -DOBJABI_VER=1 +# RUN: llvm-readobj -h %t-ilp32s | FileCheck --check-prefixes=READOBJ-ILP32,READOBJ-SOFT-V1 %s +# RUN: llvm-readelf -h %t-ilp32s | FileCheck --check-prefixes=READELF-ILP32,READELF-SOFT-V1 --match-full-lines %s -# READOBJ-ILP32D: Flags [ (0x7) -# READOBJ-ILP32D-NEXT: EF_LOONGARCH_BASE_ABI_ILP32D (0x7) -# READOBJ-ILP32D-NEXT: ] +# RUN: yaml2obj %s -o %t-ilp32f -DCLASS=32 -DABI_MODIFIER=SINGLE -DOBJABI_VER=1 +# RUN: llvm-readobj -h %t-ilp32f | FileCheck --check-prefixes=READOBJ-ILP32,READOBJ-SINGLE-V1 %s +# RUN: llvm-readelf -h %t-ilp32f | FileCheck --check-prefixes=READELF-ILP32,READELF-SINGLE-V1 --match-full-lines %s -# READELF-LP64S: Flags: 0x1, LP64, SOFT-FLOAT -# READELF-LP64F: Flags: 0x2, LP64, SINGLE-FLOAT -# READELF-LP64D: Flags: 0x3, LP64, DOUBLE-FLOAT -# READELF-ILP32S: Flags: 0x5, ILP32, SOFT-FLOAT -# READELF-ILP32F: Flags: 0x6, ILP32, SINGLE-FLOAT -# READELF-ILP32D: Flags: 0x7, ILP32, DOUBLE-FLOAT +# RUN: yaml2obj %s -o %t-ilp32d -DCLASS=32 -DABI_MODIFIER=DOUBLE -DOBJABI_VER=1 +# RUN: llvm-readobj -h %t-ilp32d | FileCheck --check-prefixes=READOBJ-ILP32,READOBJ-DOUBLE-V1 %s +# RUN: llvm-readelf -h %t-ilp32d | FileCheck --check-prefixes=READELF-ILP32,READELF-DOUBLE-V1 --match-full-lines %s + +# READOBJ-LP64: Class: 64-bit (0x2) +# READELF-LP64: Class: ELF64 +# READOBJ-ILP32: Class: 32-bit (0x1) +# READELF-ILP32: Class: ELF32 + +# READOBJ-SOFT-V0: Flags [ (0x1) +# READOBJ-SOFT-V0-NEXT: EF_LOONGARCH_ABI_SOFT_FLOAT (0x1) +# READOBJ-SOFT-V0-NEXT: ] + +# READOBJ-SINGLE-V0: Flags [ (0x2) +# READOBJ-SINGLE-V0-NEXT: EF_LOONGARCH_ABI_SINGLE_FLOAT (0x2) +# READOBJ-SINGLE-V0-NEXT: ] + +# READOBJ-DOUBLE-V0: Flags [ (0x3) +# READOBJ-DOUBLE-V0-NEXT: EF_LOONGARCH_ABI_DOUBLE_FLOAT (0x3) +# READOBJ-DOUBLE-V0-NEXT: ] + +# READOBJ-SOFT-V1: Flags [ (0x41) +# READOBJ-SOFT-V1-NEXT: EF_LOONGARCH_ABI_SOFT_FLOAT (0x1) +# READOBJ-SOFT-V1-NEXT: EF_LOONGARCH_OBJABI_V1 (0x40) +# READOBJ-SOFT-V1-NEXT: ] + +# READOBJ-SINGLE-V1: Flags [ (0x42) +# READOBJ-SINGLE-V1-NEXT: EF_LOONGARCH_ABI_SINGLE_FLOAT (0x2) +# READOBJ-SINGLE-V1-NEXT: EF_LOONGARCH_OBJABI_V1 (0x40) +# READOBJ-SINGLE-V1-NEXT: ] + +# READOBJ-DOUBLE-V1: Flags [ (0x43) +# READOBJ-DOUBLE-V1-NEXT: EF_LOONGARCH_ABI_DOUBLE_FLOAT (0x3) +# READOBJ-DOUBLE-V1-NEXT: EF_LOONGARCH_OBJABI_V1 (0x40) +# READOBJ-DOUBLE-V1-NEXT: ] + +# READELF-SOFT-V0: Flags: 0x1, SOFT-FLOAT +# READELF-SINGLE-V0: Flags: 0x2, SINGLE-FLOAT +# READELF-DOUBLE-V0: Flags: 0x3, DOUBLE-FLOAT +# READELF-SOFT-V1: Flags: 0x41, SOFT-FLOAT, OBJ-v1 +# READELF-SINGLE-V1: Flags: 0x42, SINGLE-FLOAT, OBJ-v1 +# READELF-DOUBLE-V1: Flags: 0x43, DOUBLE-FLOAT, OBJ-v1 --- !ELF FileHeader: @@ -61,4 +97,7 @@ FileHeader: Data: ELFDATA2LSB Type: ET_EXEC Machine: EM_LOONGARCH - Flags: [ EF_LOONGARCH_BASE_ABI_[[FLAG]] ] + Flags: [ + EF_LOONGARCH_ABI_[[ABI_MODIFIER]]_FLOAT, + EF_LOONGARCH_OBJABI_V[[OBJABI_VER]], + ] diff --git a/llvm/test/tools/obj2yaml/ELF/loongarch-eflags.yaml b/llvm/test/tools/obj2yaml/ELF/loongarch-eflags.yaml index e4c4c292e0da..2e4ee1dabb18 100644 --- a/llvm/test/tools/obj2yaml/ELF/loongarch-eflags.yaml +++ b/llvm/test/tools/obj2yaml/ELF/loongarch-eflags.yaml @@ -1,24 +1,43 @@ ## Check obj2yaml is able to decode all possible LoongArch e_flags field values. -# RUN: yaml2obj %s -o %t-lp64s -DCLASS=64 -DFLAG=LP64S -# RUN: obj2yaml %t-lp64s | FileCheck -DFLAG=LP64S %s +# RUN: yaml2obj %s -o %t-lp64s -DCLASS=64 -DABI_MODIFIER=SOFT -DOBJABI_VER=0 +# RUN: obj2yaml %t-lp64s | FileCheck -DCLASS=64 -DABI_MODIFIER=SOFT -DOBJABI_VER=0 %s -# RUN: yaml2obj %s -o %t-lp64f -DCLASS=64 -DFLAG=LP64F -# RUN: obj2yaml %t-lp64f | FileCheck -DFLAG=LP64F %s +# RUN: yaml2obj %s -o %t-lp64f -DCLASS=64 -DABI_MODIFIER=SINGLE -DOBJABI_VER=0 +# RUN: obj2yaml %t-lp64f | FileCheck -DCLASS=64 -DABI_MODIFIER=SINGLE -DOBJABI_VER=0 %s -# RUN: yaml2obj %s -o %t-lp64d -DCLASS=64 -DFLAG=LP64D -# RUN: obj2yaml %t-lp64d | FileCheck -DFLAG=LP64D %s +# RUN: yaml2obj %s -o %t-lp64d -DCLASS=64 -DABI_MODIFIER=DOUBLE -DOBJABI_VER=0 +# RUN: obj2yaml %t-lp64d | FileCheck -DCLASS=64 -DABI_MODIFIER=DOUBLE -DOBJABI_VER=0 %s -# RUN: yaml2obj %s -o %t-ilp32s -DCLASS=32 -DFLAG=ILP32S -# RUN: obj2yaml %t-ilp32s | FileCheck -DFLAG=ILP32S %s +# RUN: yaml2obj %s -o %t-ilp32s -DCLASS=32 -DABI_MODIFIER=SOFT -DOBJABI_VER=0 +# RUN: obj2yaml %t-ilp32s | FileCheck -DCLASS=32 -DABI_MODIFIER=SOFT -DOBJABI_VER=0 %s -# RUN: yaml2obj %s -o %t-ilp32f -DCLASS=32 -DFLAG=ILP32F -# RUN: obj2yaml %t-ilp32f | FileCheck -DFLAG=ILP32F %s +# RUN: yaml2obj %s -o %t-ilp32f -DCLASS=32 -DABI_MODIFIER=SINGLE -DOBJABI_VER=0 +# RUN: obj2yaml %t-ilp32f | FileCheck -DCLASS=32 -DABI_MODIFIER=SINGLE -DOBJABI_VER=0 %s -# RUN: yaml2obj %s -o %t-ilp32d -DCLASS=32 -DFLAG=ILP32D -# RUN: obj2yaml %t-ilp32d | FileCheck -DFLAG=ILP32D %s +# RUN: yaml2obj %s -o %t-ilp32d -DCLASS=32 -DABI_MODIFIER=DOUBLE -DOBJABI_VER=0 +# RUN: obj2yaml %t-ilp32d | FileCheck -DCLASS=32 -DABI_MODIFIER=DOUBLE -DOBJABI_VER=0 %s -# CHECK: Flags: [ EF_LOONGARCH_BASE_ABI_[[FLAG]] ] +# RUN: yaml2obj %s -o %t-lp64s -DCLASS=64 -DABI_MODIFIER=SOFT -DOBJABI_VER=1 +# RUN: obj2yaml %t-lp64s | FileCheck -DCLASS=64 -DABI_MODIFIER=SOFT -DOBJABI_VER=1 %s + +# RUN: yaml2obj %s -o %t-lp64f -DCLASS=64 -DABI_MODIFIER=SINGLE -DOBJABI_VER=1 +# RUN: obj2yaml %t-lp64f | FileCheck -DCLASS=64 -DABI_MODIFIER=SINGLE -DOBJABI_VER=1 %s + +# RUN: yaml2obj %s -o %t-lp64d -DCLASS=64 -DABI_MODIFIER=DOUBLE -DOBJABI_VER=1 +# RUN: obj2yaml %t-lp64d | FileCheck -DCLASS=64 -DABI_MODIFIER=DOUBLE -DOBJABI_VER=1 %s + +# RUN: yaml2obj %s -o %t-ilp32s -DCLASS=32 -DABI_MODIFIER=SOFT -DOBJABI_VER=1 +# RUN: obj2yaml %t-ilp32s | FileCheck -DCLASS=32 -DABI_MODIFIER=SOFT -DOBJABI_VER=1 %s + +# RUN: yaml2obj %s -o %t-ilp32f -DCLASS=32 -DABI_MODIFIER=SINGLE -DOBJABI_VER=1 +# RUN: obj2yaml %t-ilp32f | FileCheck -DCLASS=32 -DABI_MODIFIER=SINGLE -DOBJABI_VER=1 %s + +# RUN: yaml2obj %s -o %t-ilp32d -DCLASS=32 -DABI_MODIFIER=DOUBLE -DOBJABI_VER=1 +# RUN: obj2yaml %t-ilp32d | FileCheck -DCLASS=32 -DABI_MODIFIER=DOUBLE -DOBJABI_VER=1 %s + +# CHECK: Class: ELFCLASS[[CLASS]] +# CHECK: Flags: [ EF_LOONGARCH_ABI_[[ABI_MODIFIER]]_FLOAT, EF_LOONGARCH_OBJABI_V[[OBJABI_VER]] ] --- !ELF FileHeader: @@ -26,4 +45,7 @@ FileHeader: Data: ELFDATA2LSB Type: ET_EXEC Machine: EM_LOONGARCH - Flags: [ EF_LOONGARCH_BASE_ABI_[[FLAG]] ] + Flags: [ + EF_LOONGARCH_ABI_[[ABI_MODIFIER]]_FLOAT, + EF_LOONGARCH_OBJABI_V[[OBJABI_VER]], + ] diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp index 305b23c48630..e6f87edd7152 100644 --- a/llvm/tools/llvm-readobj/ELFDumper.cpp +++ b/llvm/tools/llvm-readobj/ELFDumper.cpp @@ -1649,12 +1649,11 @@ const EnumEntry ElfHeaderAVRFlags[] = { }; const EnumEntry ElfHeaderLoongArchFlags[] = { - ENUM_ENT(EF_LOONGARCH_BASE_ABI_ILP32S, "ILP32, SOFT-FLOAT"), - ENUM_ENT(EF_LOONGARCH_BASE_ABI_ILP32F, "ILP32, SINGLE-FLOAT"), - ENUM_ENT(EF_LOONGARCH_BASE_ABI_ILP32D, "ILP32, DOUBLE-FLOAT"), - ENUM_ENT(EF_LOONGARCH_BASE_ABI_LP64S, "LP64, SOFT-FLOAT"), - ENUM_ENT(EF_LOONGARCH_BASE_ABI_LP64F, "LP64, SINGLE-FLOAT"), - ENUM_ENT(EF_LOONGARCH_BASE_ABI_LP64D, "LP64, DOUBLE-FLOAT"), + ENUM_ENT(EF_LOONGARCH_ABI_SOFT_FLOAT, "SOFT-FLOAT"), + ENUM_ENT(EF_LOONGARCH_ABI_SINGLE_FLOAT, "SINGLE-FLOAT"), + ENUM_ENT(EF_LOONGARCH_ABI_DOUBLE_FLOAT, "DOUBLE-FLOAT"), + ENUM_ENT(EF_LOONGARCH_OBJABI_V0, "OBJ-v0"), + ENUM_ENT(EF_LOONGARCH_OBJABI_V1, "OBJ-v1"), }; @@ -3368,7 +3367,8 @@ template void GNUELFDumper::printFileHeaders() { unsigned(ELF::EF_AVR_ARCH_MASK)); else if (e.e_machine == EM_LOONGARCH) ElfFlags = printFlags(e.e_flags, makeArrayRef(ElfHeaderLoongArchFlags), - unsigned(ELF::EF_LOONGARCH_BASE_ABI_MASK)); + unsigned(ELF::EF_LOONGARCH_ABI_MODIFIER_MASK), + unsigned(ELF::EF_LOONGARCH_OBJABI_MASK)); Str = "0x" + utohexstr(e.e_flags); if (!ElfFlags.empty()) Str = Str + ", " + ElfFlags; @@ -6546,7 +6546,8 @@ template void LLVMELFDumper::printFileHeaders() { unsigned(ELF::EF_AVR_ARCH_MASK)); else if (E.e_machine == EM_LOONGARCH) W.printFlags("Flags", E.e_flags, makeArrayRef(ElfHeaderLoongArchFlags), - unsigned(ELF::EF_LOONGARCH_BASE_ABI_MASK)); + unsigned(ELF::EF_LOONGARCH_ABI_MODIFIER_MASK), + unsigned(ELF::EF_LOONGARCH_OBJABI_MASK)); else W.printFlags("Flags", E.e_flags); W.printNumber("HeaderSize", E.e_ehsize);