[llvm] ffc5f79 - LoongArch: Replace most Specifier members with raw relocation types

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Mon May 5 22:03:27 PDT 2025


Author: Fangrui Song
Date: 2025-05-05T22:03:22-07:00
New Revision: ffc5f79e2aeda12d8c185d9e838f2c8bfd45a01d

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

LOG: LoongArch: Replace most Specifier members with raw relocation types

Follow Sparc.

Added: 
    

Modified: 
    llvm/lib/Target/LoongArch/AsmParser/LoongArchAsmParser.cpp
    llvm/lib/Target/LoongArch/LoongArchMCInstLower.cpp
    llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchELFObjectWriter.cpp
    llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCCodeEmitter.cpp
    llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCExpr.cpp
    llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCExpr.h

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/LoongArch/AsmParser/LoongArchAsmParser.cpp b/llvm/lib/Target/LoongArch/AsmParser/LoongArchAsmParser.cpp
index fe83e8f600d8c..faac1a221cb59 100644
--- a/llvm/lib/Target/LoongArch/AsmParser/LoongArchAsmParser.cpp
+++ b/llvm/lib/Target/LoongArch/AsmParser/LoongArchAsmParser.cpp
@@ -13,6 +13,7 @@
 #include "MCTargetDesc/LoongArchMatInt.h"
 #include "MCTargetDesc/LoongArchTargetStreamer.h"
 #include "TargetInfo/LoongArchTargetInfo.h"
+#include "llvm/BinaryFormat/ELF.h"
 #include "llvm/MC/MCContext.h"
 #include "llvm/MC/MCInstBuilder.h"
 #include "llvm/MC/MCInstrInfo.h"
