entering the local entry point for __cancel from __cp_cancel is valid
if __cp_cancel was reached from __syscall_cp, since both are in libc
and share the same TOC pointer, but it is not valid if __cp_cancel was
reached when cancel_handler rewrote the program counter for
asynchronous cancellation of code outside libc.
to ensure __cancel is entered with a valid TOC pointer, recompute the
correct value in a PC-relative manner before jumping.
blr
__cp_cancel:
+ mflr 0
+ bl 1f
+ .long .TOC.-.
+1: mflr 3
+ lwa 2, 0(3)
+ add 2, 2, 3
+ mtlr 0
b __cancel