summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2009-07-02 02:09:07 +0000
committerDaniel Dunbar <daniel@zuster.org>2009-07-02 02:09:07 +0000
commit9bff6531fd344adc7b3ab441aadadbfb3c8c6e7e (patch)
treea61d8b77d6104bc8e983f075d77b28a32695dbda
parent36a20070593d0f48c2b9550e5be1ea90b586d4c3 (diff)
downloadbcm5719-llvm-9bff6531fd344adc7b3ab441aadadbfb3c8c6e7e.tar.gz
bcm5719-llvm-9bff6531fd344adc7b3ab441aadadbfb3c8c6e7e.zip
llvm-mc/x86: Fix bug in disambiguation of displacement operand, introduced by me
(I think). - We weren't properly parsing the leading parenthesized expression in something like 'push (4)(%eax)'. - Added ParseParenRelocatableExpression to support this. I suspect we should just use lookahead, though. - Test case to follow. llvm-svn: 74685
-rw-r--r--llvm/tools/llvm-mc/AsmParser.cpp13
-rw-r--r--llvm/tools/llvm-mc/AsmParser.h10
-rw-r--r--llvm/tools/llvm-mc/MC-X86Specific.cpp2
3 files changed, 24 insertions, 1 deletions
diff --git a/llvm/tools/llvm-mc/AsmParser.cpp b/llvm/tools/llvm-mc/AsmParser.cpp
index 931e460ab16..339a16db8c2 100644
--- a/llvm/tools/llvm-mc/AsmParser.cpp
+++ b/llvm/tools/llvm-mc/AsmParser.cpp
@@ -167,6 +167,19 @@ bool AsmParser::ParseRelocatableExpression(MCValue &Res) {
return false;
}
+bool AsmParser::ParseParenRelocatableExpression(MCValue &Res) {
+ AsmExpr *Expr;
+
+ SMLoc StartLoc = Lexer.getLoc();
+ if (ParseParenExpr(Expr))
+ return true;
+
+ if (!Expr->EvaluateAsRelocatable(Ctx, Res))
+ return Error(StartLoc, "expected relocatable expression");
+
+ return false;
+}
+
static unsigned getBinOpPrecedence(asmtok::TokKind K,
AsmBinaryExpr::Opcode &Kind) {
switch (K) {
diff --git a/llvm/tools/llvm-mc/AsmParser.h b/llvm/tools/llvm-mc/AsmParser.h
index ae5c414c03d..333b284eac9 100644
--- a/llvm/tools/llvm-mc/AsmParser.h
+++ b/llvm/tools/llvm-mc/AsmParser.h
@@ -73,6 +73,16 @@ private:
/// @result - False on success.
bool ParseRelocatableExpression(MCValue &Res);
+ /// ParseParenRelocatableExpression - Parse an expression which must be
+ /// relocatable, assuming that an initial '(' has already been consumed.
+ ///
+ /// @param Res - The relocatable expression value. The result is undefined on
+ /// error.
+ /// @result - False on success.
+ ///
+ /// @see ParseRelocatableExpression, ParseParenExpr.
+ bool ParseParenRelocatableExpression(MCValue &Res);
+
bool ParsePrimaryExpr(AsmExpr *&Res);
bool ParseBinOpRHS(unsigned Precedence, AsmExpr *&Res);
bool ParseParenExpr(AsmExpr *&Res);
diff --git a/llvm/tools/llvm-mc/MC-X86Specific.cpp b/llvm/tools/llvm-mc/MC-X86Specific.cpp
index 71d70804324..a1866186d7e 100644
--- a/llvm/tools/llvm-mc/MC-X86Specific.cpp
+++ b/llvm/tools/llvm-mc/MC-X86Specific.cpp
@@ -152,7 +152,7 @@ bool AsmParser::ParseX86MemOperand(X86Operand &Op) {
// memory operand consumed.
} else {
// It must be an parenthesized expression, parse it now.
- if (ParseRelocatableExpression(Disp))
+ if (ParseParenRelocatableExpression(Disp))
return true;
// After parsing the base expression we could either have a parenthesized
OpenPOWER on IntegriCloud