@@ -45,9 +46,8 @@ class LoongArchAsmParser : public MCTargetAsmParser {
 
   struct Inst {
     unsigned Opc;
-    LoongArchMCExpr::Specifier VK;
-    Inst(unsigned Opc, LoongArchMCExpr::Specifier VK = LoongArchMCExpr::VK_None)
-        : Opc(Opc), VK(VK) {}
+    uint16_t Specifier;
+    Inst(unsigned Opc, uint16_t VK = 0) : Opc(Opc), Specifier(VK) {}
   };
   using InstSeq = SmallVector<Inst>;
 
@@ -294,7 +294,7 @@ class LoongArchOperand : public MCParsedAsmOperand {
     if (!isImm() || evaluateConstantImm(getImm(), Imm, VK))
       return false;
     return LoongArchAsmParser::classifySymbolRef(getImm(), VK) &&
-           VK == LoongArchMCExpr::VK_TLS_LE_ADD_R;
+           VK == ELF::R_LARCH_TLS_LE_ADD_R;
   }
 
   bool isUImm1() const { return isUImm<1>(); }
@@ -324,13 +324,11 @@ class LoongArchOperand : public MCParsedAsmOperand {
     int64_t Imm;
     LoongArchMCExpr::Specifier VK = LoongArchMCExpr::VK_None;
     bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK);
-    bool IsValidKind = VK == LoongArchMCExpr::VK_None ||
-                       VK == LoongArchMCExpr::VK_PCALA_LO12 ||
-                       VK == LoongArchMCExpr::VK_GOT_PC_LO12 ||
-                       VK == LoongArchMCExpr::VK_TLS_IE_PC_LO12 ||
-                       VK == LoongArchMCExpr::VK_TLS_LE_LO12_R ||
-                       VK == LoongArchMCExpr::VK_TLS_DESC_PC_LO12 ||
-                       VK == LoongArchMCExpr::VK_TLS_DESC_LD;
+    bool IsValidKind =
+        VK == LoongArchMCExpr::VK_None || VK == ELF::R_LARCH_PCALA_LO12 ||
+        VK == ELF::R_LARCH_GOT_PC_LO12 || VK == ELF::R_LARCH_TLS_IE_PC_LO12 ||
+        VK == ELF::R_LARCH_TLS_LE_LO12_R ||
+        VK == ELF::R_LARCH_TLS_DESC_PC_LO12 || VK == ELF::R_LARCH_TLS_DESC_LD;
     return IsConstantImm
                ? isInt<12>(Imm) && IsValidKind
                : LoongArchAsmParser::classifySymbolRef(getImm(), VK) &&
@@ -344,16 +342,14 @@ class LoongArchOperand : public MCParsedAsmOperand {
     int64_t Imm;
     LoongArchMCExpr::Specifier VK = LoongArchMCExpr::VK_None;
     bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK);
-    bool IsValidKind = VK == LoongArchMCExpr::VK_None ||
-                       VK == LoongArchMCExpr::VK_ABS64_HI12 ||
-                       VK == LoongArchMCExpr::VK_PCALA64_HI12 ||
-                       VK == LoongArchMCExpr::VK_GOT64_HI12 ||
-                       VK == LoongArchMCExpr::VK_GOT64_PC_HI12 ||
-                       VK == LoongArchMCExpr::VK_TLS_LE64_HI12 ||
-                       VK == LoongArchMCExpr::VK_TLS_IE64_HI12 ||
-                       VK == LoongArchMCExpr::VK_TLS_IE64_PC_HI12 ||
-                       VK == LoongArchMCExpr::VK_TLS_DESC64_HI12 ||
-                       VK == LoongArchMCExpr::VK_TLS_DESC64_PC_HI12;
+    bool IsValidKind =
+        VK == LoongArchMCExpr::VK_None || VK == ELF::R_LARCH_ABS64_HI12 ||
+        VK == ELF::R_LARCH_PCALA64_HI12 || VK == ELF::R_LARCH_GOT64_HI12 ||
+        VK == ELF::R_LARCH_GOT64_PC_HI12 || VK == ELF::R_LARCH_TLS_LE64_HI12 ||
+        VK == ELF::R_LARCH_TLS_IE64_HI12 ||
+        VK == ELF::R_LARCH_TLS_IE64_PC_HI12 ||
+        VK == ELF::R_LARCH_TLS_DESC64_HI12 ||
+        VK == ELF::R_LARCH_TLS_DESC64_PC_HI12;
     return IsConstantImm
                ? isInt<12>(Imm) && IsValidKind
                : LoongArchAsmParser::classifySymbolRef(getImm(), VK) &&
@@ -369,15 +365,12 @@ class LoongArchOperand : public MCParsedAsmOperand {
     int64_t Imm;
     LoongArchMCExpr::Specifier VK = LoongArchMCExpr::VK_None;
     bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK);
-    bool IsValidKind = VK == LoongArchMCExpr::VK_None ||
-                       VK == LoongArchMCExpr::VK_ABS_LO12 ||
-                       VK == LoongArchMCExpr::VK_PCALA_LO12 ||
-                       VK == LoongArchMCExpr::VK_GOT_LO12 ||
-                       VK == LoongArchMCExpr::VK_GOT_PC_LO12 ||
-                       VK == LoongArchMCExpr::VK_TLS_LE_LO12 ||
-                       VK == LoongArchMCExpr::VK_TLS_IE_LO12 ||
-                       VK == LoongArchMCExpr::VK_TLS_IE_PC_LO12 ||
-                       VK == LoongArchMCExpr::VK_TLS_DESC_LO12;
+    bool IsValidKind =
+        VK == LoongArchMCExpr::VK_None || VK == ELF::R_LARCH_ABS_LO12 ||
+        VK == ELF::R_LARCH_PCALA_LO12 || VK == ELF::R_LARCH_GOT_LO12 ||
+        VK == ELF::R_LARCH_GOT_PC_LO12 || VK == ELF::R_LARCH_TLS_LE_LO12 ||
+        VK == ELF::R_LARCH_TLS_IE_LO12 || VK == ELF::R_LARCH_TLS_IE_PC_LO12 ||
+        VK == ELF::R_LARCH_TLS_DESC_LO12;
     return IsConstantImm
                ? isUInt<12>(Imm) && IsValidKind
                : LoongArchAsmParser::classifySymbolRef(getImm(), VK) &&
@@ -398,10 +391,9 @@ class LoongArchOperand : public MCParsedAsmOperand {
     int64_t Imm;
     LoongArchMCExpr::Specifier VK = LoongArchMCExpr::VK_None;
     bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK);
-    bool IsValidKind = VK == LoongArchMCExpr::VK_None ||
-                       VK == LoongArchMCExpr::VK_B16 ||
-                       VK == LoongArchMCExpr::VK_PCALA_LO12 ||
-                       VK == LoongArchMCExpr::VK_TLS_DESC_CALL;
+    bool IsValidKind =
+        VK == LoongArchMCExpr::VK_None || VK == ELF::R_LARCH_B16 ||
+        VK == ELF::R_LARCH_PCALA_LO12 || VK == ELF::R_LARCH_TLS_DESC_CALL;
     return IsConstantImm
                ? isShiftedInt<16, 2>(Imm) && IsValidKind
                : LoongArchAsmParser::classifySymbolRef(getImm(), VK) &&
@@ -417,13 +409,12 @@ class LoongArchOperand : public MCParsedAsmOperand {
     int64_t Imm;
     LoongArchMCExpr::Specifier VK = LoongArchMCExpr::VK_None;
     bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK);
-    bool IsValidKind = VK == LoongArchMCExpr::VK_None ||
-                       VK == LoongArchMCExpr::VK_PCALA_HI20 ||
-                       VK == LoongArchMCExpr::VK_GOT_PC_HI20 ||
-                       VK == LoongArchMCExpr::VK_TLS_IE_PC_HI20 ||
-                       VK == LoongArchMCExpr::VK_TLS_LD_PC_HI20 ||
-                       VK == LoongArchMCExpr::VK_TLS_GD_PC_HI20 ||
-                       VK == LoongArchMCExpr::VK_TLS_DESC_PC_HI20;
+    bool IsValidKind =
+        VK == LoongArchMCExpr::VK_None || VK == ELF::R_LARCH_PCALA_HI20 ||
+        VK == ELF::R_LARCH_GOT_PC_HI20 || VK == ELF::R_LARCH_TLS_IE_PC_HI20 ||
+        VK == ELF::R_LARCH_TLS_LD_PC_HI20 ||
+        VK == ELF::R_LARCH_TLS_GD_PC_HI20 ||
+        VK == ELF::R_LARCH_TLS_DESC_PC_HI20;
     return IsConstantImm
                ? isInt<20>(Imm) && IsValidKind
                : LoongArchAsmParser::classifySymbolRef(getImm(), VK) &&
@@ -437,15 +428,12 @@ class LoongArchOperand : public MCParsedAsmOperand {
     int64_t Imm;
     LoongArchMCExpr::Specifier VK = LoongArchMCExpr::VK_None;
     bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK);
-    bool IsValidKind = VK == LoongArchMCExpr::VK_None ||
-                       VK == LoongArchMCExpr::VK_ABS_HI20 ||
-                       VK == LoongArchMCExpr::VK_GOT_HI20 ||
-                       VK == LoongArchMCExpr::VK_TLS_GD_HI20 ||
-                       VK == LoongArchMCExpr::VK_TLS_LD_HI20 ||
-                       VK == LoongArchMCExpr::VK_TLS_IE_HI20 ||
-                       VK == LoongArchMCExpr::VK_TLS_LE_HI20 ||
-                       VK == LoongArchMCExpr::VK_TLS_LE_HI20_R ||
-                       VK == LoongArchMCExpr::VK_TLS_DESC_HI20;
+    bool IsValidKind =
+        VK == LoongArchMCExpr::VK_None || VK == ELF::R_LARCH_ABS_HI20 ||
+        VK == ELF::R_LARCH_GOT_HI20 || VK == ELF::R_LARCH_TLS_GD_HI20 ||
+        VK == ELF::R_LARCH_TLS_LD_HI20 || VK == ELF::R_LARCH_TLS_IE_HI20 ||
+        VK == ELF::R_LARCH_TLS_LE_HI20 || VK == ELF::R_LARCH_TLS_LE_HI20_R ||
+        VK == ELF::R_LARCH_TLS_DESC_HI20;
     return IsConstantImm
                ? isInt<20>(Imm) && IsValidKind
                : LoongArchAsmParser::classifySymbolRef(getImm(), VK) &&
@@ -459,16 +447,14 @@ class LoongArchOperand : public MCParsedAsmOperand {
     int64_t Imm;
     LoongArchMCExpr::Specifier VK = LoongArchMCExpr::VK_None;
     bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK);
-    bool IsValidKind = VK == LoongArchMCExpr::VK_None ||
-                       VK == LoongArchMCExpr::VK_ABS64_LO20 ||
-                       VK == LoongArchMCExpr::VK_PCALA64_LO20 ||
-                       VK == LoongArchMCExpr::VK_GOT64_LO20 ||
-                       VK == LoongArchMCExpr::VK_GOT64_PC_LO20 ||
-                       VK == LoongArchMCExpr::VK_TLS_IE64_LO20 ||
-                       VK == LoongArchMCExpr::VK_TLS_IE64_PC_LO20 ||
-                       VK == LoongArchMCExpr::VK_TLS_LE64_LO20 ||
-                       VK == LoongArchMCExpr::VK_TLS_DESC64_PC_LO20 ||
-                       VK == LoongArchMCExpr::VK_TLS_DESC64_LO20;
+    bool IsValidKind =
+        VK == LoongArchMCExpr::VK_None || VK == ELF::R_LARCH_ABS64_LO20 ||
+        VK == ELF::R_LARCH_PCALA64_LO20 || VK == ELF::R_LARCH_GOT64_LO20 ||
+        VK == ELF::R_LARCH_GOT64_PC_LO20 || VK == ELF::R_LARCH_TLS_IE64_LO20 ||
+        VK == ELF::R_LARCH_TLS_IE64_PC_LO20 ||
+        VK == ELF::R_LARCH_TLS_LE64_LO20 ||
+        VK == ELF::R_LARCH_TLS_DESC64_PC_LO20 ||
+        VK == ELF::R_LARCH_TLS_DESC64_LO20;
 
     return IsConstantImm
                ? isInt<20>(Imm) && IsValidKind
@@ -484,7 +470,7 @@ class LoongArchOperand : public MCParsedAsmOperand {
     LoongArchMCExpr::Specifier VK = LoongArchMCExpr::VK_None;
     bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK);
     bool IsValidKind =
-        VK == LoongArchMCExpr::VK_None || VK == LoongArchMCExpr::VK_CALL36;
+        VK == LoongArchMCExpr::VK_None || VK == ELF::R_LARCH_CALL36;
 
     return IsConstantImm
                ? isInt<20>(Imm) && IsValidKind
@@ -500,10 +486,10 @@ class LoongArchOperand : public MCParsedAsmOperand {
     LoongArchMCExpr::Specifier VK = LoongArchMCExpr::VK_None;
     bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK);
     bool IsValidKind = VK == LoongArchMCExpr::VK_None ||
-                       VK == LoongArchMCExpr::VK_PCREL20_S2 ||
-                       VK == LoongArchMCExpr::VK_TLS_LD_PCREL20_S2 ||
-                       VK == LoongArchMCExpr::VK_TLS_GD_PCREL20_S2 ||
-                       VK == LoongArchMCExpr::VK_TLS_DESC_PCREL20_S2;
+                       VK == ELF::R_LARCH_PCREL20_S2 ||
+                       VK == ELF::R_LARCH_TLS_LD_PCREL20_S2 ||
+                       VK == ELF::R_LARCH_TLS_GD_PCREL20_S2 ||
+                       VK == ELF::R_LARCH_TLS_DESC_PCREL20_S2;
     return IsConstantImm
                ? isInt<20>(Imm) && IsValidKind
                : LoongArchAsmParser::classifySymbolRef(getImm(), VK) &&
@@ -517,8 +503,7 @@ class LoongArchOperand : public MCParsedAsmOperand {
     int64_t Imm;
     LoongArchMCExpr::Specifier VK = LoongArchMCExpr::VK_None;
     bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK);
-    bool IsValidKind =
-        VK == LoongArchMCExpr::VK_None || VK == LoongArchMCExpr::VK_B21;
+    bool IsValidKind = VK == LoongArchMCExpr::VK_None || VK == ELF::R_LARCH_B21;
     return IsConstantImm
                ? isShiftedInt<21, 2>(Imm) && IsValidKind
                : LoongArchAsmParser::classifySymbolRef(getImm(), VK) &&
@@ -534,7 +519,7 @@ class LoongArchOperand : public MCParsedAsmOperand {
     bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK);
     bool IsValidKind =
         VK == LoongArchMCExpr::VK_None || VK == LoongArchMCExpr::VK_CALL ||
-        VK == LoongArchMCExpr::VK_CALL_PLT || VK == LoongArchMCExpr::VK_B26;
+        VK == LoongArchMCExpr::VK_CALL_PLT || VK == ELF::R_LARCH_B26;
     return IsConstantImm
                ? isShiftedInt<26, 2>(Imm) && IsValidKind
                : LoongArchAsmParser::classifySymbolRef(getImm(), VK) &&
@@ -888,7 +873,7 @@ void LoongArchAsmParser::emitLAInstSeq(MCRegister DestReg, MCRegister TmpReg,
   MCContext &Ctx = getContext();
   for (LoongArchAsmParser::Inst &Inst : Insts) {
     unsigned Opc = Inst.Opc;
-    LoongArchMCExpr::Specifier VK = Inst.VK;
+    auto VK = LoongArchMCExpr::Specifier(Inst.Specifier);
     const LoongArchMCExpr *LE =
         LoongArchMCExpr::create(Symbol, VK, Ctx, RelaxHint);
     switch (Opc) {
@@ -908,7 +893,7 @@ void LoongArchAsmParser::emitLAInstSeq(MCRegister DestReg, MCRegister TmpReg,
             MCInstBuilder(Opc).addReg(DestReg).addReg(DestReg).addImm(0),
             getSTI());
         continue;
-      } else if (VK == LoongArchMCExpr::VK_TLS_DESC_LD) {
+      } else if (VK == ELF::R_LARCH_TLS_DESC_LD) {
         Out.emitInstruction(MCInstBuilder(Opc)
                                 .addReg(LoongArch::R1)
                                 .addReg(DestReg)
@@ -974,16 +959,16 @@ void LoongArchAsmParser::emitLoadAddressAbs(MCInst &Inst, SMLoc IDLoc,
                              : Inst.getOperand(2).getExpr();
   InstSeq Insts;
 
-  Insts.push_back(LoongArchAsmParser::Inst(LoongArch::LU12I_W,
-                                           LoongArchMCExpr::VK_ABS_HI20));
   Insts.push_back(
-      LoongArchAsmParser::Inst(LoongArch::ORI, LoongArchMCExpr::VK_ABS_LO12));
+      LoongArchAsmParser::Inst(LoongArch::LU12I_W, ELF::R_LARCH_ABS_HI20));
+  Insts.push_back(
+      LoongArchAsmParser::Inst(LoongArch::ORI, ELF::R_LARCH_ABS_LO12));
 
   if (is64Bit()) {
-    Insts.push_back(LoongArchAsmParser::Inst(LoongArch::LU32I_D,
-                                             LoongArchMCExpr::VK_ABS64_LO20));
-    Insts.push_back(LoongArchAsmParser::Inst(LoongArch::LU52I_D,
-                                             LoongArchMCExpr::VK_ABS64_HI12));
+    Insts.push_back(
+        LoongArchAsmParser::Inst(LoongArch::LU32I_D, ELF::R_LARCH_ABS64_LO20));
+    Insts.push_back(
+        LoongArchAsmParser::Inst(LoongArch::LU52I_D, ELF::R_LARCH_ABS64_HI12));
   }
 
   emitLAInstSeq(DestReg, DestReg, Symbol, Insts, IDLoc, Out);
@@ -1000,10 +985,9 @@ void LoongArchAsmParser::emitLoadAddressPcrel(MCInst &Inst, SMLoc IDLoc,
   InstSeq Insts;
   unsigned ADDI = is64Bit() ? LoongArch::ADDI_D : LoongArch::ADDI_W;
 
-  Insts.push_back(LoongArchAsmParser::Inst(LoongArch::PCALAU12I,
-                                           LoongArchMCExpr::VK_PCALA_HI20));
   Insts.push_back(
-      LoongArchAsmParser::Inst(ADDI, LoongArchMCExpr::VK_PCALA_LO12));
+      LoongArchAsmParser::Inst(LoongArch::PCALAU12I, ELF::R_LARCH_PCALA_HI20));
+  Insts.push_back(LoongArchAsmParser::Inst(ADDI, ELF::R_LARCH_PCALA_LO12));
 
   emitLAInstSeq(DestReg, DestReg, Symbol, Insts, IDLoc, Out,
                 /*RelaxHint=*/true);
@@ -1023,14 +1007,14 @@ void LoongArchAsmParser::emitLoadAddressPcrelLarge(MCInst &Inst, SMLoc IDLoc,
   const MCExpr *Symbol = Inst.getOperand(2).getExpr();
   InstSeq Insts;
 
-  Insts.push_back(LoongArchAsmParser::Inst(LoongArch::PCALAU12I,
-                                           LoongArchMCExpr::VK_PCALA_HI20));
-  Insts.push_back(LoongArchAsmParser::Inst(LoongArch::ADDI_D,
-                                           LoongArchMCExpr::VK_PCALA_LO12));
-  Insts.push_back(LoongArchAsmParser::Inst(LoongArch::LU32I_D,
-                                           LoongArchMCExpr::VK_PCALA64_LO20));
-  Insts.push_back(LoongArchAsmParser::Inst(LoongArch::LU52I_D,
-                                           LoongArchMCExpr::VK_PCALA64_HI12));
+  Insts.push_back(
+      LoongArchAsmParser::Inst(LoongArch::PCALAU12I, ELF::R_LARCH_PCALA_HI20));
+  Insts.push_back(
+      LoongArchAsmParser::Inst(LoongArch::ADDI_D, ELF::R_LARCH_PCALA_LO12));
+  Insts.push_back(
+      LoongArchAsmParser::Inst(LoongArch::LU32I_D, ELF::R_LARCH_PCALA64_LO20));
+  Insts.push_back(
+      LoongArchAsmParser::Inst(LoongArch::LU52I_D, ELF::R_LARCH_PCALA64_HI12));
   Insts.push_back(LoongArchAsmParser::Inst(LoongArch::ADD_D));
 
   emitLAInstSeq(DestReg, TmpReg, Symbol, Insts, IDLoc, Out);
@@ -1057,16 +1041,16 @@ void LoongArchAsmParser::emitLoadAddressGot(MCInst &Inst, SMLoc IDLoc,
     //   lu32i.d $rd, %got64_lo20(sym)
     //   lu52i.d $rd, $rd, %got64_hi12(sym)
     //   ld.d    $rd, $rd, 0
-    Insts.push_back(LoongArchAsmParser::Inst(LoongArch::LU12I_W,
-                                             LoongArchMCExpr::VK_GOT_HI20));
     Insts.push_back(
-        LoongArchAsmParser::Inst(LoongArch::ORI, LoongArchMCExpr::VK_GOT_LO12));
+        LoongArchAsmParser::Inst(LoongArch::LU12I_W, ELF::R_LARCH_GOT_HI20));
+    Insts.push_back(
+        LoongArchAsmParser::Inst(LoongArch::ORI, ELF::R_LARCH_GOT_LO12));
 
     if (is64Bit()) {
       Insts.push_back(LoongArchAsmParser::Inst(LoongArch::LU32I_D,
-                                               LoongArchMCExpr::VK_GOT64_LO20));
+                                               ELF::R_LARCH_GOT64_LO20));
       Insts.push_back(LoongArchAsmParser::Inst(LoongArch::LU52I_D,
-                                               LoongArchMCExpr::VK_GOT64_HI12));
+                                               ELF::R_LARCH_GOT64_HI12));
     }
     Insts.push_back(LoongArchAsmParser::Inst(LD));
     emitLAInstSeq(DestReg, DestReg, Symbol, Insts, IDLoc, Out);
@@ -1075,10 +1059,9 @@ void LoongArchAsmParser::emitLoadAddressGot(MCInst &Inst, SMLoc IDLoc,
   // expands to:
   //   pcalau12i $rd, %got_pc_hi20(sym)
   //   ld.w/d    $rd, $rd, %got_pc_lo12(sym)
-  Insts.push_back(LoongArchAsmParser::Inst(LoongArch::PCALAU12I,
-                                           LoongArchMCExpr::VK_GOT_PC_HI20));
   Insts.push_back(
-      LoongArchAsmParser::Inst(LD, LoongArchMCExpr::VK_GOT_PC_LO12));
+      LoongArchAsmParser::Inst(LoongArch::PCALAU12I, ELF::R_LARCH_GOT_PC_HI20));
+  Insts.push_back(LoongArchAsmParser::Inst(LD, ELF::R_LARCH_GOT_PC_LO12));
 
   emitLAInstSeq(DestReg, DestReg, Symbol, Insts, IDLoc, Out,
                 /*RelaxHint=*/true);
@@ -1098,14 +1081,14 @@ void LoongArchAsmParser::emitLoadAddressGotLarge(MCInst &Inst, SMLoc IDLoc,
   const MCExpr *Symbol = Inst.getOperand(2).getExpr();
   InstSeq Insts;
 
-  Insts.push_back(LoongArchAsmParser::Inst(LoongArch::PCALAU12I,
-                                           LoongArchMCExpr::VK_GOT_PC_HI20));
-  Insts.push_back(LoongArchAsmParser::Inst(LoongArch::ADDI_D,
-                                           LoongArchMCExpr::VK_GOT_PC_LO12));
-  Insts.push_back(LoongArchAsmParser::Inst(LoongArch::LU32I_D,
-                                           LoongArchMCExpr::VK_GOT64_PC_LO20));
-  Insts.push_back(LoongArchAsmParser::Inst(LoongArch::LU52I_D,
-                                           LoongArchMCExpr::VK_GOT64_PC_HI12));
+  Insts.push_back(
+      LoongArchAsmParser::Inst(LoongArch::PCALAU12I, ELF::R_LARCH_GOT_PC_HI20));
+  Insts.push_back(
+      LoongArchAsmParser::Inst(LoongArch::ADDI_D, ELF::R_LARCH_GOT_PC_LO12));
+  Insts.push_back(
+      LoongArchAsmParser::Inst(LoongArch::LU32I_D, ELF::R_LARCH_GOT64_PC_LO20));
+  Insts.push_back(
+      LoongArchAsmParser::Inst(LoongArch::LU52I_D, ELF::R_LARCH_GOT64_PC_HI12));
   Insts.push_back(LoongArchAsmParser::Inst(LoongArch::LDX_D));
 
   emitLAInstSeq(DestReg, TmpReg, Symbol, Insts, IDLoc, Out);
@@ -1121,10 +1104,10 @@ void LoongArchAsmParser::emitLoadAddressTLSLE(MCInst &Inst, SMLoc IDLoc,
   const MCExpr *Symbol = Inst.getOperand(1).getExpr();
   InstSeq Insts;
 
-  Insts.push_back(LoongArchAsmParser::Inst(LoongArch::LU12I_W,
-                                           LoongArchMCExpr::VK_TLS_LE_HI20));
-  Insts.push_back(LoongArchAsmParser::Inst(LoongArch::ORI,
-                                           LoongArchMCExpr::VK_TLS_LE_LO12));
+  Insts.push_back(
+      LoongArchAsmParser::Inst(LoongArch::LU12I_W, ELF::R_LARCH_TLS_LE_HI20));
+  Insts.push_back(
+      LoongArchAsmParser::Inst(LoongArch::ORI, ELF::R_LARCH_TLS_LE_LO12));
 
   emitLAInstSeq(DestReg, DestReg, Symbol, Insts, IDLoc, Out);
 }
@@ -1150,16 +1133,16 @@ void LoongArchAsmParser::emitLoadAddressTLSIE(MCInst &Inst, SMLoc IDLoc,
     //   lu32i.d $rd, %ie64_lo20(sym)
     //   lu52i.d $rd, $rd, %ie64_hi12(sym)
     //   ld.d    $rd, $rd, 0
-    Insts.push_back(LoongArchAsmParser::Inst(LoongArch::LU12I_W,
-                                             LoongArchMCExpr::VK_TLS_IE_HI20));
-    Insts.push_back(LoongArchAsmParser::Inst(LoongArch::ORI,
-                                             LoongArchMCExpr::VK_TLS_IE_LO12));
+    Insts.push_back(
+        LoongArchAsmParser::Inst(LoongArch::LU12I_W, ELF::R_LARCH_TLS_IE_HI20));
+    Insts.push_back(
+        LoongArchAsmParser::Inst(LoongArch::ORI, ELF::R_LARCH_TLS_IE_LO12));
 
     if (is64Bit()) {
-      Insts.push_back(LoongArchAsmParser::Inst(
-          LoongArch::LU32I_D, LoongArchMCExpr::VK_TLS_IE64_LO20));
-      Insts.push_back(LoongArchAsmParser::Inst(
-          LoongArch::LU52I_D, LoongArchMCExpr::VK_TLS_IE64_HI12));
+      Insts.push_back(LoongArchAsmParser::Inst(LoongArch::LU32I_D,
+                                               ELF::R_LARCH_TLS_IE64_LO20));
+      Insts.push_back(LoongArchAsmParser::Inst(LoongArch::LU52I_D,
+                                               ELF::R_LARCH_TLS_IE64_HI12));
     }
     Insts.push_back(LoongArchAsmParser::Inst(LD));
     emitLAInstSeq(DestReg, DestReg, Symbol, Insts, IDLoc, Out);
@@ -1170,9 +1153,8 @@ void LoongArchAsmParser::emitLoadAddressTLSIE(MCInst &Inst, SMLoc IDLoc,
   //   pcalau12i $rd, %ie_pc_hi20(sym)
   //   ld.w/d    $rd, $rd, %ie_pc_lo12(sym)
   Insts.push_back(LoongArchAsmParser::Inst(LoongArch::PCALAU12I,
-                                           LoongArchMCExpr::VK_TLS_IE_PC_HI20));
-  Insts.push_back(
-      LoongArchAsmParser::Inst(LD, LoongArchMCExpr::VK_TLS_IE_PC_LO12));
+                                           ELF::R_LARCH_TLS_IE_PC_HI20));
+  Insts.push_back(LoongArchAsmParser::Inst(LD, ELF::R_LARCH_TLS_IE_PC_LO12));
 
   emitLAInstSeq(DestReg, DestReg, Symbol, Insts, IDLoc, Out,
                 /*RelaxHint=*/true);
@@ -1193,13 +1175,13 @@ void LoongArchAsmParser::emitLoadAddressTLSIELarge(MCInst &Inst, SMLoc IDLoc,
   InstSeq Insts;
 
   Insts.push_back(LoongArchAsmParser::Inst(LoongArch::PCALAU12I,
-                                           LoongArchMCExpr::VK_TLS_IE_PC_HI20));
-  Insts.push_back(LoongArchAsmParser::Inst(LoongArch::ADDI_D,
-                                           LoongArchMCExpr::VK_TLS_IE_PC_LO12));
-  Insts.push_back(LoongArchAsmParser::Inst(
-      LoongArch::LU32I_D, LoongArchMCExpr::VK_TLS_IE64_PC_LO20));
-  Insts.push_back(LoongArchAsmParser::Inst(
-      LoongArch::LU52I_D, LoongArchMCExpr::VK_TLS_IE64_PC_HI12));
+                                           ELF::R_LARCH_TLS_IE_PC_HI20));
+  Insts.push_back(
+      LoongArchAsmParser::Inst(LoongArch::ADDI_D, ELF::R_LARCH_TLS_IE_PC_LO12));
+  Insts.push_back(LoongArchAsmParser::Inst(LoongArch::LU32I_D,
+                                           ELF::R_LARCH_TLS_IE64_PC_LO20));
+  Insts.push_back(LoongArchAsmParser::Inst(LoongArch::LU52I_D,
+                                           ELF::R_LARCH_TLS_IE64_PC_HI12));
   Insts.push_back(LoongArchAsmParser::Inst(LoongArch::LDX_D));
 
   emitLAInstSeq(DestReg, TmpReg, Symbol, Insts, IDLoc, Out);
@@ -1224,16 +1206,16 @@ void LoongArchAsmParser::emitLoadAddressTLSLD(MCInst &Inst, SMLoc IDLoc,
     //   ori     $rd, $rd, %got_lo12(sym)
     //   lu32i.d $rd, %got64_lo20(sym)
     //   lu52i.d $rd, $rd, %got64_hi12(sym)
-    Insts.push_back(LoongArchAsmParser::Inst(LoongArch::LU12I_W,
-                                             LoongArchMCExpr::VK_TLS_LD_HI20));
     Insts.push_back(
-        LoongArchAsmParser::Inst(LoongArch::ORI, LoongArchMCExpr::VK_GOT_LO12));
+        LoongArchAsmParser::Inst(LoongArch::LU12I_W, ELF::R_LARCH_TLS_LD_HI20));
+    Insts.push_back(
+        LoongArchAsmParser::Inst(LoongArch::ORI, ELF::R_LARCH_GOT_LO12));
 
     if (is64Bit()) {
       Insts.push_back(LoongArchAsmParser::Inst(LoongArch::LU32I_D,
-                                               LoongArchMCExpr::VK_GOT64_LO20));
+                                               ELF::R_LARCH_GOT64_LO20));
       Insts.push_back(LoongArchAsmParser::Inst(LoongArch::LU52I_D,
-                                               LoongArchMCExpr::VK_GOT64_HI12));
+                                               ELF::R_LARCH_GOT64_HI12));
     }
     emitLAInstSeq(DestReg, DestReg, Symbol, Insts, IDLoc, Out);
     return;
