//===--- unittests/CodeGen/TestAsmPrinter.h ---------------------*- C++ -*-===//
//
// 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
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_UNITTESTS_CODEGEN_TESTASMPRINTER_H
#define LLVM_UNITTESTS_CODEGEN_TESTASMPRINTER_H

#include "llvm/BinaryFormat/Dwarf.h"
#include "llvm/MC/MCStreamer.h"
#include "gmock/gmock.h"

#include <memory>

namespace llvm {
class AsmPrinter;
class MCContext;
class Target;
class TargetMachine;

class MockMCStreamer : public MCStreamer {
public:
  explicit MockMCStreamer(MCContext *Ctx);
  ~MockMCStreamer();

  // These methods are pure virtual in MCStreamer, thus, have to be overridden:

  MOCK_METHOD2(emitSymbolAttribute,
               bool(MCSymbol *Symbol, MCSymbolAttr Attribute));
  MOCK_METHOD3(emitCommonSymbol,
               void(MCSymbol *Symbol, uint64_t Size, unsigned ByteAlignment));
  MOCK_METHOD5(emitZerofill,
               void(MCSection *Section, MCSymbol *Symbol, uint64_t Size,
                    unsigned ByteAlignment, SMLoc Loc));

  // The following are mock methods to be used in tests.

  MOCK_METHOD2(emitIntValue, void(uint64_t Value, unsigned Size));
  MOCK_METHOD3(emitValueImpl,
               void(const MCExpr *Value, unsigned Size, SMLoc Loc));
  MOCK_METHOD3(emitAbsoluteSymbolDiff,
               void(const MCSymbol *Hi, const MCSymbol *Lo, unsigned Size));
  MOCK_METHOD2(EmitCOFFSecRel32, void(MCSymbol const *Symbol, uint64_t Offset));
};

class TestAsmPrinter {
  std::unique_ptr<MCContext> MC;
  MockMCStreamer *MS = nullptr; // Owned by AsmPrinter
  std::unique_ptr<TargetMachine> TM;
  std::unique_ptr<AsmPrinter> Asm;

  /// Private constructor; call TestAsmPrinter::create(...)
  /// to create an instance.
  TestAsmPrinter();

  /// Initialize an AsmPrinter instance with a mocked MCStreamer.
  llvm::Error init(const Target *TheTarget, StringRef TripleStr,
                   uint16_t DwarfVersion, dwarf::DwarfFormat DwarfFormat);

public:
  /// Create an AsmPrinter and accompanied objects.
  /// Returns ErrorSuccess() with an empty value if the requested target is not
  /// supported so that the corresponding test can be gracefully skipped.
  static llvm::Expected<std::unique_ptr<TestAsmPrinter>>
  create(const std::string &TripleStr, uint16_t DwarfVersion,
         dwarf::DwarfFormat DwarfFormat);

  ~TestAsmPrinter();

  void setDwarfUsesRelocationsAcrossSections(bool Enable);

  AsmPrinter *getAP() const { return Asm.get(); }
  AsmPrinter *releaseAP() { return Asm.release(); }
  MCContext &getCtx() const { return *MC; }
  MockMCStreamer &getMS() const { return *MS; }
};

} // end namespace llvm

#endif // LLVM_UNITTESTS_CODEGEN_TESTASMPRINTER_H
