Skip to content

Commit 25ca9e1

Browse files
committed
Merging r369097:
------------------------------------------------------------------------ r369097 | lewis-revill | 2019-08-16 14:00:56 +0200 (Fri, 16 Aug 2019) | 8 lines [RISCV] Allow parsing of bare symbols with offsets This patch allows symbols followed by an expression for an offset to be parsed as bare symbols. Differential Revision: https://reviews.llvm.org/D57332 ------------------------------------------------------------------------ llvm-svn: 369338
1 parent 0a24543 commit 25ca9e1

File tree

2 files changed

+85
-62
lines changed

2 files changed

+85
-62
lines changed

llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1208,6 +1208,24 @@ OperandMatchResultTy RISCVAsmParser::parseBareSymbol(OperandVector &Operands) {
12081208
Res = V;
12091209
} else
12101210
Res = MCSymbolRefExpr::create(Sym, MCSymbolRefExpr::VK_None, getContext());
1211+
1212+
MCBinaryExpr::Opcode Opcode;
1213+
switch (getLexer().getKind()) {
1214+
default:
1215+
Operands.push_back(RISCVOperand::createImm(Res, S, E, isRV64()));
1216+
return MatchOperand_Success;
1217+
case AsmToken::Plus:
1218+
Opcode = MCBinaryExpr::Add;
1219+
break;
1220+
case AsmToken::Minus:
1221+
Opcode = MCBinaryExpr::Sub;
1222+
break;
1223+
}
1224+
1225+
const MCExpr *Expr;
1226+
if (getParser().parseExpression(Expr))
1227+
return MatchOperand_ParseFail;
1228+
Res = MCBinaryExpr::create(Opcode, Res, Expr, getContext());
12111229
Operands.push_back(RISCVOperand::createImm(Res, S, E, isRV64()));
12121230
return MatchOperand_Success;
12131231
}

llvm/test/MC/RISCV/rvi-pseudos.s

Lines changed: 67 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -34,145 +34,150 @@ lla a3, ra
3434
lla a4, f1
3535

3636
# CHECK: .Lpcrel_hi5:
37+
# CHECK: auipc a5, %pcrel_hi(a_symbol+2040)
38+
# CHECK: addi a5, a5, %pcrel_lo(.Lpcrel_hi5)
39+
lla a5, a_symbol + (0xFF << 3)
40+
41+
# CHECK: .Lpcrel_hi6:
3742
# CHECK-NOPIC: auipc a0, %pcrel_hi(a_symbol)
38-
# CHECK-NOPIC: addi a0, a0, %pcrel_lo(.Lpcrel_hi5)
43+
# CHECK-NOPIC: addi a0, a0, %pcrel_lo(.Lpcrel_hi6)
3944
# CHECK-PIC: auipc a0, %got_pcrel_hi(a_symbol)
40-
# CHECK-PIC-RV32: lw a0, %pcrel_lo(.Lpcrel_hi5)(a0)
41-
# CHECK-PIC-RV64: ld a0, %pcrel_lo(.Lpcrel_hi5)(a0)
45+
# CHECK-PIC-RV32: lw a0, %pcrel_lo(.Lpcrel_hi6)(a0)
46+
# CHECK-PIC-RV64: ld a0, %pcrel_lo(.Lpcrel_hi6)(a0)
4247
la a0, a_symbol
4348

44-
# CHECK: .Lpcrel_hi6:
49+
# CHECK: .Lpcrel_hi7:
4550
# CHECK-NOPIC: auipc a1, %pcrel_hi(another_symbol)
46-
# CHECK-NOPIC: addi a1, a1, %pcrel_lo(.Lpcrel_hi6)
51+
# CHECK-NOPIC: addi a1, a1, %pcrel_lo(.Lpcrel_hi7)
4752
# CHECK-PIC: auipc a1, %got_pcrel_hi(another_symbol)
48-
# CHECK-PIC-RV32: lw a1, %pcrel_lo(.Lpcrel_hi6)(a1)
49-
# CHECK-PIC-RV64: ld a1, %pcrel_lo(.Lpcrel_hi6)(a1)
53+
# CHECK-PIC-RV32: lw a1, %pcrel_lo(.Lpcrel_hi7)(a1)
54+
# CHECK-PIC-RV64: ld a1, %pcrel_lo(.Lpcrel_hi7)(a1)
5055
la a1, another_symbol
5156

