[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
This commit is contained in:
parent
62fc58a61d
commit
4e2dfd3589
@ -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
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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");
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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]],
|
||||
]
|
||||
|
||||
@ -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]],
|
||||
]
|
||||
|
||||
@ -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);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user