//===-- llvm/MC/MCAsmParserExtension.h - Asm Parser Hooks -------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef LLVM_MC_MCASMPARSEREXTENSION_H #define LLVM_MC_MCASMPARSEREXTENSION_H #include "llvm/MC/MCParser/MCAsmParser.h" #include "llvm/ADT/StringRef.h" #include "llvm/Support/SMLoc.h" namespace llvm { class Twine; /// \brief Generic interface for extending the MCAsmParser, /// which is implemented by target and object file assembly parser /// implementations. class MCAsmParserExtension { MCAsmParserExtension(const MCAsmParserExtension &); // DO NOT IMPLEMENT void operator=(const MCAsmParserExtension &); // DO NOT IMPLEMENT MCAsmParser *Parser; protected: MCAsmParserExtension(); // Helper template for implementing static dispatch functions. template<typename T, bool (T::*Handler)(StringRef, SMLoc)> static bool HandleDirective(MCAsmParserExtension *Target, StringRef Directive, SMLoc DirectiveLoc) { T *Obj = static_cast<T*>(Target); return (Obj->*Handler)(Directive, DirectiveLoc); } bool BracketExpressionsSupported; public: virtual ~MCAsmParserExtension(); /// \brief Initialize the extension for parsing using the given \arg /// Parser. The extension should use the AsmParser interfaces to register its /// parsing routines. virtual void Initialize(MCAsmParser &Parser); /// @name MCAsmParser Proxy Interfaces /// @{ MCContext &getContext() { return getParser().getContext(); } MCAsmLexer &getLexer() { return getParser().getLexer(); } MCAsmParser &getParser() { return *Parser; } SourceMgr &getSourceManager() { return getParser().getSourceManager(); } MCStreamer &getStreamer() { return getParser().getStreamer(); } bool Warning(SMLoc L, const Twine &Msg) { return getParser().Warning(L, Msg); } bool Error(SMLoc L, const Twine &Msg) { return getParser().Error(L, Msg); } bool TokError(const Twine &Msg) { return getParser().TokError(Msg); } const AsmToken &Lex() { return getParser().Lex(); } const AsmToken &getTok() { return getParser().getTok(); } bool HasBracketExpressions() const { return BracketExpressionsSupported; } /// @} }; } // End llvm namespace #endif