[PATCH] D37476: [mips] Partially fix PR34391

Simon Dardis via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Sep 20 14:46:38 PDT 2017


sdardis updated this revision to Diff 116078.
sdardis retitled this revision from "[mips] Fix PR34391" to "[mips] Partially fix PR34391".
sdardis edited the summary of this revision.
sdardis added a comment.
This revision is now accepted and ready to land.

Address failures by handling non-constants in the parser. Also handle the differences between register names/symbols between ABIs.


https://reviews.llvm.org/D37476

Files:
  lib/Target/Mips/AsmParser/MipsAsmParser.cpp
  test/MC/Mips/macro-aliases-invalid.s
  test/MC/Mips/macro-aliases.s


Index: test/MC/Mips/macro-aliases.s
===================================================================
--- /dev/null
+++ test/MC/Mips/macro-aliases.s
@@ -0,0 +1,35 @@
+# RUN: llvm-mc -arch=mips -mcpu=mips32r2 %s -show-inst | FileCheck %s
+
+# Test that subu accepts constant operands and inverts them when
+# rendering the operand.
+
+  subu  $4, $4, 4          # CHECK: ADDiu
+                           # CHECK; Imm:-4
+  subu  $gp, $gp, 4        # CHECK: ADDiu
+                           # CHECK; Imm:-4
+  subu  $sp, $sp, 4        # CHECK: ADDiu
+                           # CHECK; Imm:-4
+  subu  $4, $4, -4         # CHECK: ADDiu
+                           # CHECK; Imm:4
+  subu  $gp, $gp, -4       # CHECK: ADDiu
+                           # CHECK; Imm:4
+  subu  $sp, $sp, -4       # CHECK: ADDiu
+                           # CHECK; Imm:4
+  subu  $sp, $sp, -(4 + 4) # CHECK: ADDiu
+                           # CHECK: Imm:8
+
+  subu  $4, 8              # CHECK: ADDiu
+                           # CHECK; Imm:-8
+  subu  $gp, 8             # CHECK: ADDiu
+                           # CHECK; Imm:-8
+  subu  $sp, 8             # CHECK: ADDiu
+                           # CHECK; Imm:-8
+  subu  $4, -8             # CHECK: ADDiu
+                           # CHECK; Imm:8
+  subu  $gp, -8            # CHECK: ADDiu
+                           # CHECK; Imm:8
+  subu  $sp, -8            # CHECK: ADDiu
+                           # CHECK; Imm:8
+  subu  $sp, -(4 + 4)      # CHECK: ADDiu
+                           # CHECK: Imm:8
+
Index: test/MC/Mips/macro-aliases-invalid.s
===================================================================
--- /dev/null
+++ test/MC/Mips/macro-aliases-invalid.s
@@ -0,0 +1,21 @@
+# RUN: not llvm-mc -arch=mips -mcpu=mips32r2 %s 2>%t1
+# RUN: FileCheck %s < %t1
+
+# Check that subu only rejects any non-constant values.
+
+.globl end
+  subu  $4, $4, %lo($start)   # CHECK: error: invalid operand for instruction
+  subu  $4, $4, $start        # CHECK: error: invalid operand for instruction
+  subu  $4, $4, %hi(end)      # CHECK: error: invalid operand for instruction
+  subu  $4, $4, end + 4       # CHECK: error: invalid operand for instruction
+  subu  $4, $4, end           # CHECK: error: invalid operand for instruction
+  subu  $4, $4, sp            # CHECK: error: invalid operand for instruction
+
+  subu  $4, %lo($start)       # CHECK: error: invalid operand for instruction
+  subu  $4, $start            # CHECK: error: invalid operand for instruction
+  subu  $4, %hi(end)          # CHECK: error: invalid operand for instruction
+  subu  $4, end + 4           # CHECK: error: invalid operand for instruction
+  subu  $4, end               # CHECK: error: invalid operand for instruction
+  subu  $4, sp                # CHECK: error: invalid operand for instruction
+
+$start:
Index: lib/Target/Mips/AsmParser/MipsAsmParser.cpp
===================================================================
--- lib/Target/Mips/AsmParser/MipsAsmParser.cpp
+++ lib/Target/Mips/AsmParser/MipsAsmParser.cpp
@@ -5859,14 +5859,21 @@
 MipsAsmParser::parseInvNum(OperandVector &Operands) {
   MCAsmParser &Parser = getParser();
   const MCExpr *IdVal;
-  // If the first token is '$' we may have register operand.
-  if (Parser.getTok().is(AsmToken::Dollar))
-    return MatchOperand_NoMatch;
+  // If the first token is '$' we may have register operand. We have to reject
+  // cases where it is not a register. Complicating the matter is that
+  // register names are not reserved across all ABIs.
+  // Peek past the dollar to see if it's a register name for this ABI.
   SMLoc S = Parser.getTok().getLoc();
+  if (Parser.getTok().is(AsmToken::Dollar)) {
+    return matchCPURegisterName(Parser.getLexer().peekTok().getString()) == -1
+               ? MatchOperand_ParseFail
+               : MatchOperand_NoMatch;
+  }
   if (getParser().parseExpression(IdVal))
     return MatchOperand_ParseFail;
   const MCConstantExpr *MCE = dyn_cast<MCConstantExpr>(IdVal);
-  assert(MCE && "Unexpected MCExpr type.");
+  if (!MCE)
+    return MatchOperand_ParseFail;
   int64_t Val = MCE->getValue();
   SMLoc E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1);
   Operands.push_back(MipsOperand::CreateImm(


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D37476.116078.patch
Type: text/x-patch
Size: 4273 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170920/d772980e/attachment.bin>


More information about the llvm-commits mailing list