xref: /llvm-project/llvm/tools/llvm-reduce/ReducerWorkItem.h (revision 592536a9ec9318852c133b3392f2e271a08b0c68)
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