ThinLtoDiscoveryThread.h 1.47 KB
#ifndef LLVM_EXAMPLES_THINLTOJIT_DISCOVERYTHREAD_H
#define LLVM_EXAMPLES_THINLTOJIT_DISCOVERYTHREAD_H

#include "llvm/ADT/StringRef.h"
#include "llvm/IR/ModuleSummaryIndex.h"

#include "ThinLtoJIT.h"

#include <atomic>
#include <vector>

namespace llvm {
namespace orc {

class ExecutionSession;
class ThinLtoModuleIndex;
class ThinLtoInstrumentationLayer;

class ThinLtoDiscoveryThread {
public:
  ThinLtoDiscoveryThread(std::atomic<bool> &RunningFlag, ExecutionSession &ES,
                         JITDylib *MainJD, ThinLtoInstrumentationLayer &L,
                         ThinLtoModuleIndex &GlobalIndex,
                         ThinLtoJIT::AddModuleFunction AddModule,
                         unsigned LookaheadLevels, bool PrintStats)
      : KeepRunning(RunningFlag), ES(ES), Layer(L), GlobalIndex(GlobalIndex),
        AddModule(std::move(AddModule)), LookaheadLevels(LookaheadLevels),
        PrintStats(PrintStats) {}

  ~ThinLtoDiscoveryThread() {
    if (PrintStats)
      dump(errs());
  }

  void operator()();

  void dump(raw_ostream &OS) {
    OS << format("Modules submitted asynchronously: %d\n", NumModulesSubmitted);
  }

private:
  std::atomic<bool> &KeepRunning;
  ExecutionSession &ES;
  ThinLtoInstrumentationLayer &Layer;
  ThinLtoModuleIndex &GlobalIndex;
  ThinLtoJIT::AddModuleFunction AddModule;
  unsigned LookaheadLevels;
  bool PrintStats;
  unsigned NumModulesSubmitted{0};

  void spawnLookupForHighRankModules();
};

} // namespace orc
} // namespace llvm

#endif