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