From 28b4838a33b66830a0e508559effb37ffe1a20bf Mon Sep 17 00:00:00 2001 From: WANG Xuerui Date: Thu, 1 Dec 2022 17:58:11 +0800 Subject: [PATCH] [Object] Add some more LoongArch support Add ELFObjectFileBase::getLoongArchFeatures, and return the proper ELF relative reloc type for LoongArch. Reviewed By: MaskRay, SixWeining Differential Revision: https://reviews.llvm.org/D138016 --- llvm/include/llvm/Object/ELFObjectFile.h | 1 + llvm/lib/Object/ELF.cpp | 2 ++ llvm/lib/Object/ELFObjectFile.cpp | 20 +++++++++++++++++++ llvm/test/MC/LoongArch/Basic/Float/d-arith.s | 4 ++-- .../MC/LoongArch/Basic/Float/d-bound-check.s | 4 ++-- llvm/test/MC/LoongArch/Basic/Float/d-branch.s | 4 ++-- llvm/test/MC/LoongArch/Basic/Float/d-comp.s | 4 ++-- llvm/test/MC/LoongArch/Basic/Float/d-conv.s | 4 ++-- llvm/test/MC/LoongArch/Basic/Float/d-memory.s | 4 ++-- llvm/test/MC/LoongArch/Basic/Float/d-move.s | 4 ++-- llvm/test/MC/LoongArch/Basic/Float/f-arith.s | 4 ++-- .../MC/LoongArch/Basic/Float/f-bound-check.s | 4 ++-- llvm/test/MC/LoongArch/Basic/Float/f-branch.s | 4 ++-- llvm/test/MC/LoongArch/Basic/Float/f-comp.s | 4 ++-- llvm/test/MC/LoongArch/Basic/Float/f-conv.s | 4 ++-- llvm/test/MC/LoongArch/Basic/Float/f-memory.s | 4 ++-- llvm/test/MC/LoongArch/Basic/Float/f-move.s | 4 ++-- llvm/unittests/Object/ELFTest.cpp | 1 + 18 files changed, 52 insertions(+), 28 deletions(-) diff --git a/llvm/include/llvm/Object/ELFObjectFile.h b/llvm/include/llvm/Object/ELFObjectFile.h index f6d22e6e70be..0ea4f89efefb 100644 --- a/llvm/include/llvm/Object/ELFObjectFile.h +++ b/llvm/include/llvm/Object/ELFObjectFile.h @@ -56,6 +56,7 @@ class ELFObjectFileBase : public ObjectFile { SubtargetFeatures getMIPSFeatures() const; SubtargetFeatures getARMFeatures() const; SubtargetFeatures getRISCVFeatures() const; + SubtargetFeatures getLoongArchFeatures() const; StringRef getAMDGPUCPUName() const; diff --git a/llvm/lib/Object/ELF.cpp b/llvm/lib/Object/ELF.cpp index 0d5aa91c1348..93d3476ac3e1 100644 --- a/llvm/lib/Object/ELF.cpp +++ b/llvm/lib/Object/ELF.cpp @@ -223,6 +223,8 @@ uint32_t llvm::object::getELFRelativeRelocationType(uint32_t Machine) { break; case ELF::EM_BPF: break; + case ELF::EM_LOONGARCH: + return ELF::R_LARCH_RELATIVE; default: break; } diff --git a/llvm/lib/Object/ELFObjectFile.cpp b/llvm/lib/Object/ELFObjectFile.cpp index e16d275159b6..5726299591c8 100644 --- a/llvm/lib/Object/ELFObjectFile.cpp +++ b/llvm/lib/Object/ELFObjectFile.cpp @@ -342,6 +342,24 @@ SubtargetFeatures ELFObjectFileBase::getRISCVFeatures() const { return Features; } +SubtargetFeatures ELFObjectFileBase::getLoongArchFeatures() const { + SubtargetFeatures Features; + + switch (getPlatformFlags() & ELF::EF_LOONGARCH_ABI_MODIFIER_MASK) { + case ELF::EF_LOONGARCH_ABI_SOFT_FLOAT: + break; + case ELF::EF_LOONGARCH_ABI_DOUBLE_FLOAT: + Features.AddFeature("d"); + // D implies F according to LoongArch ISA spec. + [[fallthrough]]; + case ELF::EF_LOONGARCH_ABI_SINGLE_FLOAT: + Features.AddFeature("f"); + break; + } + + return Features; +} + SubtargetFeatures ELFObjectFileBase::getFeatures() const { switch (getEMachine()) { case ELF::EM_MIPS: @@ -350,6 +368,8 @@ SubtargetFeatures ELFObjectFileBase::getFeatures() const { return getARMFeatures(); case ELF::EM_RISCV: return getRISCVFeatures(); + case ELF::EM_LOONGARCH: + return getLoongArchFeatures(); default: return SubtargetFeatures(); } diff --git a/llvm/test/MC/LoongArch/Basic/Float/d-arith.s b/llvm/test/MC/LoongArch/Basic/Float/d-arith.s index a10845d7422a..5639ec886017 100644 --- a/llvm/test/MC/LoongArch/Basic/Float/d-arith.s +++ b/llvm/test/MC/LoongArch/Basic/Float/d-arith.s @@ -3,10 +3,10 @@ # RUN: llvm-mc %s --triple=loongarch64 --mattr=+d --show-encoding \ # RUN: | FileCheck --check-prefixes=ASM-AND-OBJ,ASM %s # RUN: llvm-mc %s --triple=loongarch32 --mattr=+d --filetype=obj \ -# RUN: | llvm-objdump -d --mattr=+d - \ +# RUN: | llvm-objdump -d - \ # RUN: | FileCheck --check-prefix=ASM-AND-OBJ %s # RUN: llvm-mc %s --triple=loongarch64 --mattr=+d --filetype=obj \ -# RUN: | llvm-objdump -d --mattr=+d - \ +# RUN: | llvm-objdump -d - \ # RUN: | FileCheck --check-prefix=ASM-AND-OBJ %s ## Support for the 'D' extension implies support for 'F' diff --git a/llvm/test/MC/LoongArch/Basic/Float/d-bound-check.s b/llvm/test/MC/LoongArch/Basic/Float/d-bound-check.s index 1d6b489f33b0..bd625dc5549f 100644 --- a/llvm/test/MC/LoongArch/Basic/Float/d-bound-check.s +++ b/llvm/test/MC/LoongArch/Basic/Float/d-bound-check.s @@ -3,10 +3,10 @@ # RUN: llvm-mc %s --triple=loongarch64 --mattr=+d --show-encoding \ # RUN: | FileCheck --check-prefixes=ASM-AND-OBJ,ASM %s # RUN: llvm-mc %s --triple=loongarch32 --mattr=+d --filetype=obj \ -# RUN: | llvm-objdump -d --mattr=+d - \ +# RUN: | llvm-objdump -d - \ # RUN: | FileCheck --check-prefix=ASM-AND-OBJ %s # RUN: llvm-mc %s --triple=loongarch64 --mattr=+d --filetype=obj \ -# RUN: | llvm-objdump -d --mattr=+d - \ +# RUN: | llvm-objdump -d - \ # RUN: | FileCheck --check-prefix=ASM-AND-OBJ %s ## Support for the 'D' extension implies support for 'F' diff --git a/llvm/test/MC/LoongArch/Basic/Float/d-branch.s b/llvm/test/MC/LoongArch/Basic/Float/d-branch.s index 838b7e9330d7..a310cb755fcd 100644 --- a/llvm/test/MC/LoongArch/Basic/Float/d-branch.s +++ b/llvm/test/MC/LoongArch/Basic/Float/d-branch.s @@ -3,10 +3,10 @@ # RUN: llvm-mc %s --triple=loongarch64 --mattr=+d --show-encoding \ # RUN: | FileCheck --check-prefixes=ASM-AND-OBJ,ASM %s # RUN: llvm-mc %s --triple=loongarch32 --mattr=+d --filetype=obj \ -# RUN: | llvm-objdump -d --mattr=+d - \ +# RUN: | llvm-objdump -d - \ # RUN: | FileCheck --check-prefix=ASM-AND-OBJ %s # RUN: llvm-mc %s --triple=loongarch64 --mattr=+d --filetype=obj \ -# RUN: | llvm-objdump -d --mattr=+d - \ +# RUN: | llvm-objdump -d - \ # RUN: | FileCheck --check-prefix=ASM-AND-OBJ %s ## Support for the 'D' extension implies support for 'F' diff --git a/llvm/test/MC/LoongArch/Basic/Float/d-comp.s b/llvm/test/MC/LoongArch/Basic/Float/d-comp.s index 3ddae6d0567f..07f3b6276017 100644 --- a/llvm/test/MC/LoongArch/Basic/Float/d-comp.s +++ b/llvm/test/MC/LoongArch/Basic/Float/d-comp.s @@ -3,10 +3,10 @@ # RUN: llvm-mc %s --triple=loongarch64 --mattr=+d --show-encoding \ # RUN: | FileCheck --check-prefixes=ASM-AND-OBJ,ASM %s # RUN: llvm-mc %s --triple=loongarch32 --mattr=+d --filetype=obj \ -# RUN: | llvm-objdump -d --mattr=+d - \ +# RUN: | llvm-objdump -d - \ # RUN: | FileCheck --check-prefix=ASM-AND-OBJ %s # RUN: llvm-mc %s --triple=loongarch64 --mattr=+d --filetype=obj \ -# RUN: | llvm-objdump -d --mattr=+d - \ +# RUN: | llvm-objdump -d - \ # RUN: | FileCheck --check-prefix=ASM-AND-OBJ %s ## Support for the 'D' extension implies support for 'F' diff --git a/llvm/test/MC/LoongArch/Basic/Float/d-conv.s b/llvm/test/MC/LoongArch/Basic/Float/d-conv.s index fa5a5088e6a7..10dd822a4c92 100644 --- a/llvm/test/MC/LoongArch/Basic/Float/d-conv.s +++ b/llvm/test/MC/LoongArch/Basic/Float/d-conv.s @@ -3,10 +3,10 @@ # RUN: llvm-mc %s --triple=loongarch64 --mattr=+d --show-encoding \ # RUN: | FileCheck --check-prefixes=ASM-AND-OBJ,ASM %s # RUN: llvm-mc %s --triple=loongarch32 --mattr=+d --filetype=obj \ -# RUN: | llvm-objdump -d --mattr=+d - \ +# RUN: | llvm-objdump -d - \ # RUN: | FileCheck --check-prefix=ASM-AND-OBJ %s # RUN: llvm-mc %s --triple=loongarch64 --mattr=+d --filetype=obj \ -# RUN: | llvm-objdump -d --mattr=+d - \ +# RUN: | llvm-objdump -d - \ # RUN: | FileCheck --check-prefix=ASM-AND-OBJ %s ## Support for the 'D' extension implies support for 'F' diff --git a/llvm/test/MC/LoongArch/Basic/Float/d-memory.s b/llvm/test/MC/LoongArch/Basic/Float/d-memory.s index a8f04cefe059..4cb7e6fe951c 100644 --- a/llvm/test/MC/LoongArch/Basic/Float/d-memory.s +++ b/llvm/test/MC/LoongArch/Basic/Float/d-memory.s @@ -3,10 +3,10 @@ # RUN: llvm-mc %s --triple=loongarch64 --mattr=+d --show-encoding \ # RUN: | FileCheck --check-prefixes=ASM-AND-OBJ,ASM %s # RUN: llvm-mc %s --triple=loongarch32 --mattr=+d --filetype=obj \ -# RUN: | llvm-objdump -d --mattr=+d - \ +# RUN: | llvm-objdump -d - \ # RUN: | FileCheck --check-prefix=ASM-AND-OBJ %s # RUN: llvm-mc %s --triple=loongarch64 --mattr=+d --filetype=obj \ -# RUN: | llvm-objdump -d --mattr=+d - \ +# RUN: | llvm-objdump -d - \ # RUN: | FileCheck --check-prefix=ASM-AND-OBJ %s ## Support for the 'D' extension implies support for 'F' diff --git a/llvm/test/MC/LoongArch/Basic/Float/d-move.s b/llvm/test/MC/LoongArch/Basic/Float/d-move.s index c3008add6284..c5d4b6a5fda9 100644 --- a/llvm/test/MC/LoongArch/Basic/Float/d-move.s +++ b/llvm/test/MC/LoongArch/Basic/Float/d-move.s @@ -3,10 +3,10 @@ # RUN: llvm-mc %s --triple=loongarch64 --mattr=+d --show-encoding --defsym=LA64=1 \ # RUN: | FileCheck --check-prefixes=ASM-AND-OBJ,ASM,ASM-AND-OBJ64,ASM64 %s # RUN: llvm-mc %s --triple=loongarch32 --mattr=+d --filetype=obj \ -# RUN: | llvm-objdump -d --mattr=+d - \ +# RUN: | llvm-objdump -d - \ # RUN: | FileCheck --check-prefix=ASM-AND-OBJ %s # RUN: llvm-mc %s --triple=loongarch64 --mattr=+d --filetype=obj --defsym=LA64=1 \ -# RUN: | llvm-objdump -d --mattr=+d - \ +# RUN: | llvm-objdump -d - \ # RUN: | FileCheck --check-prefixes=ASM-AND-OBJ,ASM-AND-OBJ64 %s ## Support for the 'D' extension implies support for 'F' diff --git a/llvm/test/MC/LoongArch/Basic/Float/f-arith.s b/llvm/test/MC/LoongArch/Basic/Float/f-arith.s index a5873a54511a..5865d6b6e152 100644 --- a/llvm/test/MC/LoongArch/Basic/Float/f-arith.s +++ b/llvm/test/MC/LoongArch/Basic/Float/f-arith.s @@ -3,10 +3,10 @@ # RUN: llvm-mc %s --triple=loongarch64 --mattr=+f --show-encoding \ # RUN: | FileCheck --check-prefixes=ASM-AND-OBJ,ASM %s # RUN: llvm-mc %s --triple=loongarch32 --mattr=+f --filetype=obj \ -# RUN: | llvm-objdump -d --mattr=+f - \ +# RUN: | llvm-objdump -d - \ # RUN: | FileCheck --check-prefix=ASM-AND-OBJ %s # RUN: llvm-mc %s --triple=loongarch64 --mattr=+f --filetype=obj \ -# RUN: | llvm-objdump -d --mattr=+f - \ +# RUN: | llvm-objdump -d - \ # RUN: | FileCheck --check-prefix=ASM-AND-OBJ %s # ASM-AND-OBJ: fadd.s $fs5, $ft7, $fs1 diff --git a/llvm/test/MC/LoongArch/Basic/Float/f-bound-check.s b/llvm/test/MC/LoongArch/Basic/Float/f-bound-check.s index bfff92ff8a06..cdfb67b52af0 100644 --- a/llvm/test/MC/LoongArch/Basic/Float/f-bound-check.s +++ b/llvm/test/MC/LoongArch/Basic/Float/f-bound-check.s @@ -3,10 +3,10 @@ # RUN: llvm-mc %s --triple=loongarch64 --mattr=+f --show-encoding \ # RUN: | FileCheck --check-prefixes=ASM-AND-OBJ,ASM %s # RUN: llvm-mc %s --triple=loongarch32 --mattr=+f --filetype=obj \ -# RUN: | llvm-objdump -d --mattr=+f - \ +# RUN: | llvm-objdump -d - \ # RUN: | FileCheck --check-prefix=ASM-AND-OBJ %s # RUN: llvm-mc %s --triple=loongarch64 --mattr=+f --filetype=obj \ -# RUN: | llvm-objdump -d --mattr=+f - \ +# RUN: | llvm-objdump -d - \ # RUN: | FileCheck --check-prefix=ASM-AND-OBJ %s # ASM-AND-OBJ: fldgt.s $fa3, $s4, $t1 diff --git a/llvm/test/MC/LoongArch/Basic/Float/f-branch.s b/llvm/test/MC/LoongArch/Basic/Float/f-branch.s index 583008b5a4f6..656808f60f4f 100644 --- a/llvm/test/MC/LoongArch/Basic/Float/f-branch.s +++ b/llvm/test/MC/LoongArch/Basic/Float/f-branch.s @@ -3,10 +3,10 @@ # RUN: llvm-mc %s --triple=loongarch64 --mattr=+f --show-encoding \ # RUN: | FileCheck --check-prefixes=ASM-AND-OBJ,ASM %s # RUN: llvm-mc %s --triple=loongarch32 --mattr=+f --filetype=obj \ -# RUN: | llvm-objdump -d --mattr=+f - \ +# RUN: | llvm-objdump -d - \ # RUN: | FileCheck --check-prefix=ASM-AND-OBJ %s # RUN: llvm-mc %s --triple=loongarch64 --mattr=+f --filetype=obj \ -# RUN: | llvm-objdump -d --mattr=+f - \ +# RUN: | llvm-objdump -d - \ # RUN: | FileCheck --check-prefix=ASM-AND-OBJ %s # ASM-AND-OBJ: bceqz $fcc6, 12 diff --git a/llvm/test/MC/LoongArch/Basic/Float/f-comp.s b/llvm/test/MC/LoongArch/Basic/Float/f-comp.s index cc4e1470d525..8ba38426d3aa 100644 --- a/llvm/test/MC/LoongArch/Basic/Float/f-comp.s +++ b/llvm/test/MC/LoongArch/Basic/Float/f-comp.s @@ -3,10 +3,10 @@ # RUN: llvm-mc %s --triple=loongarch64 --mattr=+f --show-encoding \ # RUN: | FileCheck --check-prefixes=ASM-AND-OBJ,ASM %s # RUN: llvm-mc %s --triple=loongarch32 --mattr=+f --filetype=obj \ -# RUN: | llvm-objdump -d --mattr=+f - \ +# RUN: | llvm-objdump -d - \ # RUN: | FileCheck --check-prefix=ASM-AND-OBJ %s # RUN: llvm-mc %s --triple=loongarch64 --mattr=+f --filetype=obj \ -# RUN: | llvm-objdump -d --mattr=+f - \ +# RUN: | llvm-objdump -d - \ # RUN: | FileCheck --check-prefix=ASM-AND-OBJ %s # ASM-AND-OBJ: fcmp.caf.s $fcc0, $fa0, $fa1 diff --git a/llvm/test/MC/LoongArch/Basic/Float/f-conv.s b/llvm/test/MC/LoongArch/Basic/Float/f-conv.s index db44077dfc38..069dab10c25a 100644 --- a/llvm/test/MC/LoongArch/Basic/Float/f-conv.s +++ b/llvm/test/MC/LoongArch/Basic/Float/f-conv.s @@ -3,10 +3,10 @@ # RUN: llvm-mc %s --triple=loongarch64 --mattr=+f --show-encoding \ # RUN: | FileCheck --check-prefixes=ASM-AND-OBJ,ASM %s # RUN: llvm-mc %s --triple=loongarch32 --mattr=+f --filetype=obj \ -# RUN: | llvm-objdump -d --mattr=+f - \ +# RUN: | llvm-objdump -d - \ # RUN: | FileCheck --check-prefix=ASM-AND-OBJ %s # RUN: llvm-mc %s --triple=loongarch64 --mattr=+f --filetype=obj \ -# RUN: | llvm-objdump -d --mattr=+f - \ +# RUN: | llvm-objdump -d - \ # RUN: | FileCheck --check-prefix=ASM-AND-OBJ %s # ASM-AND-OBJ: ffint.s.w $fs6, $fa5 diff --git a/llvm/test/MC/LoongArch/Basic/Float/f-memory.s b/llvm/test/MC/LoongArch/Basic/Float/f-memory.s index b5fbd9abd2ba..a614e867e1d9 100644 --- a/llvm/test/MC/LoongArch/Basic/Float/f-memory.s +++ b/llvm/test/MC/LoongArch/Basic/Float/f-memory.s @@ -3,10 +3,10 @@ # RUN: llvm-mc %s --triple=loongarch64 --mattr=+f --show-encoding \ # RUN: | FileCheck --check-prefixes=ASM-AND-OBJ,ASM %s # RUN: llvm-mc %s --triple=loongarch32 --mattr=+f --filetype=obj \ -# RUN: | llvm-objdump -d --mattr=+f - \ +# RUN: | llvm-objdump -d - \ # RUN: | FileCheck --check-prefix=ASM-AND-OBJ %s # RUN: llvm-mc %s --triple=loongarch64 --mattr=+f --filetype=obj \ -# RUN: | llvm-objdump -d --mattr=+f - \ +# RUN: | llvm-objdump -d - \ # RUN: | FileCheck --check-prefix=ASM-AND-OBJ %s # ASM-AND-OBJ: fld.s $ft15, $t3, 250 diff --git a/llvm/test/MC/LoongArch/Basic/Float/f-move.s b/llvm/test/MC/LoongArch/Basic/Float/f-move.s index da9107686d35..26702d60b68a 100644 --- a/llvm/test/MC/LoongArch/Basic/Float/f-move.s +++ b/llvm/test/MC/LoongArch/Basic/Float/f-move.s @@ -3,10 +3,10 @@ # RUN: llvm-mc %s --triple=loongarch64 --mattr=+f --show-encoding \ # RUN: | FileCheck --check-prefixes=ASM-AND-OBJ,ASM %s # RUN: llvm-mc %s --triple=loongarch32 --mattr=+f --filetype=obj \ -# RUN: | llvm-objdump -d --mattr=+f - \ +# RUN: | llvm-objdump -d - \ # RUN: | FileCheck --check-prefix=ASM-AND-OBJ %s # RUN: llvm-mc %s --triple=loongarch64 --mattr=+f --filetype=obj \ -# RUN: | llvm-objdump -d --mattr=+f - \ +# RUN: | llvm-objdump -d - \ # RUN: | FileCheck --check-prefix=ASM-AND-OBJ %s # ASM-AND-OBJ: fmov.s $ft5, $ft15 diff --git a/llvm/unittests/Object/ELFTest.cpp b/llvm/unittests/Object/ELFTest.cpp index 61fcb4ec9c23..9cf8feb0e2c5 100644 --- a/llvm/unittests/Object/ELFTest.cpp +++ b/llvm/unittests/Object/ELFTest.cpp @@ -237,6 +237,7 @@ TEST(ELFTest, getELFRelocationTypeNameForLoongArch) { TEST(ELFTest, getELFRelativeRelocationType) { EXPECT_EQ(ELF::R_VE_RELATIVE, getELFRelativeRelocationType(EM_VE)); + EXPECT_EQ(ELF::R_LARCH_RELATIVE, getELFRelativeRelocationType(EM_LOONGARCH)); } // This is a test for the DataRegion helper struct, defined in ELF.h header.