@@ -1243,9 +1225,8 @@ void LoongArchAsmParser::emitLoadAddressTLSLD(MCInst &Inst, SMLoc IDLoc,
   //   pcalau12i $rd, %ld_pc_hi20(sym)
   //   addi.w/d  $rd, $rd, %got_pc_lo12(sym)
   Insts.push_back(LoongArchAsmParser::Inst(LoongArch::PCALAU12I,
-                                           LoongArchMCExpr::VK_TLS_LD_PC_HI20));
-  Insts.push_back(
-      LoongArchAsmParser::Inst(ADDI, LoongArchMCExpr::VK_GOT_PC_LO12));
+                                           ELF::R_LARCH_TLS_LD_PC_HI20));
+  Insts.push_back(LoongArchAsmParser::Inst(ADDI, ELF::R_LARCH_GOT_PC_LO12));
 
   emitLAInstSeq(DestReg, DestReg, Symbol, Insts, IDLoc, Out,
                 /*RelaxHint=*/true);
@@ -1266,13 +1247,13 @@ void LoongArchAsmParser::emitLoadAddressTLSLDLarge(MCInst &Inst, SMLoc IDLoc,
   InstSeq Insts;
 
   Insts.push_back(LoongArchAsmParser::Inst(LoongArch::PCALAU12I,
-                                           LoongArchMCExpr::VK_TLS_LD_PC_HI20));
-  Insts.push_back(LoongArchAsmParser::Inst(LoongArch::ADDI_D,
-                                           LoongArchMCExpr::VK_GOT_PC_LO12));
-  Insts.push_back(LoongArchAsmParser::Inst(LoongArch::LU32I_D,
-                                           LoongArchMCExpr::VK_GOT64_PC_LO20));
-  Insts.push_back(LoongArchAsmParser::Inst(LoongArch::LU52I_D,
-                                           LoongArchMCExpr::VK_GOT64_PC_HI12));
+                                           ELF::R_LARCH_TLS_LD_PC_HI20));
+  Insts.push_back(
+      LoongArchAsmParser::Inst(LoongArch::ADDI_D, ELF::R_LARCH_GOT_PC_LO12));
+  Insts.push_back(
+      LoongArchAsmParser::Inst(LoongArch::LU32I_D, ELF::R_LARCH_GOT64_PC_LO20));
+  Insts.push_back(
+      LoongArchAsmParser::Inst(LoongArch::LU52I_D, ELF::R_LARCH_GOT64_PC_HI12));
   Insts.push_back(LoongArchAsmParser::Inst(LoongArch::ADD_D));
 
   emitLAInstSeq(DestReg, TmpReg, Symbol, Insts, IDLoc, Out);
