1 //===- llvm/MC/MCAsmParserExtension.h - Asm Parser Hooks --------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef LLVM_MC_MCPARSER_MCASMPARSEREXTENSION_H 10 #define LLVM_MC_MCPARSER_MCASMPARSEREXTENSION_H 11 12 #include "llvm/ADT/STLExtras.h" 13 #include "llvm/ADT/StringRef.h" 14 #include "llvm/MC/MCParser/MCAsmLexer.h" 15 #include "llvm/MC/MCParser/MCAsmParser.h" 16 #include "llvm/Support/SMLoc.h" 17 18 namespace llvm { 19 20 class Twine; 21 22 /// Generic interface for extending the MCAsmParser, 23 /// which is implemented by target and object file assembly parser 24 /// implementations. 25 class MCAsmParserExtension { 26 MCAsmParser *Parser; 27 28 protected: 29 MCAsmParserExtension(); 30 31 // Helper template for implementing static dispatch functions. 32 template<typename T, bool (T::*Handler)(StringRef, SMLoc)> 33 static bool HandleDirective(MCAsmParserExtension *Target, 34 StringRef Directive, 35 SMLoc DirectiveLoc) { 36 T *Obj = static_cast<T*>(Target); 37 return (Obj->*Handler)(Directive, DirectiveLoc); 38 } 39 40 bool BracketExpressionsSupported = false; 41 42 public: 43 MCAsmParserExtension(const MCAsmParserExtension &) = delete; 44 MCAsmParserExtension &operator=(const MCAsmParserExtension &) = delete; 45 virtual ~MCAsmParserExtension(); 46 47 /// Initialize the extension for parsing using the given \p Parser. 48 /// The extension should use the AsmParser interfaces to register its 49 /// parsing routines. 50 virtual void Initialize(MCAsmParser &Parser); 51 52 /// \name MCAsmParser Proxy Interfaces 53 /// @{ 54 55 MCContext &getContext() { return getParser().getContext(); } 56 57 MCAsmLexer &getLexer() { return getParser().getLexer(); } 58 const MCAsmLexer &getLexer() const { 59 return const_cast<MCAsmParserExtension *>(this)->getLexer(); 60 } 61 62 MCAsmParser &getParser() { return *Parser; } 63 const MCAsmParser &getParser() const { 64 return const_cast<MCAsmParserExtension*>(this)->getParser(); 65 } 66 67 SourceMgr &getSourceManager() { return getParser().getSourceManager(); } 68 MCStreamer &getStreamer() { return getParser().getStreamer(); } 69 70 bool Warning(SMLoc L, const Twine &Msg) { 71 return getParser().Warning(L, Msg); 72 } 73 74 bool Error(SMLoc L, const Twine &Msg, SMRange Range = SMRange()) { 75 return getParser().Error(L, Msg, Range); 76 } 77 78 void Note(SMLoc L, const Twine &Msg) { 79 getParser().Note(L, Msg); 80 } 81 82 bool TokError(const Twine &Msg) { 83 return getParser().TokError(Msg); 84 } 85 86 const AsmToken &Lex() { return getParser().Lex(); } 87 const AsmToken &getTok() { return getParser().getTok(); } 88 bool parseToken(AsmToken::TokenKind T, 89 const Twine &Msg = "unexpected token") { 90 return getParser().parseToken(T, Msg); 91 } 92 93 bool parseMany(function_ref<bool()> parseOne, bool hasComma = true) { 94 return getParser().parseMany(parseOne, hasComma); 95 } 96 97 bool parseOptionalToken(AsmToken::TokenKind T) { 98 return getParser().parseOptionalToken(T); 99 } 100 101 bool check(bool P, const Twine &Msg) { 102 return getParser().check(P, Msg); 103 } 104 105 bool check(bool P, SMLoc Loc, const Twine &Msg) { 106 return getParser().check(P, Loc, Msg); 107 } 108 109 bool addErrorSuffix(const Twine &Suffix) { 110 return getParser().addErrorSuffix(Suffix); 111 } 112 113 bool HasBracketExpressions() const { return BracketExpressionsSupported; } 114 115 /// @} 116 }; 117 118 } // end namespace llvm 119 120 #endif // LLVM_MC_MCPARSER_MCASMPARSEREXTENSION_H 121