Skip to content

Commit 4f97780

Browse files
committed
LoongArch: Move MCExpr into MCAsmInfo
to align with targets that have made the transition.
1 parent 569fcac commit 4f97780

File tree

8 files changed

+199
-249
lines changed

8 files changed

+199
-249
lines changed

llvm/lib/Target/LoongArch/AsmParser/LoongArchAsmParser.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
#include "MCTargetDesc/LoongArchBaseInfo.h"
1010
#include "MCTargetDesc/LoongArchInstPrinter.h"
1111
#include "MCTargetDesc/LoongArchMCAsmInfo.h"
12-
#include "MCTargetDesc/LoongArchMCExpr.h"
1312
#include "MCTargetDesc/LoongArchMCTargetDesc.h"
1413
#include "MCTargetDesc/LoongArchMatInt.h"
1514
#include "MCTargetDesc/LoongArchTargetStreamer.h"

llvm/lib/Target/LoongArch/LoongArchMCInstLower.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
#include "LoongArch.h"
1515
#include "MCTargetDesc/LoongArchBaseInfo.h"
16-
#include "MCTargetDesc/LoongArchMCExpr.h"
16+
#include "MCTargetDesc/LoongArchMCAsmInfo.h"
1717
#include "llvm/BinaryFormat/ELF.h"
1818
#include "llvm/CodeGen/AsmPrinter.h"
1919
#include "llvm/CodeGen/MachineBasicBlock.h"