@@ -1297,16 +1278,16 @@ void LoongArchAsmParser::emitLoadAddressTLSGD(MCInst &Inst, SMLoc IDLoc,
     //   ori     $rd, $rd, %got_lo12(sym)
     //   lu32i.d $rd, %got64_lo20(sym)
     //   lu52i.d $rd, $rd, %got64_hi12(sym)
-    Insts.push_back(LoongArchAsmParser::Inst(LoongArch::LU12I_W,
-                                             LoongArchMCExpr::VK_TLS_GD_HI20));
     Insts.push_back(
-        LoongArchAsmParser::Inst(LoongArch::ORI, LoongArchMCExpr::VK_GOT_LO12));
+        LoongArchAsmParser::Inst(LoongArch::LU12I_W, ELF::R_LARCH_TLS_GD_HI20));
+    Insts.push_back(
+        LoongArchAsmParser::Inst(LoongArch::ORI, ELF::R_LARCH_GOT_LO12));
 
     if (is64Bit()) {
       Insts.push_back(LoongArchAsmParser::Inst(LoongArch::LU32I_D,
-                                               LoongArchMCExpr::VK_GOT64_LO20));
+                                               ELF::R_LARCH_GOT64_LO20));
       Insts.push_back(LoongArchAsmParser::Inst(LoongArch::LU52I_D,
-                                               LoongArchMCExpr::VK_GOT64_HI12));
+                                               ELF::R_LARCH_GOT64_HI12));
     }
     emitLAInstSeq(DestReg, DestReg, Symbol, Insts, IDLoc, Out);
     return;
@@ -1316,9 +1297,8 @@ void LoongArchAsmParser::emitLoadAddressTLSGD(MCInst &Inst, SMLoc IDLoc,
   //   pcalau12i $rd, %gd_pc_hi20(sym)
   //   addi.w/d  $rd, $rd, %got_pc_lo12(sym)
   Insts.push_back(LoongArchAsmParser::Inst(LoongArch::PCALAU12I,
-                                           LoongArchMCExpr::VK_TLS_GD_PC_HI20));
-  Insts.push_back(
-      LoongArchAsmParser::Inst(ADDI, LoongArchMCExpr::VK_GOT_PC_LO12));
+                                           ELF::R_LARCH_TLS_GD_PC_HI20));
+  Insts.push_back(LoongArchAsmParser::Inst(ADDI, ELF::R_LARCH_GOT_PC_LO12));
 
   emitLAInstSeq(DestReg, DestReg, Symbol, Insts, IDLoc, Out,
                 /*RelaxHint=*/true);
@@ -1339,13 +1319,13 @@ void LoongArchAsmParser::emitLoadAddressTLSGDLarge(MCInst &Inst, SMLoc IDLoc,
   InstSeq Insts;
 
   Insts.push_back(LoongArchAsmParser::Inst(LoongArch::PCALAU12I,
-                                           LoongArchMCExpr::VK_TLS_GD_PC_HI20));
-  Insts.push_back(LoongArchAsmParser::Inst(LoongArch::ADDI_D,
-                                           LoongArchMCExpr::VK_GOT_PC_LO12));
-  Insts.push_back(LoongArchAsmParser::Inst(LoongArch::LU32I_D,
-                                           LoongArchMCExpr::VK_GOT64_PC_LO20));
-  Insts.push_back(LoongArchAsmParser::Inst(LoongArch::LU52I_D,
-                                           LoongArchMCExpr::VK_GOT64_PC_HI12));
+                                           ELF::R_LARCH_TLS_GD_PC_HI20));
+  Insts.push_back(
+      LoongArchAsmParser::Inst(LoongArch::ADDI_D, ELF::R_LARCH_GOT_PC_LO12));
+  Insts.push_back(
+      LoongArchAsmParser::Inst(LoongArch::LU32I_D, ELF::R_LARCH_GOT64_PC_LO20));
+  Insts.push_back(
+      LoongArchAsmParser::Inst(LoongArch::LU52I_D, ELF::R_LARCH_GOT64_PC_HI12));
   Insts.push_back(LoongArchAsmParser::Inst(LoongArch::ADD_D));
 
   emitLAInstSeq(DestReg, TmpReg, Symbol, Insts, IDLoc, Out);
@@ -1375,22 +1355,21 @@ void LoongArchAsmParser::emitLoadAddressTLSDesc(MCInst &Inst, SMLoc IDLoc,
     //   lu52i.d $rd, $rd, %desc64_hi12(sym)
     //   ld.d    $ra, $rd, %desc_ld(sym)
     //   jirl    $ra, $ra, %desc_call(sym)
-    Insts.push_back(LoongArchAsmParser::Inst(
-        LoongArch::LU12I_W, LoongArchMCExpr::VK_TLS_DESC_HI20));
-    Insts.push_back(LoongArchAsmParser::Inst(
-        LoongArch::ORI, LoongArchMCExpr::VK_TLS_DESC_LO12));
+    Insts.push_back(LoongArchAsmParser::Inst(LoongArch::LU12I_W,
+                                             ELF::R_LARCH_TLS_DESC_HI20));
+    Insts.push_back(
+        LoongArchAsmParser::Inst(LoongArch::ORI, ELF::R_LARCH_TLS_DESC_LO12));
 
     if (is64Bit()) {
-      Insts.push_back(LoongArchAsmParser::Inst(
-          LoongArch::LU32I_D, LoongArchMCExpr::VK_TLS_DESC64_LO20));
-      Insts.push_back(LoongArchAsmParser::Inst(
-          LoongArch::LU52I_D, LoongArchMCExpr::VK_TLS_DESC64_HI12));
+      Insts.push_back(LoongArchAsmParser::Inst(LoongArch::LU32I_D,
+                                               ELF::R_LARCH_TLS_DESC64_LO20));
+      Insts.push_back(LoongArchAsmParser::Inst(LoongArch::LU52I_D,
+                                               ELF::R_LARCH_TLS_DESC64_HI12));
     }
 
+    Insts.push_back(LoongArchAsmParser::Inst(LD, ELF::R_LARCH_TLS_DESC_LD));
     Insts.push_back(
-        LoongArchAsmParser::Inst(LD, LoongArchMCExpr::VK_TLS_DESC_LD));
-    Insts.push_back(LoongArchAsmParser::Inst(
-        LoongArch::JIRL, LoongArchMCExpr::VK_TLS_DESC_CALL));
+        LoongArchAsmParser::Inst(LoongArch::JIRL, ELF::R_LARCH_TLS_DESC_CALL));
 
     emitLAInstSeq(DestReg, DestReg, Symbol, Insts, IDLoc, Out);
     return;
@@ -1401,14 +1380,13 @@ void LoongArchAsmParser::emitLoadAddressTLSDesc(MCInst &Inst, SMLoc IDLoc,
   //   addi.w/d  $rd, $rd, %desc_pc_lo12(sym)
   //   ld.w/d    $ra, $rd, %desc_ld(sym)
   //   jirl      $ra, $ra, %desc_call(sym)
-  Insts.push_back(LoongArchAsmParser::Inst(
-      LoongArch::PCALAU12I, LoongArchMCExpr::VK_TLS_DESC_PC_HI20));
+  Insts.push_back(LoongArchAsmParser::Inst(LoongArch::PCALAU12I,
+                                           ELF::R_LARCH_TLS_DESC_PC_HI20));
   Insts.push_back(
-      LoongArchAsmParser::Inst(ADDI, LoongArchMCExpr::VK_TLS_DESC_PC_LO12));
+      LoongArchAsmParser::Inst(ADDI, ELF::R_LARCH_TLS_DESC_PC_LO12));
+  Insts.push_back(LoongArchAsmParser::Inst(LD, ELF::R_LARCH_TLS_DESC_LD));
   Insts.push_back(
-      LoongArchAsmParser::Inst(LD, LoongArchMCExpr::VK_TLS_DESC_LD));
-  Insts.push_back(LoongArchAsmParser::Inst(LoongArch::JIRL,
-                                           LoongArchMCExpr::VK_TLS_DESC_CALL));
+      LoongArchAsmParser::Inst(LoongArch::JIRL, ELF::R_LARCH_TLS_DESC_CALL));
 
   emitLAInstSeq(DestReg, DestReg, Symbol, Insts, IDLoc, Out,
                 /*RelaxHint=*/true);