5257
# Check that we can load the address of symbols that are spelled like a register
53-
# CHECK: .Lpcrel_hi7:
58+
# CHECK: .Lpcrel_hi8:
5459
# CHECK-NOPIC: auipc a2, %pcrel_hi(zero)
55-
# CHECK-NOPIC: addi a2, a2, %pcrel_lo(.Lpcrel_hi7)
60+
# CHECK-NOPIC: addi a2, a2, %pcrel_lo(.Lpcrel_hi8)
5661
# CHECK-PIC: auipc a2, %got_pcrel_hi(zero)
57-
# CHECK-PIC-RV32: lw a2, %pcrel_lo(.Lpcrel_hi7)(a2)
58-
# CHECK-PIC-RV64: ld a2, %pcrel_lo(.Lpcrel_hi7)(a2)
62+
# CHECK-PIC-RV32: lw a2, %pcrel_lo(.Lpcrel_hi8)(a2)
63+
# CHECK-PIC-RV64: ld a2, %pcrel_lo(.Lpcrel_hi8)(a2)
5964
la a2, zero
6065

61-
# CHECK: .Lpcrel_hi8:
66+
# CHECK: .Lpcrel_hi9:
6267
# CHECK-NOPIC: auipc a3, %pcrel_hi(ra)
63-
# CHECK-NOPIC: addi a3, a3, %pcrel_lo(.Lpcrel_hi8)
68+
# CHECK-NOPIC: addi a3, a3, %pcrel_lo(.Lpcrel_hi9)
6469
# CHECK-PIC: auipc a3, %got_pcrel_hi(ra)
65-
# CHECK-PIC-RV32: lw a3, %pcrel_lo(.Lpcrel_hi8)(a3)
66-
# CHECK-PIC-RV64: ld a3, %pcrel_lo(.Lpcrel_hi8)(a3)
70+
# CHECK-PIC-RV32: lw a3, %pcrel_lo(.Lpcrel_hi9)(a3)
71+
# CHECK-PIC-RV64: ld a3, %pcrel_lo(.Lpcrel_hi9)(a3)
6772
la a3, ra
6873

69-
# CHECK: .Lpcrel_hi9:
74+
# CHECK: .Lpcrel_hi10:
7075
# CHECK-NOPIC: auipc a4, %pcrel_hi(f1)
71-
# CHECK-NOPIC: addi a4, a4, %pcrel_lo(.Lpcrel_hi9)
76+
# CHECK-NOPIC: addi a4, a4, %pcrel_lo(.Lpcrel_hi10)
7277
# CHECK-PIC: auipc a4, %got_pcrel_hi(f1)
73-
# CHECK-PIC-RV32: lw a4, %pcrel_lo(.Lpcrel_hi9)(a4)
74-
# CHECK-PIC-RV64: ld a4, %pcrel_lo(.Lpcrel_hi9)(a4)
78+
# CHECK-PIC-RV32: lw a4, %pcrel_lo(.Lpcrel_hi10)(a4)
79+
# CHECK-PIC-RV64: ld a4, %pcrel_lo(.Lpcrel_hi10)(a4)
7580
la a4, f1
7681

77-
# CHECK: .Lpcrel_hi10:
82+
# CHECK: .Lpcrel_hi11:
7883
# CHECK: auipc a0, %tls_ie_pcrel_hi(a_symbol)
79-
# CHECK-RV32: lw a0, %pcrel_lo(.Lpcrel_hi10)(a0)
80-
# CHECK-RV64: ld a0, %pcrel_lo(.Lpcrel_hi10)(a0)
84+
# CHECK-RV32: lw a0, %pcrel_lo(.Lpcrel_hi11)(a0)
85+
# CHECK-RV64: ld a0, %pcrel_lo(.Lpcrel_hi11)(a0)
8186
la.tls.ie a0, a_symbol
8287

83-
# CHECK: .Lpcrel_hi11:
88+
# CHECK: .Lpcrel_hi12:
8489
# CHECK: auipc a1, %tls_ie_pcrel_hi(another_symbol)
85-
# CHECK-RV32: lw a1, %pcrel_lo(.Lpcrel_hi11)(a1)
86-
# CHECK-RV64: ld a1, %pcrel_lo(.Lpcrel_hi11)(a1)
90+
# CHECK-RV32: lw a1, %pcrel_lo(.Lpcrel_hi12)(a1)
91+
# CHECK-RV64: ld a1, %pcrel_lo(.Lpcrel_hi12)(a1)
8792
la.tls.ie a1, another_symbol
8893

