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 
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 &) = delete;
25   void operator=(const MCAsmParserExtension &) = delete;
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)>
HandleDirective(MCAsmParserExtension * Target,StringRef Directive,SMLoc DirectiveLoc)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 
43 public:
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 
getContext()54   MCContext &getContext() { return getParser().getContext(); }
55 
getLexer()56   MCAsmLexer &getLexer() { return getParser().getLexer(); }
getLexer()57   const MCAsmLexer &getLexer() const {
58     return const_cast<MCAsmParserExtension *>(this)->getLexer();
59   }
60 
getParser()61   MCAsmParser &getParser() { return *Parser; }
getParser()62   const MCAsmParser &getParser() const {
63     return const_cast<MCAsmParserExtension*>(this)->getParser();
64   }
65 
getSourceManager()66   SourceMgr &getSourceManager() { return getParser().getSourceManager(); }
getStreamer()67   MCStreamer &getStreamer() { return getParser().getStreamer(); }
Warning(SMLoc L,const Twine & Msg)68   bool Warning(SMLoc L, const Twine &Msg) {
69     return getParser().Warning(L, Msg);
70   }
Error(SMLoc L,const Twine & Msg)71   bool Error(SMLoc L, const Twine &Msg) {
72     return getParser().Error(L, Msg);
73   }
Note(SMLoc L,const Twine & Msg)74   void Note(SMLoc L, const Twine &Msg) {
75     getParser().Note(L, Msg);
76   }
TokError(const Twine & Msg)77   bool TokError(const Twine &Msg) {
78     return getParser().TokError(Msg);
79   }
80 
Lex()81   const AsmToken &Lex() { return getParser().Lex(); }
82 
getTok()83   const AsmToken &getTok() { return getParser().getTok(); }
84 
HasBracketExpressions()85   bool HasBracketExpressions() const { return BracketExpressionsSupported; }
86 
87   /// @}
88 };
89 
90 } // End llvm namespace
91 
92 #endif
93