@@ -1430,19 +1408,19 @@ void LoongArchAsmParser::emitLoadAddressTLSDescLarge(MCInst &Inst, SMLoc IDLoc,
   const MCExpr *Symbol = Inst.getOperand(2).getExpr();
   InstSeq Insts;
 
-  Insts.push_back(LoongArchAsmParser::Inst(
-      LoongArch::PCALAU12I, LoongArchMCExpr::VK_TLS_DESC_PC_HI20));
-  Insts.push_back(LoongArchAsmParser::Inst(
-      LoongArch::ADDI_D, LoongArchMCExpr::VK_TLS_DESC_PC_LO12));
-  Insts.push_back(LoongArchAsmParser::Inst(
-      LoongArch::LU32I_D, LoongArchMCExpr::VK_TLS_DESC64_PC_LO20));
-  Insts.push_back(LoongArchAsmParser::Inst(
-      LoongArch::LU52I_D, LoongArchMCExpr::VK_TLS_DESC64_PC_HI12));
+  Insts.push_back(LoongArchAsmParser::Inst(LoongArch::PCALAU12I,
+                                           ELF::R_LARCH_TLS_DESC_PC_HI20));
+  Insts.push_back(LoongArchAsmParser::Inst(LoongArch::ADDI_D,
+                                           ELF::R_LARCH_TLS_DESC_PC_LO12));
+  Insts.push_back(LoongArchAsmParser::Inst(LoongArch::LU32I_D,
+                                           ELF::R_LARCH_TLS_DESC64_PC_LO20));
+  Insts.push_back(LoongArchAsmParser::Inst(LoongArch::LU52I_D,
+                                           ELF::R_LARCH_TLS_DESC64_PC_HI12));
   Insts.push_back(LoongArchAsmParser::Inst(LoongArch::ADD_D));
-  Insts.push_back(LoongArchAsmParser::Inst(LoongArch::LD_D,
-                                           LoongArchMCExpr::VK_TLS_DESC_LD));
-  Insts.push_back(LoongArchAsmParser::Inst(LoongArch::JIRL,
-                                           LoongArchMCExpr::VK_TLS_DESC_CALL));
+  Insts.push_back(
+      LoongArchAsmParser::Inst(LoongArch::LD_D, ELF::R_LARCH_TLS_DESC_LD));
+  Insts.push_back(
+      LoongArchAsmParser::Inst(LoongArch::JIRL, ELF::R_LARCH_TLS_DESC_CALL));
 
   emitLAInstSeq(DestReg, TmpReg, Symbol, Insts, IDLoc, Out);
 }
