1*d415bd75Srobert //===- ReducerWorkItem.h - Wrapper for Module -------------------*- C++ -*-===// 2*d415bd75Srobert // 3*d415bd75Srobert // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*d415bd75Srobert // See https://llvm.org/LICENSE.txt for license information. 5*d415bd75Srobert // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*d415bd75Srobert // 7*d415bd75Srobert //===----------------------------------------------------------------------===// 8*d415bd75Srobert 9*d415bd75Srobert #ifndef LLVM_TOOLS_LLVM_REDUCE_REDUCERWORKITEM_H 10*d415bd75Srobert #define LLVM_TOOLS_LLVM_REDUCE_REDUCERWORKITEM_H 11*d415bd75Srobert 12*d415bd75Srobert #include "llvm/IR/Module.h" 13*d415bd75Srobert #include <memory> 14*d415bd75Srobert 15*d415bd75Srobert namespace llvm { 16*d415bd75Srobert class LLVMContext; 17*d415bd75Srobert class MachineModuleInfo; 18*d415bd75Srobert class MemoryBufferRef; 19*d415bd75Srobert class raw_ostream; 20*d415bd75Srobert class TargetMachine; 21*d415bd75Srobert class TestRunner; 22*d415bd75Srobert struct BitcodeLTOInfo; 23*d415bd75Srobert 24*d415bd75Srobert class ReducerWorkItem { 25*d415bd75Srobert public: 26*d415bd75Srobert std::shared_ptr<Module> M; 27*d415bd75Srobert std::unique_ptr<BitcodeLTOInfo> LTOInfo; 28*d415bd75Srobert std::unique_ptr<MachineModuleInfo> MMI; 29*d415bd75Srobert 30*d415bd75Srobert ReducerWorkItem(); 31*d415bd75Srobert ~ReducerWorkItem(); 32*d415bd75Srobert ReducerWorkItem(ReducerWorkItem &) = delete; 33*d415bd75Srobert ReducerWorkItem(ReducerWorkItem &&) = default; 34*d415bd75Srobert isMIR()35*d415bd75Srobert bool isMIR() const { return MMI != nullptr; } 36*d415bd75Srobert getContext()37*d415bd75Srobert LLVMContext &getContext() { 38*d415bd75Srobert return M->getContext(); 39*d415bd75Srobert } 40*d415bd75Srobert getModule()41*d415bd75Srobert Module &getModule() { return *M; } getModule()42*d415bd75Srobert const Module &getModule() const { return *M; } 43*d415bd75Srobert operator Module &() const { return *M; } 44*d415bd75Srobert 45*d415bd75Srobert void print(raw_ostream &ROS, void *p = nullptr) const; 46*d415bd75Srobert bool verify(raw_fd_ostream *OS) const; 47*d415bd75Srobert std::unique_ptr<ReducerWorkItem> clone(const TargetMachine *TM) const; 48*d415bd75Srobert 49*d415bd75Srobert /// Return a number to indicate whether there was any reduction progress. getComplexityScore()50*d415bd75Srobert uint64_t getComplexityScore() const { 51*d415bd75Srobert return isMIR() ? computeMIRComplexityScore() : computeIRComplexityScore(); 52*d415bd75Srobert } 53*d415bd75Srobert 54*d415bd75Srobert void writeOutput(raw_ostream &OS, bool EmitBitcode) const; 55*d415bd75Srobert void readBitcode(MemoryBufferRef Data, LLVMContext &Ctx, StringRef ToolName); 56*d415bd75Srobert void writeBitcode(raw_ostream &OutStream) const; 57*d415bd75Srobert 58*d415bd75Srobert bool isReduced(const TestRunner &Test) const; 59*d415bd75Srobert 60*d415bd75Srobert private: 61*d415bd75Srobert uint64_t computeIRComplexityScore() const; 62*d415bd75Srobert uint64_t computeMIRComplexityScore() const; 63*d415bd75Srobert }; 64*d415bd75Srobert 65*d415bd75Srobert std::pair<std::unique_ptr<ReducerWorkItem>, bool> 66*d415bd75Srobert parseReducerWorkItem(StringRef ToolName, StringRef Filename, LLVMContext &Ctxt, 67*d415bd75Srobert std::unique_ptr<TargetMachine> &TM, bool IsMIR); 68*d415bd75Srobert } // namespace llvm 69*d415bd75Srobert 70*d415bd75Srobert #endif 71