1498e5f89SDan Gohman //===-- CallingConvLower.cpp - Calling Conventions ------------------------===// 2498e5f89SDan Gohman // 3498e5f89SDan Gohman // The LLVM Compiler Infrastructure 4498e5f89SDan Gohman // 5498e5f89SDan Gohman // This file is distributed under the University of Illinois Open Source 6498e5f89SDan Gohman // License. See LICENSE.TXT for details. 7498e5f89SDan Gohman // 8498e5f89SDan Gohman //===----------------------------------------------------------------------===// 9498e5f89SDan Gohman // 10498e5f89SDan Gohman // This file implements the CCState class, used for lowering and implementing 11498e5f89SDan Gohman // calling conventions. 12498e5f89SDan Gohman // 13498e5f89SDan Gohman //===----------------------------------------------------------------------===// 14498e5f89SDan Gohman 15498e5f89SDan Gohman #include "llvm/CodeGen/CallingConvLower.h" 160713a9d8SEric Christopher #include "llvm/CodeGen/MachineFrameInfo.h" 17ce009334SReid Kleckner #include "llvm/CodeGen/MachineRegisterInfo.h" 189fb823bbSChandler Carruth #include "llvm/IR/DataLayout.h" 19498e5f89SDan Gohman #include "llvm/Support/Debug.h" 20498e5f89SDan Gohman #include "llvm/Support/ErrorHandling.h" 21ce009334SReid Kleckner #include "llvm/Support/SaveAndRestore.h" 22498e5f89SDan Gohman #include "llvm/Support/raw_ostream.h" 2367c5c3e9SStuart Hastings #include "llvm/Target/TargetLowering.h" 24ed0881b2SChandler Carruth #include "llvm/Target/TargetRegisterInfo.h" 25d913448bSEric Christopher #include "llvm/Target/TargetSubtargetInfo.h" 26498e5f89SDan Gohman using namespace llvm; 27498e5f89SDan Gohman 280713a9d8SEric Christopher CCState::CCState(CallingConv::ID CC, bool isVarArg, MachineFunction &mf, 29b5217507SEric Christopher SmallVectorImpl<CCValAssign> &locs, LLVMContext &C) 30b5217507SEric Christopher : CallingConv(CC), IsVarArg(isVarArg), MF(mf), 31b5217507SEric Christopher TRI(*MF.getSubtarget().getRegisterInfo()), Locs(locs), Context(C), 328b58a838SCameron Zwarich CallOrPrologue(Unknown) { 33498e5f89SDan Gohman // No stack is used. 34498e5f89SDan Gohman StackOffset = 0; 35740f9d79SJeroen Ketema MaxStackArgAlign = 1; 36498e5f89SDan Gohman 378c02c982SStepan Dyatkovskiy clearByValRegsInfo(); 38498e5f89SDan Gohman UsedRegs.resize((TRI.getNumRegs()+31)/32); 39498e5f89SDan Gohman } 40498e5f89SDan Gohman 418b2150efSSanjay Patel /// Allocate space on the stack large enough to pass an argument by value. 428b2150efSSanjay Patel /// The size and alignment information of the argument is encoded in 438b2150efSSanjay Patel /// its parameter attribute. 4471049f78SDuncan Sands void CCState::HandleByVal(unsigned ValNo, MVT ValVT, 45f5dda01fSDuncan Sands MVT LocVT, CCValAssign::LocInfo LocInfo, 46498e5f89SDan Gohman int MinSize, int MinAlign, 47498e5f89SDan Gohman ISD::ArgFlagsTy ArgFlags) { 48498e5f89SDan Gohman unsigned Align = ArgFlags.getByValAlign(); 49498e5f89SDan Gohman unsigned Size = ArgFlags.getByValSize(); 50498e5f89SDan Gohman if (MinSize > (int)Size) 51498e5f89SDan Gohman Size = MinSize; 52498e5f89SDan Gohman if (MinAlign > (int)Align) 53498e5f89SDan Gohman Align = MinAlign; 5473696927SChad Rosier MF.getFrameInfo()->ensureMaxAlignment(Align); 55b5217507SEric Christopher MF.getSubtarget().getTargetLowering()->HandleByVal(this, Size, Align); 56*da00f2fdSRui Ueyama Size = unsigned(alignTo(Size, MinAlign)); 57498e5f89SDan Gohman unsigned Offset = AllocateStack(Size, Align); 58498e5f89SDan Gohman addLoc(CCValAssign::getMem(ValNo, ValVT, Offset, LocVT, LocInfo)); 59498e5f89SDan Gohman } 60498e5f89SDan Gohman 618b2150efSSanjay Patel /// Mark a register and all of its aliases as allocated. 62498e5f89SDan Gohman void CCState::MarkAllocated(unsigned Reg) { 6354038d79SJakob Stoklund Olesen for (MCRegAliasIterator AI(Reg, &TRI, true); AI.isValid(); ++AI) 6454038d79SJakob Stoklund Olesen UsedRegs[*AI/32] |= 1 << (*AI&31); 65498e5f89SDan Gohman } 66498e5f89SDan Gohman 678b2150efSSanjay Patel /// Analyze an array of argument values, 68498e5f89SDan Gohman /// incorporating info about the formals into this state. 69498e5f89SDan Gohman void 70498e5f89SDan Gohman CCState::AnalyzeFormalArguments(const SmallVectorImpl<ISD::InputArg> &Ins, 71498e5f89SDan Gohman CCAssignFn Fn) { 72498e5f89SDan Gohman unsigned NumArgs = Ins.size(); 73498e5f89SDan Gohman 74498e5f89SDan Gohman for (unsigned i = 0; i != NumArgs; ++i) { 75f5dda01fSDuncan Sands MVT ArgVT = Ins[i].VT; 76498e5f89SDan Gohman ISD::ArgFlagsTy ArgFlags = Ins[i].Flags; 77498e5f89SDan Gohman if (Fn(i, ArgVT, ArgVT, CCValAssign::Full, ArgFlags, *this)) { 78498e5f89SDan Gohman #ifndef NDEBUG 79498e5f89SDan Gohman dbgs() << "Formal argument #" << i << " has unhandled type " 8004a5cc39SCraig Topper << EVT(ArgVT).getEVTString() << '\n'; 81498e5f89SDan Gohman #endif 82c0196b1bSCraig Topper llvm_unreachable(nullptr); 83498e5f89SDan Gohman } 84498e5f89SDan Gohman } 85498e5f89SDan Gohman } 86498e5f89SDan Gohman 878b2150efSSanjay Patel /// Analyze the return values of a function, returning true if the return can 888b2150efSSanjay Patel /// be performed without sret-demotion and false otherwise. 89d7b5ce33SDan Gohman bool CCState::CheckReturn(const SmallVectorImpl<ISD::OutputArg> &Outs, 90498e5f89SDan Gohman CCAssignFn Fn) { 91498e5f89SDan Gohman // Determine which register each value should be copied into. 92d7b5ce33SDan Gohman for (unsigned i = 0, e = Outs.size(); i != e; ++i) { 93f5dda01fSDuncan Sands MVT VT = Outs[i].VT; 94d7b5ce33SDan Gohman ISD::ArgFlagsTy ArgFlags = Outs[i].Flags; 95498e5f89SDan Gohman if (Fn(i, VT, VT, CCValAssign::Full, ArgFlags, *this)) 96498e5f89SDan Gohman return false; 97498e5f89SDan Gohman } 98498e5f89SDan Gohman return true; 99498e5f89SDan Gohman } 100498e5f89SDan Gohman 1018b2150efSSanjay Patel /// Analyze the returned values of a return, 102498e5f89SDan Gohman /// incorporating info about the result values into this state. 103498e5f89SDan Gohman void CCState::AnalyzeReturn(const SmallVectorImpl<ISD::OutputArg> &Outs, 104498e5f89SDan Gohman CCAssignFn Fn) { 105498e5f89SDan Gohman // Determine which register each value should be copied into. 106498e5f89SDan Gohman for (unsigned i = 0, e = Outs.size(); i != e; ++i) { 107f5dda01fSDuncan Sands MVT VT = Outs[i].VT; 108498e5f89SDan Gohman ISD::ArgFlagsTy ArgFlags = Outs[i].Flags; 109498e5f89SDan Gohman if (Fn(i, VT, VT, CCValAssign::Full, ArgFlags, *this)) { 110498e5f89SDan Gohman #ifndef NDEBUG 111498e5f89SDan Gohman dbgs() << "Return operand #" << i << " has unhandled type " 11204a5cc39SCraig Topper << EVT(VT).getEVTString() << '\n'; 113498e5f89SDan Gohman #endif 114c0196b1bSCraig Topper llvm_unreachable(nullptr); 115498e5f89SDan Gohman } 116498e5f89SDan Gohman } 117498e5f89SDan Gohman } 118498e5f89SDan Gohman 1198b2150efSSanjay Patel /// Analyze the outgoing arguments to a call, 120498e5f89SDan Gohman /// incorporating info about the passed values into this state. 121498e5f89SDan Gohman void CCState::AnalyzeCallOperands(const SmallVectorImpl<ISD::OutputArg> &Outs, 122498e5f89SDan Gohman CCAssignFn Fn) { 123498e5f89SDan Gohman unsigned NumOps = Outs.size(); 124498e5f89SDan Gohman for (unsigned i = 0; i != NumOps; ++i) { 125f5dda01fSDuncan Sands MVT ArgVT = Outs[i].VT; 126498e5f89SDan Gohman ISD::ArgFlagsTy ArgFlags = Outs[i].Flags; 127498e5f89SDan Gohman if (Fn(i, ArgVT, ArgVT, CCValAssign::Full, ArgFlags, *this)) { 128498e5f89SDan Gohman #ifndef NDEBUG 129498e5f89SDan Gohman dbgs() << "Call operand #" << i << " has unhandled type " 13004a5cc39SCraig Topper << EVT(ArgVT).getEVTString() << '\n'; 131498e5f89SDan Gohman #endif 132c0196b1bSCraig Topper llvm_unreachable(nullptr); 133498e5f89SDan Gohman } 134498e5f89SDan Gohman } 135498e5f89SDan Gohman } 136498e5f89SDan Gohman 1378b2150efSSanjay Patel /// Same as above except it takes vectors of types and argument flags. 138f5dda01fSDuncan Sands void CCState::AnalyzeCallOperands(SmallVectorImpl<MVT> &ArgVTs, 139498e5f89SDan Gohman SmallVectorImpl<ISD::ArgFlagsTy> &Flags, 140498e5f89SDan Gohman CCAssignFn Fn) { 141498e5f89SDan Gohman unsigned NumOps = ArgVTs.size(); 142498e5f89SDan Gohman for (unsigned i = 0; i != NumOps; ++i) { 143f5dda01fSDuncan Sands MVT ArgVT = ArgVTs[i]; 144498e5f89SDan Gohman ISD::ArgFlagsTy ArgFlags = Flags[i]; 145498e5f89SDan Gohman if (Fn(i, ArgVT, ArgVT, CCValAssign::Full, ArgFlags, *this)) { 146498e5f89SDan Gohman #ifndef NDEBUG 147498e5f89SDan Gohman dbgs() << "Call operand #" << i << " has unhandled type " 14804a5cc39SCraig Topper << EVT(ArgVT).getEVTString() << '\n'; 149498e5f89SDan Gohman #endif 150c0196b1bSCraig Topper llvm_unreachable(nullptr); 151498e5f89SDan Gohman } 152498e5f89SDan Gohman } 153498e5f89SDan Gohman } 154498e5f89SDan Gohman 1558b2150efSSanjay Patel /// Analyze the return values of a call, incorporating info about the passed 1568b2150efSSanjay Patel /// values into this state. 157498e5f89SDan Gohman void CCState::AnalyzeCallResult(const SmallVectorImpl<ISD::InputArg> &Ins, 158498e5f89SDan Gohman CCAssignFn Fn) { 159498e5f89SDan Gohman for (unsigned i = 0, e = Ins.size(); i != e; ++i) { 160f5dda01fSDuncan Sands MVT VT = Ins[i].VT; 161498e5f89SDan Gohman ISD::ArgFlagsTy Flags = Ins[i].Flags; 162498e5f89SDan Gohman if (Fn(i, VT, VT, CCValAssign::Full, Flags, *this)) { 163498e5f89SDan Gohman #ifndef NDEBUG 164498e5f89SDan Gohman dbgs() << "Call result #" << i << " has unhandled type " 16504a5cc39SCraig Topper << EVT(VT).getEVTString() << '\n'; 166498e5f89SDan Gohman #endif 167c0196b1bSCraig Topper llvm_unreachable(nullptr); 168498e5f89SDan Gohman } 169498e5f89SDan Gohman } 170498e5f89SDan Gohman } 171498e5f89SDan Gohman 1728b2150efSSanjay Patel /// Same as above except it's specialized for calls that produce a single value. 173f5dda01fSDuncan Sands void CCState::AnalyzeCallResult(MVT VT, CCAssignFn Fn) { 174498e5f89SDan Gohman if (Fn(0, VT, VT, CCValAssign::Full, ISD::ArgFlagsTy(), *this)) { 175498e5f89SDan Gohman #ifndef NDEBUG 176498e5f89SDan Gohman dbgs() << "Call result has unhandled type " 17704a5cc39SCraig Topper << EVT(VT).getEVTString() << '\n'; 178498e5f89SDan Gohman #endif 179c0196b1bSCraig Topper llvm_unreachable(nullptr); 180498e5f89SDan Gohman } 181498e5f89SDan Gohman } 182ce009334SReid Kleckner 183bba20f06SReid Kleckner static bool isValueTypeInRegForCC(CallingConv::ID CC, MVT VT) { 184bba20f06SReid Kleckner if (VT.isVector()) 185bba20f06SReid Kleckner return true; // Assume -msse-regparm might be in effect. 186bba20f06SReid Kleckner if (!VT.isInteger()) 187bba20f06SReid Kleckner return false; 188bba20f06SReid Kleckner if (CC == CallingConv::X86_VectorCall || CC == CallingConv::X86_FastCall) 189bba20f06SReid Kleckner return true; 190bba20f06SReid Kleckner return false; 191bba20f06SReid Kleckner } 192bba20f06SReid Kleckner 193ce009334SReid Kleckner void CCState::getRemainingRegParmsForType(SmallVectorImpl<MCPhysReg> &Regs, 194ce009334SReid Kleckner MVT VT, CCAssignFn Fn) { 195ce009334SReid Kleckner unsigned SavedStackOffset = StackOffset; 196740f9d79SJeroen Ketema unsigned SavedMaxStackArgAlign = MaxStackArgAlign; 197ce009334SReid Kleckner unsigned NumLocs = Locs.size(); 198ce009334SReid Kleckner 199bba20f06SReid Kleckner // Set the 'inreg' flag if it is used for this calling convention. 200ce009334SReid Kleckner ISD::ArgFlagsTy Flags; 201bba20f06SReid Kleckner if (isValueTypeInRegForCC(CallingConv, VT)) 202ce009334SReid Kleckner Flags.setInReg(); 203bba20f06SReid Kleckner 204bba20f06SReid Kleckner // Allocate something of this value type repeatedly until we get assigned a 205bba20f06SReid Kleckner // location in memory. 206ce009334SReid Kleckner bool HaveRegParm = true; 207ce009334SReid Kleckner while (HaveRegParm) { 208ce009334SReid Kleckner if (Fn(0, VT, VT, CCValAssign::Full, Flags, *this)) { 209ce009334SReid Kleckner #ifndef NDEBUG 210ce009334SReid Kleckner dbgs() << "Call has unhandled type " << EVT(VT).getEVTString() 211ce009334SReid Kleckner << " while computing remaining regparms\n"; 212ce009334SReid Kleckner #endif 213ce009334SReid Kleckner llvm_unreachable(nullptr); 214ce009334SReid Kleckner } 215ce009334SReid Kleckner HaveRegParm = Locs.back().isRegLoc(); 216ce009334SReid Kleckner } 217ce009334SReid Kleckner 218ce009334SReid Kleckner // Copy all the registers from the value locations we added. 219ce009334SReid Kleckner assert(NumLocs < Locs.size() && "CC assignment failed to add location"); 220ce009334SReid Kleckner for (unsigned I = NumLocs, E = Locs.size(); I != E; ++I) 221ce009334SReid Kleckner if (Locs[I].isRegLoc()) 222ce009334SReid Kleckner Regs.push_back(MCPhysReg(Locs[I].getLocReg())); 223ce009334SReid Kleckner 224ce009334SReid Kleckner // Clear the assigned values and stack memory. We leave the registers marked 225ce009334SReid Kleckner // as allocated so that future queries don't return the same registers, i.e. 226ce009334SReid Kleckner // when i64 and f64 are both passed in GPRs. 227ce009334SReid Kleckner StackOffset = SavedStackOffset; 228740f9d79SJeroen Ketema MaxStackArgAlign = SavedMaxStackArgAlign; 229ce009334SReid Kleckner Locs.resize(NumLocs); 230ce009334SReid Kleckner } 231ce009334SReid Kleckner 232ce009334SReid Kleckner void CCState::analyzeMustTailForwardedRegisters( 233ce009334SReid Kleckner SmallVectorImpl<ForwardedRegister> &Forwards, ArrayRef<MVT> RegParmTypes, 234ce009334SReid Kleckner CCAssignFn Fn) { 235ce009334SReid Kleckner // Oftentimes calling conventions will not user register parameters for 236ce009334SReid Kleckner // variadic functions, so we need to assume we're not variadic so that we get 237ce009334SReid Kleckner // all the registers that might be used in a non-variadic call. 238ce009334SReid Kleckner SaveAndRestore<bool> SavedVarArg(IsVarArg, false); 239ce009334SReid Kleckner 240ce009334SReid Kleckner for (MVT RegVT : RegParmTypes) { 241ce009334SReid Kleckner SmallVector<MCPhysReg, 8> RemainingRegs; 242ce009334SReid Kleckner getRemainingRegParmsForType(RemainingRegs, RegVT, Fn); 243ce009334SReid Kleckner const TargetLowering *TL = MF.getSubtarget().getTargetLowering(); 244ce009334SReid Kleckner const TargetRegisterClass *RC = TL->getRegClassFor(RegVT); 245ce009334SReid Kleckner for (MCPhysReg PReg : RemainingRegs) { 246ce009334SReid Kleckner unsigned VReg = MF.addLiveIn(PReg, RC); 247ce009334SReid Kleckner Forwards.push_back(ForwardedRegister(VReg, PReg, RegVT)); 248ce009334SReid Kleckner } 249ce009334SReid Kleckner } 250ce009334SReid Kleckner } 251