MCAsmParser.h revision ec13022c392747ef166e6be738fc6f00bd7c52d3
121830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com//===-- llvm/MC/MCAsmParser.h - Abstract Asm Parser Interface ---*- C++ -*-===//
221830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com//
321830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com//                     The LLVM Compiler Infrastructure
421830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com//
521830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com// This file is distributed under the University of Illinois Open Source
621830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com// License. See LICENSE.TXT for details.
721830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com//
821830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com//===----------------------------------------------------------------------===//
921830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com
1021830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com#ifndef LLVM_MC_MCASMPARSER_H
1121830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com#define LLVM_MC_MCASMPARSER_H
128b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org
138b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org#include "llvm/Support/DataTypes.h"
1421830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com#include "llvm/ADT/ArrayRef.h"
1521830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com
1621830d90096d2dccc4168d99a427e78035ce942adjsollen@google.comnamespace llvm {
1721830d90096d2dccc4168d99a427e78035ce942adjsollen@google.comclass AsmToken;
1821830d90096d2dccc4168d99a427e78035ce942adjsollen@google.comclass MCAsmInfo;
193e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.comclass MCAsmLexer;
2021830d90096d2dccc4168d99a427e78035ce942adjsollen@google.comclass MCAsmParserExtension;
2121830d90096d2dccc4168d99a427e78035ce942adjsollen@google.comclass MCContext;
2221830d90096d2dccc4168d99a427e78035ce942adjsollen@google.comclass MCExpr;
2321830d90096d2dccc4168d99a427e78035ce942adjsollen@google.comclass MCInstPrinter;
2421830d90096d2dccc4168d99a427e78035ce942adjsollen@google.comclass MCInstrInfo;
2521830d90096d2dccc4168d99a427e78035ce942adjsollen@google.comclass MCParsedAsmOperand;
2621830d90096d2dccc4168d99a427e78035ce942adjsollen@google.comclass MCStreamer;
2721830d90096d2dccc4168d99a427e78035ce942adjsollen@google.comclass MCTargetAsmParser;
2821830d90096d2dccc4168d99a427e78035ce942adjsollen@google.comclass SMLoc;
2921830d90096d2dccc4168d99a427e78035ce942adjsollen@google.comclass SMRange;
3021830d90096d2dccc4168d99a427e78035ce942adjsollen@google.comclass SourceMgr;
3121830d90096d2dccc4168d99a427e78035ce942adjsollen@google.comclass StringRef;
3221830d90096d2dccc4168d99a427e78035ce942adjsollen@google.comclass Twine;
3321830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com
3421830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com/// MCAsmParserSemaCallback - Generic Sema callback for assembly parser.
3521830d90096d2dccc4168d99a427e78035ce942adjsollen@google.comclass MCAsmParserSemaCallback {
3621830d90096d2dccc4168d99a427e78035ce942adjsollen@google.compublic:
3721830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  virtual ~MCAsmParserSemaCallback();
3821830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  virtual void *LookupInlineAsmIdentifier(StringRef Name, void *Loc,
39672588b684d484dce6ae251e9e163e4a46924322reed@google.com                                          unsigned &Size) = 0;
40672588b684d484dce6ae251e9e163e4a46924322reed@google.com  virtual bool LookupInlineAsmField(StringRef Base, StringRef Member,
41672588b684d484dce6ae251e9e163e4a46924322reed@google.com                                    unsigned &Offset) = 0;
42672588b684d484dce6ae251e9e163e4a46924322reed@google.com};
43672588b684d484dce6ae251e9e163e4a46924322reed@google.com
44672588b684d484dce6ae251e9e163e4a46924322reed@google.com/// MCAsmParser - Generic assembler parser interface, for use by target specific
45672588b684d484dce6ae251e9e163e4a46924322reed@google.com/// assembly parsers.
46672588b684d484dce6ae251e9e163e4a46924322reed@google.comclass MCAsmParser {
4720f7f173e05b60f541910d0c1da9850ac73e2958bsalomon@google.compublic:
4820f7f173e05b60f541910d0c1da9850ac73e2958bsalomon@google.com  typedef bool (*DirectiveHandler)(MCAsmParserExtension*, StringRef, SMLoc);
4920f7f173e05b60f541910d0c1da9850ac73e2958bsalomon@google.com
5020f7f173e05b60f541910d0c1da9850ac73e2958bsalomon@google.comprivate:
5120f7f173e05b60f541910d0c1da9850ac73e2958bsalomon@google.com  MCAsmParser(const MCAsmParser &) LLVM_DELETED_FUNCTION;
5220f7f173e05b60f541910d0c1da9850ac73e2958bsalomon@google.com  void operator=(const MCAsmParser &) LLVM_DELETED_FUNCTION;
53672588b684d484dce6ae251e9e163e4a46924322reed@google.com
5420f7f173e05b60f541910d0c1da9850ac73e2958bsalomon@google.com  MCTargetAsmParser *TargetParser;
55672588b684d484dce6ae251e9e163e4a46924322reed@google.com
5620f7f173e05b60f541910d0c1da9850ac73e2958bsalomon@google.com  unsigned ShowParsedOperands : 1;
5720f7f173e05b60f541910d0c1da9850ac73e2958bsalomon@google.com
5820f7f173e05b60f541910d0c1da9850ac73e2958bsalomon@google.comprotected: // Can only create subclasses.
5920f7f173e05b60f541910d0c1da9850ac73e2958bsalomon@google.com  MCAsmParser();
6020f7f173e05b60f541910d0c1da9850ac73e2958bsalomon@google.com
6120f7f173e05b60f541910d0c1da9850ac73e2958bsalomon@google.compublic:
6220f7f173e05b60f541910d0c1da9850ac73e2958bsalomon@google.com  virtual ~MCAsmParser();
633e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com
6420f7f173e05b60f541910d0c1da9850ac73e2958bsalomon@google.com  virtual void AddDirectiveHandler(MCAsmParserExtension *Object,
653e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com                                   StringRef Directive,
663e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com                                   DirectiveHandler Handler) = 0;
673e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com
683e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com  virtual SourceMgr &getSourceManager() = 0;
6921830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com
7021830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  virtual MCAsmLexer &getLexer() = 0;
7121830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com
7221830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  virtual MCContext &getContext() = 0;
7321830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com
7421830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  /// getStreamer - Return the output streamer for the assembler.
7521830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  virtual MCStreamer &getStreamer() = 0;
767ca24437c71af06fc06ab5f6f261b185882fa440scroggo@google.com
777ca24437c71af06fc06ab5f6f261b185882fa440scroggo@google.com  MCTargetAsmParser &getTargetParser() const { return *TargetParser; }
7821830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  void setTargetParser(MCTargetAsmParser &P);
7921830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com
8021830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  virtual unsigned getAssemblerDialect() { return 0;}
8121830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  virtual void setAssemblerDialect(unsigned i) { }
8221830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com
8321830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  bool getShowParsedOperands() const { return ShowParsedOperands; }
8421830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  void setShowParsedOperands(bool Value) { ShowParsedOperands = Value; }
8521830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com
8621830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  /// Run - Run the parser on the input source buffer.
877ca24437c71af06fc06ab5f6f261b185882fa440scroggo@google.com  virtual bool Run(bool NoInitialTextSection, bool NoFinalize = false) = 0;
887ca24437c71af06fc06ab5f6f261b185882fa440scroggo@google.com
8910dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com  virtual void setParsingInlineAsm(bool V) = 0;
9021830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  virtual bool isParsingInlineAsm() = 0;
9121830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com
9221830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  /// ParseMSInlineAsm - Parse ms-style inline assembly.
9310dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com  virtual bool ParseMSInlineAsm(void *AsmLoc, std::string &AsmString,
9410dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com                                unsigned &NumOutputs, unsigned &NumInputs,
9510dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com                                SmallVectorImpl<std::pair<void *, bool> > &OpDecls,
9610dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com                                SmallVectorImpl<std::string> &Constraints,
9710dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com                                SmallVectorImpl<std::string> &Clobbers,
9810dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com                                const MCInstrInfo *MII,
9910dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com                                const MCInstPrinter *IP,
10010dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com                                MCAsmParserSemaCallback &SI) = 0;
10110dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com
10210dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com  /// Warning - Emit a warning at the location \p L, with the message \p Msg.
10310dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com  ///
10410dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com  /// \return The return value is true, if warnings are fatal.
10510dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com  virtual bool Warning(SMLoc L, const Twine &Msg,
10610dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com                       ArrayRef<SMRange> Ranges = ArrayRef<SMRange>()) = 0;
10710dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com
10810dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com  /// Error - Emit an error at the location \p L, with the message \p Msg.
10921830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  ///
11021830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  /// \return The return value is always true, as an idiomatic convenience to
111c51db02181982fbcb8888e2a89132363a7d9371cscroggo  /// clients.
11221830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  virtual bool Error(SMLoc L, const Twine &Msg,
11321830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com                     ArrayRef<SMRange> Ranges = ArrayRef<SMRange>()) = 0;
11421830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com
11521830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  /// Lex - Get the next AsmToken in the stream, possibly handling file
11621830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  /// inclusion first.
11721830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  virtual const AsmToken &Lex() = 0;
11821830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com
11921830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  /// getTok - Get the current AsmToken from the stream.
12021830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  const AsmToken &getTok();
12121830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com
12221830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  /// \brief Report an error at the current lexer location.
12321830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  bool TokError(const Twine &Msg,
12421830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com                ArrayRef<SMRange> Ranges = ArrayRef<SMRange>());
12521830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com
12621830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  /// ParseIdentifier - Parse an identifier or string (as a quoted identifier)
1273e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com  /// and set \p Res to the identifier contents.
1283e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com  virtual bool ParseIdentifier(StringRef &Res) = 0;
1293e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com
1303e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com  /// \brief Parse up to the end of statement and return the contents from the
1313e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com  /// current token until the end of the statement; the current token on exit
1323e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com  /// will be either the EndOfStatement or EOF.
1333e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com  virtual StringRef ParseStringToEndOfStatement() = 0;
1343e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com
1353e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com  /// EatToEndOfStatement - Skip to the end of the current statement, for error
1363e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com  /// recovery.
1373e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com  virtual void EatToEndOfStatement() = 0;
1383e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com
1393e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com  /// ParseExpression - Parse an arbitrary expression.
1403e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com  ///
1413e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com  /// @param Res - The value of the expression. The result is undefined
1423e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com  /// on error.
1433e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com  /// @result - False on success.
14421830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  virtual bool ParseExpression(const MCExpr *&Res, SMLoc &EndLoc) = 0;
14521830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  bool ParseExpression(const MCExpr *&Res);
1463e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com
1473e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com  /// ParseParenExpression - Parse an arbitrary expression, assuming that an
1483e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com  /// initial '(' has already been consumed.
1493e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com  ///
1503e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com  /// @param Res - The value of the expression. The result is undefined
15121830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  /// on error.
15221830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  /// @result - False on success.
1533e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com  virtual bool ParseParenExpression(const MCExpr *&Res, SMLoc &EndLoc) = 0;
1543e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com
1553e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com  /// ParseAbsoluteExpression - Parse an expression which must evaluate to an
15621830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  /// absolute value.
15721830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  ///
15821830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  /// @param Res - The value of the absolute expression. The result is undefined
15921830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  /// on error.
16021830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  /// @result - False on success.
16121830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com  virtual bool ParseAbsoluteExpression(int64_t &Res) = 0;
16221830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com};
16321830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com
16421830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com/// \brief Create an MCAsmParser instance.
16521830d90096d2dccc4168d99a427e78035ce942adjsollen@google.comMCAsmParser *createMCAsmParser(SourceMgr &, MCContext &,
16621830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com                               MCStreamer &, const MCAsmInfo &);
16721830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com
1683e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com} // End llvm namespace
16921830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com
17021830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com#endif
17121830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com