PR13754: llvm-mc/x86 crashes on .cfi directives without the % prefix for registers.

gas accepts this and it seems to be common enough to be worth supporting. This
doesn't affect the parsing of reg operands outside of .cfi directives.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@163390 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Benjamin Kramer 2012-09-07 14:51:35 +00:00
parent 38539ebc2b
commit 8e70b5506e
2 changed files with 24 additions and 5 deletions

View File

@ -521,12 +521,13 @@ bool X86AsmParser::isDstOp(X86Operand &Op) {
bool X86AsmParser::ParseRegister(unsigned &RegNo,
SMLoc &StartLoc, SMLoc &EndLoc) {
RegNo = 0;
if (!isParsingIntelSyntax()) {
const AsmToken &TokPercent = Parser.getTok();
assert(TokPercent.is(AsmToken::Percent) && "Invalid token kind!");
StartLoc = TokPercent.getLoc();
const AsmToken &PercentTok = Parser.getTok();
StartLoc = PercentTok.getLoc();
// If we encounter a %, ignore it. This code handles registers with and
// without the prefix, unprefixed registers can occur in cfi directives.
if (!isParsingIntelSyntax() && PercentTok.is(AsmToken::Percent))
Parser.Lex(); // Eat percent token.
}
const AsmToken &Tok = Parser.getTok();
if (Tok.isNot(AsmToken::Identifier)) {

18
test/MC/ELF/cfi-reg.s Normal file
View File

@ -0,0 +1,18 @@
// RUN: llvm-mc -triple x86_64-pc-linux-gnu %s -o - | FileCheck %s
// PR13754
f:
.cfi_startproc
nop
.cfi_offset 6, -16
nop
.cfi_offset %rsi, -16
nop
.cfi_offset rbx, -16
nop
.cfi_endproc
// CHECK: f:
// CHECK: .cfi_offset %rbp, -16
// CHECK: .cfi_offset %rsi, -16
// CHECK: .cfi_offset %rbx, -16