summaryrefslogtreecommitdiff
path: root/callingconvention.cpp
diff options
context:
space:
mode:
authorBrandon Miller <brandon@vector35.com>2026-06-02 09:00:15 -0400
committerBrandon Miller <brandon@vector35.com>2026-06-02 09:00:15 -0400
commit5953d087a9a104e7abb63c5739091214edf2faca (patch)
treeabd95a2698f32b8e1f6ae7feaa9647cff8d218ae /callingconvention.cpp
parent68215ea14cfbaa4966f830d85d98f7f49b416455 (diff)
Add support for multiple global pointer registers
Diffstat (limited to 'callingconvention.cpp')
-rw-r--r--callingconvention.cpp37
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, &regs[count]);
+ BNFreeRegisterList(regs);
+ return result;
}