[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