From 5953d087a9a104e7abb63c5739091214edf2faca Mon Sep 17 00:00:00 2001 From: Brandon Miller Date: Tue, 2 Jun 2026 09:00:15 -0400 Subject: Add support for multiple global pointer registers --- callingconvention.cpp | 37 +++++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) (limited to 'callingconvention.cpp') diff --git a/callingconvention.cpp b/callingconvention.cpp index ec32a5b1..c16521d5 100644 --- a/callingconvention.cpp +++ b/callingconvention.cpp @@ -105,7 +105,7 @@ CallingConvention::CallingConvention(Architecture* arch, const string& name) cc.getIntegerReturnValueRegister = GetIntegerReturnValueRegisterCallback; cc.getHighIntegerReturnValueRegister = GetHighIntegerReturnValueRegisterCallback; cc.getFloatReturnValueRegister = GetFloatReturnValueRegisterCallback; - cc.getGlobalPointerRegister = GetGlobalPointerRegisterCallback; + cc.getGlobalPointerRegisters = GetGlobalPointerRegistersCallback; cc.getImplicitlyDefinedRegisters = GetImplicitlyDefinedRegistersCallback; cc.getIncomingRegisterValue = GetIncomingRegisterValueCallback; cc.getIncomingFlagValue = GetIncomingFlagValueCallback; @@ -282,10 +282,16 @@ uint32_t CallingConvention::GetFloatReturnValueRegisterCallback(void* ctxt) } -uint32_t CallingConvention::GetGlobalPointerRegisterCallback(void* ctxt) +uint32_t* CallingConvention::GetGlobalPointerRegistersCallback(void* ctxt, size_t* count) { CallbackRef cc(ctxt); - return cc->GetGlobalPointerRegister(); + vector regs = cc->GetGlobalPointerRegisters(); + *count = regs.size(); + + uint32_t* result = new uint32_t[regs.size()]; + for (size_t i = 0; i < regs.size(); i++) + result[i] = regs[i]; + return result; } @@ -695,6 +701,15 @@ uint32_t CallingConvention::GetGlobalPointerRegister() } +vector CallingConvention::GetGlobalPointerRegisters() +{ + uint32_t reg = GetGlobalPointerRegister(); + if (reg == BN_INVALID_REGISTER) + return vector(); + return vector { reg }; +} + + vector CallingConvention::GetImplicitlyDefinedRegisters() { return vector(); @@ -1141,7 +1156,21 @@ uint32_t CoreCallingConvention::GetFloatReturnValueRegister() uint32_t CoreCallingConvention::GetGlobalPointerRegister() { - return BNGetGlobalPointerRegister(m_object); + vector regs = GetGlobalPointerRegisters(); + if (regs.empty()) + return BN_INVALID_REGISTER; + return regs[0]; +} + + +vector CoreCallingConvention::GetGlobalPointerRegisters() +{ + size_t count; + uint32_t* regs = BNGetGlobalPointerRegisters(m_object, &count); + vector result; + result.insert(result.end(), regs, ®s[count]); + BNFreeRegisterList(regs); + return result; } -- cgit v1.3.1