10b57cec5SDimitry Andric //===- llvm/MC/MCAsmParser.h - Abstract Asm Parser Interface ----*- C++ -*-===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric 
90b57cec5SDimitry Andric #ifndef LLVM_MC_MCPARSER_MCASMPARSER_H
100b57cec5SDimitry Andric #define LLVM_MC_MCPARSER_MCASMPARSER_H
110b57cec5SDimitry Andric 
1281ad6265SDimitry Andric #include "llvm/ADT/STLFunctionalExtras.h"
130b57cec5SDimitry Andric #include "llvm/ADT/SmallString.h"
140b57cec5SDimitry Andric #include "llvm/ADT/SmallVector.h"
150b57cec5SDimitry Andric #include "llvm/ADT/StringRef.h"
160b57cec5SDimitry Andric #include "llvm/ADT/Twine.h"
1781ad6265SDimitry Andric #include "llvm/MC/MCAsmMacro.h"
180b57cec5SDimitry Andric #include "llvm/Support/SMLoc.h"
190b57cec5SDimitry Andric #include <cstdint>
200b57cec5SDimitry Andric #include <string>
210b57cec5SDimitry Andric #include <utility>
220b57cec5SDimitry Andric 
230b57cec5SDimitry Andric namespace llvm {
240b57cec5SDimitry Andric 
2581ad6265SDimitry Andric class MCAsmLexer;
260b57cec5SDimitry Andric class MCAsmInfo;
270b57cec5SDimitry Andric class MCAsmParserExtension;
280b57cec5SDimitry Andric class MCContext;
290b57cec5SDimitry Andric class MCExpr;
300b57cec5SDimitry Andric class MCInstPrinter;
310b57cec5SDimitry Andric class MCInstrInfo;
320b57cec5SDimitry Andric class MCStreamer;
330b57cec5SDimitry Andric class MCTargetAsmParser;
340b57cec5SDimitry Andric class SourceMgr;
350b57cec5SDimitry Andric 
360b57cec5SDimitry Andric struct InlineAsmIdentifierInfo {
370b57cec5SDimitry Andric   enum IdKind {
380b57cec5SDimitry Andric     IK_Invalid,  // Initial state. Unexpected after a successful parsing.
390b57cec5SDimitry Andric     IK_Label,    // Function/Label reference.
400b57cec5SDimitry Andric     IK_EnumVal,  // Value of enumeration type.
410b57cec5SDimitry Andric     IK_Var       // Variable.
420b57cec5SDimitry Andric   };
430b57cec5SDimitry Andric   // Represents an Enum value
440b57cec5SDimitry Andric   struct EnumIdentifier {
450b57cec5SDimitry Andric     int64_t EnumVal;
460b57cec5SDimitry Andric   };
470b57cec5SDimitry Andric   // Represents a label/function reference
480b57cec5SDimitry Andric   struct LabelIdentifier {
490b57cec5SDimitry Andric     void *Decl;
500b57cec5SDimitry Andric   };
510b57cec5SDimitry Andric   // Represents a variable
520b57cec5SDimitry Andric   struct VariableIdentifier {
530b57cec5SDimitry Andric     void *Decl;
540b57cec5SDimitry Andric     bool IsGlobalLV;
550b57cec5SDimitry Andric     unsigned Length;
560b57cec5SDimitry Andric     unsigned Size;
570b57cec5SDimitry Andric     unsigned Type;
580b57cec5SDimitry Andric   };
590b57cec5SDimitry Andric   // An InlineAsm identifier can only be one of those
600b57cec5SDimitry Andric   union {
610b57cec5SDimitry Andric     EnumIdentifier Enum;
620b57cec5SDimitry Andric     LabelIdentifier Label;
630b57cec5SDimitry Andric     VariableIdentifier Var;
640b57cec5SDimitry Andric   };
isKindInlineAsmIdentifierInfo650b57cec5SDimitry Andric   bool isKind(IdKind kind) const { return Kind == kind; }
660b57cec5SDimitry Andric   // Initializers
setEnumInlineAsmIdentifierInfo670b57cec5SDimitry Andric   void setEnum(int64_t enumVal) {
680b57cec5SDimitry Andric     assert(isKind(IK_Invalid) && "should be initialized only once");
690b57cec5SDimitry Andric     Kind = IK_EnumVal;
700b57cec5SDimitry Andric     Enum.EnumVal = enumVal;
710b57cec5SDimitry Andric   }
setLabelInlineAsmIdentifierInfo720b57cec5SDimitry Andric   void setLabel(void *decl) {
730b57cec5SDimitry Andric     assert(isKind(IK_Invalid) && "should be initialized only once");
740b57cec5SDimitry Andric     Kind = IK_Label;
750b57cec5SDimitry Andric     Label.Decl = decl;
760b57cec5SDimitry Andric   }
setVarInlineAsmIdentifierInfo770b57cec5SDimitry Andric   void setVar(void *decl, bool isGlobalLV, unsigned size, unsigned type) {
780b57cec5SDimitry Andric     assert(isKind(IK_Invalid) && "should be initialized only once");
790b57cec5SDimitry Andric     Kind = IK_Var;
800b57cec5SDimitry Andric     Var.Decl = decl;
810b57cec5SDimitry Andric     Var.IsGlobalLV = isGlobalLV;
820b57cec5SDimitry Andric     Var.Size = size;
830b57cec5SDimitry Andric     Var.Type = type;
840b57cec5SDimitry Andric     Var.Length = size / type;
850b57cec5SDimitry Andric   }
8606c3fb27SDimitry Andric   InlineAsmIdentifierInfo() = default;
870b57cec5SDimitry Andric 
880b57cec5SDimitry Andric private:
890b57cec5SDimitry Andric   // Discriminate using the current kind.
9006c3fb27SDimitry Andric   IdKind Kind = IK_Invalid;
910b57cec5SDimitry Andric };
920b57cec5SDimitry Andric 
93e8d8bef9SDimitry Andric // Generic type information for an assembly object.
94e8d8bef9SDimitry Andric // All sizes measured in bytes.
95e8d8bef9SDimitry Andric struct AsmTypeInfo {
96e8d8bef9SDimitry Andric   StringRef Name;
97e8d8bef9SDimitry Andric   unsigned Size = 0;
98e8d8bef9SDimitry Andric   unsigned ElementSize = 0;
99e8d8bef9SDimitry Andric   unsigned Length = 0;
100e8d8bef9SDimitry Andric };
101e8d8bef9SDimitry Andric 
102e8d8bef9SDimitry Andric struct AsmFieldInfo {
103e8d8bef9SDimitry Andric   AsmTypeInfo Type;
104e8d8bef9SDimitry Andric   unsigned Offset = 0;
105e8d8bef9SDimitry Andric };
106e8d8bef9SDimitry Andric 
1070b57cec5SDimitry Andric /// Generic Sema callback for assembly parser.
1080b57cec5SDimitry Andric class MCAsmParserSemaCallback {
1090b57cec5SDimitry Andric public:
1100b57cec5SDimitry Andric   virtual ~MCAsmParserSemaCallback();
1110b57cec5SDimitry Andric 
1120b57cec5SDimitry Andric   virtual void LookupInlineAsmIdentifier(StringRef &LineBuf,
1130b57cec5SDimitry Andric                                          InlineAsmIdentifierInfo &Info,
1140b57cec5SDimitry Andric                                          bool IsUnevaluatedContext) = 0;
1150b57cec5SDimitry Andric   virtual StringRef LookupInlineAsmLabel(StringRef Identifier, SourceMgr &SM,
1160b57cec5SDimitry Andric                                          SMLoc Location, bool Create) = 0;
1170b57cec5SDimitry Andric   virtual bool LookupInlineAsmField(StringRef Base, StringRef Member,
1180b57cec5SDimitry Andric                                     unsigned &Offset) = 0;
1190b57cec5SDimitry Andric };
1200b57cec5SDimitry Andric 
1210b57cec5SDimitry Andric /// Generic assembler parser interface, for use by target specific
1220b57cec5SDimitry Andric /// assembly parsers.
1230b57cec5SDimitry Andric class MCAsmParser {
1240b57cec5SDimitry Andric public:
1250b57cec5SDimitry Andric   using DirectiveHandler = bool (*)(MCAsmParserExtension*, StringRef, SMLoc);
1260b57cec5SDimitry Andric   using ExtensionDirectiveHandler =
1270b57cec5SDimitry Andric       std::pair<MCAsmParserExtension*, DirectiveHandler>;
1280b57cec5SDimitry Andric 
1290b57cec5SDimitry Andric   struct MCPendingError {
1300b57cec5SDimitry Andric     SMLoc Loc;
1310b57cec5SDimitry Andric     SmallString<64> Msg;
1320b57cec5SDimitry Andric     SMRange Range;
1330b57cec5SDimitry Andric   };
1340b57cec5SDimitry Andric 
1350b57cec5SDimitry Andric private:
1360b57cec5SDimitry Andric   MCTargetAsmParser *TargetParser = nullptr;
1370b57cec5SDimitry Andric 
1380b57cec5SDimitry Andric protected: // Can only create subclasses.
1390b57cec5SDimitry Andric   MCAsmParser();
1400b57cec5SDimitry Andric 
1410b57cec5SDimitry Andric   SmallVector<MCPendingError, 0> PendingErrors;
1420b57cec5SDimitry Andric 
1430b57cec5SDimitry Andric   /// Flag tracking whether any errors have been encountered.
1440b57cec5SDimitry Andric   bool HadError = false;
1450b57cec5SDimitry Andric 
1460b57cec5SDimitry Andric   bool ShowParsedOperands = false;
1470b57cec5SDimitry Andric 
1480b57cec5SDimitry Andric public:
1490b57cec5SDimitry Andric   MCAsmParser(const MCAsmParser &) = delete;
1500b57cec5SDimitry Andric   MCAsmParser &operator=(const MCAsmParser &) = delete;
1510b57cec5SDimitry Andric   virtual ~MCAsmParser();
1520b57cec5SDimitry Andric 
1530b57cec5SDimitry Andric   virtual void addDirectiveHandler(StringRef Directive,
1540b57cec5SDimitry Andric                                    ExtensionDirectiveHandler Handler) = 0;
1550b57cec5SDimitry Andric 
1560b57cec5SDimitry Andric   virtual void addAliasForDirective(StringRef Directive, StringRef Alias) = 0;
1570b57cec5SDimitry Andric 
1580b57cec5SDimitry Andric   virtual SourceMgr &getSourceManager() = 0;
1590b57cec5SDimitry Andric 
1600b57cec5SDimitry Andric   virtual MCAsmLexer &getLexer() = 0;
getLexer()1610b57cec5SDimitry Andric   const MCAsmLexer &getLexer() const {
1620b57cec5SDimitry Andric     return const_cast<MCAsmParser*>(this)->getLexer();
1630b57cec5SDimitry Andric   }
1640b57cec5SDimitry Andric 
1650b57cec5SDimitry Andric   virtual MCContext &getContext() = 0;
1660b57cec5SDimitry Andric 
1670b57cec5SDimitry Andric   /// Return the output streamer for the assembler.
1680b57cec5SDimitry Andric   virtual MCStreamer &getStreamer() = 0;
1690b57cec5SDimitry Andric 
getTargetParser()1700b57cec5SDimitry Andric   MCTargetAsmParser &getTargetParser() const { return *TargetParser; }
1710b57cec5SDimitry Andric   void setTargetParser(MCTargetAsmParser &P);
1720b57cec5SDimitry Andric 
getAssemblerDialect()1730b57cec5SDimitry Andric   virtual unsigned getAssemblerDialect() { return 0;}
setAssemblerDialect(unsigned i)1740b57cec5SDimitry Andric   virtual void setAssemblerDialect(unsigned i) { }
1750b57cec5SDimitry Andric 
getShowParsedOperands()1760b57cec5SDimitry Andric   bool getShowParsedOperands() const { return ShowParsedOperands; }
setShowParsedOperands(bool Value)1770b57cec5SDimitry Andric   void setShowParsedOperands(bool Value) { ShowParsedOperands = Value; }
1780b57cec5SDimitry Andric 
1790b57cec5SDimitry Andric   /// Run the parser on the input source buffer.
1800b57cec5SDimitry Andric   virtual bool Run(bool NoInitialTextSection, bool NoFinalize = false) = 0;
1810b57cec5SDimitry Andric 
1825ffd83dbSDimitry Andric   virtual void setParsingMSInlineAsm(bool V) = 0;
1835ffd83dbSDimitry Andric   virtual bool isParsingMSInlineAsm() = 0;
1845ffd83dbSDimitry Andric 
discardLTOSymbol(StringRef)185fe6060f1SDimitry Andric   virtual bool discardLTOSymbol(StringRef) const { return false; }
186fe6060f1SDimitry Andric 
isParsingMasm()1875ffd83dbSDimitry Andric   virtual bool isParsingMasm() const { return false; }
1885ffd83dbSDimitry Andric 
defineMacro(StringRef Name,StringRef Value)189e8d8bef9SDimitry Andric   virtual bool defineMacro(StringRef Name, StringRef Value) { return true; }
190e8d8bef9SDimitry Andric 
lookUpField(StringRef Name,AsmFieldInfo & Info)191e8d8bef9SDimitry Andric   virtual bool lookUpField(StringRef Name, AsmFieldInfo &Info) const {
1925ffd83dbSDimitry Andric     return true;
1935ffd83dbSDimitry Andric   }
lookUpField(StringRef Base,StringRef Member,AsmFieldInfo & Info)194e8d8bef9SDimitry Andric   virtual bool lookUpField(StringRef Base, StringRef Member,
195e8d8bef9SDimitry Andric                            AsmFieldInfo &Info) const {
196e8d8bef9SDimitry Andric     return true;
197e8d8bef9SDimitry Andric   }
198e8d8bef9SDimitry Andric 
lookUpType(StringRef Name,AsmTypeInfo & Info)199e8d8bef9SDimitry Andric   virtual bool lookUpType(StringRef Name, AsmTypeInfo &Info) const {
2005ffd83dbSDimitry Andric     return true;
2015ffd83dbSDimitry Andric   }
2020b57cec5SDimitry Andric 
2030b57cec5SDimitry Andric   /// Parse MS-style inline assembly.
2040b57cec5SDimitry Andric   virtual bool parseMSInlineAsm(
205fe6060f1SDimitry Andric       std::string &AsmString, unsigned &NumOutputs, unsigned &NumInputs,
206fe6060f1SDimitry Andric       SmallVectorImpl<std::pair<void *, bool>> &OpDecls,
2070b57cec5SDimitry Andric       SmallVectorImpl<std::string> &Constraints,
2080b57cec5SDimitry Andric       SmallVectorImpl<std::string> &Clobbers, const MCInstrInfo *MII,
2090b57cec5SDimitry Andric       const MCInstPrinter *IP, MCAsmParserSemaCallback &SI) = 0;
2100b57cec5SDimitry Andric 
2110b57cec5SDimitry Andric   /// Emit a note at the location \p L, with the message \p Msg.
212bdd1243dSDimitry Andric   virtual void Note(SMLoc L, const Twine &Msg,
213bdd1243dSDimitry Andric                     SMRange Range = std::nullopt) = 0;
2140b57cec5SDimitry Andric 
2150b57cec5SDimitry Andric   /// Emit a warning at the location \p L, with the message \p Msg.
2160b57cec5SDimitry Andric   ///
2170b57cec5SDimitry Andric   /// \return The return value is true, if warnings are fatal.
218bdd1243dSDimitry Andric   virtual bool Warning(SMLoc L, const Twine &Msg,
219bdd1243dSDimitry Andric                        SMRange Range = std::nullopt) = 0;
2200b57cec5SDimitry Andric 
2210b57cec5SDimitry Andric   /// Return an error at the location \p L, with the message \p Msg. This
2220b57cec5SDimitry Andric   /// may be modified before being emitted.
2230b57cec5SDimitry Andric   ///
2240b57cec5SDimitry Andric   /// \return The return value is always true, as an idiomatic convenience to
2250b57cec5SDimitry Andric   /// clients.
226bdd1243dSDimitry Andric   bool Error(SMLoc L, const Twine &Msg, SMRange Range = std::nullopt);
2270b57cec5SDimitry Andric 
2280b57cec5SDimitry Andric   /// Emit an error at the location \p L, with the message \p Msg.
2290b57cec5SDimitry Andric   ///
2300b57cec5SDimitry Andric   /// \return The return value is always true, as an idiomatic convenience to
2310b57cec5SDimitry Andric   /// clients.
232bdd1243dSDimitry Andric   virtual bool printError(SMLoc L, const Twine &Msg,
233bdd1243dSDimitry Andric                           SMRange Range = std::nullopt) = 0;
2340b57cec5SDimitry Andric 
hasPendingError()2350b57cec5SDimitry Andric   bool hasPendingError() { return !PendingErrors.empty(); }
2360b57cec5SDimitry Andric 
printPendingErrors()2370b57cec5SDimitry Andric   bool printPendingErrors() {
2380b57cec5SDimitry Andric     bool rv = !PendingErrors.empty();
23906c3fb27SDimitry Andric     for (auto &Err : PendingErrors) {
2400b57cec5SDimitry Andric       printError(Err.Loc, Twine(Err.Msg), Err.Range);
2410b57cec5SDimitry Andric     }
2420b57cec5SDimitry Andric     PendingErrors.clear();
2430b57cec5SDimitry Andric     return rv;
2440b57cec5SDimitry Andric   }
2450b57cec5SDimitry Andric 
clearPendingErrors()2460b57cec5SDimitry Andric   void clearPendingErrors() { PendingErrors.clear(); }
2470b57cec5SDimitry Andric 
2480b57cec5SDimitry Andric   bool addErrorSuffix(const Twine &Suffix);
2490b57cec5SDimitry Andric 
2500b57cec5SDimitry Andric   /// Get the next AsmToken in the stream, possibly handling file
2510b57cec5SDimitry Andric   /// inclusion first.
2520b57cec5SDimitry Andric   virtual const AsmToken &Lex() = 0;
2530b57cec5SDimitry Andric 
2540b57cec5SDimitry Andric   /// Get the current AsmToken from the stream.
2550b57cec5SDimitry Andric   const AsmToken &getTok() const;
2560b57cec5SDimitry Andric 
2570b57cec5SDimitry Andric   /// Report an error at the current lexer location.
258bdd1243dSDimitry Andric   bool TokError(const Twine &Msg, SMRange Range = std::nullopt);
2590b57cec5SDimitry Andric 
2600b57cec5SDimitry Andric   bool parseTokenLoc(SMLoc &Loc);
2610b57cec5SDimitry Andric   bool parseToken(AsmToken::TokenKind T, const Twine &Msg = "unexpected token");
2620b57cec5SDimitry Andric   /// Attempt to parse and consume token, returning true on
2630b57cec5SDimitry Andric   /// success.
2640b57cec5SDimitry Andric   bool parseOptionalToken(AsmToken::TokenKind T);
2650b57cec5SDimitry Andric 
parseComma()266fe6060f1SDimitry Andric   bool parseComma() { return parseToken(AsmToken::Comma, "expected comma"); }
parseRParen()26704eeddc0SDimitry Andric   bool parseRParen() { return parseToken(AsmToken::RParen, "expected ')'"); }
268fe6060f1SDimitry Andric   bool parseEOL();
2690b57cec5SDimitry Andric   bool parseEOL(const Twine &ErrMsg);
2700b57cec5SDimitry Andric 
2710b57cec5SDimitry Andric   bool parseMany(function_ref<bool()> parseOne, bool hasComma = true);
2720b57cec5SDimitry Andric 
2730b57cec5SDimitry Andric   bool parseIntToken(int64_t &V, const Twine &ErrMsg);
2740b57cec5SDimitry Andric 
2750b57cec5SDimitry Andric   bool check(bool P, const Twine &Msg);
2760b57cec5SDimitry Andric   bool check(bool P, SMLoc Loc, const Twine &Msg);
2770b57cec5SDimitry Andric 
2780b57cec5SDimitry Andric   /// Parse an identifier or string (as a quoted identifier) and set \p
2790b57cec5SDimitry Andric   /// Res to the identifier contents.
2800b57cec5SDimitry Andric   virtual bool parseIdentifier(StringRef &Res) = 0;
2810b57cec5SDimitry Andric 
2820b57cec5SDimitry Andric   /// Parse up to the end of statement and return the contents from the
2830b57cec5SDimitry Andric   /// current token until the end of the statement; the current token on exit
2840b57cec5SDimitry Andric   /// will be either the EndOfStatement or EOF.
2850b57cec5SDimitry Andric   virtual StringRef parseStringToEndOfStatement() = 0;
2860b57cec5SDimitry Andric 
2870b57cec5SDimitry Andric   /// Parse the current token as a string which may include escaped
2880b57cec5SDimitry Andric   /// characters and return the string contents.
2890b57cec5SDimitry Andric   virtual bool parseEscapedString(std::string &Data) = 0;
2900b57cec5SDimitry Andric 
2915ffd83dbSDimitry Andric   /// Parse an angle-bracket delimited string at the current position if one is
2925ffd83dbSDimitry Andric   /// present, returning the string contents.
2935ffd83dbSDimitry Andric   virtual bool parseAngleBracketString(std::string &Data) = 0;
2945ffd83dbSDimitry Andric 
2950b57cec5SDimitry Andric   /// Skip to the end of the current statement, for error recovery.
2960b57cec5SDimitry Andric   virtual void eatToEndOfStatement() = 0;
2970b57cec5SDimitry Andric 
2980b57cec5SDimitry Andric   /// Parse an arbitrary expression.
2990b57cec5SDimitry Andric   ///
3000b57cec5SDimitry Andric   /// \param Res - The value of the expression. The result is undefined
3010b57cec5SDimitry Andric   /// on error.
3020b57cec5SDimitry Andric   /// \return - False on success.
3030b57cec5SDimitry Andric   virtual bool parseExpression(const MCExpr *&Res, SMLoc &EndLoc) = 0;
3040b57cec5SDimitry Andric   bool parseExpression(const MCExpr *&Res);
3050b57cec5SDimitry Andric 
3060b57cec5SDimitry Andric   /// Parse a primary expression.
3070b57cec5SDimitry Andric   ///
3080b57cec5SDimitry Andric   /// \param Res - The value of the expression. The result is undefined
3090b57cec5SDimitry Andric   /// on error.
3100b57cec5SDimitry Andric   /// \return - False on success.
311e8d8bef9SDimitry Andric   virtual bool parsePrimaryExpr(const MCExpr *&Res, SMLoc &EndLoc,
312e8d8bef9SDimitry Andric                                 AsmTypeInfo *TypeInfo) = 0;
3130b57cec5SDimitry Andric 
3140b57cec5SDimitry Andric   /// Parse an arbitrary expression, assuming that an initial '(' has
3150b57cec5SDimitry Andric   /// already been consumed.
3160b57cec5SDimitry Andric   ///
3170b57cec5SDimitry Andric   /// \param Res - The value of the expression. The result is undefined
3180b57cec5SDimitry Andric   /// on error.
3190b57cec5SDimitry Andric   /// \return - False on success.
3200b57cec5SDimitry Andric   virtual bool parseParenExpression(const MCExpr *&Res, SMLoc &EndLoc) = 0;
3210b57cec5SDimitry Andric 
3220b57cec5SDimitry Andric   /// Parse an expression which must evaluate to an absolute value.
3230b57cec5SDimitry Andric   ///
3240b57cec5SDimitry Andric   /// \param Res - The value of the absolute expression. The result is undefined
3250b57cec5SDimitry Andric   /// on error.
3260b57cec5SDimitry Andric   /// \return - False on success.
3270b57cec5SDimitry Andric   virtual bool parseAbsoluteExpression(int64_t &Res) = 0;
3280b57cec5SDimitry Andric 
3290b57cec5SDimitry Andric   /// Ensure that we have a valid section set in the streamer. Otherwise,
3300b57cec5SDimitry Andric   /// report an error and switch to .text.
3310b57cec5SDimitry Andric   /// \return - False on success.
3320b57cec5SDimitry Andric   virtual bool checkForValidSection() = 0;
3330b57cec5SDimitry Andric 
3340b57cec5SDimitry Andric   /// Parse an arbitrary expression of a specified parenthesis depth,
3350b57cec5SDimitry Andric   /// assuming that the initial '(' characters have already been consumed.
3360b57cec5SDimitry Andric   ///
3370b57cec5SDimitry Andric   /// \param ParenDepth - Specifies how many trailing expressions outside the
3380b57cec5SDimitry Andric   /// current parentheses we have to parse.
3390b57cec5SDimitry Andric   /// \param Res - The value of the expression. The result is undefined
3400b57cec5SDimitry Andric   /// on error.
3410b57cec5SDimitry Andric   /// \return - False on success.
3420b57cec5SDimitry Andric   virtual bool parseParenExprOfDepth(unsigned ParenDepth, const MCExpr *&Res,
3430b57cec5SDimitry Andric                                      SMLoc &EndLoc) = 0;
344fe6060f1SDimitry Andric 
345fe6060f1SDimitry Andric   /// Parse a .gnu_attribute.
346fe6060f1SDimitry Andric   bool parseGNUAttribute(SMLoc L, int64_t &Tag, int64_t &IntegerValue);
3470b57cec5SDimitry Andric };
3480b57cec5SDimitry Andric 
3495ffd83dbSDimitry Andric /// Create an MCAsmParser instance for parsing assembly similar to gas syntax
3500b57cec5SDimitry Andric MCAsmParser *createMCAsmParser(SourceMgr &, MCContext &, MCStreamer &,
3510b57cec5SDimitry Andric                                const MCAsmInfo &, unsigned CB = 0);
3520b57cec5SDimitry Andric 
3535ffd83dbSDimitry Andric /// Create an MCAsmParser instance for parsing Microsoft MASM-style assembly
3545ffd83dbSDimitry Andric MCAsmParser *createMCMasmParser(SourceMgr &, MCContext &, MCStreamer &,
355fe6060f1SDimitry Andric                                 const MCAsmInfo &, struct tm, unsigned CB = 0);
3565ffd83dbSDimitry Andric 
3570b57cec5SDimitry Andric } // end namespace llvm
3580b57cec5SDimitry Andric 
3590b57cec5SDimitry Andric #endif // LLVM_MC_MCPARSER_MCASMPARSER_H
360