diff options
| author | Brandon Miller <brandon@vector35.com> | 2026-06-02 09:00:15 -0400 |
|---|---|---|
| committer | Brandon Miller <brandon@vector35.com> | 2026-06-02 09:00:15 -0400 |
| commit | 5953d087a9a104e7abb63c5739091214edf2faca (patch) | |
| tree | abd95a2698f32b8e1f6ae7feaa9647cff8d218ae /callingconvention.cpp | |
| parent | 68215ea14cfbaa4966f830d85d98f7f49b416455 (diff) | |
Add support for multiple global pointer registers
Diffstat (limited to 'callingconvention.cpp')
| -rw-r--r-- | callingconvention.cpp | 37 |
1 files changed, 33 insertions, 4 deletions
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<CallingConvention> cc(ctxt); - return cc->GetGlobalPointerRegister(); + vector<uint32_t> 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<uint32_t> CallingConvention::GetGlobalPointerRegisters() +{ + uint32_t reg = GetGlobalPointerRegister(); + if (reg == BN_INVALID_REGISTER) + return vector<uint32_t>(); + return vector<uint32_t> { reg }; +} + + vector<uint32_t> CallingConvention::GetImplicitlyDefinedRegisters() { return vector<uint32_t>(); @@ -1141,7 +1156,21 @@ uint32_t CoreCallingConvention::GetFloatReturnValueRegister() uint32_t CoreCallingConvention::GetGlobalPointerRegister() { - return BNGetGlobalPointerRegister(m_object); + vector<uint32_t> regs = GetGlobalPointerRegisters(); + if (regs.empty()) + return BN_INVALID_REGISTER; + return regs[0]; +} + + +vector<uint32_t> CoreCallingConvention::GetGlobalPointerRegisters() +{ + size_t count; + uint32_t* regs = BNGetGlobalPointerRegisters(m_object, &count); + vector<uint32_t> result; + result.insert(result.end(), regs, ®s[count]); + BNFreeRegisterList(regs); + return result; } |
