//===--- 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 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 MC; MockMCStreamer *MS = nullptr; // Owned by AsmPrinter std::unique_ptr TM; std::unique_ptr 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> 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