[llvm] e53e6ec - [LoongArch 2/6] Add ELF machine flag and relocs for upcoming LoongArch target

Renato Golin via llvm-commits llvm-commits at lists.llvm.org
Thu Feb 10 02:23:56 PST 2022


Author: Lu Weining
Date: 2022-02-10T10:23:34Z
New Revision: e53e6ec6ef749c2a9b922a1dc6e14e0538292643

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

LOG: [LoongArch 2/6] Add ELF machine flag and relocs for upcoming LoongArch target

This patch adds necessary definitions for LoongArch ELF files, including
relocation types. Also adds initial support to ELFYaml, llvm-objdump,
and llvm-readobj in order to work with LoongArch ELFs.

Differential revision: https://reviews.llvm.org/D115859

Added: 
    llvm/include/llvm/BinaryFormat/ELFRelocs/LoongArch.def
    llvm/test/tools/llvm-readobj/ELF/reloc-types-loongarch64.test

Modified: 
    llvm/include/llvm/BinaryFormat/ELF.h
    llvm/include/llvm/Object/ELFObjectFile.h
    llvm/lib/Object/ELF.cpp
    llvm/lib/ObjectYAML/ELFYAML.cpp
    llvm/tools/llvm-readobj/ELFDumper.cpp
    llvm/unittests/Object/ELFObjectFileTest.cpp
    llvm/unittests/Object/ELFTest.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/BinaryFormat/ELF.h b/llvm/include/llvm/BinaryFormat/ELF.h
index 5d3b1270b5380..bc4b677c75a15 100644
--- a/llvm/include/llvm/BinaryFormat/ELF.h
+++ b/llvm/include/llvm/BinaryFormat/ELF.h
@@ -319,6 +319,7 @@ enum {
   EM_BPF = 247,           // Linux kernel bpf virtual machine
   EM_VE = 251,            // NEC SX-Aurora VE
   EM_CSKY = 252,          // C-SKY 32-bit processor
+  EM_LOONGARCH = 258,     // LoongArch
 };
 
 // Object file classes.
@@ -871,6 +872,11 @@ enum {
 #include "ELFRelocs/CSKY.def"
 };
 
+// ELF Relocation types for LoongArch
+enum {
+#include "ELFRelocs/LoongArch.def"
+};
+
 #undef ELF_RELOC
 
 // Section header.

