Leslie Zhai via llvm-dev
2017-Nov-29 04:00 UTC
[llvm-dev] Do I need to implement CCAssignFnForCall for porting GlobalISel to AVR target?
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/