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 AndricMCAsmParserExtension *createXCOFFAsmParser() { return new XCOFFAsmParser; } 49fe6060f1SDimitry Andric 50fe6060f1SDimitry Andric } // end namespace llvm 51fe6060f1SDimitry Andric 52fe6060f1SDimitry Andric // .csect QualName [, Number ] ParseDirectiveCSect(StringRef,SMLoc)53fe6060f1SDimitry Andricbool XCOFFAsmParser::ParseDirectiveCSect(StringRef, SMLoc) { 54fe6060f1SDimitry Andric report_fatal_error("XCOFFAsmParser directive not yet supported!"); 55fe6060f1SDimitry Andric return false; 56fe6060f1SDimitry Andric } 57