diff  --git a/llvm/include/llvm/BinaryFormat/ELFRelocs/LoongArch.def b/llvm/include/llvm/BinaryFormat/ELFRelocs/LoongArch.def
new file mode 100644
index 0000000000000..4743d6a7c5879
--- /dev/null
+++ b/llvm/include/llvm/BinaryFormat/ELFRelocs/LoongArch.def
@@ -0,0 +1,63 @@
+#ifndef ELF_RELOC
+#error "ELF_RELOC must be defined"
+#endif
+
+// These types and values are from the LoongArch ELF psABI which can be found at
+// https://github.com/loongson/LoongArch-Documentation
+// and these definitions has been adopted by binutils (include/elf/loongarch.h).
+// The commit hash (main branch) we reference is:
+// 9b3bd9f4a497115913c22f1a2a47863798fbc02a
+
+ELF_RELOC(R_LARCH_NONE,                        0)
+ELF_RELOC(R_LARCH_32,                          1)
+ELF_RELOC(R_LARCH_64,                          2)
+ELF_RELOC(R_LARCH_RELATIVE,                    3)
+ELF_RELOC(R_LARCH_COPY,                        4)
+ELF_RELOC(R_LARCH_JUMP_SLOT,                   5)
+ELF_RELOC(R_LARCH_TLS_DTPMOD32,                6)
+ELF_RELOC(R_LARCH_TLS_DTPMOD64,                7)
+ELF_RELOC(R_LARCH_TLS_DTPREL32,                8)
+ELF_RELOC(R_LARCH_TLS_DTPREL64,                9)
+ELF_RELOC(R_LARCH_TLS_TPREL32,                10)
+ELF_RELOC(R_LARCH_TLS_TPREL64,                11)
+ELF_RELOC(R_LARCH_IRELATIVE,                  12)
+
+ELF_RELOC(R_LARCH_MARK_LA,                    20)
+ELF_RELOC(R_LARCH_MARK_PCREL,                 21)
+ELF_RELOC(R_LARCH_SOP_PUSH_PCREL,             22)
+ELF_RELOC(R_LARCH_SOP_PUSH_ABSOLUTE,          23)
+ELF_RELOC(R_LARCH_SOP_PUSH_DUP,               24)
+ELF_RELOC(R_LARCH_SOP_PUSH_GPREL,             25)
+ELF_RELOC(R_LARCH_SOP_PUSH_TLS_TPREL,         26)
+ELF_RELOC(R_LARCH_SOP_PUSH_TLS_GOT,           27)
+ELF_RELOC(R_LARCH_SOP_PUSH_TLS_GD,            28)
+ELF_RELOC(R_LARCH_SOP_PUSH_PLT_PCREL,         29)
+ELF_RELOC(R_LARCH_SOP_ASSERT,                 30)
+ELF_RELOC(R_LARCH_SOP_NOT,                    31)
+ELF_RELOC(R_LARCH_SOP_SUB,                    32)
+ELF_RELOC(R_LARCH_SOP_SL,                     33)
+ELF_RELOC(R_LARCH_SOP_SR,                     34)
+ELF_RELOC(R_LARCH_SOP_ADD,                    35)
+ELF_RELOC(R_LARCH_SOP_AND,                    36)
+ELF_RELOC(R_LARCH_SOP_IF_ELSE,                37)
+ELF_RELOC(R_LARCH_SOP_POP_32_S_10_5,          38)
+ELF_RELOC(R_LARCH_SOP_POP_32_U_10_12,         39)
+ELF_RELOC(R_LARCH_SOP_POP_32_S_10_12,         40)
+ELF_RELOC(R_LARCH_SOP_POP_32_S_10_16,         41)
+ELF_RELOC(R_LARCH_SOP_POP_32_S_10_16_S2,      42)
+ELF_RELOC(R_LARCH_SOP_POP_32_S_5_20,          43)
+ELF_RELOC(R_LARCH_SOP_POP_32_S_0_5_10_16_S2,  44)
+ELF_RELOC(R_LARCH_SOP_POP_32_S_0_10_10_16_S2, 45)
+ELF_RELOC(R_LARCH_SOP_POP_32_U,               46)
+ELF_RELOC(R_LARCH_ADD8,                       47)
+ELF_RELOC(R_LARCH_ADD16,                      48)
+ELF_RELOC(R_LARCH_ADD24,                      49)
+ELF_RELOC(R_LARCH_ADD32,                      50)
+ELF_RELOC(R_LARCH_ADD64,                      51)
+ELF_RELOC(R_LARCH_SUB8,                       52)
+ELF_RELOC(R_LARCH_SUB16,                      53)
+ELF_RELOC(R_LARCH_SUB24,                      54)
+ELF_RELOC(R_LARCH_SUB32,                      55)
+ELF_RELOC(R_LARCH_SUB64,                      56)
+ELF_RELOC(R_LARCH_GNU_VTINHERIT,              57)
+ELF_RELOC(R_LARCH_GNU_VTENTRY,                58)

diff  --git a/llvm/include/llvm/Object/ELFObjectFile.h b/llvm/include/llvm/Object/ELFObjectFile.h
index e2d2784d4f238..4c7fda45469e4 100644
--- a/llvm/include/llvm/Object/ELFObjectFile.h
+++ b/llvm/include/llvm/Object/ELFObjectFile.h
@@ -1202,6 +1202,8 @@ StringRef ELFObjectFile<ELFT>::getFileFormatName() const {
       return "elf32-sparc";
     case ELF::EM_AMDGPU:
       return "elf32-amdgpu";
+    case ELF::EM_LOONGARCH:
+      return "elf32-loongarch";
     default:
       return "elf32-unknown";
     }
