MCAsmParser.h revision c0c67b03b03d73d3614a084d467a388c35d264d1
1//===-- llvm/MC/MCAsmParser.h - Abstract Asm Parser Interface ---*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9 10#ifndef LLVM_MC_MCPARSER_MCASMPARSER_H 11#define LLVM_MC_MCPARSER_MCASMPARSER_H 12 13#include "llvm/ADT/ArrayRef.h" 14#include "llvm/ADT/StringRef.h" 15#include "llvm/MC/MCParser/AsmLexer.h" 16#include "llvm/Support/DataTypes.h" 17#include <vector> 18 19namespace llvm { 20class MCAsmInfo; 21class MCAsmLexer; 22class MCAsmParserExtension; 23class MCContext; 24class MCExpr; 25class MCInstPrinter; 26class MCInstrInfo; 27class MCParsedAsmOperand; 28class MCStreamer; 29class MCTargetAsmParser; 30class SMLoc; 31class SMRange; 32class SourceMgr; 33class StringRef; 34class Twine; 35 36/// MCAsmParserSemaCallback - Generic Sema callback for assembly parser. 37class MCAsmParserSemaCallback { 38public: 39 virtual ~MCAsmParserSemaCallback(); 40 virtual void *LookupInlineAsmIdentifier(StringRef Name, void *Loc, 41 unsigned &Size, bool &IsVarDecl) = 0; 42 virtual bool LookupInlineAsmField(StringRef Base, StringRef Member, 43 unsigned &Offset) = 0; 44}; 45 46 47/// \brief Helper types for tracking macro definitions. 48typedef std::vector<AsmToken> MCAsmMacroArgument; 49typedef std::vector<MCAsmMacroArgument> MCAsmMacroArguments; 50typedef std::pair<StringRef, MCAsmMacroArgument> MCAsmMacroParameter; 51typedef std::vector<MCAsmMacroParameter> MCAsmMacroParameters; 52 53struct MCAsmMacro { 54 StringRef Name; 55 StringRef Body; 56 MCAsmMacroParameters Parameters; 57 58public: 59 MCAsmMacro(StringRef N, StringRef B, const MCAsmMacroParameters &P) : 60 Name(N), Body(B), Parameters(P) {} 61 62 MCAsmMacro(const MCAsmMacro& Other) 63 : Name(Other.Name), Body(Other.Body), Parameters(Other.Parameters) {} 64}; 65 66/// MCAsmParser - Generic assembler parser interface, for use by target specific 67/// assembly parsers. 68class MCAsmParser { 69public: 70 typedef bool (*DirectiveHandler)(MCAsmParserExtension*, StringRef, SMLoc); 71 72private: 73 MCAsmParser(const MCAsmParser &) LLVM_DELETED_FUNCTION; 74 void operator=(const MCAsmParser &) LLVM_DELETED_FUNCTION; 75 76 MCTargetAsmParser *TargetParser; 77 78 unsigned ShowParsedOperands : 1; 79 80protected: // Can only create subclasses. 81 MCAsmParser(); 82 83public: 84 virtual ~MCAsmParser(); 85 86 virtual void AddDirectiveHandler(MCAsmParserExtension *Object, 87 StringRef Directive, 88 DirectiveHandler Handler) = 0; 89 90 virtual SourceMgr &getSourceManager() = 0; 91 92 virtual MCAsmLexer &getLexer() = 0; 93 94 virtual MCContext &getContext() = 0; 95 96 /// getStreamer - Return the output streamer for the assembler. 97 virtual MCStreamer &getStreamer() = 0; 98 99 MCTargetAsmParser &getTargetParser() const { return *TargetParser; } 100 void setTargetParser(MCTargetAsmParser &P); 101 102 virtual unsigned getAssemblerDialect() { return 0;} 103 virtual void setAssemblerDialect(unsigned i) { } 104 105 bool getShowParsedOperands() const { return ShowParsedOperands; } 106 void setShowParsedOperands(bool Value) { ShowParsedOperands = Value; } 107 108 /// Run - Run the parser on the input source buffer. 109 virtual bool Run(bool NoInitialTextSection, bool NoFinalize = false) = 0; 110 111 virtual void setParsingInlineAsm(bool V) = 0; 112 virtual bool isParsingInlineAsm() = 0; 113 114 /// ParseMSInlineAsm - Parse ms-style inline assembly. 115 virtual bool ParseMSInlineAsm(void *AsmLoc, std::string &AsmString, 116 unsigned &NumOutputs, unsigned &NumInputs, 117 SmallVectorImpl<std::pair<void *, bool> > &OpDecls, 118 SmallVectorImpl<std::string> &Constraints, 119 SmallVectorImpl<std::string> &Clobbers, 120 const MCInstrInfo *MII, 121 const MCInstPrinter *IP, 122 MCAsmParserSemaCallback &SI) = 0; 123 124 /// Warning - Emit a warning at the location \p L, with the message \p Msg. 125 /// 126 /// \return The return value is true, if warnings are fatal. 127 virtual bool Warning(SMLoc L, const Twine &Msg, 128 ArrayRef<SMRange> Ranges = ArrayRef<SMRange>()) = 0; 129 130 /// Error - Emit an error at the location \p L, with the message \p Msg. 131 /// 132 /// \return The return value is always true, as an idiomatic convenience to 133 /// clients. 134 virtual bool Error(SMLoc L, const Twine &Msg, 135 ArrayRef<SMRange> Ranges = ArrayRef<SMRange>()) = 0; 136 137 /// Lex - Get the next AsmToken in the stream, possibly handling file 138 /// inclusion first. 139 virtual const AsmToken &Lex() = 0; 140 141 /// getTok - Get the current AsmToken from the stream. 142 const AsmToken &getTok(); 143 144 /// \brief Report an error at the current lexer location. 145 bool TokError(const Twine &Msg, 146 ArrayRef<SMRange> Ranges = ArrayRef<SMRange>()); 147 148 /// ParseIdentifier - Parse an identifier or string (as a quoted identifier) 149 /// and set \p Res to the identifier contents. 150 virtual bool ParseIdentifier(StringRef &Res) = 0; 151 152 /// \brief Parse up to the end of statement and return the contents from the 153 /// current token until the end of the statement; the current token on exit 154 /// will be either the EndOfStatement or EOF. 155 virtual StringRef ParseStringToEndOfStatement() = 0; 156 157 /// EatToEndOfStatement - Skip to the end of the current statement, for error 158 /// recovery. 159 virtual void EatToEndOfStatement() = 0; 160 161 /// \brief Are macros enabled in the parser? 162 virtual bool MacrosEnabled() = 0; 163 164 /// \brief Control a flag in the parser that enables or disables macros. 165 virtual void SetMacrosEnabled(bool flag) = 0; 166 167 /// \brief Lookup a previously defined macro. 168 /// \param Name Macro name. 169 /// \returns Pointer to macro. NULL if no such macro was defined. 170 virtual const MCAsmMacro* LookupMacro(StringRef Name) = 0; 171 172 /// \brief Define a new macro with the given name and information. 173 virtual void DefineMacro(StringRef Name, const MCAsmMacro& Macro) = 0; 174 175 /// \brief Undefine a macro. If no such macro was defined, it's a no-op. 176 virtual void UndefineMacro(StringRef Name) = 0; 177 178 /// \brief Are we inside a macro instantiation? 179 virtual bool InsideMacroInstantiation() = 0; 180 181 /// \brief Handle entry to macro instantiation. 182 /// 183 /// \param M The macro. 184 /// \param NameLoc Instantiation location. 185 virtual bool HandleMacroEntry(const MCAsmMacro *M, SMLoc NameLoc) = 0; 186 187 /// \brief Handle exit from macro instantiation. 188 virtual void HandleMacroExit() = 0; 189 190 /// ParseMacroArgument - Extract AsmTokens for a macro argument. If the 191 /// argument delimiter is initially unknown, set it to AsmToken::Eof. It will 192 /// be set to the correct delimiter by the method. 193 virtual bool ParseMacroArgument(MCAsmMacroArgument &MA, 194 AsmToken::TokenKind &ArgumentDelimiter) = 0; 195 196 /// ParseExpression - Parse an arbitrary expression. 197 /// 198 /// @param Res - The value of the expression. The result is undefined 199 /// on error. 200 /// @result - False on success. 201 virtual bool ParseExpression(const MCExpr *&Res, SMLoc &EndLoc) = 0; 202 bool ParseExpression(const MCExpr *&Res); 203 204 /// ParseParenExpression - Parse an arbitrary expression, assuming that an 205 /// initial '(' has already been consumed. 206 /// 207 /// @param Res - The value of the expression. The result is undefined 208 /// on error. 209 /// @result - False on success. 210 virtual bool ParseParenExpression(const MCExpr *&Res, SMLoc &EndLoc) = 0; 211 212 /// ParseAbsoluteExpression - Parse an expression which must evaluate to an 213 /// absolute value. 214 /// 215 /// @param Res - The value of the absolute expression. The result is undefined 216 /// on error. 217 /// @result - False on success. 218 virtual bool ParseAbsoluteExpression(int64_t &Res) = 0; 219 220 /// CheckForValidSection - Ensure that we have a valid section set in the 221 /// streamer. Otherwise, report and error and switch to .text. 222 virtual void CheckForValidSection() = 0; 223}; 224 225/// \brief Create an MCAsmParser instance. 226MCAsmParser *createMCAsmParser(SourceMgr &, MCContext &, 227 MCStreamer &, const MCAsmInfo &); 228 229} // End llvm namespace 230 231#endif 232