mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-25 19:29:53 +00:00
MCAsmParserExtension has a copy of the MCAsmParser. Use it.
Base classes were storing a second copy. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@221667 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
26dd2205ba
commit
9272305648
@ -43,7 +43,6 @@ class AArch64AsmParser : public MCTargetAsmParser {
|
||||
private:
|
||||
StringRef Mnemonic; ///< Instruction mnemonic.
|
||||
MCSubtargetInfo &STI;
|
||||
MCAsmParser &Parser;
|
||||
|
||||
// Map of register aliases registers via the .req directive.
|
||||
StringMap<std::pair<bool, unsigned> > RegisterReqs;
|
||||
@ -53,10 +52,7 @@ private:
|
||||
return static_cast<AArch64TargetStreamer &>(TS);
|
||||
}
|
||||
|
||||
MCAsmParser &getParser() const { return Parser; }
|
||||
MCAsmLexer &getLexer() const { return Parser.getLexer(); }
|
||||
|
||||
SMLoc getLoc() const { return Parser.getTok().getLoc(); }
|
||||
SMLoc getLoc() const { return getParser().getTok().getLoc(); }
|
||||
|
||||
bool parseSysAlias(StringRef Name, SMLoc NameLoc, OperandVector &Operands);
|
||||
AArch64CC::CondCode parseCondCodeString(StringRef Cond);
|
||||
@ -70,8 +66,8 @@ private:
|
||||
bool parseOperand(OperandVector &Operands, bool isCondCode,
|
||||
bool invertCondCode);
|
||||
|
||||
void Warning(SMLoc L, const Twine &Msg) { Parser.Warning(L, Msg); }
|
||||
bool Error(SMLoc L, const Twine &Msg) { return Parser.Error(L, Msg); }
|
||||
void Warning(SMLoc L, const Twine &Msg) { getParser().Warning(L, Msg); }
|
||||
bool Error(SMLoc L, const Twine &Msg) { return getParser().Error(L, Msg); }
|
||||
bool showMatchError(SMLoc Loc, unsigned ErrCode);
|
||||
|
||||
bool parseDirectiveWord(unsigned Size, SMLoc L);
|
||||
@ -120,10 +116,11 @@ public:
|
||||
AArch64AsmParser(MCSubtargetInfo &_STI, MCAsmParser &_Parser,
|
||||
const MCInstrInfo &MII,
|
||||
const MCTargetOptions &Options)
|
||||
: MCTargetAsmParser(), STI(_STI), Parser(_Parser) {
|
||||
: MCTargetAsmParser(), STI(_STI) {
|
||||
MCAsmParserExtension::Initialize(_Parser);
|
||||
if (Parser.getStreamer().getTargetStreamer() == nullptr)
|
||||
new AArch64TargetStreamer(Parser.getStreamer());
|
||||
MCStreamer &S = getParser().getStreamer();
|
||||
if (S.getTargetStreamer() == nullptr)
|
||||
new AArch64TargetStreamer(S);
|
||||
|
||||
// Initialize the set of available features.
|
||||
setAvailableFeatures(ComputeAvailableFeatures(STI.getFeatureBits()));
|
||||
@ -1878,6 +1875,7 @@ unsigned AArch64AsmParser::matchRegisterNameAlias(StringRef Name,
|
||||
/// Identifier when called, and if it is a register name the token is eaten and
|
||||
/// the register is added to the operand list.
|
||||
int AArch64AsmParser::tryParseRegister() {
|
||||
MCAsmParser &Parser = getParser();
|
||||
const AsmToken &Tok = Parser.getTok();
|
||||
assert(Tok.is(AsmToken::Identifier) && "Token is not an Identifier");
|
||||
|
||||
@ -1902,6 +1900,7 @@ int AArch64AsmParser::tryParseRegister() {
|
||||
/// tryMatchVectorRegister - Try to parse a vector register name with optional
|
||||
/// kind specifier. If it is a register specifier, eat the token and return it.
|
||||
int AArch64AsmParser::tryMatchVectorRegister(StringRef &Kind, bool expected) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
if (Parser.getTok().isNot(AsmToken::Identifier)) {
|
||||
TokError("vector register expected");
|
||||
return -1;
|
||||
@ -1934,6 +1933,7 @@ int AArch64AsmParser::tryMatchVectorRegister(StringRef &Kind, bool expected) {
|
||||
/// tryParseSysCROperand - Try to parse a system instruction CR operand name.
|
||||
AArch64AsmParser::OperandMatchResultTy
|
||||
AArch64AsmParser::tryParseSysCROperand(OperandVector &Operands) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
SMLoc S = getLoc();
|
||||
|
||||
if (Parser.getTok().isNot(AsmToken::Identifier)) {
|
||||
@ -1963,6 +1963,7 @@ AArch64AsmParser::tryParseSysCROperand(OperandVector &Operands) {
|
||||
/// tryParsePrefetch - Try to parse a prefetch operand.
|
||||
AArch64AsmParser::OperandMatchResultTy
|
||||
AArch64AsmParser::tryParsePrefetch(OperandVector &Operands) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
SMLoc S = getLoc();
|
||||
const AsmToken &Tok = Parser.getTok();
|
||||
// Either an identifier for named values or a 5-bit immediate.
|
||||
@ -2010,6 +2011,7 @@ AArch64AsmParser::tryParsePrefetch(OperandVector &Operands) {
|
||||
/// instruction.
|
||||
AArch64AsmParser::OperandMatchResultTy
|
||||
AArch64AsmParser::tryParseAdrpLabel(OperandVector &Operands) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
SMLoc S = getLoc();
|
||||
const MCExpr *Expr;
|
||||
|
||||
@ -2060,6 +2062,7 @@ AArch64AsmParser::tryParseAdrpLabel(OperandVector &Operands) {
|
||||
/// instruction.
|
||||
AArch64AsmParser::OperandMatchResultTy
|
||||
AArch64AsmParser::tryParseAdrLabel(OperandVector &Operands) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
SMLoc S = getLoc();
|
||||
const MCExpr *Expr;
|
||||
|
||||
@ -2079,6 +2082,7 @@ AArch64AsmParser::tryParseAdrLabel(OperandVector &Operands) {
|
||||
/// tryParseFPImm - A floating point immediate expression operand.
|
||||
AArch64AsmParser::OperandMatchResultTy
|
||||
AArch64AsmParser::tryParseFPImm(OperandVector &Operands) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
SMLoc S = getLoc();
|
||||
|
||||
bool Hash = false;
|
||||
@ -2141,6 +2145,7 @@ AArch64AsmParser::tryParseFPImm(OperandVector &Operands) {
|
||||
/// tryParseAddSubImm - Parse ADD/SUB shifted immediate operand
|
||||
AArch64AsmParser::OperandMatchResultTy
|
||||
AArch64AsmParser::tryParseAddSubImm(OperandVector &Operands) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
SMLoc S = getLoc();
|
||||
|
||||
if (Parser.getTok().is(AsmToken::Hash))
|
||||
@ -2232,6 +2237,7 @@ AArch64CC::CondCode AArch64AsmParser::parseCondCodeString(StringRef Cond) {
|
||||
/// parseCondCode - Parse a Condition Code operand.
|
||||
bool AArch64AsmParser::parseCondCode(OperandVector &Operands,
|
||||
bool invertCondCode) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
SMLoc S = getLoc();
|
||||
const AsmToken &Tok = Parser.getTok();
|
||||
assert(Tok.is(AsmToken::Identifier) && "Token is not an Identifier");
|
||||
@ -2257,6 +2263,7 @@ bool AArch64AsmParser::parseCondCode(OperandVector &Operands,
|
||||
/// them if present.
|
||||
AArch64AsmParser::OperandMatchResultTy
|
||||
AArch64AsmParser::tryParseOptionalShiftExtend(OperandVector &Operands) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
const AsmToken &Tok = Parser.getTok();
|
||||
std::string LowerID = Tok.getString().lower();
|
||||
AArch64_AM::ShiftExtendType ShOp =
|
||||
@ -2337,6 +2344,7 @@ bool AArch64AsmParser::parseSysAlias(StringRef Name, SMLoc NameLoc,
|
||||
Operands.push_back(
|
||||
AArch64Operand::CreateToken("sys", false, NameLoc, getContext()));
|
||||
|
||||
MCAsmParser &Parser = getParser();
|
||||
const AsmToken &Tok = Parser.getTok();
|
||||
StringRef Op = Tok.getString();
|
||||
SMLoc S = Tok.getLoc();
|
||||
@ -2575,6 +2583,7 @@ bool AArch64AsmParser::parseSysAlias(StringRef Name, SMLoc NameLoc,
|
||||
|
||||
AArch64AsmParser::OperandMatchResultTy
|
||||
AArch64AsmParser::tryParseBarrierOperand(OperandVector &Operands) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
const AsmToken &Tok = Parser.getTok();
|
||||
|
||||
// Can be either a #imm style literal or an option name
|
||||
@ -2628,6 +2637,7 @@ AArch64AsmParser::tryParseBarrierOperand(OperandVector &Operands) {
|
||||
|
||||
AArch64AsmParser::OperandMatchResultTy
|
||||
AArch64AsmParser::tryParseSysReg(OperandVector &Operands) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
const AsmToken &Tok = Parser.getTok();
|
||||
|
||||
if (Tok.isNot(AsmToken::Identifier))
|
||||
@ -2642,6 +2652,7 @@ AArch64AsmParser::tryParseSysReg(OperandVector &Operands) {
|
||||
|
||||
/// tryParseVectorRegister - Parse a vector register operand.
|
||||
bool AArch64AsmParser::tryParseVectorRegister(OperandVector &Operands) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
if (Parser.getTok().isNot(AsmToken::Identifier))
|
||||
return true;
|
||||
|
||||
@ -2690,6 +2701,7 @@ bool AArch64AsmParser::tryParseVectorRegister(OperandVector &Operands) {
|
||||
|
||||
/// parseRegister - Parse a non-vector register operand.
|
||||
bool AArch64AsmParser::parseRegister(OperandVector &Operands) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
SMLoc S = getLoc();
|
||||
// Try for a vector register.
|
||||
if (!tryParseVectorRegister(Operands))
|
||||
@ -2732,6 +2744,7 @@ bool AArch64AsmParser::parseRegister(OperandVector &Operands) {
|
||||
}
|
||||
|
||||
bool AArch64AsmParser::parseSymbolicImmVal(const MCExpr *&ImmVal) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
bool HasELFModifier = false;
|
||||
AArch64MCExpr::VariantKind RefKind;
|
||||
|
||||
@ -2810,6 +2823,7 @@ bool AArch64AsmParser::parseSymbolicImmVal(const MCExpr *&ImmVal) {
|
||||
|
||||
/// parseVectorList - Parse a vector list operand for AdvSIMD instructions.
|
||||
bool AArch64AsmParser::parseVectorList(OperandVector &Operands) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
assert(Parser.getTok().is(AsmToken::LCurly) && "Token is not a Left Bracket");
|
||||
SMLoc S = getLoc();
|
||||
Parser.Lex(); // Eat left bracket token.
|
||||
@ -2908,6 +2922,7 @@ bool AArch64AsmParser::parseVectorList(OperandVector &Operands) {
|
||||
|
||||
AArch64AsmParser::OperandMatchResultTy
|
||||
AArch64AsmParser::tryParseGPR64sp0Operand(OperandVector &Operands) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
const AsmToken &Tok = Parser.getTok();
|
||||
if (!Tok.is(AsmToken::Identifier))
|
||||
return MatchOperand_NoMatch;
|
||||
@ -2953,6 +2968,7 @@ AArch64AsmParser::tryParseGPR64sp0Operand(OperandVector &Operands) {
|
||||
/// operand regardless of the mnemonic.
|
||||
bool AArch64AsmParser::parseOperand(OperandVector &Operands, bool isCondCode,
|
||||
bool invertCondCode) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
// Check if the current operand has a custom associated parser, if so, try to
|
||||
// custom parse the operand, or fallback to the general approach.
|
||||
OperandMatchResultTy ResTy = MatchOperandParserImpl(Operands, Mnemonic);
|
||||
@ -3118,6 +3134,7 @@ bool AArch64AsmParser::parseOperand(OperandVector &Operands, bool isCondCode,
|
||||
bool AArch64AsmParser::ParseInstruction(ParseInstructionInfo &Info,
|
||||
StringRef Name, SMLoc NameLoc,
|
||||
OperandVector &Operands) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
Name = StringSwitch<StringRef>(Name.lower())
|
||||
.Case("beq", "b.eq")
|
||||
.Case("bne", "b.ne")
|
||||
@ -3946,6 +3963,7 @@ bool AArch64AsmParser::ParseDirective(AsmToken DirectiveID) {
|
||||
/// parseDirectiveWord
|
||||
/// ::= .word [ expression (, expression)* ]
|
||||
bool AArch64AsmParser::parseDirectiveWord(unsigned Size, SMLoc L) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
if (getLexer().isNot(AsmToken::EndOfStatement)) {
|
||||
for (;;) {
|
||||
const MCExpr *Value;
|
||||
@ -3971,6 +3989,7 @@ bool AArch64AsmParser::parseDirectiveWord(unsigned Size, SMLoc L) {
|
||||
/// parseDirectiveInst
|
||||
/// ::= .inst opcode [, ...]
|
||||
bool AArch64AsmParser::parseDirectiveInst(SMLoc Loc) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
if (getLexer().is(AsmToken::EndOfStatement)) {
|
||||
Parser.eatToEndOfStatement();
|
||||
Error(Loc, "expected expression following directive");
|
||||
@ -4089,6 +4108,7 @@ bool AArch64AsmParser::parseDirectiveLtorg(SMLoc L) {
|
||||
/// parseDirectiveReq
|
||||
/// ::= name .req registername
|
||||
bool AArch64AsmParser::parseDirectiveReq(StringRef Name, SMLoc L) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
Parser.Lex(); // Eat the '.req' token.
|
||||
SMLoc SRegLoc = getLoc();
|
||||
unsigned RegNum = tryParseRegister();
|
||||
@ -4129,6 +4149,7 @@ bool AArch64AsmParser::parseDirectiveReq(StringRef Name, SMLoc L) {
|
||||
/// parseDirectiveUneq
|
||||
/// ::= .unreq registername
|
||||
bool AArch64AsmParser::parseDirectiveUnreq(SMLoc L) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
if (Parser.getTok().isNot(AsmToken::Identifier)) {
|
||||
Error(Parser.getTok().getLoc(), "unexpected input in .unreq directive.");
|
||||
Parser.eatToEndOfStatement();
|
||||
|
@ -129,7 +129,6 @@ public:
|
||||
|
||||
class ARMAsmParser : public MCTargetAsmParser {
|
||||
MCSubtargetInfo &STI;
|
||||
MCAsmParser &Parser;
|
||||
const MCInstrInfo &MII;
|
||||
const MCRegisterInfo *MRI;
|
||||
UnwindContext UC;
|
||||
@ -175,20 +174,16 @@ class ARMAsmParser : public MCTargetAsmParser {
|
||||
ITState.CurPosition = ~0U; // Done with the IT block after this.
|
||||
}
|
||||
|
||||
|
||||
MCAsmParser &getParser() const { return Parser; }
|
||||
MCAsmLexer &getLexer() const { return Parser.getLexer(); }
|
||||
|
||||
void Note(SMLoc L, const Twine &Msg, ArrayRef<SMRange> Ranges = None) {
|
||||
return Parser.Note(L, Msg, Ranges);
|
||||
return getParser().Note(L, Msg, Ranges);
|
||||
}
|
||||
bool Warning(SMLoc L, const Twine &Msg,
|
||||
ArrayRef<SMRange> Ranges = None) {
|
||||
return Parser.Warning(L, Msg, Ranges);
|
||||
return getParser().Warning(L, Msg, Ranges);
|
||||
}
|
||||
bool Error(SMLoc L, const Twine &Msg,
|
||||
ArrayRef<SMRange> Ranges = None) {
|
||||
return Parser.Error(L, Msg, Ranges);
|
||||
return getParser().Error(L, Msg, Ranges);
|
||||
}
|
||||
|
||||
int tryParseRegister();
|
||||
@ -338,10 +333,9 @@ public:
|
||||
|
||||
};
|
||||
|
||||
ARMAsmParser(MCSubtargetInfo &_STI, MCAsmParser &_Parser,
|
||||
const MCInstrInfo &MII,
|
||||
const MCTargetOptions &Options)
|
||||
: MCTargetAsmParser(), STI(_STI), Parser(_Parser), MII(MII), UC(_Parser) {
|
||||
ARMAsmParser(MCSubtargetInfo & _STI, MCAsmParser & _Parser,
|
||||
const MCInstrInfo &MII, const MCTargetOptions &Options)
|
||||
: MCTargetAsmParser(), STI(_STI), MII(MII), UC(_Parser) {
|
||||
MCAsmParserExtension::Initialize(_Parser);
|
||||
|
||||
// Cache the MCRegisterInfo.
|
||||
@ -2938,8 +2932,9 @@ static unsigned MatchRegisterName(StringRef Name);
|
||||
|
||||
bool ARMAsmParser::ParseRegister(unsigned &RegNo,
|
||||
SMLoc &StartLoc, SMLoc &EndLoc) {
|
||||
StartLoc = Parser.getTok().getLoc();
|
||||
EndLoc = Parser.getTok().getEndLoc();
|
||||
const AsmToken &Tok = getParser().getTok();
|
||||
StartLoc = Tok.getLoc();
|
||||
EndLoc = Tok.getEndLoc();
|
||||
RegNo = tryParseRegister();
|
||||
|
||||
return (RegNo == (unsigned)-1);
|
||||
@ -2950,6 +2945,7 @@ bool ARMAsmParser::ParseRegister(unsigned &RegNo,
|
||||
/// returned. Otherwise return -1.
|
||||
///
|
||||
int ARMAsmParser::tryParseRegister() {
|
||||
MCAsmParser &Parser = getParser();
|
||||
const AsmToken &Tok = Parser.getTok();
|
||||
if (Tok.isNot(AsmToken::Identifier)) return -1;
|
||||
|
||||
@ -3006,6 +3002,7 @@ int ARMAsmParser::tryParseRegister() {
|
||||
// consumed in the process of trying to parse the shifter (i.e., when it is
|
||||
// indeed a shifter operand, but malformed).
|
||||
int ARMAsmParser::tryParseShiftRegister(OperandVector &Operands) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
SMLoc S = Parser.getTok().getLoc();
|
||||
const AsmToken &Tok = Parser.getTok();
|
||||
if (Tok.isNot(AsmToken::Identifier))
|
||||
@ -3108,6 +3105,7 @@ int ARMAsmParser::tryParseShiftRegister(OperandVector &Operands) {
|
||||
/// TODO this is likely to change to allow different register types and or to
|
||||
/// parse for a specific register type.
|
||||
bool ARMAsmParser::tryParseRegisterWithWriteBack(OperandVector &Operands) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
const AsmToken &RegTok = Parser.getTok();
|
||||
int RegNo = tryParseRegister();
|
||||
if (RegNo == -1)
|
||||
@ -3204,6 +3202,7 @@ static int MatchCoprocessorOperandName(StringRef Name, char CoprocOp) {
|
||||
/// parseITCondCode - Try to parse a condition code for an IT instruction.
|
||||
ARMAsmParser::OperandMatchResultTy
|
||||
ARMAsmParser::parseITCondCode(OperandVector &Operands) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
SMLoc S = Parser.getTok().getLoc();
|
||||
const AsmToken &Tok = Parser.getTok();
|
||||
if (!Tok.is(AsmToken::Identifier))
|
||||
@ -3241,6 +3240,7 @@ ARMAsmParser::parseITCondCode(OperandVector &Operands) {
|
||||
/// number, the token is eaten and the operand is added to the operand list.
|
||||
ARMAsmParser::OperandMatchResultTy
|
||||
ARMAsmParser::parseCoprocNumOperand(OperandVector &Operands) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
SMLoc S = Parser.getTok().getLoc();
|
||||
const AsmToken &Tok = Parser.getTok();
|
||||
if (Tok.isNot(AsmToken::Identifier))
|
||||
@ -3263,6 +3263,7 @@ ARMAsmParser::parseCoprocNumOperand(OperandVector &Operands) {
|
||||
/// number, the token is eaten and the operand is added to the operand list.
|
||||
ARMAsmParser::OperandMatchResultTy
|
||||
ARMAsmParser::parseCoprocRegOperand(OperandVector &Operands) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
SMLoc S = Parser.getTok().getLoc();
|
||||
const AsmToken &Tok = Parser.getTok();
|
||||
if (Tok.isNot(AsmToken::Identifier))
|
||||
@ -3281,6 +3282,7 @@ ARMAsmParser::parseCoprocRegOperand(OperandVector &Operands) {
|
||||
/// coproc_option : '{' imm0_255 '}'
|
||||
ARMAsmParser::OperandMatchResultTy
|
||||
ARMAsmParser::parseCoprocOptionOperand(OperandVector &Operands) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
SMLoc S = Parser.getTok().getLoc();
|
||||
|
||||
// If this isn't a '{', this isn't a coprocessor immediate operand.
|
||||
@ -3358,6 +3360,7 @@ static unsigned getDRegFromQReg(unsigned QReg) {
|
||||
|
||||
/// Parse a register list.
|
||||
bool ARMAsmParser::parseRegisterList(OperandVector &Operands) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
assert(Parser.getTok().is(AsmToken::LCurly) &&
|
||||
"Token is not a Left Curly Brace");
|
||||
SMLoc S = Parser.getTok().getLoc();
|
||||
@ -3489,6 +3492,7 @@ bool ARMAsmParser::parseRegisterList(OperandVector &Operands) {
|
||||
// Helper function to parse the lane index for vector lists.
|
||||
ARMAsmParser::OperandMatchResultTy ARMAsmParser::
|
||||
parseVectorLane(VectorLaneTy &LaneKind, unsigned &Index, SMLoc &EndLoc) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
Index = 0; // Always return a defined index value.
|
||||
if (Parser.getTok().is(AsmToken::LBrac)) {
|
||||
Parser.Lex(); // Eat the '['.
|
||||
@ -3540,6 +3544,7 @@ parseVectorLane(VectorLaneTy &LaneKind, unsigned &Index, SMLoc &EndLoc) {
|
||||
// parse a vector register list
|
||||
ARMAsmParser::OperandMatchResultTy
|
||||
ARMAsmParser::parseVectorList(OperandVector &Operands) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
VectorLaneTy LaneKind;
|
||||
unsigned LaneIndex;
|
||||
SMLoc S = Parser.getTok().getLoc();
|
||||
@ -3791,6 +3796,7 @@ ARMAsmParser::parseVectorList(OperandVector &Operands) {
|
||||
/// parseMemBarrierOptOperand - Try to parse DSB/DMB data barrier options.
|
||||
ARMAsmParser::OperandMatchResultTy
|
||||
ARMAsmParser::parseMemBarrierOptOperand(OperandVector &Operands) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
SMLoc S = Parser.getTok().getLoc();
|
||||
const AsmToken &Tok = Parser.getTok();
|
||||
unsigned Opt;
|
||||
@ -3862,6 +3868,7 @@ ARMAsmParser::parseMemBarrierOptOperand(OperandVector &Operands) {
|
||||
/// parseInstSyncBarrierOptOperand - Try to parse ISB inst sync barrier options.
|
||||
ARMAsmParser::OperandMatchResultTy
|
||||
ARMAsmParser::parseInstSyncBarrierOptOperand(OperandVector &Operands) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
SMLoc S = Parser.getTok().getLoc();
|
||||
const AsmToken &Tok = Parser.getTok();
|
||||
unsigned Opt;
|
||||
@ -3913,6 +3920,7 @@ ARMAsmParser::parseInstSyncBarrierOptOperand(OperandVector &Operands) {
|
||||
/// parseProcIFlagsOperand - Try to parse iflags from CPS instruction.
|
||||
ARMAsmParser::OperandMatchResultTy
|
||||
ARMAsmParser::parseProcIFlagsOperand(OperandVector &Operands) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
SMLoc S = Parser.getTok().getLoc();
|
||||
const AsmToken &Tok = Parser.getTok();
|
||||
if (!Tok.is(AsmToken::Identifier))
|
||||
@ -3947,6 +3955,7 @@ ARMAsmParser::parseProcIFlagsOperand(OperandVector &Operands) {
|
||||
/// parseMSRMaskOperand - Try to parse mask flags from MSR instruction.
|
||||
ARMAsmParser::OperandMatchResultTy
|
||||
ARMAsmParser::parseMSRMaskOperand(OperandVector &Operands) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
SMLoc S = Parser.getTok().getLoc();
|
||||
const AsmToken &Tok = Parser.getTok();
|
||||
if (!Tok.is(AsmToken::Identifier))
|
||||
@ -4079,6 +4088,7 @@ ARMAsmParser::parseMSRMaskOperand(OperandVector &Operands) {
|
||||
/// use in the MRS/MSR instructions added to support virtualization.
|
||||
ARMAsmParser::OperandMatchResultTy
|
||||
ARMAsmParser::parseBankedRegOperand(OperandVector &Operands) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
SMLoc S = Parser.getTok().getLoc();
|
||||
const AsmToken &Tok = Parser.getTok();
|
||||
if (!Tok.is(AsmToken::Identifier))
|
||||
@ -4134,6 +4144,7 @@ ARMAsmParser::parseBankedRegOperand(OperandVector &Operands) {
|
||||
ARMAsmParser::OperandMatchResultTy
|
||||
ARMAsmParser::parsePKHImm(OperandVector &Operands, StringRef Op, int Low,
|
||||
int High) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
const AsmToken &Tok = Parser.getTok();
|
||||
if (Tok.isNot(AsmToken::Identifier)) {
|
||||
Error(Parser.getTok().getLoc(), Op + " operand expected.");
|
||||
@ -4181,6 +4192,7 @@ ARMAsmParser::parsePKHImm(OperandVector &Operands, StringRef Op, int Low,
|
||||
|
||||
ARMAsmParser::OperandMatchResultTy
|
||||
ARMAsmParser::parseSetEndImm(OperandVector &Operands) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
const AsmToken &Tok = Parser.getTok();
|
||||
SMLoc S = Tok.getLoc();
|
||||
if (Tok.isNot(AsmToken::Identifier)) {
|
||||
@ -4210,6 +4222,7 @@ ARMAsmParser::parseSetEndImm(OperandVector &Operands) {
|
||||
/// n == 32 encoded as n == 0.
|
||||
ARMAsmParser::OperandMatchResultTy
|
||||
ARMAsmParser::parseShifterImm(OperandVector &Operands) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
const AsmToken &Tok = Parser.getTok();
|
||||
SMLoc S = Tok.getLoc();
|
||||
if (Tok.isNot(AsmToken::Identifier)) {
|
||||
@ -4280,6 +4293,7 @@ ARMAsmParser::parseShifterImm(OperandVector &Operands) {
|
||||
/// ror #n 'n' in {0, 8, 16, 24}
|
||||
ARMAsmParser::OperandMatchResultTy
|
||||
ARMAsmParser::parseRotImm(OperandVector &Operands) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
const AsmToken &Tok = Parser.getTok();
|
||||
SMLoc S = Tok.getLoc();
|
||||
if (Tok.isNot(AsmToken::Identifier))
|
||||
@ -4326,6 +4340,7 @@ ARMAsmParser::parseRotImm(OperandVector &Operands) {
|
||||
|
||||
ARMAsmParser::OperandMatchResultTy
|
||||
ARMAsmParser::parseBitfield(OperandVector &Operands) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
SMLoc S = Parser.getTok().getLoc();
|
||||
// The bitfield descriptor is really two operands, the LSB and the width.
|
||||
if (Parser.getTok().isNot(AsmToken::Hash) &&
|
||||
@ -4402,6 +4417,7 @@ ARMAsmParser::parsePostIdxReg(OperandVector &Operands) {
|
||||
// This method must return MatchOperand_NoMatch without consuming any tokens
|
||||
// in the case where there is no match, as other alternatives take other
|
||||
// parse methods.
|
||||
MCAsmParser &Parser = getParser();
|
||||
AsmToken Tok = Parser.getTok();
|
||||
SMLoc S = Tok.getLoc();
|
||||
bool haveEaten = false;
|
||||
@ -4454,6 +4470,7 @@ ARMAsmParser::parseAM3Offset(OperandVector &Operands) {
|
||||
// This method must return MatchOperand_NoMatch without consuming any tokens
|
||||
// in the case where there is no match, as other alternatives take other
|
||||
// parse methods.
|
||||
MCAsmParser &Parser = getParser();
|
||||
AsmToken Tok = Parser.getTok();
|
||||
SMLoc S = Tok.getLoc();
|
||||
|
||||
@ -4591,6 +4608,7 @@ void ARMAsmParser::cvtThumbBranches(MCInst &Inst,
|
||||
/// Parse an ARM memory expression, return false if successful else return true
|
||||
/// or an error. The first token must be a '[' when called.
|
||||
bool ARMAsmParser::parseMemory(OperandVector &Operands) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
SMLoc S, E;
|
||||
assert(Parser.getTok().is(AsmToken::LBrac) &&
|
||||
"Token is not a Left Bracket");
|
||||
@ -4782,6 +4800,7 @@ bool ARMAsmParser::parseMemory(OperandVector &Operands) {
|
||||
/// return true if it parses a shift otherwise it returns false.
|
||||
bool ARMAsmParser::parseMemRegOffsetShift(ARM_AM::ShiftOpc &St,
|
||||
unsigned &Amount) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
SMLoc Loc = Parser.getTok().getLoc();
|
||||
const AsmToken &Tok = Parser.getTok();
|
||||
if (Tok.isNot(AsmToken::Identifier))
|
||||
@ -4842,6 +4861,7 @@ bool ARMAsmParser::parseMemRegOffsetShift(ARM_AM::ShiftOpc &St,
|
||||
/// parseFPImm - A floating point immediate expression operand.
|
||||
ARMAsmParser::OperandMatchResultTy
|
||||
ARMAsmParser::parseFPImm(OperandVector &Operands) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
// Anything that can accept a floating point constant as an operand
|
||||
// needs to go through here, as the regular parseExpression is
|
||||
// integer only.
|
||||
@ -4922,6 +4942,7 @@ ARMAsmParser::parseFPImm(OperandVector &Operands) {
|
||||
/// Parse a arm instruction operand. For now this parses the operand regardless
|
||||
/// of the mnemonic.
|
||||
bool ARMAsmParser::parseOperand(OperandVector &Operands, StringRef Mnemonic) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
SMLoc S, E;
|
||||
|
||||
// Check if the current operand has a custom associated parser, if so, try to
|
||||
@ -5054,6 +5075,7 @@ bool ARMAsmParser::parseOperand(OperandVector &Operands, StringRef Mnemonic) {
|
||||
// parsePrefix - Parse ARM 16-bit relocations expression prefix, i.e.
|
||||
// :lower16: and :upper16:.
|
||||
bool ARMAsmParser::parsePrefix(ARMMCExpr::VariantKind &RefKind) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
RefKind = ARMMCExpr::VK_ARM_None;
|
||||
|
||||
// consume an optional '#' (GNU compatibility)
|
||||
@ -5429,6 +5451,7 @@ static bool RequiresVFPRegListValidation(StringRef Inst,
|
||||
/// Parse an arm instruction mnemonic followed by its operands.
|
||||
bool ARMAsmParser::ParseInstruction(ParseInstructionInfo &Info, StringRef Name,
|
||||
SMLoc NameLoc, OperandVector &Operands) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
// FIXME: Can this be done via tablegen in some fashion?
|
||||
bool RequireVFPRegisterListCheck;
|
||||
bool AcceptSinglePrecisionOnly;
|
||||
@ -8497,6 +8520,7 @@ bool ARMAsmParser::ParseDirective(AsmToken DirectiveID) {
|
||||
/// ::= .short expression [, expression]*
|
||||
/// ::= .word expression [, expression]*
|
||||
bool ARMAsmParser::parseLiteralValues(unsigned Size, SMLoc L) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
if (getLexer().isNot(AsmToken::EndOfStatement)) {
|
||||
for (;;) {
|
||||
const MCExpr *Value;
|
||||
@ -8526,6 +8550,7 @@ bool ARMAsmParser::parseLiteralValues(unsigned Size, SMLoc L) {
|
||||
/// parseDirectiveThumb
|
||||
/// ::= .thumb
|
||||
bool ARMAsmParser::parseDirectiveThumb(SMLoc L) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
if (getLexer().isNot(AsmToken::EndOfStatement)) {
|
||||
Error(L, "unexpected token in directive");
|
||||
return false;
|
||||
@ -8547,6 +8572,7 @@ bool ARMAsmParser::parseDirectiveThumb(SMLoc L) {
|
||||
/// parseDirectiveARM
|
||||
/// ::= .arm
|
||||
bool ARMAsmParser::parseDirectiveARM(SMLoc L) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
if (getLexer().isNot(AsmToken::EndOfStatement)) {
|
||||
Error(L, "unexpected token in directive");
|
||||
return false;
|
||||
@ -8575,6 +8601,7 @@ void ARMAsmParser::onLabelParsed(MCSymbol *Symbol) {
|
||||
/// parseDirectiveThumbFunc
|
||||
/// ::= .thumbfunc symbol_name
|
||||
bool ARMAsmParser::parseDirectiveThumbFunc(SMLoc L) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
const auto Format = getContext().getObjectFileInfo()->getObjectFileType();
|
||||
bool IsMachO = Format == MCObjectFileInfo::IsMachO;
|
||||
|
||||
@ -8609,6 +8636,7 @@ bool ARMAsmParser::parseDirectiveThumbFunc(SMLoc L) {
|
||||
/// parseDirectiveSyntax
|
||||
/// ::= .syntax unified | divided
|
||||
bool ARMAsmParser::parseDirectiveSyntax(SMLoc L) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
const AsmToken &Tok = Parser.getTok();
|
||||
if (Tok.isNot(AsmToken::Identifier)) {
|
||||
Error(L, "unexpected token in .syntax directive");
|
||||
@ -8640,6 +8668,7 @@ bool ARMAsmParser::parseDirectiveSyntax(SMLoc L) {
|
||||
/// parseDirectiveCode
|
||||
/// ::= .code 16 | 32
|
||||
bool ARMAsmParser::parseDirectiveCode(SMLoc L) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
const AsmToken &Tok = Parser.getTok();
|
||||
if (Tok.isNot(AsmToken::Integer)) {
|
||||
Error(L, "unexpected token in .code directive");
|
||||
@ -8684,6 +8713,7 @@ bool ARMAsmParser::parseDirectiveCode(SMLoc L) {
|
||||
/// parseDirectiveReq
|
||||
/// ::= name .req registername
|
||||
bool ARMAsmParser::parseDirectiveReq(StringRef Name, SMLoc L) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
Parser.Lex(); // Eat the '.req' token.
|
||||
unsigned Reg;
|
||||
SMLoc SRegLoc, ERegLoc;
|
||||
@ -8713,6 +8743,7 @@ bool ARMAsmParser::parseDirectiveReq(StringRef Name, SMLoc L) {
|
||||
/// parseDirectiveUneq
|
||||
/// ::= .unreq registername
|
||||
bool ARMAsmParser::parseDirectiveUnreq(SMLoc L) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
if (Parser.getTok().isNot(AsmToken::Identifier)) {
|
||||
Parser.eatToEndOfStatement();
|
||||
Error(L, "unexpected input in .unreq directive.");
|
||||
@ -8749,6 +8780,7 @@ bool ARMAsmParser::parseDirectiveArch(SMLoc L) {
|
||||
/// ::= .eabi_attribute int, int [, "str"]
|
||||
/// ::= .eabi_attribute Tag_name, int [, "str"]
|
||||
bool ARMAsmParser::parseDirectiveEabiAttr(SMLoc L) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
int64_t Tag;
|
||||
SMLoc TagLoc;
|
||||
TagLoc = Parser.getTok().getLoc();
|
||||
@ -8978,6 +9010,7 @@ bool ARMAsmParser::parseDirectiveCantUnwind(SMLoc L) {
|
||||
/// parseDirectivePersonality
|
||||
/// ::= .personality name
|
||||
bool ARMAsmParser::parseDirectivePersonality(SMLoc L) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
bool HasExistingPersonality = UC.hasPersonality();
|
||||
|
||||
UC.recordPersonality(L);
|
||||
@ -9041,6 +9074,7 @@ bool ARMAsmParser::parseDirectiveHandlerData(SMLoc L) {
|
||||
/// parseDirectiveSetFP
|
||||
/// ::= .setfp fpreg, spreg [, offset]
|
||||
bool ARMAsmParser::parseDirectiveSetFP(SMLoc L) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
// Check the ordering of unwind directives
|
||||
if (!UC.hasFnStart()) {
|
||||
Error(L, ".fnstart must precede .setfp directive");
|
||||
@ -9118,6 +9152,7 @@ bool ARMAsmParser::parseDirectiveSetFP(SMLoc L) {
|
||||
/// parseDirective
|
||||
/// ::= .pad offset
|
||||
bool ARMAsmParser::parseDirectivePad(SMLoc L) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
// Check the ordering of unwind directives
|
||||
if (!UC.hasFnStart()) {
|
||||
Error(L, ".fnstart must precede .pad directive");
|
||||
@ -9192,6 +9227,7 @@ bool ARMAsmParser::parseDirectiveRegSave(SMLoc L, bool IsVector) {
|
||||
/// ::= .inst.n opcode [, ...]
|
||||
/// ::= .inst.w opcode [, ...]
|
||||
bool ARMAsmParser::parseDirectiveInst(SMLoc Loc, char Suffix) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
int Width;
|
||||
|
||||
if (isThumb()) {
|
||||
@ -9304,6 +9340,7 @@ bool ARMAsmParser::parseDirectiveEven(SMLoc L) {
|
||||
/// parseDirectivePersonalityIndex
|
||||
/// ::= .personalityindex index
|
||||
bool ARMAsmParser::parseDirectivePersonalityIndex(SMLoc L) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
bool HasExistingPersonality = UC.hasPersonality();
|
||||
|
||||
UC.recordPersonalityIndex(L);
|
||||
@ -9359,6 +9396,7 @@ bool ARMAsmParser::parseDirectivePersonalityIndex(SMLoc L) {
|
||||
/// parseDirectiveUnwindRaw
|
||||
/// ::= .unwind_raw offset, opcode [, opcode...]
|
||||
bool ARMAsmParser::parseDirectiveUnwindRaw(SMLoc L) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
if (!UC.hasFnStart()) {
|
||||
Parser.eatToEndOfStatement();
|
||||
Error(L, ".fnstart must precede .unwind_raw directives");
|
||||
@ -9440,6 +9478,8 @@ bool ARMAsmParser::parseDirectiveUnwindRaw(SMLoc L) {
|
||||
/// parseDirectiveTLSDescSeq
|
||||
/// ::= .tlsdescseq tls-variable
|
||||
bool ARMAsmParser::parseDirectiveTLSDescSeq(SMLoc L) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
|
||||
if (getLexer().isNot(AsmToken::Identifier)) {
|
||||
TokError("expected variable after '.tlsdescseq' directive");
|
||||
Parser.eatToEndOfStatement();
|
||||
@ -9464,6 +9504,7 @@ bool ARMAsmParser::parseDirectiveTLSDescSeq(SMLoc L) {
|
||||
/// parseDirectiveMovSP
|
||||
/// ::= .movsp reg [, #offset]
|
||||
bool ARMAsmParser::parseDirectiveMovSP(SMLoc L) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
if (!UC.hasFnStart()) {
|
||||
Parser.eatToEndOfStatement();
|
||||
Error(L, ".fnstart must precede .movsp directives");
|
||||
@ -9527,6 +9568,7 @@ bool ARMAsmParser::parseDirectiveMovSP(SMLoc L) {
|
||||
/// parseDirectiveObjectArch
|
||||
/// ::= .object_arch name
|
||||
bool ARMAsmParser::parseDirectiveObjectArch(SMLoc L) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
if (getLexer().isNot(AsmToken::Identifier)) {
|
||||
Error(getLexer().getLoc(), "unexpected token");
|
||||
Parser.eatToEndOfStatement();
|
||||
@ -9583,6 +9625,8 @@ bool ARMAsmParser::parseDirectiveAlign(SMLoc L) {
|
||||
/// parseDirectiveThumbSet
|
||||
/// ::= .thumb_set name, value
|
||||
bool ARMAsmParser::parseDirectiveThumbSet(SMLoc L) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
|
||||
StringRef Name;
|
||||
if (Parser.parseIdentifier(Name)) {
|
||||
TokError("expected identifier after '.thumb_set'");
|
||||
@ -9661,6 +9705,8 @@ static const struct {
|
||||
/// parseDirectiveArchExtension
|
||||
/// ::= .arch_extension [no]feature
|
||||
bool ARMAsmParser::parseDirectiveArchExtension(SMLoc L) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
|
||||
if (getLexer().isNot(AsmToken::Identifier)) {
|
||||
Error(getLexer().getLoc(), "unexpected token");
|
||||
Parser.eatToEndOfStatement();
|
||||
|
@ -90,12 +90,11 @@ private:
|
||||
namespace {
|
||||
class MipsAsmParser : public MCTargetAsmParser {
|
||||
MipsTargetStreamer &getTargetStreamer() {
|
||||
MCTargetStreamer &TS = *Parser.getStreamer().getTargetStreamer();
|
||||
MCTargetStreamer &TS = *getParser().getStreamer().getTargetStreamer();
|
||||
return static_cast<MipsTargetStreamer &>(TS);
|
||||
}
|
||||
|
||||
MCSubtargetInfo &STI;
|
||||
MCAsmParser &Parser;
|
||||
SmallVector<std::unique_ptr<MipsAssemblerOptions>, 2> AssemblerOptions;
|
||||
MCSymbol *CurrentFn; // Pointer to the function being parsed. It may be a
|
||||
// nullptr, which indicates that no function is currently
|
||||
@ -306,7 +305,9 @@ public:
|
||||
|
||||
MipsAsmParser(MCSubtargetInfo &sti, MCAsmParser &parser,
|
||||
const MCInstrInfo &MII, const MCTargetOptions &Options)
|
||||
: MCTargetAsmParser(), STI(sti), Parser(parser) {
|
||||
: MCTargetAsmParser(), STI(sti) {
|
||||
MCAsmParserExtension::Initialize(parser);
|
||||
|
||||
// Initialize the set of available features.
|
||||
setAvailableFeatures(ComputeAvailableFeatures(STI.getFeatureBits()));
|
||||
|
||||
@ -332,9 +333,6 @@ public:
|
||||
CurrentFn = nullptr;
|
||||
}
|
||||
|
||||
MCAsmParser &getParser() const { return Parser; }
|
||||
MCAsmLexer &getLexer() const { return Parser.getLexer(); }
|
||||
|
||||
/// True if all of $fcc0 - $fcc7 exist for the current ISA.
|
||||
bool hasEightFccRegisters() const { return hasMips4() || hasMips32(); }
|
||||
|
||||
@ -1910,6 +1908,7 @@ int MipsAsmParser::matchRegisterByNumber(unsigned RegNum, unsigned RegClass) {
|
||||
}
|
||||
|
||||
bool MipsAsmParser::parseOperand(OperandVector &Operands, StringRef Mnemonic) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
DEBUG(dbgs() << "parseOperand\n");
|
||||
|
||||
// Check if the current operand has a custom associated parser, if so, try to
|
||||
@ -2065,6 +2064,7 @@ bool MipsAsmParser::isEvaluated(const MCExpr *Expr) {
|
||||
}
|
||||
|
||||
bool MipsAsmParser::parseRelocOperand(const MCExpr *&Res) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
Parser.Lex(); // Eat the % token.
|
||||
const AsmToken &Tok = Parser.getTok(); // Get next token, operation.
|
||||
if (Tok.isNot(AsmToken::Identifier))
|
||||
@ -2133,6 +2133,7 @@ bool MipsAsmParser::ParseRegister(unsigned &RegNo, SMLoc &StartLoc,
|
||||
}
|
||||
|
||||
bool MipsAsmParser::parseMemOffset(const MCExpr *&Res, bool isParenExpr) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
SMLoc S;
|
||||
bool Result = true;
|
||||
|
||||
@ -2162,6 +2163,7 @@ bool MipsAsmParser::parseMemOffset(const MCExpr *&Res, bool isParenExpr) {
|
||||
|
||||
MipsAsmParser::OperandMatchResultTy
|
||||
MipsAsmParser::parseMemOperand(OperandVector &Operands) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
DEBUG(dbgs() << "parseMemOperand\n");
|
||||
const MCExpr *IdVal = nullptr;
|
||||
SMLoc S;
|
||||
@ -2244,7 +2246,7 @@ MipsAsmParser::parseMemOperand(OperandVector &Operands) {
|
||||
}
|
||||
|
||||
bool MipsAsmParser::searchSymbolAlias(OperandVector &Operands) {
|
||||
|
||||
MCAsmParser &Parser = getParser();
|
||||
MCSymbol *Sym = getContext().LookupSymbol(Parser.getTok().getIdentifier());
|
||||
if (Sym) {
|
||||
SMLoc S = Parser.getTok().getLoc();
|
||||
@ -2328,6 +2330,7 @@ MipsAsmParser::matchAnyRegisterNameWithoutDollar(OperandVector &Operands,
|
||||
|
||||
MipsAsmParser::OperandMatchResultTy
|
||||
MipsAsmParser::matchAnyRegisterWithoutDollar(OperandVector &Operands, SMLoc S) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
auto Token = Parser.getLexer().peekTok(false);
|
||||
|
||||
if (Token.is(AsmToken::Identifier)) {
|
||||
@ -2351,6 +2354,7 @@ MipsAsmParser::matchAnyRegisterWithoutDollar(OperandVector &Operands, SMLoc S) {
|
||||
|
||||
MipsAsmParser::OperandMatchResultTy
|
||||
MipsAsmParser::parseAnyRegister(OperandVector &Operands) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
DEBUG(dbgs() << "parseAnyRegister\n");
|
||||
|
||||
auto Token = Parser.getTok();
|
||||
@ -2378,6 +2382,7 @@ MipsAsmParser::parseAnyRegister(OperandVector &Operands) {
|
||||
|
||||
MipsAsmParser::OperandMatchResultTy
|
||||
MipsAsmParser::parseImm(OperandVector &Operands) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
switch (getLexer().getKind()) {
|
||||
default:
|
||||
return MatchOperand_NoMatch;
|
||||
@ -2402,6 +2407,7 @@ MipsAsmParser::parseImm(OperandVector &Operands) {
|
||||
|
||||
MipsAsmParser::OperandMatchResultTy
|
||||
MipsAsmParser::parseJumpTarget(OperandVector &Operands) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
DEBUG(dbgs() << "parseJumpTarget\n");
|
||||
|
||||
SMLoc S = getLexer().getLoc();
|
||||
@ -2428,6 +2434,7 @@ MipsAsmParser::parseJumpTarget(OperandVector &Operands) {
|
||||
|
||||
MipsAsmParser::OperandMatchResultTy
|
||||
MipsAsmParser::parseInvNum(OperandVector &Operands) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
const MCExpr *IdVal;
|
||||
// If the first token is '$' we may have register operand.
|
||||
if (Parser.getTok().is(AsmToken::Dollar))
|
||||
@ -2446,6 +2453,7 @@ MipsAsmParser::parseInvNum(OperandVector &Operands) {
|
||||
|
||||
MipsAsmParser::OperandMatchResultTy
|
||||
MipsAsmParser::parseLSAImm(OperandVector &Operands) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
switch (getLexer().getKind()) {
|
||||
default:
|
||||
return MatchOperand_NoMatch;
|
||||
@ -2525,6 +2533,7 @@ MCSymbolRefExpr::VariantKind MipsAsmParser::getVariantKind(StringRef Symbol) {
|
||||
/// handle it before we iterate so we don't get tripped up by the lack of
|
||||
/// a comma.
|
||||
bool MipsAsmParser::parseParenSuffix(StringRef Name, OperandVector &Operands) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
if (getLexer().is(AsmToken::LParen)) {
|
||||
Operands.push_back(
|
||||
MipsOperand::CreateToken("(", getLexer().getLoc(), *this));
|
||||
@ -2554,6 +2563,7 @@ bool MipsAsmParser::parseParenSuffix(StringRef Name, OperandVector &Operands) {
|
||||
/// a comma.
|
||||
bool MipsAsmParser::parseBracketSuffix(StringRef Name,
|
||||
OperandVector &Operands) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
if (getLexer().is(AsmToken::LBrac)) {
|
||||
Operands.push_back(
|
||||
MipsOperand::CreateToken("[", getLexer().getLoc(), *this));
|
||||
@ -2577,6 +2587,7 @@ bool MipsAsmParser::parseBracketSuffix(StringRef Name,
|
||||
|
||||
bool MipsAsmParser::ParseInstruction(ParseInstructionInfo &Info, StringRef Name,
|
||||
SMLoc NameLoc, OperandVector &Operands) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
DEBUG(dbgs() << "ParseInstruction\n");
|
||||
|
||||
// We have reached first instruction, module directive are now forbidden.
|
||||
@ -2629,6 +2640,7 @@ bool MipsAsmParser::ParseInstruction(ParseInstructionInfo &Info, StringRef Name,
|
||||
}
|
||||
|
||||
bool MipsAsmParser::reportParseError(Twine ErrorMsg) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
SMLoc Loc = getLexer().getLoc();
|
||||
Parser.eatToEndOfStatement();
|
||||
return Error(Loc, ErrorMsg);
|
||||
@ -2639,6 +2651,7 @@ bool MipsAsmParser::reportParseError(SMLoc Loc, Twine ErrorMsg) {
|
||||
}
|
||||
|
||||
bool MipsAsmParser::parseSetNoAtDirective() {
|
||||
MCAsmParser &Parser = getParser();
|
||||
// Line should look like: ".set noat".
|
||||
// set at reg to 0.
|
||||
AssemblerOptions.back()->setATReg(0);
|
||||
@ -2654,6 +2667,7 @@ bool MipsAsmParser::parseSetNoAtDirective() {
|
||||
}
|
||||
|
||||
bool MipsAsmParser::parseSetAtDirective() {
|
||||
MCAsmParser &Parser = getParser();
|
||||
// Line can be .set at - defaults to $1
|
||||
// or .set at=$reg
|
||||
int AtRegNo;
|
||||
@ -2703,6 +2717,7 @@ bool MipsAsmParser::parseSetAtDirective() {
|
||||
}
|
||||
|
||||
bool MipsAsmParser::parseSetReorderDirective() {
|
||||
MCAsmParser &Parser = getParser();
|
||||
Parser.Lex();
|
||||
// If this is not the end of the statement, report an error.
|
||||
if (getLexer().isNot(AsmToken::EndOfStatement)) {
|
||||
@ -2716,6 +2731,7 @@ bool MipsAsmParser::parseSetReorderDirective() {
|
||||
}
|
||||
|
||||
bool MipsAsmParser::parseSetNoReorderDirective() {
|
||||
MCAsmParser &Parser = getParser();
|
||||
Parser.Lex();
|
||||
// If this is not the end of the statement, report an error.
|
||||
if (getLexer().isNot(AsmToken::EndOfStatement)) {
|
||||
@ -2729,6 +2745,7 @@ bool MipsAsmParser::parseSetNoReorderDirective() {
|
||||
}
|
||||
|
||||
bool MipsAsmParser::parseSetMacroDirective() {
|
||||
MCAsmParser &Parser = getParser();
|
||||
Parser.Lex();
|
||||
// If this is not the end of the statement, report an error.
|
||||
if (getLexer().isNot(AsmToken::EndOfStatement)) {
|
||||
@ -2741,6 +2758,7 @@ bool MipsAsmParser::parseSetMacroDirective() {
|
||||
}
|
||||
|
||||
bool MipsAsmParser::parseSetNoMacroDirective() {
|
||||
MCAsmParser &Parser = getParser();
|
||||
Parser.Lex();
|
||||
// If this is not the end of the statement, report an error.
|
||||
if (getLexer().isNot(AsmToken::EndOfStatement)) {
|
||||
@ -2757,6 +2775,7 @@ bool MipsAsmParser::parseSetNoMacroDirective() {
|
||||
}
|
||||
|
||||
bool MipsAsmParser::parseSetMsaDirective() {
|
||||
MCAsmParser &Parser = getParser();
|
||||
Parser.Lex();
|
||||
|
||||
// If this is not the end of the statement, report an error.
|
||||
@ -2769,6 +2788,7 @@ bool MipsAsmParser::parseSetMsaDirective() {
|
||||
}
|
||||
|
||||
bool MipsAsmParser::parseSetNoMsaDirective() {
|
||||
MCAsmParser &Parser = getParser();
|
||||
Parser.Lex();
|
||||
|
||||
// If this is not the end of the statement, report an error.
|
||||
@ -2781,6 +2801,7 @@ bool MipsAsmParser::parseSetNoMsaDirective() {
|
||||
}
|
||||
|
||||
bool MipsAsmParser::parseSetNoDspDirective() {
|
||||
MCAsmParser &Parser = getParser();
|
||||
Parser.Lex(); // Eat "nodsp".
|
||||
|
||||
// If this is not the end of the statement, report an error.
|
||||
@ -2795,6 +2816,7 @@ bool MipsAsmParser::parseSetNoDspDirective() {
|
||||
}
|
||||
|
||||
bool MipsAsmParser::parseSetMips16Directive() {
|
||||
MCAsmParser &Parser = getParser();
|
||||
Parser.Lex(); // Eat "mips16".
|
||||
|
||||
// If this is not the end of the statement, report an error.
|
||||
@ -2810,6 +2832,7 @@ bool MipsAsmParser::parseSetMips16Directive() {
|
||||
}
|
||||
|
||||
bool MipsAsmParser::parseSetNoMips16Directive() {
|
||||
MCAsmParser &Parser = getParser();
|
||||
Parser.Lex(); // Eat "nomips16".
|
||||
|
||||
// If this is not the end of the statement, report an error.
|
||||
@ -2825,6 +2848,7 @@ bool MipsAsmParser::parseSetNoMips16Directive() {
|
||||
}
|
||||
|
||||
bool MipsAsmParser::parseSetFpDirective() {
|
||||
MCAsmParser &Parser = getParser();
|
||||
MipsABIFlagsSection::FpABIKind FpAbiVal;
|
||||
// Line can be: .set fp=32
|
||||
// .set fp=xx
|
||||
@ -2851,6 +2875,7 @@ bool MipsAsmParser::parseSetFpDirective() {
|
||||
}
|
||||
|
||||
bool MipsAsmParser::parseSetPopDirective() {
|
||||
MCAsmParser &Parser = getParser();
|
||||
SMLoc Loc = getLexer().getLoc();
|
||||
|
||||
Parser.Lex();
|
||||
@ -2870,6 +2895,7 @@ bool MipsAsmParser::parseSetPopDirective() {
|
||||
}
|
||||
|
||||
bool MipsAsmParser::parseSetPushDirective() {
|
||||
MCAsmParser &Parser = getParser();
|
||||
Parser.Lex();
|
||||
if (getLexer().isNot(AsmToken::EndOfStatement))
|
||||
return reportParseError("unexpected token, expected end of statement");
|
||||
@ -2885,6 +2911,7 @@ bool MipsAsmParser::parseSetPushDirective() {
|
||||
bool MipsAsmParser::parseSetAssignment() {
|
||||
StringRef Name;
|
||||
const MCExpr *Value;
|
||||
MCAsmParser &Parser = getParser();
|
||||
|
||||
if (Parser.parseIdentifier(Name))
|
||||
reportParseError("expected identifier after .set");
|
||||
@ -2907,6 +2934,7 @@ bool MipsAsmParser::parseSetAssignment() {
|
||||
}
|
||||
|
||||
bool MipsAsmParser::parseSetMips0Directive() {
|
||||
MCAsmParser &Parser = getParser();
|
||||
Parser.Lex();
|
||||
if (getLexer().isNot(AsmToken::EndOfStatement))
|
||||
return reportParseError("unexpected token, expected end of statement");
|
||||
@ -2920,6 +2948,7 @@ bool MipsAsmParser::parseSetMips0Directive() {
|
||||
}
|
||||
|
||||
bool MipsAsmParser::parseSetArchDirective() {
|
||||
MCAsmParser &Parser = getParser();
|
||||
Parser.Lex();
|
||||
if (getLexer().isNot(AsmToken::Equal))
|
||||
return reportParseError("unexpected token, expected equals sign");
|
||||
@ -2955,6 +2984,7 @@ bool MipsAsmParser::parseSetArchDirective() {
|
||||
}
|
||||
|
||||
bool MipsAsmParser::parseSetFeature(uint64_t Feature) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
Parser.Lex();
|
||||
if (getLexer().isNot(AsmToken::EndOfStatement))
|
||||
return reportParseError("unexpected token, expected end of statement");
|
||||
@ -3018,6 +3048,7 @@ bool MipsAsmParser::parseSetFeature(uint64_t Feature) {
|
||||
}
|
||||
|
||||
bool MipsAsmParser::eatComma(StringRef ErrorStr) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
if (getLexer().isNot(AsmToken::Comma)) {
|
||||
SMLoc Loc = getLexer().getLoc();
|
||||
Parser.eatToEndOfStatement();
|
||||
@ -3061,6 +3092,7 @@ bool MipsAsmParser::parseDirectiveCpLoad(SMLoc Loc) {
|
||||
}
|
||||
|
||||
bool MipsAsmParser::parseDirectiveCPSetup() {
|
||||
MCAsmParser &Parser = getParser();
|
||||
unsigned FuncReg;
|
||||
unsigned Save;
|
||||
bool SaveIsReg = true;
|
||||
@ -3121,6 +3153,7 @@ bool MipsAsmParser::parseDirectiveCPSetup() {
|
||||
}
|
||||
|
||||
bool MipsAsmParser::parseDirectiveNaN() {
|
||||
MCAsmParser &Parser = getParser();
|
||||
if (getLexer().isNot(AsmToken::EndOfStatement)) {
|
||||
const AsmToken &Tok = Parser.getTok();
|
||||
|
||||
@ -3141,7 +3174,7 @@ bool MipsAsmParser::parseDirectiveNaN() {
|
||||
}
|
||||
|
||||
bool MipsAsmParser::parseDirectiveSet() {
|
||||
|
||||
MCAsmParser &Parser = getParser();
|
||||
// Get the next token.
|
||||
const AsmToken &Tok = Parser.getTok();
|
||||
|
||||
@ -3219,6 +3252,7 @@ bool MipsAsmParser::parseDirectiveSet() {
|
||||
/// parseDataDirective
|
||||
/// ::= .word [ expression (, expression)* ]
|
||||
bool MipsAsmParser::parseDataDirective(unsigned Size, SMLoc L) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
if (getLexer().isNot(AsmToken::EndOfStatement)) {
|
||||
for (;;) {
|
||||
const MCExpr *Value;
|
||||
@ -3243,6 +3277,7 @@ bool MipsAsmParser::parseDataDirective(unsigned Size, SMLoc L) {
|
||||
/// parseDirectiveGpWord
|
||||
/// ::= .gpword local_sym
|
||||
bool MipsAsmParser::parseDirectiveGpWord() {
|
||||
MCAsmParser &Parser = getParser();
|
||||
const MCExpr *Value;
|
||||
// EmitGPRel32Value requires an expression, so we are using base class
|
||||
// method to evaluate the expression.
|
||||
@ -3260,6 +3295,7 @@ bool MipsAsmParser::parseDirectiveGpWord() {
|
||||
/// parseDirectiveGpDWord
|
||||
/// ::= .gpdword local_sym
|
||||
bool MipsAsmParser::parseDirectiveGpDWord() {
|
||||
MCAsmParser &Parser = getParser();
|
||||
const MCExpr *Value;
|
||||
// EmitGPRel64Value requires an expression, so we are using base class
|
||||
// method to evaluate the expression.
|
||||
@ -3275,6 +3311,7 @@ bool MipsAsmParser::parseDirectiveGpDWord() {
|
||||
}
|
||||
|
||||
bool MipsAsmParser::parseDirectiveOption() {
|
||||
MCAsmParser &Parser = getParser();
|
||||
// Get the option token.
|
||||
AsmToken Tok = Parser.getTok();
|
||||
// At the moment only identifiers are supported.
|
||||
@ -3320,6 +3357,7 @@ bool MipsAsmParser::parseDirectiveOption() {
|
||||
/// ::= .module nooddspreg
|
||||
/// ::= .module fp=value
|
||||
bool MipsAsmParser::parseDirectiveModule() {
|
||||
MCAsmParser &Parser = getParser();
|
||||
MCAsmLexer &Lexer = getLexer();
|
||||
SMLoc L = Lexer.getLoc();
|
||||
|
||||
@ -3373,6 +3411,7 @@ bool MipsAsmParser::parseDirectiveModule() {
|
||||
/// ::= =xx
|
||||
/// ::= =64
|
||||
bool MipsAsmParser::parseDirectiveModuleFP() {
|
||||
MCAsmParser &Parser = getParser();
|
||||
MCAsmLexer &Lexer = getLexer();
|
||||
|
||||
if (Lexer.isNot(AsmToken::Equal)) {
|
||||
@ -3398,6 +3437,7 @@ bool MipsAsmParser::parseDirectiveModuleFP() {
|
||||
|
||||
bool MipsAsmParser::parseFpABIValue(MipsABIFlagsSection::FpABIKind &FpABI,
|
||||
StringRef Directive) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
MCAsmLexer &Lexer = getLexer();
|
||||
|
||||
if (Lexer.is(AsmToken::Identifier)) {
|
||||
@ -3444,6 +3484,7 @@ bool MipsAsmParser::parseFpABIValue(MipsABIFlagsSection::FpABIKind &FpABI,
|
||||
}
|
||||
|
||||
bool MipsAsmParser::ParseDirective(AsmToken DirectiveID) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
StringRef IDVal = DirectiveID.getString();
|
||||
|
||||
if (IDVal == ".cpload")
|
||||
|
@ -214,16 +214,12 @@ struct PPCOperand;
|
||||
|
||||
class PPCAsmParser : public MCTargetAsmParser {
|
||||
MCSubtargetInfo &STI;
|
||||
MCAsmParser &Parser;
|
||||
const MCInstrInfo &MII;
|
||||
bool IsPPC64;
|
||||
bool IsDarwin;
|
||||
|
||||
MCAsmParser &getParser() const { return Parser; }
|
||||
MCAsmLexer &getLexer() const { return Parser.getLexer(); }
|
||||
|
||||
void Warning(SMLoc L, const Twine &Msg) { Parser.Warning(L, Msg); }
|
||||
bool Error(SMLoc L, const Twine &Msg) { return Parser.Error(L, Msg); }
|
||||
void Warning(SMLoc L, const Twine &Msg) { getParser().Warning(L, Msg); }
|
||||
bool Error(SMLoc L, const Twine &Msg) { return getParser().Error(L, Msg); }
|
||||
|
||||
bool isPPC64() const { return IsPPC64; }
|
||||
bool isDarwin() const { return IsDarwin; }
|
||||
@ -266,9 +262,8 @@ class PPCAsmParser : public MCTargetAsmParser {
|
||||
|
||||
public:
|
||||
PPCAsmParser(MCSubtargetInfo &_STI, MCAsmParser &_Parser,
|
||||
const MCInstrInfo &_MII,
|
||||
const MCTargetOptions &Options)
|
||||
: MCTargetAsmParser(), STI(_STI), Parser(_Parser), MII(_MII) {
|
||||
const MCInstrInfo &_MII, const MCTargetOptions &Options)
|
||||
: MCTargetAsmParser(), STI(_STI), MII(_MII) {
|
||||
// Check for 64-bit vs. 32-bit pointer mode.
|
||||
Triple TheTriple(STI.getTargetTriple());
|
||||
IsPPC64 = (TheTriple.getArch() == Triple::ppc64 ||
|
||||
@ -1127,6 +1122,7 @@ MatchRegisterName(const AsmToken &Tok, unsigned &RegNo, int64_t &IntVal) {
|
||||
|
||||
bool PPCAsmParser::
|
||||
ParseRegister(unsigned &RegNo, SMLoc &StartLoc, SMLoc &EndLoc) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
const AsmToken &Tok = Parser.getTok();
|
||||
StartLoc = Tok.getLoc();
|
||||
EndLoc = Tok.getEndLoc();
|
||||
@ -1308,6 +1304,7 @@ ParseExpression(const MCExpr *&EVal) {
|
||||
/// for this to be done at a higher level.
|
||||
bool PPCAsmParser::
|
||||
ParseDarwinExpression(const MCExpr *&EVal) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
PPCMCExpr::VariantKind Variant = PPCMCExpr::VK_PPC_None;
|
||||
switch (getLexer().getKind()) {
|
||||
default:
|
||||
@ -1350,6 +1347,7 @@ ParseDarwinExpression(const MCExpr *&EVal) {
|
||||
/// This handles registers in the form 'NN', '%rNN' for ELF platforms and
|
||||
/// rNN for MachO.
|
||||
bool PPCAsmParser::ParseOperand(OperandVector &Operands) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
SMLoc S = Parser.getTok().getLoc();
|
||||
SMLoc E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1);
|
||||
const MCExpr *EVal;
|
||||
@ -1558,6 +1556,7 @@ bool PPCAsmParser::ParseDirective(AsmToken DirectiveID) {
|
||||
/// ParseDirectiveWord
|
||||
/// ::= .word [ expression (, expression)* ]
|
||||
bool PPCAsmParser::ParseDirectiveWord(unsigned Size, SMLoc L) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
if (getLexer().isNot(AsmToken::EndOfStatement)) {
|
||||
for (;;) {
|
||||
const MCExpr *Value;
|
||||
@ -1582,6 +1581,7 @@ bool PPCAsmParser::ParseDirectiveWord(unsigned Size, SMLoc L) {
|
||||
/// ParseDirectiveTC
|
||||
/// ::= .tc [ symbol (, expression)* ]
|
||||
bool PPCAsmParser::ParseDirectiveTC(unsigned Size, SMLoc L) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
// Skip TC symbol, which is only used with XCOFF.
|
||||
while (getLexer().isNot(AsmToken::EndOfStatement)
|
||||
&& getLexer().isNot(AsmToken::Comma))
|
||||
@ -1602,6 +1602,7 @@ bool PPCAsmParser::ParseDirectiveTC(unsigned Size, SMLoc L) {
|
||||
/// ParseDirectiveMachine (ELF platforms)
|
||||
/// ::= .machine [ cpu | "push" | "pop" ]
|
||||
bool PPCAsmParser::ParseDirectiveMachine(SMLoc L) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
if (getLexer().isNot(AsmToken::Identifier) &&
|
||||
getLexer().isNot(AsmToken::String)) {
|
||||
Error(L, "unexpected token in directive");
|
||||
@ -1636,6 +1637,7 @@ bool PPCAsmParser::ParseDirectiveMachine(SMLoc L) {
|
||||
/// ParseDarwinDirectiveMachine (Mach-o platforms)
|
||||
/// ::= .machine cpu-identifier
|
||||
bool PPCAsmParser::ParseDarwinDirectiveMachine(SMLoc L) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
if (getLexer().isNot(AsmToken::Identifier) &&
|
||||
getLexer().isNot(AsmToken::String)) {
|
||||
Error(L, "unexpected token in directive");
|
||||
|
@ -56,12 +56,12 @@ static const char OpPrecedence[] = {
|
||||
|
||||
class X86AsmParser : public MCTargetAsmParser {
|
||||
MCSubtargetInfo &STI;
|
||||
MCAsmParser &Parser;
|
||||
const MCInstrInfo &MII;
|
||||
ParseInstructionInfo *InstInfo;
|
||||
std::unique_ptr<X86AsmInstrumentation> Instrumentation;
|
||||
private:
|
||||
SMLoc consumeToken() {
|
||||
MCAsmParser &Parser = getParser();
|
||||
SMLoc Result = Parser.getTok().getLoc();
|
||||
Parser.Lex();
|
||||
return Result;
|
||||
@ -631,13 +631,10 @@ private:
|
||||
}
|
||||
};
|
||||
|
||||
MCAsmParser &getParser() const { return Parser; }
|
||||
|
||||
MCAsmLexer &getLexer() const { return Parser.getLexer(); }
|
||||
|
||||
bool Error(SMLoc L, const Twine &Msg,
|
||||
ArrayRef<SMRange> Ranges = None,
|
||||
bool MatchingInlineAsm = false) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
if (MatchingInlineAsm) return true;
|
||||
return Parser.Error(L, Msg, Ranges);
|
||||
}
|
||||
@ -645,8 +642,9 @@ private:
|
||||
bool ErrorAndEatStatement(SMLoc L, const Twine &Msg,
|
||||
ArrayRef<SMRange> Ranges = None,
|
||||
bool MatchingInlineAsm = false) {
|
||||
Parser.eatToEndOfStatement();
|
||||
return Error(L, Msg, Ranges, MatchingInlineAsm);
|
||||
MCAsmParser &Parser = getParser();
|
||||
Parser.eatToEndOfStatement();
|
||||
return Error(L, Msg, Ranges, MatchingInlineAsm);
|
||||
}
|
||||
|
||||
std::nullptr_t ErrorOperand(SMLoc Loc, StringRef Msg) {
|
||||
@ -774,11 +772,9 @@ private:
|
||||
/// }
|
||||
|
||||
public:
|
||||
X86AsmParser(MCSubtargetInfo &sti, MCAsmParser &parser,
|
||||
const MCInstrInfo &mii,
|
||||
const MCTargetOptions &Options)
|
||||
: MCTargetAsmParser(), STI(sti), Parser(parser), MII(mii),
|
||||
InstInfo(nullptr) {
|
||||
X86AsmParser(MCSubtargetInfo &sti, MCAsmParser &Parser,
|
||||
const MCInstrInfo &mii, const MCTargetOptions &Options)
|
||||
: MCTargetAsmParser(), STI(sti), MII(mii), InstInfo(nullptr) {
|
||||
|
||||
// Initialize the set of available features.
|
||||
setAvailableFeatures(ComputeAvailableFeatures(STI.getFeatureBits()));
|
||||
@ -865,6 +861,7 @@ bool X86AsmParser::doSrcDstMatch(X86Operand &Op1, X86Operand &Op2)
|
||||
|
||||
bool X86AsmParser::ParseRegister(unsigned &RegNo,
|
||||
SMLoc &StartLoc, SMLoc &EndLoc) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
RegNo = 0;
|
||||
const AsmToken &PercentTok = Parser.getTok();
|
||||
StartLoc = PercentTok.getLoc();
|
||||
@ -1120,6 +1117,7 @@ RewriteIntelBracExpression(SmallVectorImpl<AsmRewrite> *AsmRewrites,
|
||||
}
|
||||
|
||||
bool X86AsmParser::ParseIntelExpression(IntelExprStateMachine &SM, SMLoc &End) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
const AsmToken &Tok = Parser.getTok();
|
||||
|
||||
bool Done = false;
|
||||
@ -1241,6 +1239,7 @@ bool X86AsmParser::ParseIntelExpression(IntelExprStateMachine &SM, SMLoc &End) {
|
||||
std::unique_ptr<X86Operand>
|
||||
X86AsmParser::ParseIntelBracExpression(unsigned SegReg, SMLoc Start,
|
||||
int64_t ImmDisp, unsigned Size) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
const AsmToken &Tok = Parser.getTok();
|
||||
SMLoc BracLoc = Tok.getLoc(), End = Tok.getEndLoc();
|
||||
if (getLexer().isNot(AsmToken::LBrac))
|
||||
@ -1316,6 +1315,7 @@ bool X86AsmParser::ParseIntelIdentifier(const MCExpr *&Val,
|
||||
StringRef &Identifier,
|
||||
InlineAsmIdentifierInfo &Info,
|
||||
bool IsUnevaluatedOperand, SMLoc &End) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
assert (isParsingInlineAsm() && "Expected to be parsing inline assembly.");
|
||||
Val = nullptr;
|
||||
|
||||
@ -1362,6 +1362,7 @@ bool X86AsmParser::ParseIntelIdentifier(const MCExpr *&Val,
|
||||
std::unique_ptr<X86Operand>
|
||||
X86AsmParser::ParseIntelSegmentOverride(unsigned SegReg, SMLoc Start,
|
||||
unsigned Size) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
assert(SegReg != 0 && "Tried to parse a segment override without a segment!");
|
||||
const AsmToken &Tok = Parser.getTok(); // Eat colon.
|
||||
if (Tok.isNot(AsmToken::Colon))
|
||||
@ -1413,6 +1414,7 @@ X86AsmParser::ParseIntelSegmentOverride(unsigned SegReg, SMLoc Start,
|
||||
std::unique_ptr<X86Operand> X86AsmParser::ParseIntelMemOperand(int64_t ImmDisp,
|
||||
SMLoc Start,
|
||||
unsigned Size) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
const AsmToken &Tok = Parser.getTok();
|
||||
SMLoc End;
|
||||
|
||||
@ -1472,6 +1474,7 @@ std::unique_ptr<X86Operand> X86AsmParser::ParseIntelMemOperand(int64_t ImmDisp,
|
||||
/// Parse the '.' operator.
|
||||
bool X86AsmParser::ParseIntelDotOperator(const MCExpr *Disp,
|
||||
const MCExpr *&NewDisp) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
const AsmToken &Tok = Parser.getTok();
|
||||
int64_t OrigDispVal, DotDispVal;
|
||||
|
||||
@ -1516,6 +1519,7 @@ bool X86AsmParser::ParseIntelDotOperator(const MCExpr *Disp,
|
||||
/// Parse the 'offset' operator. This operator is used to specify the
|
||||
/// location rather then the content of a variable.
|
||||
std::unique_ptr<X86Operand> X86AsmParser::ParseIntelOffsetOfOperator() {
|
||||
MCAsmParser &Parser = getParser();
|
||||
const AsmToken &Tok = Parser.getTok();
|
||||
SMLoc OffsetOfLoc = Tok.getLoc();
|
||||
Parser.Lex(); // Eat offset.
|
||||
@ -1553,6 +1557,7 @@ enum IntelOperatorKind {
|
||||
/// TYPE operator returns the size of a C or C++ type or variable. If the
|
||||
/// variable is an array, TYPE returns the size of a single element.
|
||||
std::unique_ptr<X86Operand> X86AsmParser::ParseIntelOperator(unsigned OpKind) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
const AsmToken &Tok = Parser.getTok();
|
||||
SMLoc TypeLoc = Tok.getLoc();
|
||||
Parser.Lex(); // Eat operator.
|
||||
@ -1586,6 +1591,7 @@ std::unique_ptr<X86Operand> X86AsmParser::ParseIntelOperator(unsigned OpKind) {
|
||||
}
|
||||
|
||||
std::unique_ptr<X86Operand> X86AsmParser::ParseIntelOperand() {
|
||||
MCAsmParser &Parser = getParser();
|
||||
const AsmToken &Tok = Parser.getTok();
|
||||
SMLoc Start, End;
|
||||
|
||||
@ -1668,6 +1674,7 @@ std::unique_ptr<X86Operand> X86AsmParser::ParseIntelOperand() {
|
||||
}
|
||||
|
||||
std::unique_ptr<X86Operand> X86AsmParser::ParseATTOperand() {
|
||||
MCAsmParser &Parser = getParser();
|
||||
switch (getLexer().getKind()) {
|
||||
default:
|
||||
// Parse a memory operand with no segment register.
|
||||
@ -1708,6 +1715,7 @@ std::unique_ptr<X86Operand> X86AsmParser::ParseATTOperand() {
|
||||
|
||||
bool X86AsmParser::HandleAVX512Operand(OperandVector &Operands,
|
||||
const MCParsedAsmOperand &Op) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
if(STI.getFeatureBits() & X86::FeatureAVX512) {
|
||||
if (getLexer().is(AsmToken::LCurly)) {
|
||||
// Eat "{" and mark the current place.
|
||||
@ -1779,6 +1787,7 @@ bool X86AsmParser::HandleAVX512Operand(OperandVector &Operands,
|
||||
std::unique_ptr<X86Operand> X86AsmParser::ParseMemOperand(unsigned SegReg,
|
||||
SMLoc MemStart) {
|
||||
|
||||
MCAsmParser &Parser = getParser();
|
||||
// We have to disambiguate a parenthesized expression "(4+5)" from the start
|
||||
// of a memory operand with a missing displacement "(%ebx)" or "(,%eax)". The
|
||||
// only way to do this without lookahead is to eat the '(' and see what is
|
||||
@ -1944,6 +1953,7 @@ std::unique_ptr<X86Operand> X86AsmParser::ParseMemOperand(unsigned SegReg,
|
||||
|
||||
bool X86AsmParser::ParseInstruction(ParseInstructionInfo &Info, StringRef Name,
|
||||
SMLoc NameLoc, OperandVector &Operands) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
InstInfo = &Info;
|
||||
StringRef PatchedName = Name;
|
||||
|
||||
@ -2715,6 +2725,7 @@ bool X86AsmParser::OmitRegisterFromClobberLists(unsigned RegNo) {
|
||||
}
|
||||
|
||||
bool X86AsmParser::ParseDirective(AsmToken DirectiveID) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
StringRef IDVal = DirectiveID.getIdentifier();
|
||||
if (IDVal == ".word")
|
||||
return ParseDirectiveWord(2, DirectiveID.getLoc());
|
||||
@ -2749,6 +2760,7 @@ bool X86AsmParser::ParseDirective(AsmToken DirectiveID) {
|
||||
/// ParseDirectiveWord
|
||||
/// ::= .word [ expression (, expression)* ]
|
||||
bool X86AsmParser::ParseDirectiveWord(unsigned Size, SMLoc L) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
if (getLexer().isNot(AsmToken::EndOfStatement)) {
|
||||
for (;;) {
|
||||
const MCExpr *Value;
|
||||
@ -2776,6 +2788,7 @@ bool X86AsmParser::ParseDirectiveWord(unsigned Size, SMLoc L) {
|
||||
/// ParseDirectiveCode
|
||||
/// ::= .code16 | .code32 | .code64
|
||||
bool X86AsmParser::ParseDirectiveCode(StringRef IDVal, SMLoc L) {
|
||||
MCAsmParser &Parser = getParser();
|
||||
if (IDVal == ".code16") {
|
||||
Parser.Lex();
|
||||
if (!is16BitMode()) {
|
||||
|
@ -3057,7 +3057,7 @@ void AsmMatcherEmitter::run(raw_ostream &OS) {
|
||||
OS << " if (MII.get(Inst.getOpcode()).getDeprecatedInfo(Inst, STI, Info)) {\n";
|
||||
OS << " SMLoc Loc = ((" << Target.getName()
|
||||
<< "Operand&)*Operands[0]).getStartLoc();\n";
|
||||
OS << " Parser.Warning(Loc, Info, None);\n";
|
||||
OS << " getParser().Warning(Loc, Info, None);\n";
|
||||
OS << " }\n";
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user