[llvm-dev] Do I need to implement CCAssignFnForCall for porting GlobalISel to AVR target?

Diana Picus via llvm-dev llvm-dev at lists.llvm.org
Wed Nov 29 02:23:15 PST 2017


Hi Leslie,

Long story short - no, you don't need CCAssignFnForCall.

In fact, if you look at the X86CallLowering, you'll see that it
doesn't use that either, since it can use CC_X86 directly. For ARM it
made sense to have a CCAssignFnForCall so we could reuse the code in
ARMISelLowering.

I don't know the AVR backend very well, so I can't help you figure out
what is most appropriate for the AVR target. Having a CCAssignFn
available would make it easier to use the existing infrastructure, but
in principle you should be able to get away without one if you
override ValueHandler::assignArg. After a cursory look at
AVRISelLowering, I see it has some custom code for analyzing arguments
- you'll probably have to somehow incorporate that logic into
assignArg.

Hope that helps,
Diana

On 29 November 2017 at 05:00, Leslie Zhai <lesliezhai at llvm.org.cn> wrote:
> Hi LLVM developers,
>
> I am porting GlobalISel to AVR target by learning ARM target's source code
>
>
> commit c82e7ec9e25c934568eb9c75cf13226177e98dba
> Author: Diana Picus <diana.picus at linaro.org>
> Date:   Fri Dec 16 10:35:20 2016 +0000
>
>     [ARM] Expose methods to get the CCAssignFn. NFCI
>
>     Add two public methods to ARMTargetLowering: CCAssignFnForCall and
>     CCAssignFnForReturn, which are just calling the already existing private
> method
>     CCAssignFnForNode. These will come in handy for GlobalISel on ARM.
>
>     We also replace all calls to CCAssignFnForNode in ARMISelLowering.cpp,
> because
>     the new methods are friendlier to the reader.
>
>
> There are:
>
> CCAssignFnForCall
>
> and
>
> CCAssignFnForReturn
>
> But there is only CCAssignFnForReturn for AVR, do I need to implement
> CCAssignFnForCall for AVR target?
>
>
> diff --git a/lib/Target/AVR/AVRCallingConv.td
> b/lib/Target/AVR/AVRCallingConv.td
> index 68dbce0..d460925 100644
> --- a/lib/Target/AVR/AVRCallingConv.td
> +++ b/lib/Target/AVR/AVRCallingConv.td
> @@ -10,6 +10,18 @@
>
> //===----------------------------------------------------------------------===//
>
>
> //===----------------------------------------------------------------------===//
> +// AVR Calling Convention
> +//===----------------------------------------------------------------------===//
> +
> +def CC_AVR : CallingConv
> +<[
> +]>;
> +
> +def CC_AVR_BUILTIN : CallingConv
> +<[
> +]>;
> +
> +//===----------------------------------------------------------------------===//
>  // AVR Return Value Calling Convention
>
> //===----------------------------------------------------------------------===//
>
> diff --git a/lib/Target/AVR/AVRISelLowering.cpp
> b/lib/Target/AVR/AVRISelLowering.cpp
> index a49da15..44f0ed6 100644
> --- a/lib/Target/AVR/AVRISelLowering.cpp
> +++ b/lib/Target/AVR/AVRISelLowering.cpp
> @@ -1324,12 +1324,13 @@ SDValue AVRTargetLowering::LowerCallResult(
>  //               Return Value Calling Convention Implementation
>
> //===----------------------------------------------------------------------===//
>
> -CCAssignFn *AVRTargetLowering::CCAssignFnForReturn(CallingConv::ID CC)
> const {
> +CCAssignFn *AVRTargetLowering::CCAssignFnForReturn(CallingConv::ID CC,
> +                                                   bool Return) const {
>    switch (CC) {
>    case CallingConv::AVR_BUILTIN:
> -    return RetCC_AVR_BUILTIN;
> +    return Return ? RetCC_AVR_BUILTIN : CC_AVR_BUILTIN;
>    default:
> -    return RetCC_AVR;
> +    return Return ? RetCC_AVR : CC_AVR;
>    }
>  }
>
> diff --git a/lib/Target/AVR/AVRISelLowering.h
> b/lib/Target/AVR/AVRISelLowering.h
> index c90c65c..43777a2 100644
> --- a/lib/Target/AVR/AVRISelLowering.h
> +++ b/lib/Target/AVR/AVRISelLowering.h
> @@ -127,6 +127,8 @@ public:
>    unsigned getRegisterByName(const char* RegName, EVT VT,
>                               SelectionDAG &DAG) const override;
>
> +  CCAssignFn *CCAssignFnForReturn(CallingConv::ID CC, bool Return = true)
> const;
> +
>  private:
>    SDValue getAVRCmp(SDValue LHS, SDValue RHS, ISD::CondCode CC, SDValue
> &AVRcc,
>                      SelectionDAG &DAG, SDLoc dl) const;
> @@ -140,8 +142,6 @@ private:
>    SDValue LowerSETCC(SDValue Op, SelectionDAG &DAG) const;
>    SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const;
>
> -  CCAssignFn *CCAssignFnForReturn(CallingConv::ID CC) const;
> -
>    bool CanLowerReturn(CallingConv::ID CallConv,
>                        MachineFunction &MF, bool isVarArg,
>                        const SmallVectorImpl<ISD::OutputArg> &Outs,
>
>
> Please give me some hint, thanks a lot!
>
> --
> Regards,
> Leslie Zhai - https://reviews.llvm.org/p/xiangzhai/
>
>
>


More information about the llvm-dev mailing list