[PowerPC] Do not use BLA with the 64-bit SVR4 ABI
authorUlrich Weigand <ulrich.weigand@de.ibm.com>
Wed, 18 Jun 2014 16:14:04 +0000 (16:14 +0000)
committerUlrich Weigand <ulrich.weigand@de.ibm.com>
Wed, 18 Jun 2014 16:14:04 +0000 (16:14 +0000)
commit9aa09ef30f0bc65aeb848f0cdc6b5987fc884d16
tree36c63f3aa6ec5626b91b5537783de64b9bab53e9
parentef2272c49e1da9ef22b142ea4a8dca86a9cf80e5
[PowerPC] Do not use BLA with the 64-bit SVR4 ABI

The PowerPC back-end uses BLA to implement calls to functions at
known-constant addresses, which is apparently used for certain
system routines on Darwin.

However, with the 64-bit SVR4 ABI, this is actually incorrect.
An immediate function pointer value on this platform is not
directly usable as a target address for BLA:
- in the ELFv1 ABI, the function pointer value refers to the
  *function descriptor*, not the code address
- in the ELFv2 ABI, the function pointer value refers to the
  global entry point, but BL(A) would only be correct when
  calling the *local* entry point

This bug didn't show up since using immediate function pointer
values is not usually done in the 64-bit SVR4 ABI in the first
place.  However, I ran into this issue with a certain use case
of LLVM as JIT, where immediate function pointer values were
uses to implement callbacks from JITted code to helpers in
statically compiled code.

Fixed by simply not using BLA with the 64-bit SVR4 ABI.

llvm-svn: 211174
llvm/lib/Target/PowerPC/PPCISelLowering.cpp
llvm/test/CodeGen/PowerPC/ppc64-calls.ll