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