mirror of
https://github.com/hedge-dev/XenonRecomp.git
synced 2025-06-06 18:31:03 +00:00
Print only actually used labels.
This commit is contained in:
parent
70497754d9
commit
261e8c1d60
@ -1920,6 +1920,29 @@ bool Recompiler::Recompile(const Function& fn)
|
|||||||
auto end = base + fn.size;
|
auto end = base + fn.size;
|
||||||
auto* data = (uint32_t*)image.Find(base);
|
auto* data = (uint32_t*)image.Find(base);
|
||||||
|
|
||||||
|
static std::unordered_set<size_t> labels;
|
||||||
|
labels.clear();
|
||||||
|
|
||||||
|
for (size_t addr = base; addr < end; addr += 4)
|
||||||
|
{
|
||||||
|
const uint32_t instruction = std::byteswap(*(uint32_t*)((char*)data + addr - base));
|
||||||
|
if (!PPC_BL(instruction))
|
||||||
|
{
|
||||||
|
const size_t op = PPC_OP(instruction);
|
||||||
|
if (op == PPC_OP_B)
|
||||||
|
labels.emplace(addr + PPC_BI(instruction));
|
||||||
|
else if (op == PPC_OP_BC)
|
||||||
|
labels.emplace(addr + PPC_BD(instruction));
|
||||||
|
}
|
||||||
|
|
||||||
|
auto switchTable = switchTables.find(addr);
|
||||||
|
if (switchTable != switchTables.end())
|
||||||
|
{
|
||||||
|
for (auto label : switchTable->second.labels)
|
||||||
|
labels.emplace(label);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
auto symbol = image.symbols.find(fn.base);
|
auto symbol = image.symbols.find(fn.base);
|
||||||
if (symbol != image.symbols.end())
|
if (symbol != image.symbols.end())
|
||||||
{
|
{
|
||||||
@ -1937,13 +1960,15 @@ bool Recompiler::Recompile(const Function& fn)
|
|||||||
|
|
||||||
// TODO: the printing scheme here is scuffed
|
// TODO: the printing scheme here is scuffed
|
||||||
RecompilerLocalVariables localVariables;
|
RecompilerLocalVariables localVariables;
|
||||||
|
static std::string tempString;
|
||||||
tempString.clear();
|
tempString.clear();
|
||||||
std::swap(out, tempString);
|
std::swap(out, tempString);
|
||||||
|
|
||||||
ppc_insn insn;
|
ppc_insn insn;
|
||||||
while (base < end)
|
while (base < end)
|
||||||
{
|
{
|
||||||
println("loc_{:X}:", base);
|
if (labels.contains(base))
|
||||||
|
println("loc_{:X}:", base);
|
||||||
|
|
||||||
if (switchTable == switchTables.end())
|
if (switchTable == switchTables.end())
|
||||||
switchTable = switchTables.find(base);
|
switchTable = switchTables.find(base);
|
||||||
@ -2122,6 +2147,8 @@ void Recompiler::SaveCurrentOutData(const char* directoryPath, const std::string
|
|||||||
FILE* f = fopen(filePath.c_str(), "rb");
|
FILE* f = fopen(filePath.c_str(), "rb");
|
||||||
if (f)
|
if (f)
|
||||||
{
|
{
|
||||||
|
static std::vector<uint8_t> temp;
|
||||||
|
|
||||||
fseek(f, 0, SEEK_END);
|
fseek(f, 0, SEEK_END);
|
||||||
long fileSize = ftell(f);
|
long fileSize = ftell(f);
|
||||||
if (fileSize == out.size())
|
if (fileSize == out.size())
|
||||||
|
@ -41,8 +41,6 @@ struct Recompiler
|
|||||||
std::unordered_map<size_t, SwitchTable> switchTables;
|
std::unordered_map<size_t, SwitchTable> switchTables;
|
||||||
std::string out;
|
std::string out;
|
||||||
size_t cppFileIndex = 0;
|
size_t cppFileIndex = 0;
|
||||||
std::vector<uint8_t> temp;
|
|
||||||
std::string tempString;
|
|
||||||
uint32_t setJmpAddress = 0;
|
uint32_t setJmpAddress = 0;
|
||||||
uint32_t longJmpAddress = 0;
|
uint32_t longJmpAddress = 0;
|
||||||
RecompilerConfig config;
|
RecompilerConfig config;
|
||||||
|
@ -3,9 +3,7 @@ project("PowerSample")
|
|||||||
add_compile_options(
|
add_compile_options(
|
||||||
"/fp:strict"
|
"/fp:strict"
|
||||||
"-march=x86-64-v3"
|
"-march=x86-64-v3"
|
||||||
"-fno-strict-aliasing"
|
"-fno-strict-aliasing")
|
||||||
"-Wno-unused-label"
|
|
||||||
"-Wno-unused-variable")
|
|
||||||
|
|
||||||
file(GLOB RecompiledFiles *.cpp)
|
file(GLOB RecompiledFiles *.cpp)
|
||||||
add_library(PowerSample ${RecompiledFiles})
|
add_library(PowerSample ${RecompiledFiles})
|
||||||
|
1
PowerTests/.gitignore
vendored
Normal file
1
PowerTests/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
*.cpp
|
Loading…
x
Reference in New Issue
Block a user