[llvm] r211174 - [PowerPC] Do not use BLA with the 64-bit SVR4 ABI
Hal Finkel
hfinkel at anl.gov
Wed Jun 18 09:48:41 PDT 2014
----- Original Message -----
> From: "Ulrich Weigand" <ulrich.weigand at de.ibm.com>
> To: llvm-commits at cs.uiuc.edu
> Sent: Wednesday, June 18, 2014 11:14:05 AM
> Subject: [llvm] r211174 - [PowerPC] Do not use BLA with the 64-bit SVR4 ABI
>
> Author: uweigand
> Date: Wed Jun 18 11:14:04 2014
> New Revision: 211174
>
> URL: http://llvm.org/viewvc/llvm-project?rev=211174&view=rev
> Log:
> [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.
>
>
> Modified:
> llvm/trunk/lib/Target/PowerPC/PPCISelLowering.cpp
> llvm/trunk/test/CodeGen/PowerPC/ppc64-calls.ll
>
> Modified: llvm/trunk/lib/Target/PowerPC/PPCISelLowering.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCISelLowering.cpp?rev=211174&r1=211173&r2=211174&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/PowerPC/PPCISelLowering.cpp (original)
> +++ llvm/trunk/lib/Target/PowerPC/PPCISelLowering.cpp Wed Jun 18
> 11:14:04 2014
> @@ -3431,11 +3431,12 @@ unsigned PrepareCall(SelectionDAG &DAG,
> unsigned CallOpc = PPCISD::CALL;
>
> bool needIndirectCall = true;
> - if (SDNode *Dest = isBLACompatibleAddress(Callee, DAG)) {
> - // If this is an absolute destination address, use the munged
> value.
> - Callee = SDValue(Dest, 0);
> - needIndirectCall = false;
> - }
> + if (!isSVR4ABI || !isPPC64)
> + if (SDNode *Dest = isBLACompatibleAddress(Callee, DAG)) {
> + // If this is an absolute destination address, use the munged
> value.
> + Callee = SDValue(Dest, 0);
> + needIndirectCall = false;
> + }
>
> if (GlobalAddressSDNode *G =
> dyn_cast<GlobalAddressSDNode>(Callee)) {
> // XXX Work around for http://llvm.org/bugs/show_bug.cgi?id=5201
> @@ -4383,8 +4384,7 @@ PPCTargetLowering::LowerCall_64SVR4(SDVa
> // pointers in the 64-bit SVR4 ABI.
> if (!isTailCall &&
> !dyn_cast<GlobalAddressSDNode>(Callee) &&
> - !dyn_cast<ExternalSymbolSDNode>(Callee) &&
> - !isBLACompatibleAddress(Callee, DAG)) {
> + !dyn_cast<ExternalSymbolSDNode>(Callee)) {
> // Load r2 into a virtual register and store it to the TOC save
> area.
> SDValue Val = DAG.getCopyFromReg(Chain, dl, PPC::X2, MVT::i64);
> // TOC save area offset.
>
> Modified: llvm/trunk/test/CodeGen/PowerPC/ppc64-calls.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/PowerPC/ppc64-calls.ll?rev=211174&r1=211173&r2=211174&view=diff
> ==============================================================================
> --- llvm/trunk/test/CodeGen/PowerPC/ppc64-calls.ll (original)
> +++ llvm/trunk/test/CodeGen/PowerPC/ppc64-calls.ll Wed Jun 18
> 11:14:04 2014
> @@ -42,15 +42,6 @@ define void @test_indirect(void ()* noca
> ret void
> }
>
> -; Absolute vales should be have the TOC restore 'nop'
> -define void @test_abs() nounwind {
> -; CHECK-LABEL: test_abs:
> - tail call void inttoptr (i64 1024 to void ()*)() nounwind
> -; CHECK: bla 1024
> -; CHECK-NEXT: nop
> - ret void
> -}
I don't understand; what happens now?
-Hal
> -
> declare double @sin(double) nounwind
>
> ; External functions call should also have a 'nop'
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
--
Hal Finkel
Assistant Computational Scientist
Leadership Computing Facility
Argonne National Laboratory
More information about the llvm-commits
mailing list