8994
# Check that we can load the address of symbols that are spelled like a register
90-
# CHECK: .Lpcrel_hi12:
95+
# CHECK: .Lpcrel_hi13:
9196
# CHECK: auipc a2, %tls_ie_pcrel_hi(zero)
92-
# CHECK-RV32: lw a2, %pcrel_lo(.Lpcrel_hi12)(a2)
93-
# CHECK-RV64: ld a2, %pcrel_lo(.Lpcrel_hi12)(a2)
97+
# CHECK-RV32: lw a2, %pcrel_lo(.Lpcrel_hi13)(a2)
98+
# CHECK-RV64: ld a2, %pcrel_lo(.Lpcrel_hi13)(a2)
9499
la.tls.ie a2, zero
95100

96-
# CHECK: .Lpcrel_hi13:
101+
# CHECK: .Lpcrel_hi14:
97102
# CHECK: auipc a3, %tls_ie_pcrel_hi(ra)
98-
# CHECK-RV32: lw a3, %pcrel_lo(.Lpcrel_hi13)(a3)
99-
# CHECK-RV64: ld a3, %pcrel_lo(.Lpcrel_hi13)(a3)
103+
# CHECK-RV32: lw a3, %pcrel_lo(.Lpcrel_hi14)(a3)
104+
# CHECK-RV64: ld a3, %pcrel_lo(.Lpcrel_hi14)(a3)
100105
la.tls.ie a3, ra
101106

102-
# CHECK: .Lpcrel_hi14:
107+
# CHECK: .Lpcrel_hi15:
103108
# CHECK: auipc a4, %tls_ie_pcrel_hi(f1)
104-
# CHECK-RV32: lw a4, %pcrel_lo(.Lpcrel_hi14)(a4)
105-
# CHECK-RV64: ld a4, %pcrel_lo(.Lpcrel_hi14)(a4)
109+
# CHECK-RV32: lw a4, %pcrel_lo(.Lpcrel_hi15)(a4)
110+
# CHECK-RV64: ld a4, %pcrel_lo(.Lpcrel_hi15)(a4)
106111
la.tls.ie a4, f1
107112

108-
# CHECK: .Lpcrel_hi15:
113+
# CHECK: .Lpcrel_hi16:
109114
# CHECK: auipc a0, %tls_gd_pcrel_hi(a_symbol)
110-
# CHECK: addi a0, a0, %pcrel_lo(.Lpcrel_hi15)
115+
# CHECK: addi a0, a0, %pcrel_lo(.Lpcrel_hi16)
111116
la.tls.gd a0, a_symbol
112117

113-
# CHECK: .Lpcrel_hi16:
118+
# CHECK: .Lpcrel_hi17:
114119
# CHECK: auipc a1, %tls_gd_pcrel_hi(another_symbol)
115-
# CHECK: addi a1, a1, %pcrel_lo(.Lpcrel_hi16)
120+
# CHECK: addi a1, a1, %pcrel_lo(.Lpcrel_hi17)
116121
la.tls.gd a1, another_symbol
117122

118123
# Check that we can load the address of symbols that are spelled like a register
119-
# CHECK: .Lpcrel_hi17:
124+
# CHECK: .Lpcrel_hi18:
120125
# CHECK: auipc a2, %tls_gd_pcrel_hi(zero)
121-
# CHECK: addi a2, a2, %pcrel_lo(.Lpcrel_hi17)
126+
# CHECK: addi a2, a2, %pcrel_lo(.Lpcrel_hi18)
122127
la.tls.gd a2, zero
123128

124-
# CHECK: .Lpcrel_hi18:
129+
# CHECK: .Lpcrel_hi19:
125130
# CHECK: auipc a3, %tls_gd_pcrel_hi(ra)
126-
# CHECK: addi a3, a3, %pcrel_lo(.Lpcrel_hi18)
131+
# CHECK: addi a3, a3, %pcrel_lo(.Lpcrel_hi19)
127132
la.tls.gd a3, ra
128133

