[llvm] 28b4838 - [Object] Add some more LoongArch support
Weining Lu via llvm-commits
llvm-commits at lists.llvm.org
Thu Dec 1 03:18:39 PST 2022
Author: WANG Xuerui
Date: 2022-12-01T19:16:51+08:00
New Revision: 28b4838a33b66830a0e508559effb37ffe1a20bf
URL: https://github.com/llvm/llvm-project/commit/28b4838a33b66830a0e508559effb37ffe1a20bf
DIFF: https://github.com/llvm/llvm-project/commit/28b4838a33b66830a0e508559effb37ffe1a20bf.diff
LOG: [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
Added:
Modified:
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
Removed:
################################################################################
diff --git a/llvm/include/llvm/Object/ELFObjectFile.h b/llvm/include/llvm/Object/ELFObjectFile.h
index f6d22e6e70be6..0ea4f89efefb6 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 0d5aa91c1348e..93d3476ac3e19 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 e16d275159b6a..5726299591c8f 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 a10845d7422af..5639ec886017f 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 1d6b489f33b04..bd625dc5549f8 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 838b7e9330d77..a310cb755fcdc 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 3ddae6d0567f8..07f3b6276017f 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 fa5a5088e6a77..10dd822a4c922 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 a8f04cefe059b..4cb7e6fe951c1 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 c3008add62849..c5d4b6a5fda97 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 a5873a54511ac..5865d6b6e152f 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 bfff92ff8a061..cdfb67b52af0c 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 583008b5a4f64..656808f60f4f6 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 cc4e1470d5251..8ba38426d3aa7 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 db44077dfc38f..069dab10c25a0 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 b5fbd9abd2baa..a614e867e1d92 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 da9107686d35f..26702d60b68a0 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 61fcb4ec9c23e..9cf8feb0e2c52 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.
More information about the llvm-commits
mailing list