Path: blob/main/contrib/llvm-project/llvm/lib/MC/MCParser/MCAsmParser.cpp
35269 views
//===-- MCAsmParser.cpp - Abstract Asm Parser Interface -------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "llvm/MC/MCParser/MCAsmParser.h"9#include "llvm/ADT/StringRef.h"10#include "llvm/ADT/Twine.h"11#include "llvm/Config/llvm-config.h"12#include "llvm/MC/MCParser/MCAsmLexer.h"13#include "llvm/MC/MCParser/MCParsedAsmOperand.h"14#include "llvm/MC/MCParser/MCTargetAsmParser.h"15#include "llvm/Support/CommandLine.h"16#include "llvm/Support/Debug.h"17#include "llvm/Support/SMLoc.h"18#include "llvm/Support/raw_ostream.h"19#include <cassert>2021using namespace llvm;2223namespace llvm {24cl::opt<unsigned> AsmMacroMaxNestingDepth(25"asm-macro-max-nesting-depth", cl::init(20), cl::Hidden,26cl::desc("The maximum nesting depth allowed for assembly macros."));27}2829MCAsmParser::MCAsmParser() = default;3031MCAsmParser::~MCAsmParser() = default;3233void MCAsmParser::setTargetParser(MCTargetAsmParser &P) {34assert(!TargetParser && "Target parser is already initialized!");35TargetParser = &P;36TargetParser->Initialize(*this);37}3839const AsmToken &MCAsmParser::getTok() const {40return getLexer().getTok();41}4243bool MCAsmParser::parseTokenLoc(SMLoc &Loc) {44Loc = getTok().getLoc();45return false;46}4748bool MCAsmParser::parseEOL() {49if (getTok().getKind() != AsmToken::EndOfStatement)50return Error(getTok().getLoc(), "expected newline");51Lex();52return false;53}5455bool MCAsmParser::parseEOL(const Twine &Msg) {56if (getTok().getKind() != AsmToken::EndOfStatement)57return Error(getTok().getLoc(), Msg);58Lex();59return false;60}6162bool MCAsmParser::parseToken(AsmToken::TokenKind T, const Twine &Msg) {63if (T == AsmToken::EndOfStatement)64return parseEOL(Msg);65if (getTok().getKind() != T)66return Error(getTok().getLoc(), Msg);67Lex();68return false;69}7071bool MCAsmParser::parseIntToken(int64_t &V, const Twine &Msg) {72if (getTok().getKind() != AsmToken::Integer)73return TokError(Msg);74V = getTok().getIntVal();75Lex();76return false;77}7879bool MCAsmParser::parseOptionalToken(AsmToken::TokenKind T) {80bool Present = (getTok().getKind() == T);81if (Present)82parseToken(T);83return Present;84}8586bool MCAsmParser::check(bool P, const Twine &Msg) {87return check(P, getTok().getLoc(), Msg);88}8990bool MCAsmParser::check(bool P, SMLoc Loc, const Twine &Msg) {91if (P)92return Error(Loc, Msg);93return false;94}9596bool MCAsmParser::TokError(const Twine &Msg, SMRange Range) {97return Error(getLexer().getLoc(), Msg, Range);98}99100bool MCAsmParser::Error(SMLoc L, const Twine &Msg, SMRange Range) {101MCPendingError PErr;102PErr.Loc = L;103Msg.toVector(PErr.Msg);104PErr.Range = Range;105PendingErrors.push_back(PErr);106107// If we threw this parsing error after a lexing error, this should108// supercede the lexing error and so we remove it from the Lexer109// before it can propagate110if (getTok().is(AsmToken::Error))111getLexer().Lex();112return true;113}114115bool MCAsmParser::addErrorSuffix(const Twine &Suffix) {116// Make sure lexing errors have propagated to the parser.117if (getTok().is(AsmToken::Error))118Lex();119for (auto &PErr : PendingErrors)120Suffix.toVector(PErr.Msg);121return true;122}123124bool MCAsmParser::parseMany(function_ref<bool()> parseOne, bool hasComma) {125if (parseOptionalToken(AsmToken::EndOfStatement))126return false;127while (true) {128if (parseOne())129return true;130if (parseOptionalToken(AsmToken::EndOfStatement))131return false;132if (hasComma && parseToken(AsmToken::Comma))133return true;134}135return false;136}137138bool MCAsmParser::parseExpression(const MCExpr *&Res) {139SMLoc L;140return parseExpression(Res, L);141}142143bool MCAsmParser::parseGNUAttribute(SMLoc L, int64_t &Tag,144int64_t &IntegerValue) {145// Parse a .gnu_attribute with numerical tag and value.146StringRef S(L.getPointer());147SMLoc TagLoc;148TagLoc = getTok().getLoc();149const AsmToken &Tok = getTok();150if (Tok.isNot(AsmToken::Integer))151return false;152Tag = Tok.getIntVal();153Lex(); // Eat the Tag154Lex(); // Eat the comma155if (Tok.isNot(AsmToken::Integer))156return false;157IntegerValue = Tok.getIntVal();158Lex(); // Eat the IntegerValue159return true;160}161162void MCParsedAsmOperand::dump() const {163// Cannot completely remove virtual function even in release mode.164#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)165dbgs() << " " << *this;166#endif167}168169170