Skip to content

Commit 4ec3c17

Browse files
committed
[llvm][SystemZ] Fix parsing of .cfi_undefined with percent-less registers.
This is just e3d658b applied to SystemZ.
1 parent 0ba006d commit 4ec3c17

File tree

3 files changed

+143
-14
lines changed

3 files changed

+143
-14
lines changed

llvm/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -757,33 +757,37 @@ void SystemZOperand::print(raw_ostream &OS) const {
757757

758758
// Parse one register of the form %<prefix><number>.
759759
bool SystemZAsmParser::parseRegister(Register &Reg, bool RestoreOnFailure) {
760-
Reg.StartLoc = Parser.getTok().getLoc();
761-
762-
// Eat the % prefix.
763-
if (Parser.getTok().isNot(AsmToken::Percent))
764-
return Error(Parser.getTok().getLoc(), "register expected");
765760
const AsmToken &PercentTok = Parser.getTok();
766-
Parser.Lex();
761+
bool HasPercent = PercentTok.is(AsmToken::Percent);
762+
763+
Reg.StartLoc = PercentTok.getLoc();
764+
765+
// If we encounter a %, ignore it. This code handles registers with and
766+
// without the prefix, unprefixed registers can occur in cfi directives.
767+
if (HasPercent) {
768+
Parser.Lex(); // Eat percent token.
769+
}
767770

768771
// Expect a register name.
769772
if (Parser.getTok().isNot(AsmToken::Identifier)) {
770-
if (RestoreOnFailure)
773+
if (RestoreOnFailure && HasPercent)
771774
getLexer().UnLex(PercentTok);
772-
return Error(Reg.StartLoc, "invalid register");
775+
return Error(Reg.StartLoc,
776+
HasPercent ? "invalid register" : "register expected");
773777
}
774778

775779
// Check that there's a prefix.
776780
StringRef Name = Parser.getTok().getString();
777781
if (Name.size() < 2) {
778-
if (RestoreOnFailure)
782+
if (RestoreOnFailure && HasPercent)
779783
getLexer().UnLex(PercentTok);
780784
return Error(Reg.StartLoc, "invalid register");
781785
}
782786
char Prefix = Name[0];
783787

784788
// Treat the rest of the register name as a register number.
785789
if (Name.substr(1).getAsInteger(10, Reg.Num)) {
786-
if (RestoreOnFailure)
790+
if (RestoreOnFailure && HasPercent)
787791
getLexer().UnLex(PercentTok);
788792
return Error(Reg.StartLoc, "invalid register");
789793
}
@@ -800,7 +804,7 @@ bool SystemZAsmParser::parseRegister(Register &Reg, bool RestoreOnFailure) {
800804
else if (Prefix == 'c' && Reg.Num < 16)
801805
Reg.Group = RegCR;
802806
else {
803-
if (RestoreOnFailure)
807+
if (RestoreOnFailure && HasPercent)
804808
getLexer().UnLex(PercentTok);
805809
return Error(Reg.StartLoc, "invalid register");
806810
}

llvm/test/MC/SystemZ/regs-bad.s

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -262,8 +262,6 @@
262262

263263
# Test general register parsing, with no predetermined class in mind.
264264
#
265-
#CHECK: error: register expected
266-
#CHECK: .cfi_offset r0,0
267265
#CHECK: error: invalid register
268266
#CHECK: .cfi_offset %,0
269267
#CHECK: error: invalid register
@@ -289,7 +287,6 @@
289287
#CHECK: error: invalid register
290288
#CHECK: .cfi_offset %arid,0
291289

292-
.cfi_offset r0,0
293290
.cfi_offset %,0
294291
.cfi_offset %r,0
295292
.cfi_offset %f,0

llvm/test/MC/SystemZ/regs-good.s

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,70 @@
176176
st 0, 4095(1,15)
177177
st 0, 4095(15,1)
178178

179+
#CHECK: .cfi_offset %r0, 0
180+
#CHECK: .cfi_offset %r1, 8
181+
#CHECK: .cfi_offset %r2, 16
182+
#CHECK: .cfi_offset %r3, 24
183+
#CHECK: .cfi_offset %r4, 32
184+
#CHECK: .cfi_offset %r5, 40
185+
#CHECK: .cfi_offset %r6, 48
186+
#CHECK: .cfi_offset %r7, 56
187+
#CHECK: .cfi_offset %r8, 64
188+
#CHECK: .cfi_offset %r9, 72
189+
#CHECK: .cfi_offset %r10, 80
190+
#CHECK: .cfi_offset %r11, 88
191+
#CHECK: .cfi_offset %r12, 96
192+
#CHECK: .cfi_offset %r13, 104
193+
#CHECK: .cfi_offset %r14, 112
194+
#CHECK: .cfi_offset %r15, 120
195+
#CHECK: .cfi_offset %f0, 128
196+
#CHECK: .cfi_offset %f1, 136
197+
#CHECK: .cfi_offset %f2, 144
198+
#CHECK: .cfi_offset %f3, 152
199+
#CHECK: .cfi_offset %f4, 160
200+
#CHECK: .cfi_offset %f5, 168
201+
#CHECK: .cfi_offset %f6, 176
202+
#CHECK: .cfi_offset %f7, 184
203+
#CHECK: .cfi_offset %f8, 192
204+
#CHECK: .cfi_offset %f9, 200
205+
#CHECK: .cfi_offset %f10, 208
206+
#CHECK: .cfi_offset %f11, 216
207+
#CHECK: .cfi_offset %f12, 224
208+
#CHECK: .cfi_offset %f13, 232
209+
#CHECK: .cfi_offset %f14, 240
210+
#CHECK: .cfi_offset %f15, 248
211+
#CHECK: .cfi_offset %a0, 256
212+
#CHECK: .cfi_offset %a1, 260
213+
#CHECK: .cfi_offset %a2, 264
214+
#CHECK: .cfi_offset %a3, 268
215+
#CHECK: .cfi_offset %a4, 272
216+
#CHECK: .cfi_offset %a5, 276
217+
#CHECK: .cfi_offset %a6, 280
218+
#CHECK: .cfi_offset %a7, 284
219+
#CHECK: .cfi_offset %a8, 288
220+
#CHECK: .cfi_offset %r9, 292
221+
#CHECK: .cfi_offset %a10, 296
222+
#CHECK: .cfi_offset %a11, 300
223+
#CHECK: .cfi_offset %a12, 304
224+
#CHECK: .cfi_offset %a13, 308
225+
#CHECK: .cfi_offset %a14, 312
226+
#CHECK: .cfi_offset %a15, 316
227+
#CHECK: .cfi_offset %c0, 318
228+
#CHECK: .cfi_offset %c1, 326
229+
#CHECK: .cfi_offset %c2, 334
230+
#CHECK: .cfi_offset %c3, 342
231+
#CHECK: .cfi_offset %c4, 350
232+
#CHECK: .cfi_offset %c5, 358
233+
#CHECK: .cfi_offset %c6, 366
234+
#CHECK: .cfi_offset %c7, 374
235+
#CHECK: .cfi_offset %c8, 382
236+
#CHECK: .cfi_offset %c9, 390
237+
#CHECK: .cfi_offset %c10, 398
238+
#CHECK: .cfi_offset %c11, 406
239+
#CHECK: .cfi_offset %c12, 414
240+
#CHECK: .cfi_offset %c13, 422
241+
#CHECK: .cfi_offset %c14, 430
242+
#CHECK: .cfi_offset %c15, 438
179243
#CHECK: .cfi_offset %r0, 0
180244
#CHECK: .cfi_offset %r1, 8
181245
#CHECK: .cfi_offset %r2, 16
@@ -306,4 +370,68 @@
306370
.cfi_offset %c13,422
307371
.cfi_offset %c14,430
308372
.cfi_offset %c15,438
373+
.cfi_offset r0,0
374+
.cfi_offset r1,8
375+
.cfi_offset r2,16
376+
.cfi_offset r3,24
377+
.cfi_offset r4,32
378+
.cfi_offset r5,40
379+
.cfi_offset r6,48
380+
.cfi_offset r7,56
381+
.cfi_offset r8,64
382+
.cfi_offset r9,72
383+
.cfi_offset r10,80
384+
.cfi_offset r11,88
385+
.cfi_offset r12,96
386+
.cfi_offset r13,104
387+
.cfi_offset r14,112
388+
.cfi_offset r15,120
389+
.cfi_offset f0,128
390+
.cfi_offset f1,136
391+
.cfi_offset f2,144
392+
.cfi_offset f3,152
393+
.cfi_offset f4,160
394+
.cfi_offset f5,168
395+
.cfi_offset f6,176
396+
.cfi_offset f7,184
397+
.cfi_offset f8,192
398+
.cfi_offset f9,200
399+
.cfi_offset f10,208
400+
.cfi_offset f11,216
401+
.cfi_offset f12,224
402+
.cfi_offset f13,232
403+
.cfi_offset f14,240
404+
.cfi_offset f15,248
405+
.cfi_offset a0,256
406+
.cfi_offset a1,260
407+
.cfi_offset a2,264
408+
.cfi_offset a3,268
409+
.cfi_offset a4,272
410+
.cfi_offset a5,276
411+
.cfi_offset a6,280
412+
.cfi_offset a7,284
413+
.cfi_offset a8,288
414+
.cfi_offset r9,292
415+
.cfi_offset a10,296
416+
.cfi_offset a11,300
417+
.cfi_offset a12,304
418+
.cfi_offset a13,308
419+
.cfi_offset a14,312
420+
.cfi_offset a15,316
421+
.cfi_offset c0,318
422+
.cfi_offset c1,326
423+
.cfi_offset c2,334
424+
.cfi_offset c3,342
425+
.cfi_offset c4,350
426+
.cfi_offset c5,358
427+
.cfi_offset c6,366
428+
.cfi_offset c7,374
429+
.cfi_offset c8,382
430+
.cfi_offset c9,390
431+
.cfi_offset c10,398
432+
.cfi_offset c11,406
433+
.cfi_offset c12,414
434+
.cfi_offset c13,422
435+
.cfi_offset c14,430
436+
.cfi_offset c15,438
309437
.cfi_endproc

0 commit comments

Comments
 (0)