diff options
author | Jim Grosbach <grosbach@apple.com> | 2011-08-20 16:24:13 +0000 |
---|---|---|
committer | Jim Grosbach <grosbach@apple.com> | 2011-08-20 16:24:13 +0000 |
commit | fbe1681490f4386a351e385129f2c3bce516adbc (patch) | |
tree | b542e4aa9a14239146314d2e06c35b01c326b9a6 | |
parent | 2f4bdc5db92fbf5fd54c3067bb41d47aa3141ddd (diff) | |
download | llvm-fbe1681490f4386a351e385129f2c3bce516adbc.tar.gz llvm-fbe1681490f4386a351e385129f2c3bce516adbc.tar.bz2 llvm-fbe1681490f4386a351e385129f2c3bce516adbc.tar.xz |
Fix AsmParser binary precedence for shift operators.
rdar://9976729
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@138208 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/MC/MCParser/AsmParser.cpp | 37 | ||||
-rw-r--r-- | test/MC/AsmParser/exprs.s | 1 |
2 files changed, 22 insertions, 16 deletions
diff --git a/lib/MC/MCParser/AsmParser.cpp b/lib/MC/MCParser/AsmParser.cpp index b1deed1a35..cd8d2707a8 100644 --- a/lib/MC/MCParser/AsmParser.cpp +++ b/lib/MC/MCParser/AsmParser.cpp @@ -740,9 +740,12 @@ AsmParser::ApplyModifierToExpr(const MCExpr *E, /// ParseExpression - Parse an expression and return it. /// -/// expr ::= expr +,- expr -> lowest. -/// expr ::= expr |,^,&,! expr -> middle. -/// expr ::= expr *,/,%,<<,>> expr -> highest. +/// expr ::= expr &&,|| expr -> lowest. +/// expr ::= expr |,^,&,! expr +/// expr ::= expr ==,!=,<>,<,<=,>,>= expr +/// expr ::= expr <<,>> expr +/// expr ::= expr +,- expr +/// expr ::= expr *,/,% expr -> highest. /// expr ::= primaryexpr /// bool AsmParser::ParseExpression(const MCExpr *&Res, SMLoc &EndLoc) { @@ -809,7 +812,7 @@ static unsigned getBinOpPrecedence(AsmToken::TokenKind K, default: return 0; // not a binop. - // Lowest Precedence: &&, ||, @ + // Lowest Precedence: &&, || case AsmToken::AmpAmp: Kind = MCBinaryExpr::LAnd; return 1; @@ -852,30 +855,32 @@ static unsigned getBinOpPrecedence(AsmToken::TokenKind K, Kind = MCBinaryExpr::GTE; return 3; + // Intermediate Precedence: <<, >> + case AsmToken::LessLess: + Kind = MCBinaryExpr::Shl; + return 4; + case AsmToken::GreaterGreater: + Kind = MCBinaryExpr::Shr; + return 4; + // High Intermediate Precedence: +, - case AsmToken::Plus: Kind = MCBinaryExpr::Add; - return 4; + return 5; case AsmToken::Minus: Kind = MCBinaryExpr::Sub; - return 4; + return 5; - // Highest Precedence: *, /, %, <<, >> + // Highest Precedence: *, /, % case AsmToken::Star: Kind = MCBinaryExpr::Mul; - return 5; + return 6; case AsmToken::Slash: Kind = MCBinaryExpr::Div; - return 5; + return 6; case AsmToken::Percent: Kind = MCBinaryExpr::Mod; - return 5; - case AsmToken::LessLess: - Kind = MCBinaryExpr::Shl; - return 5; - case AsmToken::GreaterGreater: - Kind = MCBinaryExpr::Shr; - return 5; + return 6; } } diff --git a/test/MC/AsmParser/exprs.s b/test/MC/AsmParser/exprs.s index 4d99e212af..df075f85ec 100644 --- a/test/MC/AsmParser/exprs.s +++ b/test/MC/AsmParser/exprs.s @@ -44,6 +44,7 @@ k: check_expr 0 || 1, 1 check_expr 0 || 0, 0 check_expr 1 + 2 < 3 + 4, 1 + check_expr 1 << 8 - 1, 128 .set c, 10 check_expr c + 1, 11 |