llvm/lib/Target/LoongArch/MCTargetDesc/CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ add_llvm_component_library(LLVMLoongArchDesc
66
LoongArchInstPrinter.cpp
77
LoongArchMCAsmInfo.cpp
88
LoongArchMCCodeEmitter.cpp
9-
LoongArchMCExpr.cpp
109
LoongArchMCTargetDesc.cpp
1110
LoongArchMatInt.cpp
1211
LoongArchTargetStreamer.cpp

llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCAsmInfo.cpp

Lines changed: 177 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,189 @@
1111
//===----------------------------------------------------------------------===//
1212

1313
#include "LoongArchMCAsmInfo.h"
14-
#include "LoongArchMCExpr.h"
1514
#include "llvm/BinaryFormat/Dwarf.h"
1615
#include "llvm/BinaryFormat/ELF.h"
16+
#include "llvm/MC/MCContext.h"
1717
#include "llvm/MC/MCStreamer.h"
1818
#include "llvm/TargetParser/Triple.h"
1919

2020
using namespace llvm;
2121

22+
const LoongArchMCExpr *LoongArchMCExpr::create(const MCExpr *Expr, uint16_t S,
23+
MCContext &Ctx, bool Hint) {
24+
return new (Ctx) LoongArchMCExpr(Expr, S, Hint);
25+
}
26+
27+
static StringRef getLoongArchSpecifierName(uint16_t S) {
28+
switch (S) {
29+
default:
30+
llvm_unreachable("Invalid ELF symbol kind");
31+
case ELF::R_LARCH_B16:
32+
return "b16";
33+
case ELF::R_LARCH_B21:
34+
return "b21";
35+
case ELF::R_LARCH_ABS_HI20:
36+
return "abs_hi20";
37+
case ELF::R_LARCH_ABS_LO12:
38+
return "abs_lo12";
39+
case ELF::R_LARCH_ABS64_LO20:
40+
return "abs64_lo20";
41+
case ELF::R_LARCH_ABS64_HI12:
42+
return "abs64_hi12";
43+
case ELF::R_LARCH_PCALA_HI20:
44+
return "pc_hi20";
45+
case ELF::R_LARCH_PCALA_LO12:
46+
return "pc_lo12";
47+
case ELF::R_LARCH_PCALA64_LO20:
48+
return "pc64_lo20";
49+
case ELF::R_LARCH_PCALA64_HI12:
50+
return "pc64_hi12";
51+
case ELF::R_LARCH_GOT_PC_HI20:
52+
return "got_pc_hi20";
53+
case ELF::R_LARCH_GOT_PC_LO12:
54+
return "got_pc_lo12";
55+
case ELF::R_LARCH_GOT64_PC_LO20:
56+
return "got64_pc_lo20";
57+
case ELF::R_LARCH_GOT64_PC_HI12:
58+
return "got64_pc_hi12";
59+
case ELF::R_LARCH_GOT_HI20:
60+
return "got_hi20";
61+
case ELF::R_LARCH_GOT_LO12:
62+
return "got_lo12";
63+
case ELF::R_LARCH_GOT64_LO20:
64+
return "got64_lo20";
65+
case ELF::R_LARCH_GOT64_HI12:
66+
return "got64_hi12";
67+
case ELF::R_LARCH_TLS_LE_HI20:
68+
return "le_hi20";
69+
case ELF::R_LARCH_TLS_LE_LO12:
70+
return "le_lo12";
71+
case ELF::R_LARCH_TLS_LE64_LO20:
72+
return "le64_lo20";
73+
case ELF::R_LARCH_TLS_LE64_HI12:
74+
return "le64_hi12";
75+
case ELF::R_LARCH_TLS_IE_PC_HI20:
76+
return "ie_pc_hi20";
77+
case ELF::R_LARCH_TLS_IE_PC_LO12:
78+
return "ie_pc_lo12";
79+
case ELF::R_LARCH_TLS_IE64_PC_LO20:
80+
return "ie64_pc_lo20";
81+
case ELF::R_LARCH_TLS_IE64_PC_HI12:
82+
return "ie64_pc_hi12";
83+
case ELF::R_LARCH_TLS_IE_HI20:
84+
return "ie_hi20";
85+
case ELF::R_LARCH_TLS_IE_LO12:
86+
return "ie_lo12";
87+
case ELF::R_LARCH_TLS_IE64_LO20:
88+
return "ie64_lo20";
89+
case ELF::R_LARCH_TLS_IE64_HI12:
90+
return "ie64_hi12";
91+
case ELF::R_LARCH_TLS_LD_PC_HI20:
92+
return "ld_pc_hi20";
93+
case ELF::R_LARCH_TLS_LD_HI20:
94+
return "ld_hi20";
95+
case ELF::R_LARCH_TLS_GD_PC_HI20:
96+
return "gd_pc_hi20";
97+
case ELF::R_LARCH_TLS_GD_HI20:
98+
return "gd_hi20";
99+
case ELF::R_LARCH_CALL36:
100+
return "call36";
101+
case ELF::R_LARCH_TLS_DESC_PC_HI20:
102+
return "desc_pc_hi20";
103+
case ELF::R_LARCH_TLS_DESC_PC_LO12:
104+
return "desc_pc_lo12";
105+
case ELF::R_LARCH_TLS_DESC64_PC_LO20:
106+
return "desc64_pc_lo20";
107+
case ELF::R_LARCH_TLS_DESC64_PC_HI12:
108+
return "desc64_pc_hi12";
109+
case ELF::R_LARCH_TLS_DESC_HI20:
110+
return "desc_hi20";
111+
case ELF::R_LARCH_TLS_DESC_LO12:
112+
return "desc_lo12";
113+
case ELF::R_LARCH_TLS_DESC64_LO20:
114+
return "desc64_lo20";
115+
case ELF::R_LARCH_TLS_DESC64_HI12:
116+
return "desc64_hi12";
117+
case ELF::R_LARCH_TLS_DESC_LD:
118+
return "desc_ld";
119+
case ELF::R_LARCH_TLS_DESC_CALL:
120+
return "desc_call";
121+
case ELF::R_LARCH_TLS_LE_HI20_R:
122+
return "le_hi20_r";
123+
case ELF::R_LARCH_TLS_LE_ADD_R:
124+
return "le_add_r";
125+
case ELF::R_LARCH_TLS_LE_LO12_R:
126+
return "le_lo12_r";
127+
case ELF::R_LARCH_PCREL20_S2:
128+
return "pcrel_20";
129+
case ELF::R_LARCH_TLS_LD_PCREL20_S2:
130+
return "ld_pcrel_20";
131+
case ELF::R_LARCH_TLS_GD_PCREL20_S2:
132+
return "gd_pcrel_20";
133+
case ELF::R_LARCH_TLS_DESC_PCREL20_S2:
134+
return "desc_pcrel_20";
135+
}
136+
}
137+
138+
LoongArchMCExpr::Specifier LoongArch::parseSpecifier(StringRef name) {
139+
return StringSwitch<LoongArchMCExpr::Specifier>(name)
140+
.Case("plt", ELF::R_LARCH_B26)
141+
.Case("b16", ELF::R_LARCH_B16)
142+
.Case("b21", ELF::R_LARCH_B21)
143+
.Case("b26", ELF::R_LARCH_B26)
144+
.Case("abs_hi20", ELF::R_LARCH_ABS_HI20)
145+
.Case("abs_lo12", ELF::R_LARCH_ABS_LO12)
146+
.Case("abs64_lo20", ELF::R_LARCH_ABS64_LO20)
147+
.Case("abs64_hi12", ELF::R_LARCH_ABS64_HI12)
148+
.Case("pc_hi20", ELF::R_LARCH_PCALA_HI20)
149+
.Case("pc_lo12", ELF::R_LARCH_PCALA_LO12)
150+
.Case("pc64_lo20", ELF::R_LARCH_PCALA64_LO20)
151+
.Case("pc64_hi12", ELF::R_LARCH_PCALA64_HI12)
152+
.Case("got_pc_hi20", ELF::R_LARCH_GOT_PC_HI20)
153+
.Case("got_pc_lo12", ELF::R_LARCH_GOT_PC_LO12)
154+
.Case("got64_pc_lo20", ELF::R_LARCH_GOT64_PC_LO20)
155+
.Case("got64_pc_hi12", ELF::R_LARCH_GOT64_PC_HI12)
156+
.Case("got_hi20", ELF::R_LARCH_GOT_HI20)
157+
.Case("got_lo12", ELF::R_LARCH_GOT_LO12)
158+
.Case("got64_lo20", ELF::R_LARCH_GOT64_LO20)
159+
.Case("got64_hi12", ELF::R_LARCH_GOT64_HI12)
160+
.Case("le_hi20", ELF::R_LARCH_TLS_LE_HI20)
161+
.Case("le_lo12", ELF::R_LARCH_TLS_LE_LO12)
162+
.Case("le64_lo20", ELF::R_LARCH_TLS_LE64_LO20)
163+
.Case("le64_hi12", ELF::R_LARCH_TLS_LE64_HI12)
164+
.Case("ie_pc_hi20", ELF::R_LARCH_TLS_IE_PC_HI20)
165+
.Case("ie_pc_lo12", ELF::R_LARCH_TLS_IE_PC_LO12)
166+
.Case("ie64_pc_lo20", ELF::R_LARCH_TLS_IE64_PC_LO20)
167+
.Case("ie64_pc_hi12", ELF::R_LARCH_TLS_IE64_PC_HI12)
168+
.Case("ie_hi20", ELF::R_LARCH_TLS_IE_HI20)
169+
.Case("ie_lo12", ELF::R_LARCH_TLS_IE_LO12)
170+
.Case("ie64_lo20", ELF::R_LARCH_TLS_IE64_LO20)
171+
.Case("ie64_hi12", ELF::R_LARCH_TLS_IE64_HI12)
172+
.Case("ld_pc_hi20", ELF::R_LARCH_TLS_LD_PC_HI20)
173+
.Case("ld_hi20", ELF::R_LARCH_TLS_LD_HI20)
174+
.Case("gd_pc_hi20", ELF::R_LARCH_TLS_GD_PC_HI20)
175+
.Case("gd_hi20", ELF::R_LARCH_TLS_GD_HI20)
176+
.Case("call36", ELF::R_LARCH_CALL36)
177+
.Case("desc_pc_hi20", ELF::R_LARCH_TLS_DESC_PC_HI20)
178+
.Case("desc_pc_lo12", ELF::R_LARCH_TLS_DESC_PC_LO12)
179+
.Case("desc64_pc_lo20", ELF::R_LARCH_TLS_DESC64_PC_LO20)
180+
.Case("desc64_pc_hi12", ELF::R_LARCH_TLS_DESC64_PC_HI12)
181+
.Case("desc_hi20", ELF::R_LARCH_TLS_DESC_HI20)
182+
.Case("desc_lo12", ELF::R_LARCH_TLS_DESC_LO12)
183+
.Case("desc64_lo20", ELF::R_LARCH_TLS_DESC64_LO20)
184+
.Case("desc64_hi12", ELF::R_LARCH_TLS_DESC64_HI12)
185+
.Case("desc_ld", ELF::R_LARCH_TLS_DESC_LD)
186+
.Case("desc_call", ELF::R_LARCH_TLS_DESC_CALL)
187+
.Case("le_hi20_r", ELF::R_LARCH_TLS_LE_HI20_R)
188+
.Case("le_add_r", ELF::R_LARCH_TLS_LE_ADD_R)
189+
.Case("le_lo12_r", ELF::R_LARCH_TLS_LE_LO12_R)
190+
.Case("pcrel_20", ELF::R_LARCH_PCREL20_S2)
191+
.Case("ld_pcrel_20", ELF::R_LARCH_TLS_LD_PCREL20_S2)
192+
.Case("gd_pcrel_20", ELF::R_LARCH_TLS_GD_PCREL20_S2)
193+
.Case("desc_pcrel_20", ELF::R_LARCH_TLS_DESC_PCREL20_S2)
194+
.Default(0);
195+
}
196+
22197
void LoongArchMCAsmInfo::anchor() {}
23198

24199
LoongArchMCAsmInfo::LoongArchMCAsmInfo(const Triple &TT) {
@@ -40,7 +215,7 @@ void LoongArchMCAsmInfo::printSpecifierExpr(raw_ostream &OS,
40215
auto S = Expr.getSpecifier();
41216
bool HasSpecifier = S != 0 && S != ELF::R_LARCH_B26;
42217
if (HasSpecifier)
43-
OS << '%' << LoongArch::getSpecifierName(S) << '(';
218+
OS << '%' << getLoongArchSpecifierName(S) << '(';
44219
printExpr(OS, *Expr.getSubExpr());
45220
if (HasSpecifier)
46221
OS << ')';

llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCAsmInfo.h

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,29 @@
1414
#define LLVM_LIB_TARGET_LOONGARCH_MCTARGETDESC_LOONGARCHMCASMINFO_H
1515

1616
#include "llvm/MC/MCAsmInfoELF.h"
17+
#include "llvm/MC/MCExpr.h"
1718

1819
namespace llvm {
1920
class Triple;
21+
class StringRef;
22+
23+
class LoongArchMCExpr : public MCSpecifierExpr {
24+
public:
25+
using Specifier = uint16_t;
26+
enum { VK_None };
27+
28+
private:
29+
const bool RelaxHint;
30+
31+
explicit LoongArchMCExpr(const MCExpr *Expr, Specifier S, bool Hint)
32+
: MCSpecifierExpr(Expr, S), RelaxHint(Hint) {}
33+
34+
public:
35+
static const LoongArchMCExpr *create(const MCExpr *Expr, uint16_t S,
36+
MCContext &Ctx, bool Hint = false);
37+
38+
bool getRelaxHint() const { return RelaxHint; }
39+
};
2040

2141
class LoongArchMCAsmInfo : public MCAsmInfoELF {
2242
void anchor() override;
@@ -28,7 +48,6 @@ class LoongArchMCAsmInfo : public MCAsmInfoELF {
2848
};
2949

3050
namespace LoongArch {
31-
StringRef getSpecifierName(uint16_t S);
3251
uint16_t parseSpecifier(StringRef name);
3352
} // namespace LoongArch
3453

llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCCodeEmitter.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
//===----------------------------------------------------------------------===//
1212

1313
#include "LoongArchFixupKinds.h"
14-
#include "MCTargetDesc/LoongArchMCExpr.h"
14+
#include "MCTargetDesc/LoongArchMCAsmInfo.h"
1515
#include "MCTargetDesc/LoongArchMCTargetDesc.h"
1616
#include "llvm/BinaryFormat/ELF.h"
1717
#include "llvm/MC/MCCodeEmitter.h"

0 commit comments

Comments
 (0)