|  | //===--- 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, Align ByteAlignment)); | 
|  | MOCK_METHOD5(emitZerofill, | 
|  | void(MCSection *Section, MCSymbol *Symbol, uint64_t Size, | 
|  | Align ByteAlignment, SMLoc Loc)); | 
|  |  | 
|  | // The following are mock methods to be used in tests. | 
|  |  | 
|  | MOCK_METHOD2(emitLabel, void(MCSymbol *Symbol, SMLoc Loc)); | 
|  | 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 |