MC/AsmParser: Stop playing unsafe member function pointer calls, this isn't
[oota-llvm.git] / include / llvm / MC / MCParser / MCAsmParserExtension.h
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_MCASMPARSEREXTENSION_H
11 #define LLVM_MC_MCASMPARSEREXTENSION_H
12
13 #include "llvm/MC/MCParser/MCAsmParser.h"
14 #include "llvm/ADT/StringRef.h"
15 #include "llvm/Support/SMLoc.h"
16
17 namespace llvm {
18 class Twine;
19
20 /// \brief Generic interface for extending the MCAsmParser,
21 /// which is implemented by target and object file assembly parser
22 /// implementations.
23 class MCAsmParserExtension {
24   MCAsmParserExtension(const MCAsmParserExtension &);   // DO NOT IMPLEMENT
25   void operator=(const MCAsmParserExtension &);  // DO NOT IMPLEMENT
26
27   MCAsmParser *Parser;
28
29 protected:
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 public:
42   virtual ~MCAsmParserExtension();
43
44   /// \brief Initialize the extension for parsing using the given \arg
45   /// Parser. The extension should use the AsmParser interfaces to register its
46   /// parsing routines.
47   virtual void Initialize(MCAsmParser &Parser);
48
49   /// @name MCAsmParser Proxy Interfaces
50   /// @{
51
52   MCContext &getContext() { return getParser().getContext(); }
53   MCAsmLexer &getLexer() { return getParser().getLexer(); }
54   MCAsmParser &getParser() { return *Parser; }
55   SourceMgr &getSourceManager() { return getParser().getSourceManager(); }
56   MCStreamer &getStreamer() { return getParser().getStreamer(); }
57   void Warning(SMLoc L, const Twine &Msg) {
58     return getParser().Warning(L, Msg);
59   }
60   bool Error(SMLoc L, const Twine &Msg) {
61     return getParser().Error(L, Msg);
62   }
63   bool TokError(const Twine &Msg) {
64     return getParser().TokError(Msg);
65   }
66
67   const AsmToken &Lex() { return getParser().Lex(); }
68
69   const AsmToken &getTok() { return getParser().getTok(); }
70
71   /// @}
72 };
73
74 } // End llvm namespace
75
76 #endif