@@ -1229,6 +1231,8 @@ StringRef ELFObjectFile<ELFT>::getFileFormatName() const {
       return "elf64-bpf";
     case ELF::EM_VE:
       return "elf64-ve";
+    case ELF::EM_LOONGARCH:
+      return "elf64-loongarch";
     default:
       return "elf64-unknown";
     }
@@ -1313,6 +1317,17 @@ template <class ELFT> Triple::ArchType ELFObjectFile<ELFT>::getArch() const {
     return Triple::ve;
   case ELF::EM_CSKY:
     return Triple::csky;
+
+  case ELF::EM_LOONGARCH:
+    switch (EF.getHeader().e_ident[ELF::EI_CLASS]) {
+    case ELF::ELFCLASS32:
+      return Triple::loongarch32;
+    case ELF::ELFCLASS64:
+      return Triple::loongarch64;
+    default:
+      report_fatal_error("Invalid ELFCLASS!");
+    }
+
   default:
     return Triple::UnknownArch;
   }

diff  --git a/llvm/lib/Object/ELF.cpp b/llvm/lib/Object/ELF.cpp
index 6e56da1a31f3e..c4e4887abba76 100644
--- a/llvm/lib/Object/ELF.cpp
+++ b/llvm/lib/Object/ELF.cpp
@@ -166,6 +166,13 @@ StringRef llvm::object::getELFRelocationTypeName(uint32_t Machine,
       break;
     }
     break;
+  case ELF::EM_LOONGARCH:
+    switch (Type) {
+#include "llvm/BinaryFormat/ELFRelocs/LoongArch.def"
+    default:
+      break;
+    }
+    break;
   default:
     break;
   }

diff  --git a/llvm/lib/ObjectYAML/ELFYAML.cpp b/llvm/lib/ObjectYAML/ELFYAML.cpp
index 3d4cd4088e9fc..48803cae1bd9c 100644
--- a/llvm/lib/ObjectYAML/ELFYAML.cpp
+++ b/llvm/lib/ObjectYAML/ELFYAML.cpp
@@ -344,6 +344,7 @@ void ScalarEnumerationTraits<ELFYAML::ELF_EM>::enumeration(
   ECase(EM_BPF);
   ECase(EM_VE);
   ECase(EM_CSKY);
+  ECase(EM_LOONGARCH);
 #undef ECase
   IO.enumFallback<Hex16>(Value);
 }
