[llvm] 4e2dfd3 - [LoongArch] Updates for the LoongArch ELF psABI v2.01 revision

Weining Lu via llvm-commits llvm-commits at lists.llvm.org
Thu Oct 13 04:17:21 PDT 2022


Author: WANG Xuerui
Date: 2022-10-13T19:12:26+08:00
New Revision: 4e2dfd3589bd8eae6acd5a3aa895199cedd7efc9

URL: https://github.com/llvm/llvm-project/commit/4e2dfd3589bd8eae6acd5a3aa895199cedd7efc9
DIFF: https://github.com/llvm/llvm-project/commit/4e2dfd3589bd8eae6acd5a3aa895199cedd7efc9.diff

LOG: [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

Added: 
    

Modified: 
    llvm/include/llvm/BinaryFormat/ELF.h
    llvm/lib/ObjectYAML/ELFYAML.cpp
    llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchELFStreamer.cpp
    llvm/test/CodeGen/LoongArch/e_flags.ll
    llvm/test/tools/llvm-readobj/ELF/loongarch-eflags.test
    llvm/test/tools/obj2yaml/ELF/loongarch-eflags.yaml
    llvm/tools/llvm-readobj/ELFDumper.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/BinaryFormat/ELF.h b/llvm/include/llvm/BinaryFormat/ELF.h
index 16cc9a0921550..8387f96394a33 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 82cb8cbb7c06d..7e95ee0849401 100644
--- a/llvm/lib/ObjectYAML/ELFYAML.cpp
+++ b/llvm/lib/ObjectYAML/ELFYAML.cpp
@@ -520,12 +520,11 @@ void ScalarBitSetTraits<ELFYAML::ELF_EF>::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 1b289a450acc4..3410c8f4277d7 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;
-    break;
-  case LoongArchABI::ABI_ILP32F:
-    EFlags |= ELF::EF_LOONGARCH_BASE_ABI_ILP32F;
-    break;
-  case LoongArchABI::ABI_ILP32D:
-    EFlags |= ELF::EF_LOONGARCH_BASE_ABI_ILP32D;
-    break;
   case LoongArchABI::ABI_LP64S:
-    EFlags |= ELF::EF_LOONGARCH_BASE_ABI_LP64S;
+    EFlags |= ELF::EF_LOONGARCH_ABI_SOFT_FLOAT;
     break;
+  case LoongArchABI::ABI_ILP32F:
   case LoongArchABI::ABI_LP64F:
-    EFlags |= ELF::EF_LOONGARCH_BASE_ABI_LP64F;
+    EFlags |= ELF::EF_LOONGARCH_ABI_SINGLE_FLOAT;
     break;
+  case LoongArchABI::ABI_ILP32D:
   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 21ce7f113f0d0..d55b9b7267484 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 b6627364054b6..824dcb2c05af2 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 e4c4c292e0da5..2e4ee1dabb186 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 305b23c48630d..e6f87edd71522 100644
--- a/llvm/tools/llvm-readobj/ELFDumper.cpp
+++ b/llvm/tools/llvm-readobj/ELFDumper.cpp
@@ -1649,12 +1649,11 @@ const EnumEntry<unsigned> ElfHeaderAVRFlags[] = {
 };
 
 const EnumEntry<unsigned> 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 <class ELFT> void GNUELFDumper<ELFT>::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 <class ELFT> void LLVMELFDumper<ELFT>::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);


        


More information about the llvm-commits mailing list