129-
# CHECK: .Lpcrel_hi19:
134+
# CHECK: .Lpcrel_hi20:
130135
# CHECK: auipc a4, %tls_gd_pcrel_hi(f1)
131-
# CHECK: addi a4, a4, %pcrel_lo(.Lpcrel_hi19)
136+
# CHECK: addi a4, a4, %pcrel_lo(.Lpcrel_hi20)
132137
la.tls.gd a4, f1
133138

134-
# CHECK: .Lpcrel_hi20:
139+
# CHECK: .Lpcrel_hi21:
135140
# CHECK: auipc a0, %pcrel_hi(a_symbol)
136-
# CHECK: lb a0, %pcrel_lo(.Lpcrel_hi20)(a0)
141+
# CHECK: lb a0, %pcrel_lo(.Lpcrel_hi21)(a0)
137142
lb a0, a_symbol
138143

139-
# CHECK: .Lpcrel_hi21:
144+
# CHECK: .Lpcrel_hi22:
140145
# CHECK: auipc a1, %pcrel_hi(a_symbol)
141-
# CHECK: lh a1, %pcrel_lo(.Lpcrel_hi21)(a1)
146+
# CHECK: lh a1, %pcrel_lo(.Lpcrel_hi22)(a1)
142147
lh a1, a_symbol
143148

144-
# CHECK: .Lpcrel_hi22:
149+
# CHECK: .Lpcrel_hi23:
145150
# CHECK: auipc a2, %pcrel_hi(a_symbol)
146-
# CHECK: lhu a2, %pcrel_lo(.Lpcrel_hi22)(a2)
151+
# CHECK: lhu a2, %pcrel_lo(.Lpcrel_hi23)(a2)
147152
lhu a2, a_symbol
148153

149-
# CHECK: .Lpcrel_hi23:
154+
# CHECK: .Lpcrel_hi24:
150155
# CHECK: auipc a3, %pcrel_hi(a_symbol)
151-
# CHECK: lw a3, %pcrel_lo(.Lpcrel_hi23)(a3)
156+
# CHECK: lw a3, %pcrel_lo(.Lpcrel_hi24)(a3)
152157
lw a3, a_symbol
153158

154-
# CHECK: .Lpcrel_hi24:
159+
# CHECK: .Lpcrel_hi25:
155160
# CHECK: auipc a4, %pcrel_hi(a_symbol)
156-
# CHECK: sb a3, %pcrel_lo(.Lpcrel_hi24)(a4)
161+
# CHECK: sb a3, %pcrel_lo(.Lpcrel_hi25)(a4)
157162
sb a3, a_symbol, a4
158163

159-
# CHECK: .Lpcrel_hi25:
164+
# CHECK: .Lpcrel_hi26:
160165
# CHECK: auipc a4, %pcrel_hi(a_symbol)
161-
# CHECK: sh a3, %pcrel_lo(.Lpcrel_hi25)(a4)
166+
# CHECK: sh a3, %pcrel_lo(.Lpcrel_hi26)(a4)
162167
sh a3, a_symbol, a4
163168

164-
# CHECK: .Lpcrel_hi26:
169+
# CHECK: .Lpcrel_hi27:
165170
# CHECK: auipc a4, %pcrel_hi(a_symbol)
166-
# CHECK: sw a3, %pcrel_lo(.Lpcrel_hi26)(a4)
171+
# CHECK: sw a3, %pcrel_lo(.Lpcrel_hi27)(a4)
167172
sw a3, a_symbol, a4
168173

169174
# Check that we can load the address of symbols that are spelled like a register
170-
# CHECK: .Lpcrel_hi27:
175+
# CHECK: .Lpcrel_hi28:
171176
# CHECK: auipc a2, %pcrel_hi(zero)
172-
# CHECK: lw a2, %pcrel_lo(.Lpcrel_hi27)(a2)
177+
# CHECK: lw a2, %pcrel_lo(.Lpcrel_hi28)(a2)
173178
lw a2, zero
174179

175-
# CHECK: .Lpcrel_hi28:
180+
# CHECK: .Lpcrel_hi29:
176181
# CHECK: auipc a4, %pcrel_hi(zero)
177-
# CHECK: sw a3, %pcrel_lo(.Lpcrel_hi28)(a4)
182+
# CHECK: sw a3, %pcrel_lo(.Lpcrel_hi29)(a4)
178183
sw a3, zero, a4

0 commit comments

Comments
 (0)