* Jeff Law:
> This is best addressed by changing GCC itself to know about the
> different ABIs. Trying to tackle in ASMs is going to be painful,
> particularly since your asms change the stack pointer and that's
> generally verboten for an ASM.
Standard practice is to use generic assembler trampolines for the thorny
cases. We use them in glibc for those system calls which have
incompatible calling conventions, and I believe UEFI and WINE use them,
too.
It would be nice to teach GCC about these calling conventions, but even
for much larger use cases, that simply does not happen in practice. 8-(
For example, on POWER, the condition register is used to indicate
errors. Instead of using that directly, we need to store that in a
register, via mfcr:
0000000000000000 <__GI___getdents64>:
0: addis r2,r12,0
0: R_PPC64_REL16_HA .TOC.
4: addi r2,r2,0
4: R_PPC64_REL16_LO .TOC.+0x4
8: li r0,202
c: sc
10: mfcr r0
14: andis. r9,r0,4096
18: beqlr
1c: addis r9,r2,0
1c: R_PPC64_GOT_TPREL16_HA __libc_errno
20: ld r9,0(r9)
20: R_PPC64_GOT_TPREL16_LO_DS __libc_errno
24: add r9,r9,r13
24: R_PPC64_TLS __libc_errno
28: stw r3,0(r9)
2c: li r3,-1
30: blr
Ideally, the mfcr, andis, beqlr instructions would just be a bclr
instruction.
Thanks,
Florian