forked from OSchip/llvm-project
[Assembler] Add location info to unary expressions.
Summary: This is a continuation of D28861. Add an SMLoc to MCUnaryExpr such that a better diagnostic can be given in case of an error in later stages of assembling. Reviewers: rengolin, grosbach, javed.absar, olista01 Reviewed By: olista01 Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D30581 llvm-svn: 297454
This commit is contained in:
parent
0cc80c1f5a
commit
9dfa6ade4f
|
@ -351,30 +351,30 @@ private:
|
||||||
Opcode Op;
|
Opcode Op;
|
||||||
const MCExpr *Expr;
|
const MCExpr *Expr;
|
||||||
|
|
||||||
MCUnaryExpr(Opcode Op, const MCExpr *Expr)
|
MCUnaryExpr(Opcode Op, const MCExpr *Expr, SMLoc Loc)
|
||||||
: MCExpr(MCExpr::Unary, SMLoc()), Op(Op), Expr(Expr) {}
|
: MCExpr(MCExpr::Unary, Loc), Op(Op), Expr(Expr) {}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/// \name Construction
|
/// \name Construction
|
||||||
/// @{
|
/// @{
|
||||||
|
|
||||||
static const MCUnaryExpr *create(Opcode Op, const MCExpr *Expr,
|
static const MCUnaryExpr *create(Opcode Op, const MCExpr *Expr,
|
||||||
MCContext &Ctx);
|
MCContext &Ctx, SMLoc Loc = SMLoc());
|
||||||
|
|
||||||
static const MCUnaryExpr *createLNot(const MCExpr *Expr, MCContext &Ctx) {
|
static const MCUnaryExpr *createLNot(const MCExpr *Expr, MCContext &Ctx, SMLoc Loc = SMLoc()) {
|
||||||
return create(LNot, Expr, Ctx);
|
return create(LNot, Expr, Ctx, Loc);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const MCUnaryExpr *createMinus(const MCExpr *Expr, MCContext &Ctx) {
|
static const MCUnaryExpr *createMinus(const MCExpr *Expr, MCContext &Ctx, SMLoc Loc = SMLoc()) {
|
||||||
return create(Minus, Expr, Ctx);
|
return create(Minus, Expr, Ctx, Loc);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const MCUnaryExpr *createNot(const MCExpr *Expr, MCContext &Ctx) {
|
static const MCUnaryExpr *createNot(const MCExpr *Expr, MCContext &Ctx, SMLoc Loc = SMLoc()) {
|
||||||
return create(Not, Expr, Ctx);
|
return create(Not, Expr, Ctx, Loc);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const MCUnaryExpr *createPlus(const MCExpr *Expr, MCContext &Ctx) {
|
static const MCUnaryExpr *createPlus(const MCExpr *Expr, MCContext &Ctx, SMLoc Loc = SMLoc()) {
|
||||||
return create(Plus, Expr, Ctx);
|
return create(Plus, Expr, Ctx, Loc);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @}
|
/// @}
|
||||||
|
|
|
@ -152,8 +152,8 @@ const MCBinaryExpr *MCBinaryExpr::create(Opcode Opc, const MCExpr *LHS,
|
||||||
}
|
}
|
||||||
|
|
||||||
const MCUnaryExpr *MCUnaryExpr::create(Opcode Opc, const MCExpr *Expr,
|
const MCUnaryExpr *MCUnaryExpr::create(Opcode Opc, const MCExpr *Expr,
|
||||||
MCContext &Ctx) {
|
MCContext &Ctx, SMLoc Loc) {
|
||||||
return new (Ctx) MCUnaryExpr(Opc, Expr);
|
return new (Ctx) MCUnaryExpr(Opc, Expr, Loc);
|
||||||
}
|
}
|
||||||
|
|
||||||
const MCConstantExpr *MCConstantExpr::create(int64_t Value, MCContext &Ctx) {
|
const MCConstantExpr *MCConstantExpr::create(int64_t Value, MCContext &Ctx) {
|
||||||
|
|
|
@ -924,7 +924,7 @@ bool AsmParser::parsePrimaryExpr(const MCExpr *&Res, SMLoc &EndLoc) {
|
||||||
Lex(); // Eat the operator.
|
Lex(); // Eat the operator.
|
||||||
if (parsePrimaryExpr(Res, EndLoc))
|
if (parsePrimaryExpr(Res, EndLoc))
|
||||||
return true;
|
return true;
|
||||||
Res = MCUnaryExpr::createLNot(Res, getContext());
|
Res = MCUnaryExpr::createLNot(Res, getContext(), FirstTokenLoc);
|
||||||
return false;
|
return false;
|
||||||
case AsmToken::Dollar:
|
case AsmToken::Dollar:
|
||||||
case AsmToken::At:
|
case AsmToken::At:
|
||||||
|
@ -1077,19 +1077,19 @@ bool AsmParser::parsePrimaryExpr(const MCExpr *&Res, SMLoc &EndLoc) {
|
||||||
Lex(); // Eat the operator.
|
Lex(); // Eat the operator.
|
||||||
if (parsePrimaryExpr(Res, EndLoc))
|
if (parsePrimaryExpr(Res, EndLoc))
|
||||||
return true;
|
return true;
|
||||||
Res = MCUnaryExpr::createMinus(Res, getContext());
|
Res = MCUnaryExpr::createMinus(Res, getContext(), FirstTokenLoc);
|
||||||
return false;
|
return false;
|
||||||
case AsmToken::Plus:
|
case AsmToken::Plus:
|
||||||
Lex(); // Eat the operator.
|
Lex(); // Eat the operator.
|
||||||
if (parsePrimaryExpr(Res, EndLoc))
|
if (parsePrimaryExpr(Res, EndLoc))
|
||||||
return true;
|
return true;
|
||||||
Res = MCUnaryExpr::createPlus(Res, getContext());
|
Res = MCUnaryExpr::createPlus(Res, getContext(), FirstTokenLoc);
|
||||||
return false;
|
return false;
|
||||||
case AsmToken::Tilde:
|
case AsmToken::Tilde:
|
||||||
Lex(); // Eat the operator.
|
Lex(); // Eat the operator.
|
||||||
if (parsePrimaryExpr(Res, EndLoc))
|
if (parsePrimaryExpr(Res, EndLoc))
|
||||||
return true;
|
return true;
|
||||||
Res = MCUnaryExpr::createNot(Res, getContext());
|
Res = MCUnaryExpr::createNot(Res, getContext(), FirstTokenLoc);
|
||||||
return false;
|
return false;
|
||||||
// MIPS unary expression operators. The lexer won't generate these tokens if
|
// MIPS unary expression operators. The lexer won't generate these tokens if
|
||||||
// MCAsmInfo::HasMipsExpressions is false for the target.
|
// MCAsmInfo::HasMipsExpressions is false for the target.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// RUN: not llvm-mc -triple aarch64--none-eabi -filetype obj < %s -o /dev/null 2>&1 | FileCheck %s
|
// RUN: not llvm-mc -triple aarch64--none-eabi -filetype obj < %s -o /dev/null 2>&1 | FileCheck %s
|
||||||
|
|
||||||
.set v1, -undef
|
.set v1, -undef
|
||||||
// CHECK: <unknown>:0: error: expression could not be evaluated
|
// CHECK: 3:12: error: expression could not be evaluated
|
||||||
|
|
||||||
.comm common, 4
|
.comm common, 4
|
||||||
.set v3, common
|
.set v3, common
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
@ RUN: not llvm-mc -triple armv7a--none-eabi -filetype obj < %s -o /dev/null 2>&1 | FileCheck %s
|
@ RUN: not llvm-mc -triple armv7a--none-eabi -filetype obj < %s -o /dev/null 2>&1 | FileCheck %s
|
||||||
|
|
||||||
.set v1, -undef
|
.set v1, -undef
|
||||||
@ CHECK: <unknown>:0: error: expression could not be evaluated
|
@ CHECK: 3:12: error: expression could not be evaluated
|
||||||
|
|
||||||
.comm common, 4
|
.comm common, 4
|
||||||
.set v3, common
|
.set v3, common
|
||||||
|
|
Loading…
Reference in New Issue