Files
FEX-Emu--FEX/External/FEXCore/Source/Interface/IR/PassManager.h
T
Ryan Houdek fd857e4966 Makes threaded compilation not rely on a global mutex
As we run more threaded applications it is becoming apparent that this
needs to be fixed now.
This duplicates the FrontendDecoder and Passmanager per thread so they
no longer block each other while compiling.
Increases a bit of memory usage but completely worth it.
2020-05-27 10:18:02 -07:00

83 lines
1.6 KiB
C++

#pragma once
#include <FEXCore/IR/IntrusiveIRList.h>
#include <FEXCore/IR/IREmitter.h>
#include <functional>
#include <memory>
#include <vector>
namespace FEXCore {
class SyscallHandler;
}
namespace FEXCore::IR {
class OpDispatchBuilder;
class SyscallOptimization;
using ShouldExitHandler = std::function<void(void)>;
class Pass {
public:
virtual ~Pass() = default;
virtual bool Run(IREmitter *IREmit) = 0;
void RegisterPassManager(PassManager *_Manager) {
Manager = _Manager;
}
protected:
PassManager *Manager;
};
class PassManager final {
friend class SyscallOptimization;
public:
void AddDefaultPasses();
void AddDefaultValidationPasses();
void InsertPass(Pass *Pass) {
Pass->RegisterPassManager(this);
Passes.emplace_back(Pass);
}
void InsertRAPass(Pass *Pass) {
RAPass = Pass;
InsertPass(Pass);
}
bool Run(IREmitter *IREmit);
void RegisterExitHandler(ShouldExitHandler Handler) {
ExitHandler = Handler;
}
bool HasRAPass() const {
return RAPass != nullptr;
}
IR::RegisterAllocationPass *GetRAPass() {
return reinterpret_cast<IR::RegisterAllocationPass*>(RAPass);
}
void RegisterSyscallHandler(SyscallHandler *Handler) {
SyscallHandler = Handler;
}
protected:
ShouldExitHandler ExitHandler;
SyscallHandler *SyscallHandler;
private:
Pass *RAPass{};
std::vector<std::unique_ptr<Pass>> Passes;
#ifndef NDEBUG
std::vector<std::unique_ptr<Pass>> ValidationPasses;
void InsertValidationPass(Pass *Pass) {
Pass->RegisterPassManager(this);
ValidationPasses.emplace_back(Pass);
}
#endif
};
}