| //===--- 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 |