mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-26 05:00:26 +00:00
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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@74685 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
46b6c5266e
commit
2c3f00cd94
@ -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) {
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user