1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-23 13:02:52 +02:00
llvm-mirror/lib/MC/MCParser/MCAsmParser.cpp
Nirav Dave 66019b69d5 Defer asm errors to post-statement failure
Recommitting after fixing AsmParser initialization and X86 inline asm
error cleanup.

Allow errors to be deferred and emitted as part of clean up to simplify
and shorten Assembly parser code. This will allow error messages to be
emitted in helper functions and be modified by the caller which has
better context.

As part of this many minor cleanups to the Parser:

* Unify parser cleanup on error
* Add Workaround for incorrect return values in ParseDirective instances
* Tighten checks on error-signifying return values for parser functions
  and fix in-tree TargetParsers to be more consistent with the changes.
* Fix AArch64 test cases checking for spurious error messages that are
  now fixed.

These changes should be backwards compatible with current Target Parsers
so long as the error status are correctly returned in appropriate
functions.

Reviewers: rnk, majnemer

Subscribers: aemerson, jyknight, llvm-commits

Differential Revision: https://reviews.llvm.org/D24047

llvm-svn: 281762
2016-09-16 18:30:20 +00:00

111 lines
2.8 KiB
C++

//===-- MCAsmParser.cpp - Abstract Asm Parser Interface -------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "llvm/MC/MCParser/MCAsmParser.h"
#include "llvm/ADT/Twine.h"
#include "llvm/MC/MCParser/MCAsmLexer.h"
#include "llvm/MC/MCParser/MCParsedAsmOperand.h"
#include "llvm/MC/MCParser/MCTargetAsmParser.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/SourceMgr.h"
#include "llvm/Support/raw_ostream.h"
using namespace llvm;
MCAsmParser::MCAsmParser()
: TargetParser(nullptr), ShowParsedOperands(0), HadError(false),
PendingErrors() {}
MCAsmParser::~MCAsmParser() {
}
void MCAsmParser::setTargetParser(MCTargetAsmParser &P) {
assert(!TargetParser && "Target parser is already initialized!");
TargetParser = &P;
TargetParser->Initialize(*this);
}
const AsmToken &MCAsmParser::getTok() const {
return getLexer().getTok();
}
bool MCAsmParser::parseTokenLoc(SMLoc &Loc) {
Loc = getTok().getLoc();
return false;
}
bool MCAsmParser::parseEOL(const Twine &Msg) {
if (getTok().getKind() == AsmToken::Hash) {
StringRef CommentStr = parseStringToEndOfStatement();
getLexer().Lex();
getLexer().UnLex(AsmToken(AsmToken::EndOfStatement, CommentStr));
}
if (getTok().getKind() != AsmToken::EndOfStatement)
return Error(getTok().getLoc(), Msg);
Lex();
return false;
}
bool MCAsmParser::parseToken(AsmToken::TokenKind T, const Twine &Msg) {
if (T == AsmToken::EndOfStatement)
return parseEOL(Msg);
if (getTok().getKind() != T)
return Error(getTok().getLoc(), Msg);
Lex();
return false;
}
bool MCAsmParser::parseIntToken(int64_t &V, const Twine &Msg) {
if (getTok().getKind() != AsmToken::Integer)
return TokError(Msg);
V = getTok().getIntVal();
Lex();
return false;
}
bool MCAsmParser::parseOptionalToken(AsmToken::TokenKind T, bool &Present) {
Present = (getTok().getKind() == T);
if (Present)
Lex();
return false;
}
bool MCAsmParser::check(bool P, const Twine &Msg) {
return check(P, getTok().getLoc(), Msg);
}
bool MCAsmParser::check(bool P, SMLoc Loc, const Twine &Msg) {
if (P)
return Error(Loc, Msg);
return false;
}
bool MCAsmParser::TokError(const Twine &Msg, SMRange Range) {
return Error(getLexer().getLoc(), Msg, Range);
}
bool MCAsmParser::Error(SMLoc L, const Twine &Msg, SMRange Range) {
HadError = true;
MCPendingError PErr;
PErr.Loc = L;
Msg.toVector(PErr.Msg);
PErr.Range = Range;
PendingErrors.push_back(PErr);
return true;
}
bool MCAsmParser::parseExpression(const MCExpr *&Res) {
SMLoc L;
return parseExpression(Res, L);
}
LLVM_DUMP_METHOD void MCParsedAsmOperand::dump() const {
dbgs() << " " << *this;
}