mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-14 13:09:22 +02:00
* perform interface dispatches via R12 instead of R11 as expected for
indirect function calls for ELFv2 (and other ABIs don't care about the register) git-svn-id: trunk@30236 -
This commit is contained in:
parent
2bcef2daee
commit
f633d094ee
@ -786,15 +786,17 @@ unit cgppc;
|
|||||||
smallint((href.offset shr 16)+ord(smallint(href.offset and $ffff) < 0))));
|
smallint((href.offset shr 16)+ord(smallint(href.offset and $ffff) < 0))));
|
||||||
href.offset := smallint(href.offset and $ffff);
|
href.offset := smallint(href.offset and $ffff);
|
||||||
end;
|
end;
|
||||||
a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,NR_R11);
|
{ use R12 for dispatch because most ABIs don't care and ELFv2
|
||||||
|
requires it }
|
||||||
|
a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,NR_R12);
|
||||||
if (target_info.system in systems_aix) or
|
if (target_info.system in systems_aix) or
|
||||||
((target_info.system = system_powerpc64_linux) and
|
((target_info.system = system_powerpc64_linux) and
|
||||||
(target_info.abi=abi_powerpc_sysv)) then
|
(target_info.abi=abi_powerpc_sysv)) then
|
||||||
begin
|
begin
|
||||||
reference_reset_base(href, NR_R11, 0, sizeof(pint));
|
reference_reset_base(href, NR_R12, 0, sizeof(pint));
|
||||||
a_load_ref_reg(list, OS_ADDR, OS_ADDR, href, NR_R11);
|
a_load_ref_reg(list, OS_ADDR, OS_ADDR, href, NR_R12);
|
||||||
end;
|
end;
|
||||||
list.concat(taicpu.op_reg(A_MTCTR,NR_R11));
|
list.concat(taicpu.op_reg(A_MTCTR,NR_R12));
|
||||||
list.concat(taicpu.op_none(A_BCTR));
|
list.concat(taicpu.op_none(A_BCTR));
|
||||||
if (target_info.system in ([system_powerpc64_linux]+systems_aix)) then
|
if (target_info.system in ([system_powerpc64_linux]+systems_aix)) then
|
||||||
list.concat(taicpu.op_none(A_NOP));
|
list.concat(taicpu.op_none(A_NOP));
|
||||||
|
Loading…
Reference in New Issue
Block a user