1 //===- llvm/MC/MCAsmParserExtension.h - Asm Parser Hooks --------*- C++ -*-===//
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
7 //===----------------------------------------------------------------------===//
9 #ifndef LLVM_MC_MCPARSER_MCASMPARSEREXTENSION_H
10 #define LLVM_MC_MCPARSER_MCASMPARSEREXTENSION_H
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"
22 /// Generic interface for extending the MCAsmParser,
23 /// which is implemented by target and object file assembly parser
25 class MCAsmParserExtension
{
29 MCAsmParserExtension();
31 // Helper template for implementing static dispatch functions.
32 template<typename T
, bool (T::*Handler
)(StringRef
, SMLoc
)>
33 static bool HandleDirective(MCAsmParserExtension
*Target
,
36 T
*Obj
= static_cast<T
*>(Target
);
37 return (Obj
->*Handler
)(Directive
, DirectiveLoc
);
40 bool BracketExpressionsSupported
= false;
43 MCAsmParserExtension(const MCAsmParserExtension
&) = delete;
44 MCAsmParserExtension
&operator=(const MCAsmParserExtension
&) = delete;
45 virtual ~MCAsmParserExtension();
47 /// Initialize the extension for parsing using the given \p Parser.
48 /// The extension should use the AsmParser interfaces to register its
50 virtual void Initialize(MCAsmParser
&Parser
);
52 /// \name MCAsmParser Proxy Interfaces
55 MCContext
&getContext() { return getParser().getContext(); }
57 MCAsmLexer
&getLexer() { return getParser().getLexer(); }
58 const MCAsmLexer
&getLexer() const {
59 return const_cast<MCAsmParserExtension
*>(this)->getLexer();
62 MCAsmParser
&getParser() { return *Parser
; }
63 const MCAsmParser
&getParser() const {
64 return const_cast<MCAsmParserExtension
*>(this)->getParser();
67 SourceMgr
&getSourceManager() { return getParser().getSourceManager(); }
68 MCStreamer
&getStreamer() { return getParser().getStreamer(); }
70 bool Warning(SMLoc L
, const Twine
&Msg
) {
71 return getParser().Warning(L
, Msg
);
74 bool Error(SMLoc L
, const Twine
&Msg
, SMRange Range
= SMRange()) {
75 return getParser().Error(L
, Msg
, Range
);
78 void Note(SMLoc L
, const Twine
&Msg
) {
79 getParser().Note(L
, Msg
);
82 bool TokError(const Twine
&Msg
) {
83 return getParser().TokError(Msg
);
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
);
93 bool parseMany(function_ref
<bool()> parseOne
, bool hasComma
= true) {
94 return getParser().parseMany(parseOne
, hasComma
);
97 bool parseOptionalToken(AsmToken::TokenKind T
) {
98 return getParser().parseOptionalToken(T
);
101 bool check(bool P
, const Twine
&Msg
) {
102 return getParser().check(P
, Msg
);
105 bool check(bool P
, SMLoc Loc
, const Twine
&Msg
) {
106 return getParser().check(P
, Loc
, Msg
);
109 bool addErrorSuffix(const Twine
&Suffix
) {
110 return getParser().addErrorSuffix(Suffix
);
113 bool HasBracketExpressions() const { return BracketExpressionsSupported
; }
118 } // end namespace llvm
120 #endif // LLVM_MC_MCPARSER_MCASMPARSEREXTENSION_H