13a25b21cSMatt Arsenault //===- ReducerWorkItem.h - Wrapper for Module -------------------*- C++ -*-===// 2fd41738eSMarkus Lavin // 3fd41738eSMarkus Lavin // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4fd41738eSMarkus Lavin // See https://llvm.org/LICENSE.txt for license information. 5fd41738eSMarkus Lavin // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6fd41738eSMarkus Lavin // 7fd41738eSMarkus Lavin //===----------------------------------------------------------------------===// 8fd41738eSMarkus Lavin 9fd41738eSMarkus Lavin #ifndef LLVM_TOOLS_LLVM_REDUCE_REDUCERWORKITEM_H 10fd41738eSMarkus Lavin #define LLVM_TOOLS_LLVM_REDUCE_REDUCERWORKITEM_H 11fd41738eSMarkus Lavin 12fd41738eSMarkus Lavin #include "llvm/IR/Module.h" 13333ffafbSMatt Arsenault #include <memory> 14fd41738eSMarkus Lavin 15333ffafbSMatt Arsenault namespace llvm { 16333ffafbSMatt Arsenault class LLVMContext; 17333ffafbSMatt Arsenault class MachineModuleInfo; 18*592536a9SMatt Arsenault class MemoryBufferRef; 19333ffafbSMatt Arsenault class raw_ostream; 20333ffafbSMatt Arsenault class TargetMachine; 21333ffafbSMatt Arsenault class TestRunner; 22333ffafbSMatt Arsenault struct BitcodeLTOInfo; 23fd41738eSMarkus Lavin 24fd41738eSMarkus Lavin class ReducerWorkItem { 25fd41738eSMarkus Lavin public: 26fd41738eSMarkus Lavin std::shared_ptr<Module> M; 276b3956e1SMatthew Voss std::unique_ptr<BitcodeLTOInfo> LTOInfo; 287c2db666SMatt Arsenault std::unique_ptr<MachineModuleInfo> MMI; 297c2db666SMatt Arsenault 30*592536a9SMatt Arsenault ReducerWorkItem(); 31*592536a9SMatt Arsenault ~ReducerWorkItem(); 32*592536a9SMatt Arsenault ReducerWorkItem(ReducerWorkItem &) = delete; 33*592536a9SMatt Arsenault ReducerWorkItem(ReducerWorkItem &&) = default; 34*592536a9SMatt Arsenault isMIR()357c2db666SMatt Arsenault bool isMIR() const { return MMI != nullptr; } 367c2db666SMatt Arsenault getContext()3723cc36e4SMatt Arsenault LLVMContext &getContext() { 3823cc36e4SMatt Arsenault return M->getContext(); 3923cc36e4SMatt Arsenault } 4023cc36e4SMatt Arsenault getModule()4123cc36e4SMatt Arsenault Module &getModule() { return *M; } getModule()427c2db666SMatt Arsenault const Module &getModule() const { return *M; } 43*592536a9SMatt Arsenault operator Module &() const { return *M; } 447c2db666SMatt Arsenault 45fd41738eSMarkus Lavin void print(raw_ostream &ROS, void *p = nullptr) const; 46*592536a9SMatt Arsenault bool verify(raw_fd_ostream *OS) const; 47*592536a9SMatt Arsenault std::unique_ptr<ReducerWorkItem> clone(const TargetMachine *TM) const; 4835264e71SMatt Arsenault 4935264e71SMatt Arsenault /// Return a number to indicate whether there was any reduction progress. getComplexityScore()5035264e71SMatt Arsenault uint64_t getComplexityScore() const { 51c23ac22fSMatt Arsenault return isMIR() ? computeMIRComplexityScore() : computeIRComplexityScore(); 5235264e71SMatt Arsenault } 5335264e71SMatt Arsenault 54*592536a9SMatt Arsenault void writeOutput(raw_ostream &OS, bool EmitBitcode) const; 55*592536a9SMatt Arsenault void readBitcode(MemoryBufferRef Data, LLVMContext &Ctx, StringRef ToolName); 56*592536a9SMatt Arsenault void writeBitcode(raw_ostream &OutStream) const; 57*592536a9SMatt Arsenault 58*592536a9SMatt Arsenault bool isReduced(const TestRunner &Test) const; 59333ffafbSMatt Arsenault 6035264e71SMatt Arsenault private: 61c23ac22fSMatt Arsenault uint64_t computeIRComplexityScore() const; 6235264e71SMatt Arsenault uint64_t computeMIRComplexityScore() const; 63fd41738eSMarkus Lavin }; 64*592536a9SMatt Arsenault 65*592536a9SMatt Arsenault std::pair<std::unique_ptr<ReducerWorkItem>, bool> 66*592536a9SMatt Arsenault parseReducerWorkItem(StringRef ToolName, StringRef Filename, LLVMContext &Ctxt, 67*592536a9SMatt Arsenault std::unique_ptr<TargetMachine> &TM, bool IsMIR); 68333ffafbSMatt Arsenault } // namespace llvm 69fd41738eSMarkus Lavin 70fd41738eSMarkus Lavin #endif 71