MCAsmParser.h revision 94b9550a32d189704a8eae55505edf62662c0534
15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//===-- llvm/MC/MCAsmParser.h - Abstract Asm Parser Interface ---*- C++ -*-===//
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//                     The LLVM Compiler Infrastructure
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// This file is distributed under the University of Illinois Open Source
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// License. See LICENSE.TXT for details.
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//===----------------------------------------------------------------------===//
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef LLVM_MC_MCASMPARSER_H
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define LLVM_MC_MCASMPARSER_H
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "llvm/Support/DataTypes.h"
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace llvm {
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AsmToken;
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class MCAsmInfo;
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class MCAsmLexer;
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class MCAsmParserExtension;
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class MCContext;
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class MCExpr;
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class MCStreamer;
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class MCTargetAsmParser;
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class SMLoc;
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class SourceMgr;
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class StringRef;
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Target;
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Twine;
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/// MCAsmParser - Generic assembler parser interface, for use by target specific
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/// assembly parsers.
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class MCAsmParser {
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  typedef bool (*DirectiveHandler)(MCAsmParserExtension*, StringRef, SMLoc);
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  MCAsmParser(const MCAsmParser &);   // DO NOT IMPLEMENT
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  void operator=(const MCAsmParser &);  // DO NOT IMPLEMENT
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  MCTargetAsmParser *TargetParser;
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  unsigned ShowParsedOperands : 1;
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)protected: // Can only create subclasses.
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  MCAsmParser();
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  virtual ~MCAsmParser();
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  virtual void AddDirectiveHandler(MCAsmParserExtension *Object,
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                   StringRef Directive,
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                   DirectiveHandler Handler) = 0;
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  virtual SourceMgr &getSourceManager() = 0;
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  virtual MCAsmLexer &getLexer() = 0;
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  virtual MCContext &getContext() = 0;
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  /// getStreamer - Return the output streamer for the assembler.
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  virtual MCStreamer &getStreamer() = 0;
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  MCTargetAsmParser &getTargetParser() const { return *TargetParser; }
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  void setTargetParser(MCTargetAsmParser &P);
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bool getShowParsedOperands() const { return ShowParsedOperands; }
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  void setShowParsedOperands(bool Value) { ShowParsedOperands = Value; }
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  /// Run - Run the parser on the input source buffer.
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  virtual bool Run(bool NoInitialTextSection, bool NoFinalize = false) = 0;
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  /// Warning - Emit a warning at the location \arg L, with the message \arg
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  /// Msg.
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  ///
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  /// \return The return value is true, if warnings are fatal.
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  virtual bool Warning(SMLoc L, const Twine &Msg) = 0;
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  /// Error - Emit an error at the location \arg L, with the message \arg
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  /// Msg.
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  ///
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  /// \return The return value is always true, as an idiomatic convenience to
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  /// clients.
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  virtual bool Error(SMLoc L, const Twine &Msg) = 0;
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  /// Lex - Get the next AsmToken in the stream, possibly handling file
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  /// inclusion first.
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  virtual const AsmToken &Lex() = 0;
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  /// getTok - Get the current AsmToken from the stream.
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  const AsmToken &getTok();
917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci  /// \brief Report an error at the current lexer location.
937242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci  bool TokError(const Twine &Msg);
947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
95  /// ParseIdentifier - Parse an identifier or string (as a quoted identifier)
96  /// and set \arg Res to the identifier contents.
97  virtual bool ParseIdentifier(StringRef &Res) = 0;
98
99  /// \brief Parse up to the end of statement and return the contents from the
100  /// current token until the end of the statement; the current token on exit
101  /// will be either the EndOfStatement or EOF.
102  virtual StringRef ParseStringToEndOfStatement() = 0;
103
104  /// EatToEndOfStatement - Skip to the end of the current statement, for error
105  /// recovery.
106  virtual void EatToEndOfStatement() = 0;
107
108  /// ParseExpression - Parse an arbitrary expression.
109  ///
110  /// @param Res - The value of the expression. The result is undefined
111  /// on error.
112  /// @result - False on success.
113  virtual bool ParseExpression(const MCExpr *&Res, SMLoc &EndLoc) = 0;
114  bool ParseExpression(const MCExpr *&Res);
115
116  /// ParseParenExpression - Parse an arbitrary expression, assuming that an
117  /// initial '(' has already been consumed.
118  ///
119  /// @param Res - The value of the expression. The result is undefined
120  /// on error.
121  /// @result - False on success.
122  virtual bool ParseParenExpression(const MCExpr *&Res, SMLoc &EndLoc) = 0;
123
124  /// ParseAbsoluteExpression - Parse an expression which must evaluate to an
125  /// absolute value.
126  ///
127  /// @param Res - The value of the absolute expression. The result is undefined
128  /// on error.
129  /// @result - False on success.
130  virtual bool ParseAbsoluteExpression(int64_t &Res) = 0;
131};
132
133/// \brief Create an MCAsmParser instance.
134MCAsmParser *createMCAsmParser(const Target &, SourceMgr &, MCContext &,
135                               MCStreamer &, const MCAsmInfo &);
136
137} // End llvm namespace
138
139#endif
140