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