//===- XCOFFAsmParser.cpp - XCOFF Assembly Parser
//-----------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#include "llvm/BinaryFormat/XCOFF.h"
#include "llvm/MC/MCContext.h"
#include "llvm/MC/MCParser/MCAsmLexer.h"
#include "llvm/MC/MCParser/MCAsmParser.h"
#include "llvm/MC/MCParser/MCAsmParserExtension.h"
#include "llvm/MC/MCSectionXCOFF.h"
#include "llvm/MC/MCStreamer.h"
#include "llvm/MC/MCSymbol.h"
#include "llvm/MC/MCSymbolXCOFF.h"
#include "llvm/Support/MachineValueType.h"

using namespace llvm;

namespace {

class XCOFFAsmParser : public MCAsmParserExtension {
  MCAsmParser *Parser = nullptr;
  MCAsmLexer *Lexer = nullptr;

  template <bool (XCOFFAsmParser::*HandlerMethod)(StringRef, SMLoc)>
  void addDirectiveHandler(StringRef Directive) {
    MCAsmParser::ExtensionDirectiveHandler Handler =
        std::make_pair(this, HandleDirective<XCOFFAsmParser, HandlerMethod>);

    getParser().addDirectiveHandler(Directive, Handler);
  }

public:
  XCOFFAsmParser() {}

  void Initialize(MCAsmParser &P) override {
    Parser = &P;
    Lexer = &Parser->getLexer();
    // Call the base implementation.
    MCAsmParserExtension::Initialize(*Parser);

    addDirectiveHandler<&XCOFFAsmParser::ParseDirectiveCSect>(".csect");
  }
  bool ParseDirectiveCSect(StringRef, SMLoc);
};

} // end anonymous namespace

namespace llvm {

MCAsmParserExtension *createXCOFFAsmParser() { return new XCOFFAsmParser; }

} // end namespace llvm

// .csect QualName [, Number ]
bool XCOFFAsmParser::ParseDirectiveCSect(StringRef, SMLoc) {
  report_fatal_error("XCOFFAsmParser directive not yet supported!");
  return false;
}
