Skip to content

Commit 3f1e7ef

Browse files
authored
[LoongArch] Support parsing register names in CFI instructions
Reviewed By: MQ-mengqing, heiher, xen0n Pull Request: #117120
1 parent 105ecd8 commit 3f1e7ef

File tree

2 files changed

+50
-14
lines changed

2 files changed

+50
-14
lines changed

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

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -669,13 +669,33 @@ static bool matchRegisterNameHelper(MCRegister &RegNo, StringRef Name) {
669669

670670
bool LoongArchAsmParser::parseRegister(MCRegister &Reg, SMLoc &StartLoc,
671671
SMLoc &EndLoc) {
672-
return Error(getLoc(), "invalid register number");
672+
if (!tryParseRegister(Reg, StartLoc, EndLoc).isSuccess())
673+
return Error(getLoc(), "invalid register name");
674+
675+
if (!LoongArchMCRegisterClasses[LoongArch::GPRRegClassID].contains(Reg) &&
676+
!LoongArchMCRegisterClasses[LoongArch::FPR32RegClassID].contains(Reg))
677+
return Error(getLoc(), "invalid register name");
678+
679+
return false;
673680
}
674681

675682
ParseStatus LoongArchAsmParser::tryParseRegister(MCRegister &Reg,
676683
SMLoc &StartLoc,
677684
SMLoc &EndLoc) {
678-
llvm_unreachable("Unimplemented function.");
685+
const AsmToken &Tok = getParser().getTok();
686+
StartLoc = Tok.getLoc();
687+
EndLoc = Tok.getEndLoc();
688+
689+
parseOptionalToken(AsmToken::Dollar);
690+
if (getLexer().getKind() != AsmToken::Identifier)
691+
return ParseStatus::NoMatch;
692+
693+
StringRef Name = Tok.getIdentifier();
694+
if (matchRegisterNameHelper(Reg, Name))
695+
return ParseStatus::NoMatch;
696+
697+
getParser().Lex(); // Eat identifier token.
698+
return ParseStatus::Success;
679699
}
680700

681701
bool LoongArchAsmParser::classifySymbolRef(const MCExpr *Expr,
Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
## Test cfi directives.
22

3-
# RUN: llvm-mc %s --triple=loongarch32 | FileCheck %s
4-
# RUN: llvm-mc %s --triple=loongarch64 | FileCheck %s
5-
# RUN: not llvm-mc --triple=loongarch32 --defsym=ERR=1 < %s 2>&1 \
3+
# RUN: llvm-mc %s --triple=loongarch32 --mattr=+lasx | FileCheck %s
4+
# RUN: llvm-mc %s --triple=loongarch64 --mattr=+lasx | FileCheck %s
5+
# RUN: not llvm-mc --triple=loongarch32 --mattr=+lasx --defsym=ERR=1 < %s 2>&1 \
66
# RUN: | FileCheck %s --check-prefix=CHECK-ERR
7-
# RUN: not llvm-mc --triple=loongarch64 --defsym=ERR=1 < %s 2>&1 \
7+
# RUN: not llvm-mc --triple=loongarch64 --mattr=+lasx --defsym=ERR=1 < %s 2>&1 \
88
# RUN: | FileCheck %s --check-prefix=CHECK-ERR
99

1010
# CHECK: .cfi_startproc
@@ -15,20 +15,36 @@
1515
.cfi_offset 9, 8
1616
# CHECK-NEXT: .cfi_offset 31, 16
1717
.cfi_offset 31, 16
18+
# CHECK-NEXT: .cfi_offset 22, -8
19+
.cfi_offset r22, -8
20+
# CHECK-NEXT: .cfi_offset 22, -8
21+
.cfi_offset $r22, -8
22+
# CHECK-NEXT: .cfi_offset 22, -8
23+
.cfi_offset fp, -8
24+
# CHECK-NEXT: .cfi_offset 22, -8
25+
.cfi_offset $fp, -8
26+
# CHECK-NEXT: .cfi_offset 42, 8
27+
.cfi_offset f10, 8
28+
# CHECK-NEXT: .cfi_offset 56, 8
29+
.cfi_offset fs0, 8
1830
# CHECK-NEXT: .cfi_endproc
1931
.cfi_endproc
2032

2133
.ifdef ERR
2234
.cfi_startproc
23-
# CHECK-ERR: :[[#@LINE+1]]:13: error: invalid register number
35+
# CHECK-ERR: :[[#@LINE+1]]:13: error: invalid register name
2436
.cfi_offset -22, -8
25-
# CHECK-ERR: :[[#@LINE+1]]:13: error: invalid register number
26-
.cfi_offset fp, -8
27-
# CHECK-ERR: :[[#@LINE+1]]:13: error: invalid register number
37+
# CHECK-ERR: :[[#@LINE+1]]:13: error: invalid register name
38+
.cfi_offset lr, -8
39+
# CHECK-ERR: :[[#@LINE+1]]:13: error: invalid register name
40+
.cfi_offset r32, -8
41+
# CHECK-ERR: :[[#@LINE+1]]:14: error: invalid register name
42+
.cfi_offset $r32, -8
43+
# CHECK-ERR: :[[#@LINE+1]]:14: error: invalid register name
2844
.cfi_offset $22, -8
29-
# CHECK-ERR: :[[#@LINE+1]]:13: error: invalid register number
30-
.cfi_offset $r22, -8
31-
# CHECK-ERR: :[[#@LINE+1]]:13: error: invalid register number
32-
.cfi_offset $fp, -8
45+
# CHECK-ERR: :[[#@LINE+1]]:16: error: invalid register name
46+
.cfi_offset vr0, 8
47+
# CHECK-ERR: :[[#@LINE+1]]:16: error: invalid register name
48+
.cfi_offset xr0, 8
3349
.cfi_endproc
3450
.endif

0 commit comments

Comments
 (0)