diff --git a/PowerRecomp/recompiler.cpp b/PowerRecomp/recompiler.cpp index 15b6cee..ca6f909 100644 --- a/PowerRecomp/recompiler.cpp +++ b/PowerRecomp/recompiler.cpp @@ -1972,15 +1972,18 @@ bool Recompiler::Recompile(const Function& fn) } auto symbol = image.symbols.find(fn.base); + std::string name; if (symbol != image.symbols.end()) { - println("PPC_WEAK_FUNC({}) {{", symbol->name); + name = symbol->name; } else { - println("PPC_WEAK_FUNC(sub_{}) {{", fn.base); + name = std::format("sub_{}", fn.base); } + println("__attribute__((alias(\"__imp__{}\"))) PPC_WEAK_FUNC({});", name, name); + println("PPC_FUNC_IMPL(__imp__{}) {{", name); println("\tPPC_FUNC_PROLOGUE();"); auto switchTable = switchTables.end(); diff --git a/PowerUtils/ppc_context.h b/PowerUtils/ppc_context.h index 0fc8be0..0c169f7 100644 --- a/PowerUtils/ppc_context.h +++ b/PowerUtils/ppc_context.h @@ -14,8 +14,12 @@ #include #include +#define PPC_JOIN(x, y) x##y +#define PPC_XSTRINGIFY(x) #x +#define PPC_STRINGIFY(x) PPC_XSTRINGIFY(x) #define PPC_FUNC(x) void x(PPCContext& __restrict ctx, uint8_t* base) -#define PPC_EXTERN_FUNC(x) extern PPC_FUNC(x) +#define PPC_FUNC_IMPL(x) extern "C" PPC_FUNC(x) +#define PPC_EXTERN_FUNC(x) extern "C" PPC_FUNC(x) #define PPC_WEAK_FUNC(x) __attribute__((weak,noinline)) PPC_FUNC(x) #define PPC_FUNC_PROLOGUE() __builtin_assume(((size_t)base & 0xFFFFFFFF) == 0)