mirror of
https://github.com/ran-j/PS2Recomp.git
synced 2026-09-30 02:04:32 -04:00
5196a6672a
* feat: added guestBranchKind enum to categorize branch types feat: added missingFunctionPolicy enum to define behaviors for missing function scenarios refactor: added handle guest branches and report missing functions feat lookupFunction to utilize new dispatch logic and improve error handling for unregistered functions * fix: fix test conflict * feat: added debug sound driver logs * feat: emmiter for return * feat: added recompiler reporter feat: added strict diagnostics flag for heavy debug calls * feat: staticc table insted of hashmap for runtime * feat: back file to ignore * feat: explode code across helpers and classes * feat: update codegen test feat: better guest nop check * feat: fix link problem on linux * feat: fix Segmentation fault
88 lines
3.1 KiB
C++
88 lines
3.1 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;
|
|
|
|
static StubTarget resolveStubTarget(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 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::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 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
|