1//===-- llvm/MC/MCAsmParserExtension.h - Asm Parser Hooks -------*- 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_MCASMPARSEREXTENSION_H
11#define LLVM_MC_MCPARSER_MCASMPARSEREXTENSION_H
12
13#include "llvm/ADT/StringRef.h"
14#include "llvm/MC/MCParser/MCAsmParser.h"
15#include "llvm/Support/SMLoc.h"
16
17namespace llvm {
18class Twine;
19
20/// \brief Generic interface for extending the MCAsmParser,
21/// which is implemented by target and object file assembly parser
22/// implementations.
23class MCAsmParserExtension {
24  MCAsmParserExtension(const MCAsmParserExtension &) LLVM_DELETED_FUNCTION;
25  void operator=(const MCAsmParserExtension &) LLVM_DELETED_FUNCTION;
26
27  MCAsmParser *Parser;
28
29protected:
30  MCAsmParserExtension();
31
32  // Helper template for implementing static dispatch functions.
33  template<typename T, bool (T::*Handler)(StringRef, SMLoc)>
34  static bool HandleDirective(MCAsmParserExtension *Target,
35                              StringRef Directive,
36                              SMLoc DirectiveLoc) {
37    T *Obj = static_cast<T*>(Target);
38    return (Obj->*Handler)(Directive, DirectiveLoc);
39  }
40
41  bool BracketExpressionsSupported;
42
43public:
44  virtual ~MCAsmParserExtension();
45
46  /// \brief Initialize the extension for parsing using the given \p Parser.
47  /// The extension should use the AsmParser interfaces to register its
48  /// parsing routines.
49  virtual void Initialize(MCAsmParser &Parser);
50
51  /// @name MCAsmParser Proxy Interfaces
52  /// @{
53
54  MCContext &getContext() { return getParser().getContext(); }
55  MCAsmLexer &getLexer() { return getParser().getLexer(); }
56  MCAsmParser &getParser() { return *Parser; }
57  SourceMgr &getSourceManager() { return getParser().getSourceManager(); }
58  MCStreamer &getStreamer() { return getParser().getStreamer(); }
59  bool Warning(SMLoc L, const Twine &Msg) {
60    return getParser().Warning(L, Msg);
61  }
62  bool Error(SMLoc L, const Twine &Msg) {
63    return getParser().Error(L, Msg);
64  }
65  bool TokError(const Twine &Msg) {
66    return getParser().TokError(Msg);
67  }
68
69  const AsmToken &Lex() { return getParser().Lex(); }
70
71  const AsmToken &getTok() { return getParser().getTok(); }
72
73  bool HasBracketExpressions() const { return BracketExpressionsSupported; }
74
75  /// @}
76};
77
78} // End llvm namespace
79
80#endif
81