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