xref: /freebsd-src/contrib/llvm-project/llvm/lib/MC/MCParser/XCOFFAsmParser.cpp (revision 81ad626541db97eb356e2c1d4a20eb2a26a766ab)
1fe6060f1SDimitry Andric //===- XCOFFAsmParser.cpp - XCOFF Assembly Parser
2fe6060f1SDimitry Andric //-----------------------------===//
3fe6060f1SDimitry Andric //
4fe6060f1SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5fe6060f1SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
6fe6060f1SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7fe6060f1SDimitry Andric //
8fe6060f1SDimitry Andric //===----------------------------------------------------------------------===//
9fe6060f1SDimitry Andric 
10fe6060f1SDimitry Andric #include "llvm/BinaryFormat/XCOFF.h"
11fe6060f1SDimitry Andric #include "llvm/MC/MCParser/MCAsmParser.h"
12fe6060f1SDimitry Andric #include "llvm/MC/MCParser/MCAsmParserExtension.h"
13fe6060f1SDimitry Andric 
14fe6060f1SDimitry Andric using namespace llvm;
15fe6060f1SDimitry Andric 
16fe6060f1SDimitry Andric namespace {
17fe6060f1SDimitry Andric 
18fe6060f1SDimitry Andric class XCOFFAsmParser : public MCAsmParserExtension {
19fe6060f1SDimitry Andric   MCAsmParser *Parser = nullptr;
20fe6060f1SDimitry Andric   MCAsmLexer *Lexer = nullptr;
21fe6060f1SDimitry Andric 
22fe6060f1SDimitry Andric   template <bool (XCOFFAsmParser::*HandlerMethod)(StringRef, SMLoc)>
addDirectiveHandler(StringRef Directive)23fe6060f1SDimitry Andric   void addDirectiveHandler(StringRef Directive) {
24fe6060f1SDimitry Andric     MCAsmParser::ExtensionDirectiveHandler Handler =
25fe6060f1SDimitry Andric         std::make_pair(this, HandleDirective<XCOFFAsmParser, HandlerMethod>);
26fe6060f1SDimitry Andric 
27fe6060f1SDimitry Andric     getParser().addDirectiveHandler(Directive, Handler);
28fe6060f1SDimitry Andric   }
29fe6060f1SDimitry Andric 
30fe6060f1SDimitry Andric public:
31*81ad6265SDimitry Andric   XCOFFAsmParser() = default;
32fe6060f1SDimitry Andric 
Initialize(MCAsmParser & P)33fe6060f1SDimitry Andric   void Initialize(MCAsmParser &P) override {
34fe6060f1SDimitry Andric     Parser = &P;
35fe6060f1SDimitry Andric     Lexer = &Parser->getLexer();
36fe6060f1SDimitry Andric     // Call the base implementation.
37fe6060f1SDimitry Andric     MCAsmParserExtension::Initialize(*Parser);
38fe6060f1SDimitry Andric 
39fe6060f1SDimitry Andric     addDirectiveHandler<&XCOFFAsmParser::ParseDirectiveCSect>(".csect");
40fe6060f1SDimitry Andric   }
41fe6060f1SDimitry Andric   bool ParseDirectiveCSect(StringRef, SMLoc);
42fe6060f1SDimitry Andric };
43fe6060f1SDimitry Andric 
44fe6060f1SDimitry Andric } // end anonymous namespace
45fe6060f1SDimitry Andric 
46fe6060f1SDimitry Andric namespace llvm {
47fe6060f1SDimitry Andric 
createXCOFFAsmParser()48fe6060f1SDimitry Andric MCAsmParserExtension *createXCOFFAsmParser() { return new XCOFFAsmParser; }
49fe6060f1SDimitry Andric 
50fe6060f1SDimitry Andric } // end namespace llvm
51fe6060f1SDimitry Andric 
52fe6060f1SDimitry Andric // .csect QualName [, Number ]
ParseDirectiveCSect(StringRef,SMLoc)53fe6060f1SDimitry Andric bool XCOFFAsmParser::ParseDirectiveCSect(StringRef, SMLoc) {
54fe6060f1SDimitry Andric   report_fatal_error("XCOFFAsmParser directive not yet supported!");
55fe6060f1SDimitry Andric   return false;
56fe6060f1SDimitry Andric }
57