1//===----------------------------------------------------------------------===//
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/// \file
10/// LFI assembly parser.
11///
12//===----------------------------------------------------------------------===//
13
14#include "llvm/MC/MCLFIRewriter.h"
15#include "llvm/MC/MCParser/MCAsmParserExtension.h"
16
17using namespace llvm;
18
19class LFIAsmParser : public MCAsmParserExtension {
20 MCLFIRewriter *Rewriter;
21 template <bool (LFIAsmParser::*HandlerMethod)(StringRef, SMLoc)>
22 void addDirectiveHandler(StringRef Directive) {
23 MCAsmParser::ExtensionDirectiveHandler Handler =
24 std::make_pair(this, HandleDirective<LFIAsmParser, HandlerMethod>);
25
26 getParser().addDirectiveHandler(Directive, Handler);
27 }
28
29public:
30 LFIAsmParser(MCLFIRewriter *Exp) : Rewriter(Exp) {}
31 void Initialize(MCAsmParser &Parser) override {
32 // Call the base implementation.
33 MCAsmParserExtension::Initialize(Parser);
34 addDirectiveHandler<&LFIAsmParser::parseRewriteDisable>(
35 Directive: ".lfi_rewrite_disable");
36 addDirectiveHandler<&LFIAsmParser::parseRewriteEnable>(
37 Directive: ".lfi_rewrite_enable");
38 }
39
40 /// ::= {.lfi_rewrite_disable}
41 bool parseRewriteDisable(StringRef Directive, SMLoc Loc) {
42 getParser().checkForValidSection();
43 if (getLexer().isNot(K: AsmToken::EndOfStatement))
44 return TokError(Msg: "unexpected token");
45 Lex();
46
47 Rewriter->disable();
48
49 return false;
50 }
51
52 /// ::= {.lfi_rewrite_enable}
53 bool parseRewriteEnable(StringRef Directive, SMLoc Loc) {
54 getParser().checkForValidSection();
55 if (getLexer().isNot(K: AsmToken::EndOfStatement))
56 return TokError(Msg: "unexpected token");
57 Lex();
58
59 Rewriter->enable();
60
61 return false;
62 }
63};
64
65namespace llvm {
66MCAsmParserExtension *createLFIAsmParser(MCLFIRewriter *Exp) {
67 return new LFIAsmParser(Exp);
68}
69} // namespace llvm
70