PR13754: llvm-mc/x86 crashes on .cfi directives without the % prefix for registers.
authorBenjamin Kramer <benny.kra@googlemail.com>
Fri, 7 Sep 2012 14:51:35 +0000 (14:51 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Fri, 7 Sep 2012 14:51:35 +0000 (14:51 +0000)
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

lib/Target/X86/AsmParser/X86AsmParser.cpp
test/MC/ELF/cfi-reg.s [new file with mode: 0644]

index 8a7d6f0c753425e13c6e6984f765eb7057816aed..2d787b6a9a942169ec7d30927b8aef569adb6062 100644 (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)) {
diff --git a/test/MC/ELF/cfi-reg.s b/test/MC/ELF/cfi-reg.s
new file mode 100644 (file)
index 0000000..fd68d6d
--- /dev/null
@@ -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