[mips] Extend ParseJumpTarget to support the full symbol expression syntax.
authorDaniel Sanders <daniel.sanders@imgtec.com>
Tue, 1 Apr 2014 10:41:48 +0000 (10:41 +0000)
committerDaniel Sanders <daniel.sanders@imgtec.com>
Tue, 1 Apr 2014 10:41:48 +0000 (10:41 +0000)
Summary:
This should fix the issues the D3222 caused in lld. Testcase is based on
the one that failed in the buildbot.

Depends on D3233

Reviewers: matheusalmeida, vmedic

Reviewed By: matheusalmeida

Differential Revision: http://llvm-reviews.chandlerc.com/D3234

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@205298 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/Mips/AsmParser/MipsAsmParser.cpp
test/MC/Mips/sym-expr.s [new file with mode: 0644]

index 12469822f71656f2e70e6f8be0270095363986b1..759a2db2839fd301ce2cd9908d7a2d4f886021ca 100644 (file)
@@ -1868,35 +1868,14 @@ MipsAsmParser::OperandMatchResultTy MipsAsmParser::ParseJumpTarget(
   if (ResTy != MatchOperand_NoMatch)
     return ResTy;
 
-  // Consume the $ if there is one. We'll add it to the symbol below.
-  bool hasConsumedDollar = false;
-  if (getLexer().is(AsmToken::Dollar)) {
-    Parser.Lex();
-    hasConsumedDollar = true;
+  const MCExpr *Expr = nullptr;
+  if (Parser.parseExpression(Expr)) {
+    // We have no way of knowing if a symbol was consumed so we must ParseFail
+    return MatchOperand_ParseFail;
   }
-
-  StringRef Identifier;
-  if (Parser.parseIdentifier(Identifier))
-    return hasConsumedDollar ? MatchOperand_ParseFail : MatchOperand_NoMatch;
-
-  if (hasConsumedDollar)
-    Identifier = StringRef("$" + Identifier.str());
-
-  SMLoc E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1);
-  MCSymbol *Sym = getContext().GetOrCreateSymbol(Identifier);
-
-  // Create a symbol reference.
-  const MCExpr *Res =
-      MCSymbolRefExpr::Create(Sym, MCSymbolRefExpr::VK_None, getContext());
-
-  Operands.push_back(MipsOperand::CreateImm(Res, S, E, *this));
+  Operands.push_back(
+      MipsOperand::CreateImm(Expr, S, getLexer().getLoc(), *this));
   return MatchOperand_Success;
-  //  // Look for the existing symbol, we should check if
-  //  // we need to assign the proper RegisterKind.
-  //  if (searchSymbolAlias(Operands))
-  //    return false;
-
-  return MatchOperand_NoMatch;
 }
 
 MipsAsmParser::OperandMatchResultTy
diff --git a/test/MC/Mips/sym-expr.s b/test/MC/Mips/sym-expr.s
new file mode 100644 (file)
index 0000000..efefb1d
--- /dev/null
@@ -0,0 +1,14 @@
+# Check parsing symbol expressions
+
+# RUN: llvm-mc -triple=mipsel -show-inst-operands %s 2> %t0
+# RUN: FileCheck %s < %t0
+
+    .global __start
+    .ent    __start
+__start:
+    nop
+loc:
+    jal     __start + 0x4       # CHECK: instruction: [jal, Imm<__start+4>]
+    jal     __start + (-0x10)   # CHECK: instruction: [jal, Imm<__start-16>]
+    jal     (__start + (-0x10)) # CHECK: instruction: [jal, Imm<__start-16>]
+    .end    __start