1456e281c11914034558f9878f88688ab7873647aDan Gohman//===-- CallingConvLower.cpp - Calling Conventions ------------------------===// 2362e98a5f5cf1919ac6435ff5b630b58ecd95fc5Chris Lattner// 3362e98a5f5cf1919ac6435ff5b630b58ecd95fc5Chris Lattner// The LLVM Compiler Infrastructure 4362e98a5f5cf1919ac6435ff5b630b58ecd95fc5Chris Lattner// 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details. 7362e98a5f5cf1919ac6435ff5b630b58ecd95fc5Chris Lattner// 8362e98a5f5cf1919ac6435ff5b630b58ecd95fc5Chris Lattner//===----------------------------------------------------------------------===// 9362e98a5f5cf1919ac6435ff5b630b58ecd95fc5Chris Lattner// 10362e98a5f5cf1919ac6435ff5b630b58ecd95fc5Chris Lattner// This file implements the CCState class, used for lowering and implementing 11362e98a5f5cf1919ac6435ff5b630b58ecd95fc5Chris Lattner// calling conventions. 12362e98a5f5cf1919ac6435ff5b630b58ecd95fc5Chris Lattner// 13362e98a5f5cf1919ac6435ff5b630b58ecd95fc5Chris Lattner//===----------------------------------------------------------------------===// 14362e98a5f5cf1919ac6435ff5b630b58ecd95fc5Chris Lattner 15362e98a5f5cf1919ac6435ff5b630b58ecd95fc5Chris Lattner#include "llvm/CodeGen/CallingConvLower.h" 16471e4224809f51652c71f319532697a879a75a0dEric Christopher#include "llvm/CodeGen/MachineFrameInfo.h" 170b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DataLayout.h" 18ad61b129ee283f6399ecf6fa5f64f82760e9a56aDavid Greene#include "llvm/Support/Debug.h" 197d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin#include "llvm/Support/ErrorHandling.h" 207d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin#include "llvm/Support/raw_ostream.h" 21f222e595c0137b8a9571408257f7000c2fb95473Stuart Hastings#include "llvm/Target/TargetLowering.h" 22d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetMachine.h" 23d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetRegisterInfo.h" 24362e98a5f5cf1919ac6435ff5b630b58ecd95fc5Chris Lattnerusing namespace llvm; 25362e98a5f5cf1919ac6435ff5b630b58ecd95fc5Chris Lattner 26471e4224809f51652c71f319532697a879a75a0dEric ChristopherCCState::CCState(CallingConv::ID CC, bool isVarArg, MachineFunction &mf, 27a0f803a2e3a6b2962417cae23e2980535ea39ff9Cameron Zwarich const TargetMachine &tm, SmallVector<CCValAssign, 16> &locs, 28a0f803a2e3a6b2962417cae23e2980535ea39ff9Cameron Zwarich LLVMContext &C) 29471e4224809f51652c71f319532697a879a75a0dEric Christopher : CallingConv(CC), IsVarArg(isVarArg), MF(mf), TM(tm), 30c73158730d43e7c8bdef32b2107566a6e78a8538Stuart Hastings TRI(*TM.getRegisterInfo()), Locs(locs), Context(C), 31a50760f43bafbb46f72fc22426075204a69ce178Cameron Zwarich CallOrPrologue(Unknown) { 32362e98a5f5cf1919ac6435ff5b630b58ecd95fc5Chris Lattner // No stack is used. 33362e98a5f5cf1919ac6435ff5b630b58ecd95fc5Chris Lattner StackOffset = 0; 34471e4224809f51652c71f319532697a879a75a0dEric Christopher 35c73158730d43e7c8bdef32b2107566a6e78a8538Stuart Hastings clearFirstByValReg(); 36117b64b3f8277e8882d711ea859bed380a3e6f14Dan Gohman UsedRegs.resize((TRI.getNumRegs()+31)/32); 37362e98a5f5cf1919ac6435ff5b630b58ecd95fc5Chris Lattner} 38362e98a5f5cf1919ac6435ff5b630b58ecd95fc5Chris Lattner 39471e4224809f51652c71f319532697a879a75a0dEric Christopher// HandleByVal - Allocate space on the stack large enough to pass an argument 40471e4224809f51652c71f319532697a879a75a0dEric Christopher// by value. The size and alignment information of the argument is encoded in 41471e4224809f51652c71f319532697a879a75a0dEric Christopher// its parameter attribute. 421e96bab329eb23e4ce8a0dc3cc6b33a3f03d15bfDuncan Sandsvoid CCState::HandleByVal(unsigned ValNo, MVT ValVT, 431440e8b918d7116c3587cb95f4f7ac7a0a0b65adDuncan Sands MVT LocVT, CCValAssign::LocInfo LocInfo, 444c46fc6bbf206a59b1b46d8b1af43896a4675c65Evan Cheng int MinSize, int MinAlign, 45276dcbdc8db6614cfd5004dc7dc35e437ddf9c58Duncan Sands ISD::ArgFlagsTy ArgFlags) { 46276dcbdc8db6614cfd5004dc7dc35e437ddf9c58Duncan Sands unsigned Align = ArgFlags.getByValAlign(); 47276dcbdc8db6614cfd5004dc7dc35e437ddf9c58Duncan Sands unsigned Size = ArgFlags.getByValSize(); 484c46fc6bbf206a59b1b46d8b1af43896a4675c65Evan Cheng if (MinSize > (int)Size) 494c46fc6bbf206a59b1b46d8b1af43896a4675c65Evan Cheng Size = MinSize; 504c46fc6bbf206a59b1b46d8b1af43896a4675c65Evan Cheng if (MinAlign > (int)Align) 514c46fc6bbf206a59b1b46d8b1af43896a4675c65Evan Cheng Align = MinAlign; 522531a6415ff9c082bb1c11c27f1b03aa3e1b97dfChad Rosier MF.getFrameInfo()->ensureMaxAlignment(Align); 53b52ba9f8a896b6717d6395ad59f6550e1fa475b0Stepan Dyatkovskiy TM.getTargetLowering()->HandleByVal(this, Size, Align); 542aa0f23e1cb5afc96981ecc057980d1958c0be72Stuart Hastings unsigned Offset = AllocateStack(Size, Align); 552aa0f23e1cb5afc96981ecc057980d1958c0be72Stuart Hastings addLoc(CCValAssign::getMem(ValNo, ValVT, Offset, LocVT, LocInfo)); 56594d37e21aea4ef841d9ee5d9c328c4bf1c6bed7Rafael Espindola} 57362e98a5f5cf1919ac6435ff5b630b58ecd95fc5Chris Lattner 58362e98a5f5cf1919ac6435ff5b630b58ecd95fc5Chris Lattner/// MarkAllocated - Mark a register and all of its aliases as allocated. 59362e98a5f5cf1919ac6435ff5b630b58ecd95fc5Chris Lattnervoid CCState::MarkAllocated(unsigned Reg) { 60396618b43a85e12d290a90b181c6af5d7c0c5f11Jakob Stoklund Olesen for (MCRegAliasIterator AI(Reg, &TRI, true); AI.isValid(); ++AI) 61396618b43a85e12d290a90b181c6af5d7c0c5f11Jakob Stoklund Olesen UsedRegs[*AI/32] |= 1 << (*AI&31); 62362e98a5f5cf1919ac6435ff5b630b58ecd95fc5Chris Lattner} 63fb39f99fa4cdeab24c1b462cdd954a7d792323b7Chris Lattner 6498ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman/// AnalyzeFormalArguments - Analyze an array of argument values, 6566baf26fe0c229142d483030e1633f656822c5eeChris Lattner/// incorporating info about the formals into this state. 6698ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohmanvoid 6798ca4f2a325f72374a477f9deba7d09e8999c29bDan GohmanCCState::AnalyzeFormalArguments(const SmallVectorImpl<ISD::InputArg> &Ins, 6898ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman CCAssignFn Fn) { 6998ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman unsigned NumArgs = Ins.size(); 7098ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman 7166baf26fe0c229142d483030e1633f656822c5eeChris Lattner for (unsigned i = 0; i != NumArgs; ++i) { 721440e8b918d7116c3587cb95f4f7ac7a0a0b65adDuncan Sands MVT ArgVT = Ins[i].VT; 7398ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman ISD::ArgFlagsTy ArgFlags = Ins[i].Flags; 7466baf26fe0c229142d483030e1633f656822c5eeChris Lattner if (Fn(i, ArgVT, ArgVT, CCValAssign::Full, ArgFlags, *this)) { 75c23197a26f34f559ea9797de51e187087c039c42Torok Edwin#ifndef NDEBUG 76ad61b129ee283f6399ecf6fa5f64f82760e9a56aDavid Greene dbgs() << "Formal argument #" << i << " has unhandled type " 7732631d1a5a18cb997ea7ad4f103938470aecc146Craig Topper << EVT(ArgVT).getEVTString() << '\n'; 78c23197a26f34f559ea9797de51e187087c039c42Torok Edwin#endif 79c23197a26f34f559ea9797de51e187087c039c42Torok Edwin llvm_unreachable(0); 8066baf26fe0c229142d483030e1633f656822c5eeChris Lattner } 8166baf26fe0c229142d483030e1633f656822c5eeChris Lattner } 8266baf26fe0c229142d483030e1633f656822c5eeChris Lattner} 8366baf26fe0c229142d483030e1633f656822c5eeChris Lattner 84b4997aeab74934ffa6fc0409afc4d8704245e372Kenneth Uildriks/// CheckReturn - Analyze the return values of a function, returning true if 85b4997aeab74934ffa6fc0409afc4d8704245e372Kenneth Uildriks/// the return can be performed without sret-demotion, and false otherwise. 8684023e0fbefc406a4c611d3d64a10df5d3a97dd7Dan Gohmanbool CCState::CheckReturn(const SmallVectorImpl<ISD::OutputArg> &Outs, 87b4997aeab74934ffa6fc0409afc4d8704245e372Kenneth Uildriks CCAssignFn Fn) { 88b4997aeab74934ffa6fc0409afc4d8704245e372Kenneth Uildriks // Determine which register each value should be copied into. 8984023e0fbefc406a4c611d3d64a10df5d3a97dd7Dan Gohman for (unsigned i = 0, e = Outs.size(); i != e; ++i) { 901440e8b918d7116c3587cb95f4f7ac7a0a0b65adDuncan Sands MVT VT = Outs[i].VT; 9184023e0fbefc406a4c611d3d64a10df5d3a97dd7Dan Gohman ISD::ArgFlagsTy ArgFlags = Outs[i].Flags; 92b4997aeab74934ffa6fc0409afc4d8704245e372Kenneth Uildriks if (Fn(i, VT, VT, CCValAssign::Full, ArgFlags, *this)) 93b4997aeab74934ffa6fc0409afc4d8704245e372Kenneth Uildriks return false; 94b4997aeab74934ffa6fc0409afc4d8704245e372Kenneth Uildriks } 95b4997aeab74934ffa6fc0409afc4d8704245e372Kenneth Uildriks return true; 96b4997aeab74934ffa6fc0409afc4d8704245e372Kenneth Uildriks} 97b4997aeab74934ffa6fc0409afc4d8704245e372Kenneth Uildriks 9898ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman/// AnalyzeReturn - Analyze the returned values of a return, 9966baf26fe0c229142d483030e1633f656822c5eeChris Lattner/// incorporating info about the result values into this state. 10098ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohmanvoid CCState::AnalyzeReturn(const SmallVectorImpl<ISD::OutputArg> &Outs, 10198ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman CCAssignFn Fn) { 10266baf26fe0c229142d483030e1633f656822c5eeChris Lattner // Determine which register each value should be copied into. 10398ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman for (unsigned i = 0, e = Outs.size(); i != e; ++i) { 1041440e8b918d7116c3587cb95f4f7ac7a0a0b65adDuncan Sands MVT VT = Outs[i].VT; 105aa8c19405ac3891ee7fbea1a509c6774ca7a5b59Dan Gohman ISD::ArgFlagsTy ArgFlags = Outs[i].Flags; 106aa8c19405ac3891ee7fbea1a509c6774ca7a5b59Dan Gohman if (Fn(i, VT, VT, CCValAssign::Full, ArgFlags, *this)) { 107aa8c19405ac3891ee7fbea1a509c6774ca7a5b59Dan Gohman#ifndef NDEBUG 108aa8c19405ac3891ee7fbea1a509c6774ca7a5b59Dan Gohman dbgs() << "Return operand #" << i << " has unhandled type " 10932631d1a5a18cb997ea7ad4f103938470aecc146Craig Topper << EVT(VT).getEVTString() << '\n'; 110aa8c19405ac3891ee7fbea1a509c6774ca7a5b59Dan Gohman#endif 111aa8c19405ac3891ee7fbea1a509c6774ca7a5b59Dan Gohman llvm_unreachable(0); 112aa8c19405ac3891ee7fbea1a509c6774ca7a5b59Dan Gohman } 113aa8c19405ac3891ee7fbea1a509c6774ca7a5b59Dan Gohman } 114aa8c19405ac3891ee7fbea1a509c6774ca7a5b59Dan Gohman} 115aa8c19405ac3891ee7fbea1a509c6774ca7a5b59Dan Gohman 11698ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman/// AnalyzeCallOperands - Analyze the outgoing arguments to a call, 11798ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman/// incorporating info about the passed values into this state. 11898ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohmanvoid CCState::AnalyzeCallOperands(const SmallVectorImpl<ISD::OutputArg> &Outs, 11998ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman CCAssignFn Fn) { 12098ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman unsigned NumOps = Outs.size(); 121fb39f99fa4cdeab24c1b462cdd954a7d792323b7Chris Lattner for (unsigned i = 0; i != NumOps; ++i) { 1221440e8b918d7116c3587cb95f4f7ac7a0a0b65adDuncan Sands MVT ArgVT = Outs[i].VT; 123aa8c19405ac3891ee7fbea1a509c6774ca7a5b59Dan Gohman ISD::ArgFlagsTy ArgFlags = Outs[i].Flags; 124aa8c19405ac3891ee7fbea1a509c6774ca7a5b59Dan Gohman if (Fn(i, ArgVT, ArgVT, CCValAssign::Full, ArgFlags, *this)) { 125aa8c19405ac3891ee7fbea1a509c6774ca7a5b59Dan Gohman#ifndef NDEBUG 126aa8c19405ac3891ee7fbea1a509c6774ca7a5b59Dan Gohman dbgs() << "Call operand #" << i << " has unhandled type " 12732631d1a5a18cb997ea7ad4f103938470aecc146Craig Topper << EVT(ArgVT).getEVTString() << '\n'; 128aa8c19405ac3891ee7fbea1a509c6774ca7a5b59Dan Gohman#endif 129aa8c19405ac3891ee7fbea1a509c6774ca7a5b59Dan Gohman llvm_unreachable(0); 130aa8c19405ac3891ee7fbea1a509c6774ca7a5b59Dan Gohman } 131aa8c19405ac3891ee7fbea1a509c6774ca7a5b59Dan Gohman } 132aa8c19405ac3891ee7fbea1a509c6774ca7a5b59Dan Gohman} 133aa8c19405ac3891ee7fbea1a509c6774ca7a5b59Dan Gohman 134c89d2feb35560883688e43b553b8e94e7cd371deEvan Cheng/// AnalyzeCallOperands - Same as above except it takes vectors of types 135c89d2feb35560883688e43b553b8e94e7cd371deEvan Cheng/// and argument flags. 1361440e8b918d7116c3587cb95f4f7ac7a0a0b65adDuncan Sandsvoid CCState::AnalyzeCallOperands(SmallVectorImpl<MVT> &ArgVTs, 137c89d2feb35560883688e43b553b8e94e7cd371deEvan Cheng SmallVectorImpl<ISD::ArgFlagsTy> &Flags, 138c89d2feb35560883688e43b553b8e94e7cd371deEvan Cheng CCAssignFn Fn) { 139c89d2feb35560883688e43b553b8e94e7cd371deEvan Cheng unsigned NumOps = ArgVTs.size(); 140c89d2feb35560883688e43b553b8e94e7cd371deEvan Cheng for (unsigned i = 0; i != NumOps; ++i) { 1411440e8b918d7116c3587cb95f4f7ac7a0a0b65adDuncan Sands MVT ArgVT = ArgVTs[i]; 142c89d2feb35560883688e43b553b8e94e7cd371deEvan Cheng ISD::ArgFlagsTy ArgFlags = Flags[i]; 143c89d2feb35560883688e43b553b8e94e7cd371deEvan Cheng if (Fn(i, ArgVT, ArgVT, CCValAssign::Full, ArgFlags, *this)) { 144c23197a26f34f559ea9797de51e187087c039c42Torok Edwin#ifndef NDEBUG 145ad61b129ee283f6399ecf6fa5f64f82760e9a56aDavid Greene dbgs() << "Call operand #" << i << " has unhandled type " 14632631d1a5a18cb997ea7ad4f103938470aecc146Craig Topper << EVT(ArgVT).getEVTString() << '\n'; 147c23197a26f34f559ea9797de51e187087c039c42Torok Edwin#endif 148c23197a26f34f559ea9797de51e187087c039c42Torok Edwin llvm_unreachable(0); 149c89d2feb35560883688e43b553b8e94e7cd371deEvan Cheng } 150c89d2feb35560883688e43b553b8e94e7cd371deEvan Cheng } 151c89d2feb35560883688e43b553b8e94e7cd371deEvan Cheng} 152c89d2feb35560883688e43b553b8e94e7cd371deEvan Cheng 15398ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman/// AnalyzeCallResult - Analyze the return values of a call, 15466baf26fe0c229142d483030e1633f656822c5eeChris Lattner/// incorporating info about the passed values into this state. 15598ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohmanvoid CCState::AnalyzeCallResult(const SmallVectorImpl<ISD::InputArg> &Ins, 15698ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman CCAssignFn Fn) { 15798ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman for (unsigned i = 0, e = Ins.size(); i != e; ++i) { 1581440e8b918d7116c3587cb95f4f7ac7a0a0b65adDuncan Sands MVT VT = Ins[i].VT; 15998ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman ISD::ArgFlagsTy Flags = Ins[i].Flags; 16086098bd6a63d2cdf0c9be9ef3151bd2728281fd7Dale Johannesen if (Fn(i, VT, VT, CCValAssign::Full, Flags, *this)) { 161c23197a26f34f559ea9797de51e187087c039c42Torok Edwin#ifndef NDEBUG 162ad61b129ee283f6399ecf6fa5f64f82760e9a56aDavid Greene dbgs() << "Call result #" << i << " has unhandled type " 16332631d1a5a18cb997ea7ad4f103938470aecc146Craig Topper << EVT(VT).getEVTString() << '\n'; 164c23197a26f34f559ea9797de51e187087c039c42Torok Edwin#endif 165c23197a26f34f559ea9797de51e187087c039c42Torok Edwin llvm_unreachable(0); 166fb39f99fa4cdeab24c1b462cdd954a7d792323b7Chris Lattner } 167fb39f99fa4cdeab24c1b462cdd954a7d792323b7Chris Lattner } 168fb39f99fa4cdeab24c1b462cdd954a7d792323b7Chris Lattner} 169c7fcfa07d9c358e5fe20cf1da82f6b60a862920dEvan Cheng 170c7fcfa07d9c358e5fe20cf1da82f6b60a862920dEvan Cheng/// AnalyzeCallResult - Same as above except it's specialized for calls which 171c7fcfa07d9c358e5fe20cf1da82f6b60a862920dEvan Cheng/// produce a single value. 1721440e8b918d7116c3587cb95f4f7ac7a0a0b65adDuncan Sandsvoid CCState::AnalyzeCallResult(MVT VT, CCAssignFn Fn) { 173c7fcfa07d9c358e5fe20cf1da82f6b60a862920dEvan Cheng if (Fn(0, VT, VT, CCValAssign::Full, ISD::ArgFlagsTy(), *this)) { 174c23197a26f34f559ea9797de51e187087c039c42Torok Edwin#ifndef NDEBUG 175ad61b129ee283f6399ecf6fa5f64f82760e9a56aDavid Greene dbgs() << "Call result has unhandled type " 17632631d1a5a18cb997ea7ad4f103938470aecc146Craig Topper << EVT(VT).getEVTString() << '\n'; 177c23197a26f34f559ea9797de51e187087c039c42Torok Edwin#endif 178c23197a26f34f559ea9797de51e187087c039c42Torok Edwin llvm_unreachable(0); 179c7fcfa07d9c358e5fe20cf1da82f6b60a862920dEvan Cheng } 180c7fcfa07d9c358e5fe20cf1da82f6b60a862920dEvan Cheng} 181