mirror of
https://github.com/ran-j/PS2Recomp.git
synced 2026-09-26 08:51:05 -04:00
75d729ce40
* refactor: from guest threads to EE scheduler * feat: bad wip mpeg fix for code veronica * feat: cheap copy from host feat: small perf o vsync tick * feat: added EE clock Hz fix: fix MPEG out of sync with new EE refactor * fix: fix lotr tests * fix: fix cri dtx loading fix: fix wrong mmi instruction translation fix: fix thread info params feat: added EE timers decoder and consumer feat: split SFI and IOP memory to prevent collision and overrides * feat: revert wrong changes * refactor: change GS architecture * feat: IOP emulator refactor: codegen to catch callbacks on mips code feat: added a lot of entries or IOP emulator * feat: analyzer resolve the complete constant-producing sequence with five-instruction backward scan stopped at LUI and therefore * feat: remove recompiled version of GetRomName refactor: split IOP emulator logic feat: added more HLE IOP modules feat: added ps2_path * eat: enhance ELF parser with improved callable entry detection and control flow analysis * feat: update memory hint handling and enhance entry point discovery logic * feat: add SET_GPR_ZE32 macro for zero-extending loads with unsigned semantics * refactor: Refactor PS2 IOP Host Adapter and Memory Management feat: Added PS2Vfs for virtual file system operations, including file opening, reading, writing, and path resolution. feat: Improve VIF1 data processing to handle GIF image packets more efficiently. * feat: added a lot of tests * fix: fix texture caching feat: wip multi version on dbcman * feat: remove LLE IOPs
98 lines
3.9 KiB
C++
98 lines
3.9 KiB
C++
#ifndef PS2RECOMP_PS2_RECOMPILER_H
|
|
#define PS2RECOMP_PS2_RECOMPILER_H
|
|
|
|
#include "code_generator.h"
|
|
#include "config_manager.h"
|
|
#include "recompiler_reporter.h"
|
|
#include <string>
|
|
#include <vector>
|
|
#include <unordered_map>
|
|
#include <unordered_set>
|
|
#include <filesystem>
|
|
#include <memory>
|
|
#include <map>
|
|
|
|
namespace ps2recomp
|
|
{
|
|
class R5900Decoder;
|
|
class ElfParser;
|
|
|
|
enum class StubTarget
|
|
{
|
|
Unknown,
|
|
Syscall,
|
|
Stub
|
|
};
|
|
|
|
class PS2Recompiler
|
|
{
|
|
public:
|
|
explicit PS2Recompiler(const std::string &configPath);
|
|
~PS2Recompiler();
|
|
|
|
bool initialize();
|
|
bool recompile();
|
|
void generateOutput();
|
|
void printReport() const;
|
|
const RecompilerReporter::Counters &reportCounters() const { return m_reporter.counters(); }
|
|
|
|
static StubTarget resolveStubTarget(const std::string& name);
|
|
static bool IsCorrectnessCriticalFunctionName(const std::string &name);
|
|
static size_t DiscoverAdditionalEntryPoints(
|
|
std::vector<Function> &functions,
|
|
std::unordered_map<uint32_t, std::vector<Instruction>> &decodedFunctions,
|
|
const std::vector<Section> §ions);
|
|
static size_t ResliceEntryFunctions(std::vector<Function> &functions, std::unordered_map<uint32_t, std::vector<Instruction>> &decodedFunctions);
|
|
static size_t CollectInternalEntryTargets(
|
|
const std::vector<Function> &functions,
|
|
const std::unordered_map<uint32_t, std::vector<Instruction>> &decodedFunctions,
|
|
const std::unordered_set<uint32_t> &entryAddresses,
|
|
std::unordered_map<uint32_t, std::vector<uint32_t>> &targetsByOwner);
|
|
|
|
static std::string ClampFilenameLength(const std::string& baseName, const std::string& extension, std::size_t maxLength);
|
|
|
|
private:
|
|
ConfigManager m_configManager;
|
|
std::unique_ptr<ElfParser> m_elfParser;
|
|
std::unique_ptr<R5900Decoder> m_decoder;
|
|
std::unique_ptr<CodeGenerator> m_codeGenerator;
|
|
RecompilerConfig m_config;
|
|
RecompilerReporter m_reporter;
|
|
|
|
std::vector<Function> m_functions;
|
|
std::vector<Symbol> m_symbols;
|
|
std::vector<Section> m_sections;
|
|
std::vector<Relocation> m_relocations;
|
|
|
|
std::unordered_map<uint32_t, std::vector<Instruction>> m_decodedFunctions;
|
|
std::unordered_map<std::string, bool> m_skipFunctions;
|
|
std::unordered_set<uint32_t> m_skipFunctionStarts;
|
|
std::unordered_set<std::string> m_stubFunctions;
|
|
std::unordered_set<uint32_t> m_stubFunctionStarts;
|
|
std::unordered_map<uint32_t, std::string> m_stubHandlerBindingsByStart;
|
|
std::unordered_set<uint32_t> m_entryPointHintStarts;
|
|
std::unordered_set<uint32_t> m_correctnessCriticalFunctionStarts;
|
|
std::map<uint32_t, std::string> m_generatedStubs;
|
|
std::unordered_map<uint32_t, std::string> m_functionRenames;
|
|
std::unordered_map<uint32_t, std::vector<uint32_t>> m_resumeEntryTargetsByOwner;
|
|
CodeGenerator::BootstrapInfo m_bootstrapInfo;
|
|
|
|
bool decodeFunction(Function &function);
|
|
void discoverAdditionalEntryPoints();
|
|
bool shouldSkipFunction(const Function &function) const;
|
|
bool isStubFunction(const Function &function) const;
|
|
bool isCorrectnessCriticalFunction(const Function &function) const;
|
|
bool hasResolvedStubHandler(const Function &function) const;
|
|
void collectCorrectnessCriticalFunctionStarts();
|
|
bool generateFunctionHeader();
|
|
bool generateStubHeader();
|
|
bool writeToFile(const std::string &path, const std::string &content);
|
|
std::filesystem::path getOutputPath(const Function &function) const;
|
|
static std::string clampFilenameLength(const std::string& baseName, const std::string& extension, std::size_t maxLength);
|
|
std::string sanitizeFunctionName(const std::string &name) const;
|
|
};
|
|
|
|
}
|
|
|
|
#endif
|