194b9550a32d189704a8eae55505edf62662c0534Evan Cheng//===-- llvm/MC/MCTargetAsmParser.h - Target Assembly Parser ----*- C++ -*-===//
2092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar//
3092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar//                     The LLVM Compiler Infrastructure
4092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar//
5092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar// This file is distributed under the University of Illinois Open Source
6092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar// License. See LICENSE.TXT for details.
7092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar//
8092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar//===----------------------------------------------------------------------===//
9092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar
10de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#ifndef LLVM_MC_MCPARSER_MCTARGETASMPARSER_H
11de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#define LLVM_MC_MCPARSER_MCTARGETASMPARSER_H
12092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar
1366b7139b1be1ddce410d97499d5831231c6be267Joerg Sonnenberger#include "llvm/MC/MCExpr.h"
1436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/MC/MCParser/MCAsmParserExtension.h"
15dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "llvm/MC/MCTargetOptions.h"
16c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines#include <memory>
17c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
18092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbarnamespace llvm {
19f007e853e26845cd6866b52d646455fc69f4e0afChris Lattnerclass AsmToken;
2019cb7f491fbc7cb5d0bbd10e201f9d5093e6d4e5Jim Grosbachclass MCInst;
21dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass MCParsedAsmOperand;
22dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass MCStreamer;
23f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarclass MCSubtargetInfo;
24dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass SMLoc;
25dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass StringRef;
269898671a74d3fc924347e679c45edaa685b3fe6eChris Lattnertemplate <typename T> class SmallVectorImpl;
27092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar
28c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinestypedef SmallVectorImpl<std::unique_ptr<MCParsedAsmOperand>> OperandVector;
29c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
306a020a71173a3ea7738a9df69982e85ddbfe0303Chad Rosierenum AsmRewriteKind {
31f16b08de8a57b921ef10f96d5e233027530db448Chad Rosier  AOK_Delete = 0,     // Rewrite should be ignored.
32f16b08de8a57b921ef10f96d5e233027530db448Chad Rosier  AOK_Align,          // Rewrite align as .align.
33f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  AOK_EVEN,           // Rewrite even as .even.
34efcb3d9c1cd9410949b4005fbe6f2817f8dfe395Chad Rosier  AOK_DotOperator,    // Rewrite a dot operator expression as an immediate.
35efcb3d9c1cd9410949b4005fbe6f2817f8dfe395Chad Rosier                      // E.g., [eax].foo.bar -> [eax].8
36efcb3d9c1cd9410949b4005fbe6f2817f8dfe395Chad Rosier  AOK_Emit,           // Rewrite _emit as .byte.
37efcb3d9c1cd9410949b4005fbe6f2817f8dfe395Chad Rosier  AOK_Imm,            // Rewrite as $$N.
38efcb3d9c1cd9410949b4005fbe6f2817f8dfe395Chad Rosier  AOK_ImmPrefix,      // Add $$ before a parsed Imm.
39efcb3d9c1cd9410949b4005fbe6f2817f8dfe395Chad Rosier  AOK_Input,          // Rewrite in terms of $N.
40efcb3d9c1cd9410949b4005fbe6f2817f8dfe395Chad Rosier  AOK_Output,         // Rewrite in terms of $N.
41efcb3d9c1cd9410949b4005fbe6f2817f8dfe395Chad Rosier  AOK_SizeDirective,  // Add a sizing directive (e.g., dword ptr).
4237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  AOK_Label,          // Rewrite local labels.
43de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  AOK_EndOfStatement, // Add EndOfStatement (e.g., "\n\t").
44efcb3d9c1cd9410949b4005fbe6f2817f8dfe395Chad Rosier  AOK_Skip            // Skip emission (e.g., offset/type operators).
456a020a71173a3ea7738a9df69982e85ddbfe0303Chad Rosier};
466a020a71173a3ea7738a9df69982e85ddbfe0303Chad Rosier
476b369ceb582f2deba9c252af301667975456ff86Chad Rosierconst char AsmRewritePrecedence [] = {
48f16b08de8a57b921ef10f96d5e233027530db448Chad Rosier  0, // AOK_Delete
4937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  2, // AOK_Align
50f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  2, // AOK_EVEN
5137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  2, // AOK_DotOperator
5237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  2, // AOK_Emit
5337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  4, // AOK_Imm
5437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  4, // AOK_ImmPrefix
5537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  3, // AOK_Input
5637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  3, // AOK_Output
5737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  5, // AOK_SizeDirective
5837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  1, // AOK_Label
59de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  5, // AOK_EndOfStatement
6037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  2  // AOK_Skip
616b369ceb582f2deba9c252af301667975456ff86Chad Rosier};
626b369ceb582f2deba9c252af301667975456ff86Chad Rosier
636a020a71173a3ea7738a9df69982e85ddbfe0303Chad Rosierstruct AsmRewrite {
646a020a71173a3ea7738a9df69982e85ddbfe0303Chad Rosier  AsmRewriteKind Kind;
656a020a71173a3ea7738a9df69982e85ddbfe0303Chad Rosier  SMLoc Loc;
666a020a71173a3ea7738a9df69982e85ddbfe0303Chad Rosier  unsigned Len;
676a020a71173a3ea7738a9df69982e85ddbfe0303Chad Rosier  unsigned Val;
6837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  StringRef Label;
696a020a71173a3ea7738a9df69982e85ddbfe0303Chad Rosierpublic:
70efcb3d9c1cd9410949b4005fbe6f2817f8dfe395Chad Rosier  AsmRewrite(AsmRewriteKind kind, SMLoc loc, unsigned len = 0, unsigned val = 0)
716a020a71173a3ea7738a9df69982e85ddbfe0303Chad Rosier    : Kind(kind), Loc(loc), Len(len), Val(val) {}
7237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  AsmRewrite(AsmRewriteKind kind, SMLoc loc, unsigned len, StringRef label)
7337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    : Kind(kind), Loc(loc), Len(len), Val(0), Label(label) {}
746a020a71173a3ea7738a9df69982e85ddbfe0303Chad Rosier};
756a020a71173a3ea7738a9df69982e85ddbfe0303Chad Rosier
766a020a71173a3ea7738a9df69982e85ddbfe0303Chad Rosierstruct ParseInstructionInfo {
776a020a71173a3ea7738a9df69982e85ddbfe0303Chad Rosier
786a020a71173a3ea7738a9df69982e85ddbfe0303Chad Rosier  SmallVectorImpl<AsmRewrite> *AsmRewrites;
796a020a71173a3ea7738a9df69982e85ddbfe0303Chad Rosier
80dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  ParseInstructionInfo() : AsmRewrites(nullptr) {}
816a020a71173a3ea7738a9df69982e85ddbfe0303Chad Rosier  ParseInstructionInfo(SmallVectorImpl<AsmRewrite> *rewrites)
826a020a71173a3ea7738a9df69982e85ddbfe0303Chad Rosier    : AsmRewrites(rewrites) {}
836a020a71173a3ea7738a9df69982e85ddbfe0303Chad Rosier};
846a020a71173a3ea7738a9df69982e85ddbfe0303Chad Rosier
8594b9550a32d189704a8eae55505edf62662c0534Evan Cheng/// MCTargetAsmParser - Generic interface to target specific assembly parsers.
8694b9550a32d189704a8eae55505edf62662c0534Evan Chengclass MCTargetAsmParser : public MCAsmParserExtension {
8747a24ab4d72dc0f78c2027327cb9a69d6de2bbcdJim Grosbachpublic:
8847a24ab4d72dc0f78c2027327cb9a69d6de2bbcdJim Grosbach  enum MatchResultTy {
8947a24ab4d72dc0f78c2027327cb9a69d6de2bbcdJim Grosbach    Match_InvalidOperand,
9047a24ab4d72dc0f78c2027327cb9a69d6de2bbcdJim Grosbach    Match_MissingFeature,
9147a24ab4d72dc0f78c2027327cb9a69d6de2bbcdJim Grosbach    Match_MnemonicFail,
9219cb7f491fbc7cb5d0bbd10e201f9d5093e6d4e5Jim Grosbach    Match_Success,
9319cb7f491fbc7cb5d0bbd10e201f9d5093e6d4e5Jim Grosbach    FIRST_TARGET_MATCH_RESULT_TY
9447a24ab4d72dc0f78c2027327cb9a69d6de2bbcdJim Grosbach  };
9547a24ab4d72dc0f78c2027327cb9a69d6de2bbcdJim Grosbach
9647a24ab4d72dc0f78c2027327cb9a69d6de2bbcdJim Grosbachprivate:
97ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  MCTargetAsmParser(const MCTargetAsmParser &) = delete;
98ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  void operator=(const MCTargetAsmParser &) = delete;
99092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbarprotected: // Can only create subclasses.
100f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  MCTargetAsmParser(MCTargetOptions const &, const MCSubtargetInfo &STI);
101f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
102f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// Create a copy of STI and return a non-const reference to it.
103f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  MCSubtargetInfo &copySTI();
104bb0752b040cfe206afeef7fa60e80dde91594fa1Jim Grosbach
105480cee5d4396a380ada6ffd03551b5700d041fe0Evan Cheng  /// AvailableFeatures - The current set of available features.
10637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  uint64_t AvailableFeatures;
10754074b5f04f5affc77b5c6f3e5d8062b50384831Daniel Dunbar
1089abfbdfc77efe715314f8ed673a7b6d25c00ca48Chad Rosier  /// ParsingInlineAsm - Are we parsing ms-style inline assembly?
1099abfbdfc77efe715314f8ed673a7b6d25c00ca48Chad Rosier  bool ParsingInlineAsm;
1109abfbdfc77efe715314f8ed673a7b6d25c00ca48Chad Rosier
111faf547053bc097be0e834efd241ccc023777ff38Chad Rosier  /// SemaCallback - The Sema callback implementation.  Must be set when parsing
112faf547053bc097be0e834efd241ccc023777ff38Chad Rosier  /// ms-style inline assembly.
113faf547053bc097be0e834efd241ccc023777ff38Chad Rosier  MCAsmParserSemaCallback *SemaCallback;
114faf547053bc097be0e834efd241ccc023777ff38Chad Rosier
115dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Set of options which affects instrumentation of inline assembly.
116dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  MCTargetOptions MCOptions;
117dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
118f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// Current STI.
119f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  const MCSubtargetInfo *STI;
120f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
121092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbarpublic:
1220c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  ~MCTargetAsmParser() override;
123092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar
124f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  const MCSubtargetInfo &getSTI() const;
125f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
12637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  uint64_t getAvailableFeatures() const { return AvailableFeatures; }
12737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  void setAvailableFeatures(uint64_t Value) { AvailableFeatures = Value; }
12854074b5f04f5affc77b5c6f3e5d8062b50384831Daniel Dunbar
1299abfbdfc77efe715314f8ed673a7b6d25c00ca48Chad Rosier  bool isParsingInlineAsm () { return ParsingInlineAsm; }
1309abfbdfc77efe715314f8ed673a7b6d25c00ca48Chad Rosier  void setParsingInlineAsm (bool Value) { ParsingInlineAsm = Value; }
1319abfbdfc77efe715314f8ed673a7b6d25c00ca48Chad Rosier
13237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  MCTargetOptions getTargetOptions() const { return MCOptions; }
13337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
134faf547053bc097be0e834efd241ccc023777ff38Chad Rosier  void setSemaCallback(MCAsmParserSemaCallback *Callback) {
135faf547053bc097be0e834efd241ccc023777ff38Chad Rosier    SemaCallback = Callback;
136faf547053bc097be0e834efd241ccc023777ff38Chad Rosier  }
137faf547053bc097be0e834efd241ccc023777ff38Chad Rosier
138480cee5d4396a380ada6ffd03551b5700d041fe0Evan Cheng  virtual bool ParseRegister(unsigned &RegNo, SMLoc &StartLoc,
139480cee5d4396a380ada6ffd03551b5700d041fe0Evan Cheng                             SMLoc &EndLoc) = 0;
140bf7553210ae44f05e7460edeae1ee499d8a22dcbRoman Divacky
14137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// Sets frame register corresponding to the current MachineFunction.
14237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  virtual void SetFrameRegister(unsigned RegNo) {}
14337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
144a3af370dc12f6d5100da5d614ab0a62da135569aDaniel Dunbar  /// ParseInstruction - Parse one assembly instruction.
145a3af370dc12f6d5100da5d614ab0a62da135569aDaniel Dunbar  ///
146a3af370dc12f6d5100da5d614ab0a62da135569aDaniel Dunbar  /// The parser is positioned following the instruction name. The target
147a3af370dc12f6d5100da5d614ab0a62da135569aDaniel Dunbar  /// specific instruction parser should parse the entire instruction and
148a3af370dc12f6d5100da5d614ab0a62da135569aDaniel Dunbar  /// construct the appropriate MCInst, or emit an error. On success, the entire
149a3af370dc12f6d5100da5d614ab0a62da135569aDaniel Dunbar  /// line should be parsed up to and including the end-of-statement token. On
150a3af370dc12f6d5100da5d614ab0a62da135569aDaniel Dunbar  /// failure, the parser is not required to read to the end of the line.
151a3af370dc12f6d5100da5d614ab0a62da135569aDaniel Dunbar  //
152a3af370dc12f6d5100da5d614ab0a62da135569aDaniel Dunbar  /// \param Name - The instruction name.
153fb76fe09297ee292129e44d723127f2408602a3dDan Gohman  /// \param NameLoc - The source location of the name.
1549898671a74d3fc924347e679c45edaa685b3fe6eChris Lattner  /// \param Operands [out] - The list of parsed operands, this returns
1559898671a74d3fc924347e679c45edaa685b3fe6eChris Lattner  ///        ownership of them to the caller.
156a3af370dc12f6d5100da5d614ab0a62da135569aDaniel Dunbar  /// \return True on failure.
1576a020a71173a3ea7738a9df69982e85ddbfe0303Chad Rosier  virtual bool ParseInstruction(ParseInstructionInfo &Info, StringRef Name,
158c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines                                SMLoc NameLoc, OperandVector &Operands) = 0;
159f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  virtual bool ParseInstruction(ParseInstructionInfo &Info, StringRef Name,
160f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                AsmToken Token, OperandVector &Operands) {
161f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return ParseInstruction(Info, Name, Token.getLoc(), Operands);
162f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
1639c656450d65034c4cd3597fff61ef17376cff090Kevin Enderby
1649c656450d65034c4cd3597fff61ef17376cff090Kevin Enderby  /// ParseDirective - Parse a target specific assembler directive
1659c656450d65034c4cd3597fff61ef17376cff090Kevin Enderby  ///
1669c656450d65034c4cd3597fff61ef17376cff090Kevin Enderby  /// The parser is positioned following the directive name.  The target
1679c656450d65034c4cd3597fff61ef17376cff090Kevin Enderby  /// specific directive parser should parse the entire directive doing or
1689c656450d65034c4cd3597fff61ef17376cff090Kevin Enderby  /// recording any target specific work, or return true and do nothing if the
1699c656450d65034c4cd3597fff61ef17376cff090Kevin Enderby  /// directive is not target specific. If the directive is specific for
1709c656450d65034c4cd3597fff61ef17376cff090Kevin Enderby  /// the target, the entire line is parsed up to and including the
1719c656450d65034c4cd3597fff61ef17376cff090Kevin Enderby  /// end-of-statement token and false is returned.
1729c656450d65034c4cd3597fff61ef17376cff090Kevin Enderby  ///
173fb76fe09297ee292129e44d723127f2408602a3dDan Gohman  /// \param DirectiveID - the identifier token of the directive.
1749c656450d65034c4cd3597fff61ef17376cff090Kevin Enderby  virtual bool ParseDirective(AsmToken DirectiveID) = 0;
175bb0752b040cfe206afeef7fa60e80dde91594fa1Jim Grosbach
1767036f8be4df8a1a830ca01afe9497b035a5647d6Chris Lattner  /// MatchAndEmitInstruction - Recognize a series of operands of a parsed
1777036f8be4df8a1a830ca01afe9497b035a5647d6Chris Lattner  /// instruction as an actual MCInst and emit it to the specified MCStreamer.
1787036f8be4df8a1a830ca01afe9497b035a5647d6Chris Lattner  /// This returns false on success and returns true on failure to match.
179f1e29d4c21d15f9e1e3a64f3b92b1aa9908e4f63Daniel Dunbar  ///
180f1e29d4c21d15f9e1e3a64f3b92b1aa9908e4f63Daniel Dunbar  /// On failure, the target parser is responsible for emitting a diagnostic
181f1e29d4c21d15f9e1e3a64f3b92b1aa9908e4f63Daniel Dunbar  /// explaining the match failure.
182c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  virtual bool MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode,
183c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines                                       OperandVector &Operands, MCStreamer &Out,
18437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                       uint64_t &ErrorInfo,
185c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines                                       bool MatchingInlineAsm) = 0;
186bb0752b040cfe206afeef7fa60e80dde91594fa1Jim Grosbach
18737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// Allows targets to let registers opt out of clobber lists.
18837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  virtual bool OmitRegisterFromClobberLists(unsigned RegNo) { return false; }
18937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
190fa05def52c6bb8266d856a9af2de6fa066d93d44Jim Grosbach  /// Allow a target to add special case operand matching for things that
191fa05def52c6bb8266d856a9af2de6fa066d93d44Jim Grosbach  /// tblgen doesn't/can't handle effectively. For example, literal
192fa05def52c6bb8266d856a9af2de6fa066d93d44Jim Grosbach  /// immediates on ARM. TableGen expects a token operand, but the parser
193fa05def52c6bb8266d856a9af2de6fa066d93d44Jim Grosbach  /// will recognize them as immediates.
194c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  virtual unsigned validateTargetOperandClass(MCParsedAsmOperand &Op,
195fa05def52c6bb8266d856a9af2de6fa066d93d44Jim Grosbach                                              unsigned Kind) {
196fa05def52c6bb8266d856a9af2de6fa066d93d44Jim Grosbach    return Match_InvalidOperand;
197fa05def52c6bb8266d856a9af2de6fa066d93d44Jim Grosbach  }
198fa05def52c6bb8266d856a9af2de6fa066d93d44Jim Grosbach
19919cb7f491fbc7cb5d0bbd10e201f9d5093e6d4e5Jim Grosbach  /// checkTargetMatchPredicate - Validate the instruction match against
20019cb7f491fbc7cb5d0bbd10e201f9d5093e6d4e5Jim Grosbach  /// any complex target predicates not expressible via match classes.
20119cb7f491fbc7cb5d0bbd10e201f9d5093e6d4e5Jim Grosbach  virtual unsigned checkTargetMatchPredicate(MCInst &Inst) {
20219cb7f491fbc7cb5d0bbd10e201f9d5093e6d4e5Jim Grosbach    return Match_Success;
20319cb7f491fbc7cb5d0bbd10e201f9d5093e6d4e5Jim Grosbach  }
20419cb7f491fbc7cb5d0bbd10e201f9d5093e6d4e5Jim Grosbach
20522685876ed7231f32f7d1698c00acab22825b74cChad Rosier  virtual void convertToMapAndConstraints(unsigned Kind,
206c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines                                          const OperandVector &Operands) = 0;
20766b7139b1be1ddce410d97499d5831231c6be267Joerg Sonnenberger
208f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // Return whether this parser uses assignment statements with equals tokens
209f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  virtual bool equalIsAsmAssignment() { return true; };
210f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // Return whether this start of statement identifier is a label
211f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  virtual bool isLabel(AsmToken &Token) { return true; };
212f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
21366b7139b1be1ddce410d97499d5831231c6be267Joerg Sonnenberger  virtual const MCExpr *applyModifierToExpr(const MCExpr *E,
21466b7139b1be1ddce410d97499d5831231c6be267Joerg Sonnenberger                                            MCSymbolRefExpr::VariantKind,
21566b7139b1be1ddce410d97499d5831231c6be267Joerg Sonnenberger                                            MCContext &Ctx) {
216dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return nullptr;
21766b7139b1be1ddce410d97499d5831231c6be267Joerg Sonnenberger  }
218c8f4e5db29270fc7ed164af973ece7ba5921539bTim Northover
219f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  virtual void onLabelParsed(MCSymbol *Symbol) { }
220092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar};
221092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar
222092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar} // End llvm namespace
223092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar
224092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar#endif
225