1//===-- MCTargetAsmParser.cpp - Target Assembly Parser --------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#include "llvm/MC/MCParser/MCTargetAsmParser.h"
10#include "llvm/MC/MCContext.h"
11#include "llvm/MC/MCObjectStreamer.h"
12#include "llvm/MC/MCRegister.h"
13
14using namespace llvm;
15
16MCTargetAsmParser::MCTargetAsmParser(MCTargetOptions const &MCOptions,
17 const MCSubtargetInfo &STI,
18 const MCInstrInfo &MII)
19 : MCOptions(MCOptions), STI(&STI), MII(MII) {}
20
21MCTargetAsmParser::~MCTargetAsmParser() = default;
22
23MCSubtargetInfo &MCTargetAsmParser::copySTI() {
24 MCSubtargetInfo &STICopy = getContext().getSubtargetCopy(STI: getSTI());
25 STI = &STICopy;
26 // The returned STI will likely be modified. Create a new fragment to prevent
27 // mixing STI values within a fragment.
28 auto &S = getStreamer();
29 if (S.isObj() && S.getCurrentFragment())
30 static_cast<MCObjectStreamer &>(S).newFragment();
31 return STICopy;
32}
33
34const MCSubtargetInfo &MCTargetAsmParser::getSTI() const {
35 return *STI;
36}
37
38ParseStatus MCTargetAsmParser::parseDirective(AsmToken DirectiveID) {
39 SMLoc StartTokLoc = getTok().getLoc();
40 // Delegate to ParseDirective by default for transition period. Once the
41 // transition is over, this method should just return NoMatch.
42 bool Res = ParseDirective(DirectiveID);
43
44 // Some targets erroneously report success after emitting an error.
45 if (getParser().hasPendingError())
46 return ParseStatus::Failure;
47
48 // ParseDirective returns true if there was an error or if the directive is
49 // not target-specific. Disambiguate the two cases by comparing position of
50 // the lexer before and after calling the method: if no tokens were consumed,
51 // there was no match, otherwise there was a failure.
52 if (!Res)
53 return ParseStatus::Success;
54 if (getTok().getLoc() != StartTokLoc)
55 return ParseStatus::Failure;
56 return ParseStatus::NoMatch;
57}
58
59bool MCTargetAsmParser::areEqualRegs(const MCParsedAsmOperand &Op1,
60 const MCParsedAsmOperand &Op2) const {
61 return Op1.isReg() && Op2.isReg() && Op1.getReg() == Op2.getReg();
62}
63