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