@@ -848,6 +849,9 @@ void ScalarEnumerationTraits<ELFYAML::ELF_REL>::enumeration(
   case ELF::EM_68K:
 #include "llvm/BinaryFormat/ELFRelocs/M68k.def"
     break;
+  case ELF::EM_LOONGARCH:
+#include "llvm/BinaryFormat/ELFRelocs/LoongArch.def"
+    break;
   default:
     // Nothing to do.
     break;

diff  --git a/llvm/test/tools/llvm-readobj/ELF/reloc-types-loongarch64.test b/llvm/test/tools/llvm-readobj/ELF/reloc-types-loongarch64.test
new file mode 100644
index 0000000000000..0aed3fff4413c
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/reloc-types-loongarch64.test
@@ -0,0 +1,121 @@
+## Test that llvm-readobj/llvm-readelf shows proper relocation type
+## names and values for loongarch64 target.
+
+# RUN: yaml2obj %s -o %t-loongarch64.o
+# RUN: llvm-readobj -r --expand-relocs %t-loongarch64.o | FileCheck %s
+
+# CHECK: Type: R_LARCH_NONE (0)
+# CHECK: Type: R_LARCH_32 (1)
+# CHECK: Type: R_LARCH_64 (2)
+# CHECK: Type: R_LARCH_RELATIVE (3)
+# CHECK: Type: R_LARCH_COPY (4)
+# CHECK: Type: R_LARCH_JUMP_SLOT (5)
+# CHECK: Type: R_LARCH_TLS_DTPMOD32 (6)
+# CHECK: Type: R_LARCH_TLS_DTPMOD64 (7)
+# CHECK: Type: R_LARCH_TLS_DTPREL32 (8)
+# CHECK: Type: R_LARCH_TLS_DTPREL64 (9)
+# CHECK: Type: R_LARCH_TLS_TPREL32 (10)
+# CHECK: Type: R_LARCH_TLS_TPREL64 (11)
+# CHECK: Type: R_LARCH_IRELATIVE (12)
+# CHECK: Type: R_LARCH_MARK_LA (20)
+# CHECK: Type: R_LARCH_MARK_PCREL (21)
+# CHECK: Type: R_LARCH_SOP_PUSH_PCREL (22)
+# CHECK: Type: R_LARCH_SOP_PUSH_ABSOLUTE (23)
+# CHECK: Type: R_LARCH_SOP_PUSH_DUP (24)
+# CHECK: Type: R_LARCH_SOP_PUSH_GPREL (25)
+# CHECK: Type: R_LARCH_SOP_PUSH_TLS_TPREL (26)
+# CHECK: Type: R_LARCH_SOP_PUSH_TLS_GOT (27)
+# CHECK: Type: R_LARCH_SOP_PUSH_TLS_GD (28)
+# CHECK: Type: R_LARCH_SOP_PUSH_PLT_PCREL (29)
+# CHECK: Type: R_LARCH_SOP_ASSERT (30)
+# CHECK: Type: R_LARCH_SOP_NOT (31)
+# CHECK: Type: R_LARCH_SOP_SUB (32)
+# CHECK: Type: R_LARCH_SOP_SL (33)
+# CHECK: Type: R_LARCH_SOP_SR (34)
+# CHECK: Type: R_LARCH_SOP_ADD (35)
+# CHECK: Type: R_LARCH_SOP_AND (36)
+# CHECK: Type: R_LARCH_SOP_IF_ELSE (37)
+# CHECK: Type: R_LARCH_SOP_POP_32_S_10_5 (38)
+# CHECK: Type: R_LARCH_SOP_POP_32_U_10_12 (39)
+# CHECK: Type: R_LARCH_SOP_POP_32_S_10_12 (40)
+# CHECK: Type: R_LARCH_SOP_POP_32_S_10_16 (41)
+# CHECK: Type: R_LARCH_SOP_POP_32_S_10_16_S2 (42)
+# CHECK: Type: R_LARCH_SOP_POP_32_S_5_20 (43)
+# CHECK: Type: R_LARCH_SOP_POP_32_S_0_5_10_16_S2 (44)
+# CHECK: Type: R_LARCH_SOP_POP_32_S_0_10_10_16_S2 (45)
+# CHECK: Type: R_LARCH_SOP_POP_32_U (46)
+# CHECK: Type: R_LARCH_ADD8 (47)
+# CHECK: Type: R_LARCH_ADD16 (48)
+# CHECK: Type: R_LARCH_ADD24 (49)
+# CHECK: Type: R_LARCH_ADD32 (50)
+# CHECK: Type: R_LARCH_ADD64 (51)
+# CHECK: Type: R_LARCH_SUB8 (52)
+# CHECK: Type: R_LARCH_SUB16 (53)
+# CHECK: Type: R_LARCH_SUB24 (54)
+# CHECK: Type: R_LARCH_SUB32 (55)
+# CHECK: Type: R_LARCH_SUB64 (56)
+# CHECK: Type: R_LARCH_GNU_VTINHERIT (57)
+# CHECK: Type: R_LARCH_GNU_VTENTRY (58)
+
+--- !ELF
+FileHeader:
+  Class:   ELFCLASS64
+  Data:    ELFDATA2LSB
+  Type:    ET_REL
+  Machine: EM_LOONGARCH
+Sections:
+  - Name: .rela.text
+    Type: SHT_RELA
+    Relocations:
+      - Type: R_LARCH_NONE
+      - Type: R_LARCH_32
+      - Type: R_LARCH_64
+      - Type: R_LARCH_RELATIVE
+      - Type: R_LARCH_COPY
+      - Type: R_LARCH_JUMP_SLOT
+      - Type: R_LARCH_TLS_DTPMOD32
+      - Type: R_LARCH_TLS_DTPMOD64
+      - Type: R_LARCH_TLS_DTPREL32
+      - Type: R_LARCH_TLS_DTPREL64
+      - Type: R_LARCH_TLS_TPREL32
+      - Type: R_LARCH_TLS_TPREL64
+      - Type: R_LARCH_IRELATIVE
+      - Type: R_LARCH_MARK_LA
+      - Type: R_LARCH_MARK_PCREL
+      - Type: R_LARCH_SOP_PUSH_PCREL
+      - Type: R_LARCH_SOP_PUSH_ABSOLUTE
+      - Type: R_LARCH_SOP_PUSH_DUP
+      - Type: R_LARCH_SOP_PUSH_GPREL
+      - Type: R_LARCH_SOP_PUSH_TLS_TPREL
+      - Type: R_LARCH_SOP_PUSH_TLS_GOT
+      - Type: R_LARCH_SOP_PUSH_TLS_GD
+      - Type: R_LARCH_SOP_PUSH_PLT_PCREL
+      - Type: R_LARCH_SOP_ASSERT
+      - Type: R_LARCH_SOP_NOT
+      - Type: R_LARCH_SOP_SUB
+      - Type: R_LARCH_SOP_SL
+      - Type: R_LARCH_SOP_SR
+      - Type: R_LARCH_SOP_ADD
+      - Type: R_LARCH_SOP_AND
+      - Type: R_LARCH_SOP_IF_ELSE
+      - Type: R_LARCH_SOP_POP_32_S_10_5
+      - Type: R_LARCH_SOP_POP_32_U_10_12
+      - Type: R_LARCH_SOP_POP_32_S_10_12
+      - Type: R_LARCH_SOP_POP_32_S_10_16
+      - Type: R_LARCH_SOP_POP_32_S_10_16_S2
+      - Type: R_LARCH_SOP_POP_32_S_5_20
+      - Type: R_LARCH_SOP_POP_32_S_0_5_10_16_S2
+      - Type: R_LARCH_SOP_POP_32_S_0_10_10_16_S2
+      - Type: R_LARCH_SOP_POP_32_U
+      - Type: R_LARCH_ADD8
+      - Type: R_LARCH_ADD16
+      - Type: R_LARCH_ADD24
+      - Type: R_LARCH_ADD32
+      - Type: R_LARCH_ADD64
+      - Type: R_LARCH_SUB8
+      - Type: R_LARCH_SUB16
+      - Type: R_LARCH_SUB24
+      - Type: R_LARCH_SUB32
+      - Type: R_LARCH_SUB64
+      - Type: R_LARCH_GNU_VTINHERIT
+      - Type: R_LARCH_GNU_VTENTRY

diff  --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp
index 04a67225401f1..c4a20ca932d6a 100644
--- a/llvm/tools/llvm-readobj/ELFDumper.cpp
+++ b/llvm/tools/llvm-readobj/ELFDumper.cpp
@@ -1204,6 +1204,7 @@ const EnumEntry<unsigned> ElfMachineType[] = {
   ENUM_ENT(EM_LANAI,         "EM_LANAI"),
   ENUM_ENT(EM_BPF,           "EM_BPF"),
   ENUM_ENT(EM_VE,            "NEC SX-Aurora Vector Engine"),
+  ENUM_ENT(EM_LOONGARCH,     "LoongArch"),
 };
 
 const EnumEntry<unsigned> ElfSymbolBindings[] = {

diff  --git a/llvm/unittests/Object/ELFObjectFileTest.cpp b/llvm/unittests/Object/ELFObjectFileTest.cpp
index 246406ef6e43d..5168cf2c250f4 100644
--- a/llvm/unittests/Object/ELFObjectFileTest.cpp
+++ b/llvm/unittests/Object/ELFObjectFileTest.cpp
@@ -289,6 +289,19 @@ TEST(ELFObjectFileTest, MachineTestForMSP430) {
     checkFormatAndArch(D, Formats[I++], Triple::msp430);
 }
 
+TEST(ELFObjectFileTest, MachineTestForLoongArch) {
+  std::array<StringRef, 4> Formats = {"elf32-loongarch", "elf32-loongarch",
+                                      "elf64-loongarch", "elf64-loongarch"};
+  std::array<Triple::ArchType, 4> Archs = {
+      Triple::loongarch32, Triple::loongarch32, Triple::loongarch64,
+      Triple::loongarch64};
+  size_t I = 0;
+  for (const DataForTest &D : generateData(ELF::EM_LOONGARCH)) {
+    checkFormatAndArch(D, Formats[I], Archs[I]);
+    ++I;
+  }
+}
+
 TEST(ELFObjectFileTest, MachineTestForCSKY) {
   std::array<StringRef, 4> Formats = {"elf32-csky", "elf32-csky",
                                       "elf64-unknown", "elf64-unknown"};

diff  --git a/llvm/unittests/Object/ELFTest.cpp b/llvm/unittests/Object/ELFTest.cpp
index 17868331890a4..83e7363f3425d 100644
--- a/llvm/unittests/Object/ELFTest.cpp
+++ b/llvm/unittests/Object/ELFTest.cpp
@@ -52,6 +52,115 @@ TEST(ELFTest, getELFRelocationTypeNameForVE) {
   EXPECT_EQ("R_VE_CALL_LO32", getELFRelocationTypeName(EM_VE, R_VE_CALL_LO32));
 }
 
+TEST(ELFTest, getELFRelocationTypeNameForLoongArch) {
+  EXPECT_EQ("R_LARCH_NONE",
+            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_NONE));
+  EXPECT_EQ("R_LARCH_32", getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_32));
+  EXPECT_EQ("R_LARCH_64", getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_64));
+  EXPECT_EQ("R_LARCH_RELATIVE",
+            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_RELATIVE));
+  EXPECT_EQ("R_LARCH_COPY",
+            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_COPY));
+  EXPECT_EQ("R_LARCH_JUMP_SLOT",
+            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_JUMP_SLOT));
+  EXPECT_EQ("R_LARCH_TLS_DTPMOD32",
+            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_DTPMOD32));
+  EXPECT_EQ("R_LARCH_TLS_DTPMOD64",
+            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_DTPMOD64));
+  EXPECT_EQ("R_LARCH_TLS_DTPREL32",
+            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_DTPREL32));
+  EXPECT_EQ("R_LARCH_TLS_DTPREL64",
+            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_DTPREL64));
+  EXPECT_EQ("R_LARCH_TLS_TPREL32",
+            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_TPREL32));
+  EXPECT_EQ("R_LARCH_TLS_TPREL64",
+            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_TPREL64));
+  EXPECT_EQ("R_LARCH_IRELATIVE",
+            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_IRELATIVE));
+
+  EXPECT_EQ("R_LARCH_MARK_LA",
+            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_MARK_LA));
+  EXPECT_EQ("R_LARCH_MARK_PCREL",
+            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_MARK_PCREL));
+  EXPECT_EQ("R_LARCH_SOP_PUSH_PCREL",
+            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_PUSH_PCREL));
+  EXPECT_EQ("R_LARCH_SOP_PUSH_ABSOLUTE",
+            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_PUSH_ABSOLUTE));
+  EXPECT_EQ("R_LARCH_SOP_PUSH_DUP",
+            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_PUSH_DUP));
+  EXPECT_EQ("R_LARCH_SOP_PUSH_GPREL",
+            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_PUSH_GPREL));
+  EXPECT_EQ("R_LARCH_SOP_PUSH_TLS_TPREL",
+            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_PUSH_TLS_TPREL));
+  EXPECT_EQ("R_LARCH_SOP_PUSH_TLS_GOT",
+            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_PUSH_TLS_GOT));
+  EXPECT_EQ("R_LARCH_SOP_PUSH_TLS_GD",
+            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_PUSH_TLS_GD));
+  EXPECT_EQ("R_LARCH_SOP_PUSH_PLT_PCREL",
+            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_PUSH_PLT_PCREL));
+  EXPECT_EQ("R_LARCH_SOP_ASSERT",
+            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_ASSERT));
+  EXPECT_EQ("R_LARCH_SOP_NOT",
+            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_NOT));
+  EXPECT_EQ("R_LARCH_SOP_SUB",
+            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_SUB));
+  EXPECT_EQ("R_LARCH_SOP_SL",
+            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_SL));
+  EXPECT_EQ("R_LARCH_SOP_SR",
+            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_SR));
+  EXPECT_EQ("R_LARCH_SOP_ADD",
+            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_ADD));
+  EXPECT_EQ("R_LARCH_SOP_AND",
+            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_AND));
+  EXPECT_EQ("R_LARCH_SOP_IF_ELSE",
+            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_IF_ELSE));
+  EXPECT_EQ("R_LARCH_SOP_POP_32_S_10_5",
+            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_POP_32_S_10_5));
+  EXPECT_EQ("R_LARCH_SOP_POP_32_U_10_12",
+            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_POP_32_U_10_12));
+  EXPECT_EQ("R_LARCH_SOP_POP_32_S_10_12",
+            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_POP_32_S_10_12));
+  EXPECT_EQ("R_LARCH_SOP_POP_32_S_10_16",
+            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_POP_32_S_10_16));
+  EXPECT_EQ(
+      "R_LARCH_SOP_POP_32_S_10_16_S2",
+      getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_POP_32_S_10_16_S2));
+  EXPECT_EQ("R_LARCH_SOP_POP_32_S_5_20",
+            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_POP_32_S_5_20));
+  EXPECT_EQ("R_LARCH_SOP_POP_32_S_0_5_10_16_S2",
+            getELFRelocationTypeName(EM_LOONGARCH,
+                                     R_LARCH_SOP_POP_32_S_0_5_10_16_S2));
+  EXPECT_EQ("R_LARCH_SOP_POP_32_S_0_10_10_16_S2",
+            getELFRelocationTypeName(EM_LOONGARCH,
+                                     R_LARCH_SOP_POP_32_S_0_10_10_16_S2));
+  EXPECT_EQ("R_LARCH_SOP_POP_32_U",
+            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_POP_32_U));
+  EXPECT_EQ("R_LARCH_ADD8",
+            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_ADD8));
+  EXPECT_EQ("R_LARCH_ADD16",
+            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_ADD16));
+  EXPECT_EQ("R_LARCH_ADD24",
+            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_ADD24));
+  EXPECT_EQ("R_LARCH_ADD32",
+            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_ADD32));
+  EXPECT_EQ("R_LARCH_ADD64",
+            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_ADD64));
+  EXPECT_EQ("R_LARCH_SUB8",
+            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SUB8));
+  EXPECT_EQ("R_LARCH_SUB16",
+            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SUB16));
+  EXPECT_EQ("R_LARCH_SUB24",
+            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SUB24));
+  EXPECT_EQ("R_LARCH_SUB32",
+            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SUB32));
+  EXPECT_EQ("R_LARCH_SUB64",
+            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SUB64));
+  EXPECT_EQ("R_LARCH_GNU_VTINHERIT",
+            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_GNU_VTINHERIT));
+  EXPECT_EQ("R_LARCH_GNU_VTENTRY",
+            getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_GNU_VTENTRY));
+}
+
 TEST(ELFTest, getELFRelativeRelocationType) {
   EXPECT_EQ(ELF::R_VE_RELATIVE, getELFRelativeRelocationType(EM_VE));
 }


        


More information about the llvm-commits mailing list