[Object] Add some more LoongArch support
authorWANG Xuerui <git@xen0n.name>
Thu, 1 Dec 2022 09:58:11 +0000 (17:58 +0800)
committerWeining Lu <luweining@loongson.cn>
Thu, 1 Dec 2022 11:16:51 +0000 (19:16 +0800)
Add ELFObjectFileBase::getLoongArchFeatures, and return the proper ELF
relative reloc type for LoongArch.

Reviewed By: MaskRay, SixWeining

Differential Revision: https://reviews.llvm.org/D138016

18 files changed:
llvm/include/llvm/Object/ELFObjectFile.h
llvm/lib/Object/ELF.cpp
llvm/lib/Object/ELFObjectFile.cpp
llvm/test/MC/LoongArch/Basic/Float/d-arith.s
llvm/test/MC/LoongArch/Basic/Float/d-bound-check.s
llvm/test/MC/LoongArch/Basic/Float/d-branch.s
llvm/test/MC/LoongArch/Basic/Float/d-comp.s
llvm/test/MC/LoongArch/Basic/Float/d-conv.s
llvm/test/MC/LoongArch/Basic/Float/d-memory.s
llvm/test/MC/LoongArch/Basic/Float/d-move.s
llvm/test/MC/LoongArch/Basic/Float/f-arith.s
llvm/test/MC/LoongArch/Basic/Float/f-bound-check.s
llvm/test/MC/LoongArch/Basic/Float/f-branch.s
llvm/test/MC/LoongArch/Basic/Float/f-comp.s
llvm/test/MC/LoongArch/Basic/Float/f-conv.s
llvm/test/MC/LoongArch/Basic/Float/f-memory.s
llvm/test/MC/LoongArch/Basic/Float/f-move.s
llvm/unittests/Object/ELFTest.cpp

index f6d22e6..0ea4f89 100644 (file)
@@ -56,6 +56,7 @@ class ELFObjectFileBase : public ObjectFile {
   SubtargetFeatures getMIPSFeatures() const;
   SubtargetFeatures getARMFeatures() const;
   SubtargetFeatures getRISCVFeatures() const;
+  SubtargetFeatures getLoongArchFeatures() const;
 
   StringRef getAMDGPUCPUName() const;
 
index 0d5aa91..93d3476 100644 (file)
@@ -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;
   }
index e16d275..5726299 100644 (file)
@@ -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();
   }
index a10845d..5639ec8 100644 (file)
@@ -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'
index 1d6b489..bd625dc 100644 (file)
@@ -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'
index 838b7e9..a310cb7 100644 (file)
@@ -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'
index 3ddae6d..07f3b62 100644 (file)
@@ -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'
index fa5a508..10dd822 100644 (file)
@@ -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'
index a8f04ce..4cb7e6f 100644 (file)
@@ -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'
index c3008ad..c5d4b6a 100644 (file)
@@ -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'
index a5873a5..5865d6b 100644 (file)
@@ -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
index bfff92f..cdfb67b 100644 (file)
@@ -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
index 583008b..656808f 100644 (file)
@@ -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
index cc4e147..8ba3842 100644 (file)
@@ -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
index db44077..069dab1 100644 (file)
@@ -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
index b5fbd9a..a614e86 100644 (file)
@@ -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
index da91076..26702d6 100644 (file)
@@ -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
index 61fcb4e..9cf8feb 100644 (file)
@@ -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.