@@ -1503,7 +1481,7 @@ void LoongArchAsmParser::emitFuncCall36(MCInst &Inst, SMLoc IDLoc,
   const MCExpr *Sym =
       IsTailCall ? Inst.getOperand(1).getExpr() : Inst.getOperand(0).getExpr();
   const LoongArchMCExpr *LE = LoongArchMCExpr::create(
-      Sym, LoongArchMCExpr::VK_CALL36, getContext(), /*RelaxHint=*/true);
+      Sym, ELF::R_LARCH_CALL36, getContext(), /*RelaxHint=*/true);
 
   Out.emitInstruction(
       MCInstBuilder(LoongArch::PCADDU18I).addReg(ScratchReg).addExpr(LE),

diff  --git a/llvm/lib/Target/LoongArch/LoongArchMCInstLower.cpp b/llvm/lib/Target/LoongArch/LoongArchMCInstLower.cpp
index 5632859f73786..ae76463e7ebc8 100644
--- a/llvm/lib/Target/LoongArch/LoongArchMCInstLower.cpp
+++ b/llvm/lib/Target/LoongArch/LoongArchMCInstLower.cpp
@@ -14,6 +14,7 @@
 #include "LoongArch.h"
 #include "MCTargetDesc/LoongArchBaseInfo.h"
 #include "MCTargetDesc/LoongArchMCExpr.h"
+#include "llvm/BinaryFormat/ELF.h"
 #include "llvm/CodeGen/AsmPrinter.h"
 #include "llvm/CodeGen/MachineBasicBlock.h"
 #include "llvm/CodeGen/MachineInstr.h"
@@ -25,7 +26,7 @@ using namespace llvm;
 static MCOperand lowerSymbolOperand(const MachineOperand &MO, MCSymbol *Sym,
                                     const AsmPrinter &AP) {
   MCContext &Ctx = AP.OutContext;
-  LoongArchMCExpr::Specifier Kind;
+  uint16_t Kind = 0;
 
   switch (LoongArchII::getDirectFlags(MO)) {
   default:
@@ -40,88 +41,88 @@ static MCOperand lowerSymbolOperand(const MachineOperand &MO, MCSymbol *Sym,
     Kind = LoongArchMCExpr::VK_CALL_PLT;
     break;
   case LoongArchII::MO_PCREL_HI:
-    Kind = LoongArchMCExpr::VK_PCALA_HI20;
+    Kind = ELF::R_LARCH_PCALA_HI20;
     break;
   case LoongArchII::MO_PCREL_LO:
-    Kind = LoongArchMCExpr::VK_PCALA_LO12;
+    Kind = ELF::R_LARCH_PCALA_LO12;
     break;
   case LoongArchII::MO_PCREL64_LO:
-    Kind = LoongArchMCExpr::VK_PCALA64_LO20;
+    Kind = ELF::R_LARCH_PCALA64_LO20;
     break;
   case LoongArchII::MO_PCREL64_HI:
-    Kind = LoongArchMCExpr::VK_PCALA64_HI12;
+    Kind = ELF::R_LARCH_PCALA64_HI12;
     break;
   case LoongArchII::MO_GOT_PC_HI:
-    Kind = LoongArchMCExpr::VK_GOT_PC_HI20;
+    Kind = ELF::R_LARCH_GOT_PC_HI20;
     break;
   case LoongArchII::MO_GOT_PC_LO:
-    Kind = LoongArchMCExpr::VK_GOT_PC_LO12;
+    Kind = ELF::R_LARCH_GOT_PC_LO12;
     break;
   case LoongArchII::MO_GOT_PC64_LO:
-    Kind = LoongArchMCExpr::VK_GOT64_PC_LO20;
+    Kind = ELF::R_LARCH_GOT64_PC_LO20;
     break;
   case LoongArchII::MO_GOT_PC64_HI:
-    Kind = LoongArchMCExpr::VK_GOT64_PC_HI12;
+    Kind = ELF::R_LARCH_GOT64_PC_HI12;
     break;
   case LoongArchII::MO_LE_HI:
-    Kind = LoongArchMCExpr::VK_TLS_LE_HI20;
+    Kind = ELF::R_LARCH_TLS_LE_HI20;
     break;
   case LoongArchII::MO_LE_LO:
-    Kind = LoongArchMCExpr::VK_TLS_LE_LO12;
+    Kind = ELF::R_LARCH_TLS_LE_LO12;
     break;
   case LoongArchII::MO_LE64_LO:
-    Kind = LoongArchMCExpr::VK_TLS_LE64_LO20;
+    Kind = ELF::R_LARCH_TLS_LE64_LO20;
     break;
   case LoongArchII::MO_LE64_HI:
-    Kind = LoongArchMCExpr::VK_TLS_LE64_HI12;
+    Kind = ELF::R_LARCH_TLS_LE64_HI12;
     break;
   case LoongArchII::MO_IE_PC_HI:
-    Kind = LoongArchMCExpr::VK_TLS_IE_PC_HI20;
+    Kind = ELF::R_LARCH_TLS_IE_PC_HI20;
     break;
   case LoongArchII::MO_IE_PC_LO:
-    Kind = LoongArchMCExpr::VK_TLS_IE_PC_LO12;
+    Kind = ELF::R_LARCH_TLS_IE_PC_LO12;
     break;
   case LoongArchII::MO_IE_PC64_LO:
-    Kind = LoongArchMCExpr::VK_TLS_IE64_PC_LO20;
+    Kind = ELF::R_LARCH_TLS_IE64_PC_LO20;
     break;
   case LoongArchII::MO_IE_PC64_HI:
-    Kind = LoongArchMCExpr::VK_TLS_IE64_PC_HI12;
+    Kind = ELF::R_LARCH_TLS_IE64_PC_HI12;
     break;
   case LoongArchII::MO_LD_PC_HI:
-    Kind = LoongArchMCExpr::VK_TLS_LD_PC_HI20;
+    Kind = ELF::R_LARCH_TLS_LD_PC_HI20;
     break;
   case LoongArchII::MO_GD_PC_HI:
-    Kind = LoongArchMCExpr::VK_TLS_GD_PC_HI20;
+    Kind = ELF::R_LARCH_TLS_GD_PC_HI20;
     break;
   case LoongArchII::MO_CALL36:
-    Kind = LoongArchMCExpr::VK_CALL36;
+    Kind = ELF::R_LARCH_CALL36;
     break;
   case LoongArchII::MO_DESC_PC_HI:
-    Kind = LoongArchMCExpr::VK_TLS_DESC_PC_HI20;
+    Kind = ELF::R_LARCH_TLS_DESC_PC_HI20;
     break;
   case LoongArchII::MO_DESC_PC_LO:
-    Kind = LoongArchMCExpr::VK_TLS_DESC_PC_LO12;
+    Kind = ELF::R_LARCH_TLS_DESC_PC_LO12;
     break;
   case LoongArchII::MO_DESC64_PC_LO:
-    Kind = LoongArchMCExpr::VK_TLS_DESC64_PC_LO20;
+    Kind = ELF::R_LARCH_TLS_DESC64_PC_LO20;
     break;
   case LoongArchII::MO_DESC64_PC_HI:
-    Kind = LoongArchMCExpr::VK_TLS_DESC64_PC_HI12;
+    Kind = ELF::R_LARCH_TLS_DESC64_PC_HI12;
     break;
   case LoongArchII::MO_DESC_LD:
-    Kind = LoongArchMCExpr::VK_TLS_DESC_LD;
+    Kind = ELF::R_LARCH_TLS_DESC_LD;
     break;
   case LoongArchII::MO_DESC_CALL:
-    Kind = LoongArchMCExpr::VK_TLS_DESC_CALL;
+    Kind = ELF::R_LARCH_TLS_DESC_CALL;
     break;
   case LoongArchII::MO_LE_HI_R:
-    Kind = LoongArchMCExpr::VK_TLS_LE_HI20_R;
+    Kind = ELF::R_LARCH_TLS_LE_HI20_R;
     break;
   case LoongArchII::MO_LE_ADD_R:
-    Kind = LoongArchMCExpr::VK_TLS_LE_ADD_R;
+    Kind = ELF::R_LARCH_TLS_LE_ADD_R;
     break;
   case LoongArchII::MO_LE_LO_R:
-    Kind = LoongArchMCExpr::VK_TLS_LE_LO12_R;
+    Kind = ELF::R_LARCH_TLS_LE_LO12_R;
     break;
     // TODO: Handle more target-flags.
   }

diff  --git a/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchELFObjectWriter.cpp b/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchELFObjectWriter.cpp
index 5b6ecc1e8bc1f..c6305d8693a26 100644
--- a/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchELFObjectWriter.cpp
+++ b/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchELFObjectWriter.cpp
@@ -51,19 +51,19 @@ unsigned LoongArchELFObjectWriter::getRelocType(MCContext &Ctx,
                                                 const MCFixup &Fixup,
                                                 bool IsPCRel) const {
   switch (Target.getSpecifier()) {
-  case LoongArchMCExpr::VK_TLS_LE_HI20:
-  case LoongArchMCExpr::VK_TLS_IE_PC_HI20:
-  case LoongArchMCExpr::VK_TLS_IE_HI20:
-  case LoongArchMCExpr::VK_TLS_LD_PC_HI20:
-  case LoongArchMCExpr::VK_TLS_LD_HI20:
-  case LoongArchMCExpr::VK_TLS_GD_PC_HI20:
-  case LoongArchMCExpr::VK_TLS_GD_HI20:
-  case LoongArchMCExpr::VK_TLS_DESC_PC_HI20:
-  case LoongArchMCExpr::VK_TLS_DESC_HI20:
-  case LoongArchMCExpr::VK_TLS_LE_HI20_R:
-  case LoongArchMCExpr::VK_TLS_LD_PCREL20_S2:
-  case LoongArchMCExpr::VK_TLS_GD_PCREL20_S2:
-  case LoongArchMCExpr::VK_TLS_DESC_PCREL20_S2:
+  case ELF::R_LARCH_TLS_LE_HI20:
+  case ELF::R_LARCH_TLS_IE_PC_HI20:
+  case ELF::R_LARCH_TLS_IE_HI20:
+  case ELF::R_LARCH_TLS_LD_PC_HI20:
+  case ELF::R_LARCH_TLS_LD_HI20:
+  case ELF::R_LARCH_TLS_GD_PC_HI20:
+  case ELF::R_LARCH_TLS_GD_HI20:
+  case ELF::R_LARCH_TLS_DESC_PC_HI20:
+  case ELF::R_LARCH_TLS_DESC_HI20:
+  case ELF::R_LARCH_TLS_LE_HI20_R:
+  case ELF::R_LARCH_TLS_LD_PCREL20_S2:
+  case ELF::R_LARCH_TLS_GD_PCREL20_S2:
+  case ELF::R_LARCH_TLS_DESC_PCREL20_S2:
     if (auto *SA = Target.getAddSym())
       cast<MCSymbolELF>(SA)->setType(ELF::STT_TLS);
     break;

diff  --git a/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCCodeEmitter.cpp b/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCCodeEmitter.cpp
index fa965d144b726..d16fb5c52b8e8 100644
--- a/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCCodeEmitter.cpp
+++ b/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCCodeEmitter.cpp
@@ -132,175 +132,42 @@ LoongArchMCCodeEmitter::getExprOpValue(const MCInst &MI, const MCOperand &MO,
   unsigned FixupKind = LoongArch::fixup_loongarch_invalid;
   if (Kind == MCExpr::Target) {
     const LoongArchMCExpr *LAExpr = cast<LoongArchMCExpr>(Expr);
-
+    FixupKind = LAExpr->getSpecifier();
     RelaxCandidate = LAExpr->getRelaxHint();
-    switch (LAExpr->getSpecifier()) {
+    switch (uint16_t(LAExpr->getSpecifier())) {
     case LoongArchMCExpr::VK_None:
       llvm_unreachable("Unhandled fixup kind!");
-    case LoongArchMCExpr::VK_TLS_LE_ADD_R:
-      llvm_unreachable("VK_TLS_LE_ADD_R should not represent an "
+    case ELF::R_LARCH_TLS_LE_ADD_R:
+      llvm_unreachable("ELF::R_LARCH_TLS_LE_ADD_R should not represent an "
                        "instruction operand");
-    case LoongArchMCExpr::VK_B16:
+    case ELF::R_LARCH_B16:
       FixupKind = LoongArch::fixup_loongarch_b16;
       break;
-    case LoongArchMCExpr::VK_B21:
+    case ELF::R_LARCH_B21:
       FixupKind = LoongArch::fixup_loongarch_b21;
       break;
-    case LoongArchMCExpr::VK_B26:
+    case ELF::R_LARCH_B26:
     case LoongArchMCExpr::VK_CALL:
     case LoongArchMCExpr::VK_CALL_PLT:
       FixupKind = LoongArch::fixup_loongarch_b26;
       break;
-    case LoongArchMCExpr::VK_ABS_HI20:
+    case ELF::R_LARCH_ABS_HI20:
       FixupKind = LoongArch::fixup_loongarch_abs_hi20;
       break;
-    case LoongArchMCExpr::VK_ABS_LO12:
+    case ELF::R_LARCH_ABS_LO12:
       FixupKind = LoongArch::fixup_loongarch_abs_lo12;
       break;
-    case LoongArchMCExpr::VK_ABS64_LO20:
+    case ELF::R_LARCH_ABS64_LO20:
       FixupKind = LoongArch::fixup_loongarch_abs64_lo20;
       break;
-    case LoongArchMCExpr::VK_ABS64_HI12:
+    case ELF::R_LARCH_ABS64_HI12:
       FixupKind = LoongArch::fixup_loongarch_abs64_hi12;
       break;
-    case LoongArchMCExpr::VK_PCALA_HI20:
-      FixupKind = ELF::R_LARCH_PCALA_HI20;
-      break;
-    case LoongArchMCExpr::VK_PCALA_LO12:
-      FixupKind = ELF::R_LARCH_PCALA_LO12;
-      break;
-    case LoongArchMCExpr::VK_PCALA64_LO20:
-      FixupKind = ELF::R_LARCH_PCALA64_LO20;
-      break;
-    case LoongArchMCExpr::VK_PCALA64_HI12:
-      FixupKind = ELF::R_LARCH_PCALA64_HI12;
-      break;
-    case LoongArchMCExpr::VK_GOT_PC_HI20:
-      FixupKind = ELF::R_LARCH_GOT_PC_HI20;
-      break;
-    case LoongArchMCExpr::VK_GOT_PC_LO12:
-      FixupKind = ELF::R_LARCH_GOT_PC_LO12;
-      break;
-    case LoongArchMCExpr::VK_GOT64_PC_LO20:
-      FixupKind = ELF::R_LARCH_GOT64_PC_LO20;
-      break;
-    case LoongArchMCExpr::VK_GOT64_PC_HI12:
-      FixupKind = ELF::R_LARCH_GOT64_PC_HI12;
-      break;
-    case LoongArchMCExpr::VK_GOT_HI20:
-      FixupKind = ELF::R_LARCH_GOT_HI20;
-      break;
-    case LoongArchMCExpr::VK_GOT_LO12:
-      FixupKind = ELF::R_LARCH_GOT_LO12;
-      break;
-    case LoongArchMCExpr::VK_GOT64_LO20:
-      FixupKind = ELF::R_LARCH_GOT64_LO20;
-      break;
-    case LoongArchMCExpr::VK_GOT64_HI12:
-      FixupKind = ELF::R_LARCH_GOT64_HI12;
-      break;
-    case LoongArchMCExpr::VK_TLS_LE_HI20:
-      FixupKind = ELF::R_LARCH_TLS_LE_HI20;
-      break;
-    case LoongArchMCExpr::VK_TLS_LE_LO12:
-      FixupKind = ELF::R_LARCH_TLS_LE_LO12;
-      break;
-    case LoongArchMCExpr::VK_TLS_LE64_LO20:
-      FixupKind = ELF::R_LARCH_TLS_LE64_LO20;
-      break;
-    case LoongArchMCExpr::VK_TLS_LE64_HI12:
-      FixupKind = ELF::R_LARCH_TLS_LE64_HI12;
-      break;
-    case LoongArchMCExpr::VK_TLS_IE_PC_HI20:
-      FixupKind = ELF::R_LARCH_TLS_IE_PC_HI20;
-      break;
-    case LoongArchMCExpr::VK_TLS_IE_PC_LO12:
-      FixupKind = ELF::R_LARCH_TLS_IE_PC_LO12;
-      break;
-    case LoongArchMCExpr::VK_TLS_IE64_PC_LO20:
-      FixupKind = ELF::R_LARCH_TLS_IE64_PC_LO20;
-      break;
-    case LoongArchMCExpr::VK_TLS_IE64_PC_HI12:
-      FixupKind = ELF::R_LARCH_TLS_IE64_PC_HI12;
-      break;
-    case LoongArchMCExpr::VK_TLS_IE_HI20:
-      FixupKind = ELF::R_LARCH_TLS_IE_HI20;
-      break;
-    case LoongArchMCExpr::VK_TLS_IE_LO12:
-      FixupKind = ELF::R_LARCH_TLS_IE_LO12;
-      break;
-    case LoongArchMCExpr::VK_TLS_IE64_LO20:
-      FixupKind = ELF::R_LARCH_TLS_IE64_LO20;
-      break;
-    case LoongArchMCExpr::VK_TLS_IE64_HI12:
-      FixupKind = ELF::R_LARCH_TLS_IE64_HI12;
-      break;
-    case LoongArchMCExpr::VK_TLS_LD_PC_HI20:
-      FixupKind = ELF::R_LARCH_TLS_LD_PC_HI20;
-      break;
-    case LoongArchMCExpr::VK_TLS_LD_HI20:
-      FixupKind = ELF::R_LARCH_TLS_LD_HI20;
-      break;
-    case LoongArchMCExpr::VK_TLS_GD_PC_HI20:
-      FixupKind = ELF::R_LARCH_TLS_GD_PC_HI20;
-      break;
-    case LoongArchMCExpr::VK_TLS_GD_HI20:
-      FixupKind = ELF::R_LARCH_TLS_GD_HI20;
-      break;
-    case LoongArchMCExpr::VK_CALL36:
-      FixupKind = ELF::R_LARCH_CALL36;
+    case ELF::R_LARCH_CALL36:
+    case ELF::R_LARCH_TLS_LE_HI20_R:
+    case ELF::R_LARCH_TLS_LE_LO12_R:
       RelaxCandidate = true;
       break;
-    case LoongArchMCExpr::VK_TLS_DESC_PC_HI20:
-      FixupKind = ELF::R_LARCH_TLS_DESC_PC_HI20;
-      break;
-    case LoongArchMCExpr::VK_TLS_DESC_PC_LO12:
-      FixupKind = ELF::R_LARCH_TLS_DESC_PC_LO12;
-      break;
-    case LoongArchMCExpr::VK_TLS_DESC64_PC_LO20:
-      FixupKind = ELF::R_LARCH_TLS_DESC64_PC_LO20;
-      break;
-    case LoongArchMCExpr::VK_TLS_DESC64_PC_HI12:
-      FixupKind = ELF::R_LARCH_TLS_DESC64_PC_HI12;
-      break;
-    case LoongArchMCExpr::VK_TLS_DESC_HI20:
-      FixupKind = ELF::R_LARCH_TLS_DESC_HI20;
-      break;
-    case LoongArchMCExpr::VK_TLS_DESC_LO12:
-      FixupKind = ELF::R_LARCH_TLS_DESC_LO12;
-      break;
-    case LoongArchMCExpr::VK_TLS_DESC64_LO20:
-      FixupKind = ELF::R_LARCH_TLS_DESC64_LO20;
-      break;
-    case LoongArchMCExpr::VK_TLS_DESC64_HI12:
-      FixupKind = ELF::R_LARCH_TLS_DESC64_HI12;
-      break;
-    case LoongArchMCExpr::VK_TLS_DESC_LD:
-      FixupKind = ELF::R_LARCH_TLS_DESC_LD;
-      break;
-    case LoongArchMCExpr::VK_TLS_DESC_CALL:
-      FixupKind = ELF::R_LARCH_TLS_DESC_CALL;
-      break;
-    case LoongArchMCExpr::VK_TLS_LE_HI20_R:
-      FixupKind = ELF::R_LARCH_TLS_LE_HI20_R;
-      RelaxCandidate = true;
-      break;
-    case LoongArchMCExpr::VK_TLS_LE_LO12_R:
-      FixupKind = ELF::R_LARCH_TLS_LE_LO12_R;
-      RelaxCandidate = true;
-      break;
-    case LoongArchMCExpr::VK_PCREL20_S2:
-      FixupKind = ELF::R_LARCH_PCREL20_S2;
-      break;
-    case LoongArchMCExpr::VK_TLS_LD_PCREL20_S2:
-      FixupKind = ELF::R_LARCH_TLS_LD_PCREL20_S2;
-      break;
-    case LoongArchMCExpr::VK_TLS_GD_PCREL20_S2:
-      FixupKind = ELF::R_LARCH_TLS_GD_PCREL20_S2;
-      break;
-    case LoongArchMCExpr::VK_TLS_DESC_PCREL20_S2:
-      FixupKind = ELF::R_LARCH_TLS_DESC_PCREL20_S2;
-      break;
     }
   } else if (Kind == MCExpr::SymbolRef &&
              cast<MCSymbolRefExpr>(Expr)->getKind() ==
@@ -385,7 +252,7 @@ void LoongArchMCCodeEmitter::expandAddTPRel(const MCInst &MI,
          "Expected expression as third input to TP-relative add");
 
   const LoongArchMCExpr *Expr = dyn_cast<LoongArchMCExpr>(Symbol.getExpr());
-  assert(Expr && Expr->getSpecifier() == LoongArchMCExpr::VK_TLS_LE_ADD_R &&
+  assert(Expr && Expr->getSpecifier() == ELF::R_LARCH_TLS_LE_ADD_R &&
          "Expected %le_add_r relocation on TP-relative symbol");
 
   // Emit the correct %le_add_r relocation for the symbol.

diff  --git a/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCExpr.cpp b/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCExpr.cpp
index dceb62dcf4604..ac39b1fa411f2 100644
--- a/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCExpr.cpp
+++ b/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCExpr.cpp
@@ -13,6 +13,7 @@
 
 #include "LoongArchMCExpr.h"
 #include "LoongArchAsmBackend.h"
+#include "llvm/BinaryFormat/ELF.h"
 #include "llvm/MC/MCContext.h"
 #include "llvm/MC/MCStreamer.h"
 #include "llvm/MC/MCSymbolELF.h"
@@ -24,9 +25,9 @@ using namespace llvm;
 
 #define DEBUG_TYPE "loongarch-mcexpr"
 
-const LoongArchMCExpr *LoongArchMCExpr::create(const MCExpr *Expr, Specifier S,
+const LoongArchMCExpr *LoongArchMCExpr::create(const MCExpr *Expr, uint16_t S,
                                                MCContext &Ctx, bool Hint) {
-  return new (Ctx) LoongArchMCExpr(Expr, S, Hint);
+  return new (Ctx) LoongArchMCExpr(Expr, Specifier(S), Hint);
 }
 
 void LoongArchMCExpr::printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const {
@@ -58,117 +59,117 @@ void LoongArchMCExpr::visitUsedExpr(MCStreamer &Streamer) const {
   Streamer.visitUsedExpr(*getSubExpr());
 }
 
-StringRef LoongArchMCExpr::getSpecifierName(Specifier S) {
+StringRef LoongArchMCExpr::getSpecifierName(uint16_t S) {
   switch (S) {
   default:
     llvm_unreachable("Invalid ELF symbol kind");
   case VK_CALL_PLT:
     return "plt";
-  case VK_B16:
+  case ELF::R_LARCH_B16:
     return "b16";
-  case VK_B21:
+  case ELF::R_LARCH_B21:
     return "b21";
-  case VK_B26:
+  case ELF::R_LARCH_B26:
     return "b26";
-  case VK_ABS_HI20:
+  case ELF::R_LARCH_ABS_HI20:
     return "abs_hi20";
-  case VK_ABS_LO12:
+  case ELF::R_LARCH_ABS_LO12:
     return "abs_lo12";
-  case VK_ABS64_LO20:
+  case ELF::R_LARCH_ABS64_LO20:
     return "abs64_lo20";
-  case VK_ABS64_HI12:
+  case ELF::R_LARCH_ABS64_HI12:
     return "abs64_hi12";
-  case VK_PCALA_HI20:
+  case ELF::R_LARCH_PCALA_HI20:
     return "pc_hi20";
-  case VK_PCALA_LO12:
+  case ELF::R_LARCH_PCALA_LO12:
     return "pc_lo12";
-  case VK_PCALA64_LO20:
+  case ELF::R_LARCH_PCALA64_LO20:
     return "pc64_lo20";
-  case VK_PCALA64_HI12:
+  case ELF::R_LARCH_PCALA64_HI12:
     return "pc64_hi12";
-  case VK_GOT_PC_HI20:
+  case ELF::R_LARCH_GOT_PC_HI20:
     return "got_pc_hi20";
-  case VK_GOT_PC_LO12:
+  case ELF::R_LARCH_GOT_PC_LO12:
     return "got_pc_lo12";
-  case VK_GOT64_PC_LO20:
+  case ELF::R_LARCH_GOT64_PC_LO20:
     return "got64_pc_lo20";
-  case VK_GOT64_PC_HI12:
+  case ELF::R_LARCH_GOT64_PC_HI12:
     return "got64_pc_hi12";
-  case VK_GOT_HI20:
+  case ELF::R_LARCH_GOT_HI20:
     return "got_hi20";
-  case VK_GOT_LO12:
+  case ELF::R_LARCH_GOT_LO12:
     return "got_lo12";
-  case VK_GOT64_LO20:
+  case ELF::R_LARCH_GOT64_LO20:
     return "got64_lo20";
-  case VK_GOT64_HI12:
+  case ELF::R_LARCH_GOT64_HI12:
     return "got64_hi12";
-  case VK_TLS_LE_HI20:
+  case ELF::R_LARCH_TLS_LE_HI20:
     return "le_hi20";
-  case VK_TLS_LE_LO12:
+  case ELF::R_LARCH_TLS_LE_LO12:
     return "le_lo12";
-  case VK_TLS_LE64_LO20:
+  case ELF::R_LARCH_TLS_LE64_LO20:
     return "le64_lo20";
-  case VK_TLS_LE64_HI12:
+  case ELF::R_LARCH_TLS_LE64_HI12:
     return "le64_hi12";
-  case VK_TLS_IE_PC_HI20:
+  case ELF::R_LARCH_TLS_IE_PC_HI20:
     return "ie_pc_hi20";
-  case VK_TLS_IE_PC_LO12:
+  case ELF::R_LARCH_TLS_IE_PC_LO12:
     return "ie_pc_lo12";
-  case VK_TLS_IE64_PC_LO20:
+  case ELF::R_LARCH_TLS_IE64_PC_LO20:
     return "ie64_pc_lo20";
-  case VK_TLS_IE64_PC_HI12:
+  case ELF::R_LARCH_TLS_IE64_PC_HI12:
     return "ie64_pc_hi12";
-  case VK_TLS_IE_HI20:
+  case ELF::R_LARCH_TLS_IE_HI20:
     return "ie_hi20";
-  case VK_TLS_IE_LO12:
+  case ELF::R_LARCH_TLS_IE_LO12:
     return "ie_lo12";
-  case VK_TLS_IE64_LO20:
+  case ELF::R_LARCH_TLS_IE64_LO20:
     return "ie64_lo20";
-  case VK_TLS_IE64_HI12:
+  case ELF::R_LARCH_TLS_IE64_HI12:
     return "ie64_hi12";
-  case VK_TLS_LD_PC_HI20:
+  case ELF::R_LARCH_TLS_LD_PC_HI20:
     return "ld_pc_hi20";
-  case VK_TLS_LD_HI20:
+  case ELF::R_LARCH_TLS_LD_HI20:
     return "ld_hi20";
-  case VK_TLS_GD_PC_HI20:
+  case ELF::R_LARCH_TLS_GD_PC_HI20:
     return "gd_pc_hi20";
-  case VK_TLS_GD_HI20:
+  case ELF::R_LARCH_TLS_GD_HI20:
     return "gd_hi20";
-  case VK_CALL36:
+  case ELF::R_LARCH_CALL36:
     return "call36";
-  case VK_TLS_DESC_PC_HI20:
+  case ELF::R_LARCH_TLS_DESC_PC_HI20:
     return "desc_pc_hi20";
-  case VK_TLS_DESC_PC_LO12:
+  case ELF::R_LARCH_TLS_DESC_PC_LO12:
     return "desc_pc_lo12";
-  case VK_TLS_DESC64_PC_LO20:
+  case ELF::R_LARCH_TLS_DESC64_PC_LO20:
     return "desc64_pc_lo20";
-  case VK_TLS_DESC64_PC_HI12:
+  case ELF::R_LARCH_TLS_DESC64_PC_HI12:
     return "desc64_pc_hi12";
-  case VK_TLS_DESC_HI20:
+  case ELF::R_LARCH_TLS_DESC_HI20:
     return "desc_hi20";
-  case VK_TLS_DESC_LO12:
+  case ELF::R_LARCH_TLS_DESC_LO12:
     return "desc_lo12";
-  case VK_TLS_DESC64_LO20:
+  case ELF::R_LARCH_TLS_DESC64_LO20:
     return "desc64_lo20";
-  case VK_TLS_DESC64_HI12:
+  case ELF::R_LARCH_TLS_DESC64_HI12:
     return "desc64_hi12";
-  case VK_TLS_DESC_LD:
+  case ELF::R_LARCH_TLS_DESC_LD:
     return "desc_ld";
-  case VK_TLS_DESC_CALL:
+  case ELF::R_LARCH_TLS_DESC_CALL:
     return "desc_call";
-  case VK_TLS_LE_HI20_R:
+  case ELF::R_LARCH_TLS_LE_HI20_R:
     return "le_hi20_r";
-  case VK_TLS_LE_ADD_R:
+  case ELF::R_LARCH_TLS_LE_ADD_R:
     return "le_add_r";
-  case VK_TLS_LE_LO12_R:
+  case ELF::R_LARCH_TLS_LE_LO12_R:
     return "le_lo12_r";
-  case VK_PCREL20_S2:
+  case ELF::R_LARCH_PCREL20_S2:
     return "pcrel_20";
-  case VK_TLS_LD_PCREL20_S2:
+  case ELF::R_LARCH_TLS_LD_PCREL20_S2:
     return "ld_pcrel_20";
-  case VK_TLS_GD_PCREL20_S2:
+  case ELF::R_LARCH_TLS_GD_PCREL20_S2:
     return "gd_pcrel_20";
-  case VK_TLS_DESC_PCREL20_S2:
+  case ELF::R_LARCH_TLS_DESC_PCREL20_S2:
     return "desc_pcrel_20";
   }
 }
@@ -176,58 +177,58 @@ StringRef LoongArchMCExpr::getSpecifierName(Specifier S) {
 LoongArchMCExpr::Specifier LoongArchMCExpr::parseSpecifier(StringRef name) {
   return StringSwitch<LoongArchMCExpr::Specifier>(name)
       .Case("plt", VK_CALL_PLT)
-      .Case("b16", VK_B16)
-      .Case("b21", VK_B21)
-      .Case("b26", VK_B26)
-      .Case("abs_hi20", VK_ABS_HI20)
-      .Case("abs_lo12", VK_ABS_LO12)
-      .Case("abs64_lo20", VK_ABS64_LO20)
-      .Case("abs64_hi12", VK_ABS64_HI12)
-      .Case("pc_hi20", VK_PCALA_HI20)
-      .Case("pc_lo12", VK_PCALA_LO12)
-      .Case("pc64_lo20", VK_PCALA64_LO20)
-      .Case("pc64_hi12", VK_PCALA64_HI12)
-      .Case("got_pc_hi20", VK_GOT_PC_HI20)
-      .Case("got_pc_lo12", VK_GOT_PC_LO12)
-      .Case("got64_pc_lo20", VK_GOT64_PC_LO20)
-      .Case("got64_pc_hi12", VK_GOT64_PC_HI12)
-      .Case("got_hi20", VK_GOT_HI20)
-      .Case("got_lo12", VK_GOT_LO12)
-      .Case("got64_lo20", VK_GOT64_LO20)
-      .Case("got64_hi12", VK_GOT64_HI12)
-      .Case("le_hi20", VK_TLS_LE_HI20)
-      .Case("le_lo12", VK_TLS_LE_LO12)
-      .Case("le64_lo20", VK_TLS_LE64_LO20)
-      .Case("le64_hi12", VK_TLS_LE64_HI12)
-      .Case("ie_pc_hi20", VK_TLS_IE_PC_HI20)
-      .Case("ie_pc_lo12", VK_TLS_IE_PC_LO12)
-      .Case("ie64_pc_lo20", VK_TLS_IE64_PC_LO20)
-      .Case("ie64_pc_hi12", VK_TLS_IE64_PC_HI12)
-      .Case("ie_hi20", VK_TLS_IE_HI20)
-      .Case("ie_lo12", VK_TLS_IE_LO12)
-      .Case("ie64_lo20", VK_TLS_IE64_LO20)
-      .Case("ie64_hi12", VK_TLS_IE64_HI12)
-      .Case("ld_pc_hi20", VK_TLS_LD_PC_HI20)
-      .Case("ld_hi20", VK_TLS_LD_HI20)
-      .Case("gd_pc_hi20", VK_TLS_GD_PC_HI20)
-      .Case("gd_hi20", VK_TLS_GD_HI20)
-      .Case("call36", VK_CALL36)
-      .Case("desc_pc_hi20", VK_TLS_DESC_PC_HI20)
-      .Case("desc_pc_lo12", VK_TLS_DESC_PC_LO12)
-      .Case("desc64_pc_lo20", VK_TLS_DESC64_PC_LO20)
-      .Case("desc64_pc_hi12", VK_TLS_DESC64_PC_HI12)
-      .Case("desc_hi20", VK_TLS_DESC_HI20)
-      .Case("desc_lo12", VK_TLS_DESC_LO12)
-      .Case("desc64_lo20", VK_TLS_DESC64_LO20)
-      .Case("desc64_hi12", VK_TLS_DESC64_HI12)
-      .Case("desc_ld", VK_TLS_DESC_LD)
-      .Case("desc_call", VK_TLS_DESC_CALL)
-      .Case("le_hi20_r", VK_TLS_LE_HI20_R)
-      .Case("le_add_r", VK_TLS_LE_ADD_R)
-      .Case("le_lo12_r", VK_TLS_LE_LO12_R)
-      .Case("pcrel_20", VK_PCREL20_S2)
-      .Case("ld_pcrel_20", VK_TLS_LD_PCREL20_S2)
-      .Case("gd_pcrel_20", VK_TLS_GD_PCREL20_S2)
-      .Case("desc_pcrel_20", VK_TLS_DESC_PCREL20_S2)
+      .Case("b16", ELF::R_LARCH_B16)
+      .Case("b21", ELF::R_LARCH_B21)
+      .Case("b26", ELF::R_LARCH_B26)
+      .Case("abs_hi20", ELF::R_LARCH_ABS_HI20)
+      .Case("abs_lo12", ELF::R_LARCH_ABS_LO12)
+      .Case("abs64_lo20", ELF::R_LARCH_ABS64_LO20)
+      .Case("abs64_hi12", ELF::R_LARCH_ABS64_HI12)
+      .Case("pc_hi20", ELF::R_LARCH_PCALA_HI20)
+      .Case("pc_lo12", ELF::R_LARCH_PCALA_LO12)
+      .Case("pc64_lo20", ELF::R_LARCH_PCALA64_LO20)
+      .Case("pc64_hi12", ELF::R_LARCH_PCALA64_HI12)
+      .Case("got_pc_hi20", ELF::R_LARCH_GOT_PC_HI20)
+      .Case("got_pc_lo12", ELF::R_LARCH_GOT_PC_LO12)
+      .Case("got64_pc_lo20", ELF::R_LARCH_GOT64_PC_LO20)
+      .Case("got64_pc_hi12", ELF::R_LARCH_GOT64_PC_HI12)
+      .Case("got_hi20", ELF::R_LARCH_GOT_HI20)
+      .Case("got_lo12", ELF::R_LARCH_GOT_LO12)
+      .Case("got64_lo20", ELF::R_LARCH_GOT64_LO20)
+      .Case("got64_hi12", ELF::R_LARCH_GOT64_HI12)
+      .Case("le_hi20", ELF::R_LARCH_TLS_LE_HI20)
+      .Case("le_lo12", ELF::R_LARCH_TLS_LE_LO12)
+      .Case("le64_lo20", ELF::R_LARCH_TLS_LE64_LO20)
+      .Case("le64_hi12", ELF::R_LARCH_TLS_LE64_HI12)
+      .Case("ie_pc_hi20", ELF::R_LARCH_TLS_IE_PC_HI20)
+      .Case("ie_pc_lo12", ELF::R_LARCH_TLS_IE_PC_LO12)
+      .Case("ie64_pc_lo20", ELF::R_LARCH_TLS_IE64_PC_LO20)
+      .Case("ie64_pc_hi12", ELF::R_LARCH_TLS_IE64_PC_HI12)
+      .Case("ie_hi20", ELF::R_LARCH_TLS_IE_HI20)
+      .Case("ie_lo12", ELF::R_LARCH_TLS_IE_LO12)
+      .Case("ie64_lo20", ELF::R_LARCH_TLS_IE64_LO20)
+      .Case("ie64_hi12", ELF::R_LARCH_TLS_IE64_HI12)
+      .Case("ld_pc_hi20", ELF::R_LARCH_TLS_LD_PC_HI20)
+      .Case("ld_hi20", ELF::R_LARCH_TLS_LD_HI20)
+      .Case("gd_pc_hi20", ELF::R_LARCH_TLS_GD_PC_HI20)
+      .Case("gd_hi20", ELF::R_LARCH_TLS_GD_HI20)
+      .Case("call36", ELF::R_LARCH_CALL36)
+      .Case("desc_pc_hi20", ELF::R_LARCH_TLS_DESC_PC_HI20)
+      .Case("desc_pc_lo12", ELF::R_LARCH_TLS_DESC_PC_LO12)
+      .Case("desc64_pc_lo20", ELF::R_LARCH_TLS_DESC64_PC_LO20)
+      .Case("desc64_pc_hi12", ELF::R_LARCH_TLS_DESC64_PC_HI12)
+      .Case("desc_hi20", ELF::R_LARCH_TLS_DESC_HI20)
+      .Case("desc_lo12", ELF::R_LARCH_TLS_DESC_LO12)
+      .Case("desc64_lo20", ELF::R_LARCH_TLS_DESC64_LO20)
+      .Case("desc64_hi12", ELF::R_LARCH_TLS_DESC64_HI12)
+      .Case("desc_ld", ELF::R_LARCH_TLS_DESC_LD)
+      .Case("desc_call", ELF::R_LARCH_TLS_DESC_CALL)
+      .Case("le_hi20_r", ELF::R_LARCH_TLS_LE_HI20_R)
+      .Case("le_add_r", ELF::R_LARCH_TLS_LE_ADD_R)
+      .Case("le_lo12_r", ELF::R_LARCH_TLS_LE_LO12_R)
+      .Case("pcrel_20", ELF::R_LARCH_PCREL20_S2)
+      .Case("ld_pcrel_20", ELF::R_LARCH_TLS_LD_PCREL20_S2)
+      .Case("gd_pcrel_20", ELF::R_LARCH_TLS_GD_PCREL20_S2)
+      .Case("desc_pcrel_20", ELF::R_LARCH_TLS_DESC_PCREL20_S2)
       .Default(VK_None);
 }

diff  --git a/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCExpr.h b/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCExpr.h
index 4bc0b384bfe23..aac49979fb60a 100644
--- a/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCExpr.h
+++ b/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCExpr.h
@@ -22,63 +22,11 @@ class StringRef;
 
 class LoongArchMCExpr : public MCTargetExpr {
 public:
-  enum Specifier {
+  using Specifier = uint16_t;
+  enum {
     VK_None,
-    VK_CALL,
+    VK_CALL = 1000, // larger than relocation types
     VK_CALL_PLT,
-    VK_B16,
-    VK_B21,
-    VK_B26,
-    VK_ABS_HI20,
-    VK_ABS_LO12,
-    VK_ABS64_LO20,
-    VK_ABS64_HI12,
-    VK_PCALA_HI20,
-    VK_PCALA_LO12,
-    VK_PCALA64_LO20,
-    VK_PCALA64_HI12,
-    VK_GOT_PC_HI20,
-    VK_GOT_PC_LO12,
-    VK_GOT64_PC_LO20,
-    VK_GOT64_PC_HI12,
-    VK_GOT_HI20,
-    VK_GOT_LO12,
-    VK_GOT64_LO20,
-    VK_GOT64_HI12,
-    VK_TLS_LE_HI20,
-    VK_TLS_LE_LO12,
-    VK_TLS_LE64_LO20,
-    VK_TLS_LE64_HI12,
-    VK_TLS_IE_PC_HI20,
-    VK_TLS_IE_PC_LO12,
-    VK_TLS_IE64_PC_LO20,
-    VK_TLS_IE64_PC_HI12,
-    VK_TLS_IE_HI20,
-    VK_TLS_IE_LO12,
-    VK_TLS_IE64_LO20,
-    VK_TLS_IE64_HI12,
-    VK_TLS_LD_PC_HI20,
-    VK_TLS_LD_HI20,
-    VK_TLS_GD_PC_HI20,
-    VK_TLS_GD_HI20,
-    VK_CALL36,
-    VK_TLS_DESC_PC_HI20,
-    VK_TLS_DESC_PC_LO12,
-    VK_TLS_DESC64_PC_LO20,
-    VK_TLS_DESC64_PC_HI12,
-    VK_TLS_DESC_HI20,
-    VK_TLS_DESC_LO12,
-    VK_TLS_DESC64_LO20,
-    VK_TLS_DESC64_HI12,
-    VK_TLS_DESC_LD,
-    VK_TLS_DESC_CALL,
-    VK_TLS_LE_HI20_R,
-    VK_TLS_LE_ADD_R,
-    VK_TLS_LE_LO12_R,
-    VK_PCREL20_S2,
-    VK_TLS_LD_PCREL20_S2,
-    VK_TLS_GD_PCREL20_S2,
-    VK_TLS_DESC_PCREL20_S2,
   };
 
 private:
@@ -90,7 +38,7 @@ class LoongArchMCExpr : public MCTargetExpr {
       : Expr(Expr), specifier(S), RelaxHint(Hint) {}
 
 public:
-  static const LoongArchMCExpr *create(const MCExpr *Expr, Specifier Kind,
+  static const LoongArchMCExpr *create(const MCExpr *Expr, uint16_t S,
                                        MCContext &Ctx, bool Hint = false);
 
   Specifier getSpecifier() const { return specifier; }
@@ -109,7 +57,7 @@ class LoongArchMCExpr : public MCTargetExpr {
     return E->getKind() == MCExpr::Target;
   }
 
-  static StringRef getSpecifierName(Specifier Kind);
+  static StringRef getSpecifierName(uint16_t S);
   static Specifier parseSpecifier(StringRef name);
 };
 


        


More information about the llvm-commits mailing list