Home | History | Annotate | Download | only in CodeGen
      1 //===-- CallingConvLower.cpp - Calling Conventions ------------------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This file implements the CCState class, used for lowering and implementing
     11 // calling conventions.
     12 //
     13 //===----------------------------------------------------------------------===//
     14 
     15 #include "llvm/CodeGen/CallingConvLower.h"
     16 #include "llvm/CodeGen/MachineFrameInfo.h"
     17 #include "llvm/Support/Debug.h"
     18 #include "llvm/Support/ErrorHandling.h"
     19 #include "llvm/Support/raw_ostream.h"
     20 #include "llvm/Target/TargetRegisterInfo.h"
     21 #include "llvm/Target/TargetData.h"
     22 #include "llvm/Target/TargetMachine.h"
     23 #include "llvm/Target/TargetLowering.h"
     24 using namespace llvm;
     25 
     26 CCState::CCState(CallingConv::ID CC, bool isVarArg, MachineFunction &mf,
     27                  const TargetMachine &tm, SmallVector<CCValAssign, 16> &locs,
     28                  LLVMContext &C)
     29   : CallingConv(CC), IsVarArg(isVarArg), MF(mf), TM(tm),
     30     TRI(*TM.getRegisterInfo()), Locs(locs), Context(C),
     31     CallOrPrologue(Unknown) {
     32   // No stack is used.
     33   StackOffset = 0;
     34 
     35   clearFirstByValReg();
     36   UsedRegs.resize((TRI.getNumRegs()+31)/32);
     37 }
     38 
     39 // HandleByVal - Allocate space on the stack large enough to pass an argument
     40 // by value. The size and alignment information of the argument is encoded in
     41 // its parameter attribute.
     42 void CCState::HandleByVal(unsigned ValNo, MVT ValVT,
     43                           MVT LocVT, CCValAssign::LocInfo LocInfo,
     44                           int MinSize, int MinAlign,
     45                           ISD::ArgFlagsTy ArgFlags) {
     46   unsigned Align = ArgFlags.getByValAlign();
     47   unsigned Size  = ArgFlags.getByValSize();
     48   if (MinSize > (int)Size)
     49     Size = MinSize;
     50   if (MinAlign > (int)Align)
     51     Align = MinAlign;
     52   if (MF.getFrameInfo()->getMaxAlignment() < Align)
     53     MF.getFrameInfo()->setMaxAlignment(Align);
     54   TM.getTargetLowering()->HandleByVal(this, Size);
     55   unsigned Offset = AllocateStack(Size, Align);
     56   addLoc(CCValAssign::getMem(ValNo, ValVT, Offset, LocVT, LocInfo));
     57 }
     58 
     59 /// MarkAllocated - Mark a register and all of its aliases as allocated.
     60 void CCState::MarkAllocated(unsigned Reg) {
     61   for (const unsigned *Alias = TRI.getOverlaps(Reg);
     62        unsigned Reg = *Alias; ++Alias)
     63     UsedRegs[Reg/32] |= 1 << (Reg&31);
     64 }
     65 
     66 /// AnalyzeFormalArguments - Analyze an array of argument values,
     67 /// incorporating info about the formals into this state.
     68 void
     69 CCState::AnalyzeFormalArguments(const SmallVectorImpl<ISD::InputArg> &Ins,
     70                                 CCAssignFn Fn) {
     71   unsigned NumArgs = Ins.size();
     72 
     73   for (unsigned i = 0; i != NumArgs; ++i) {
     74     MVT ArgVT = Ins[i].VT;
     75     ISD::ArgFlagsTy ArgFlags = Ins[i].Flags;
     76     if (Fn(i, ArgVT, ArgVT, CCValAssign::Full, ArgFlags, *this)) {
     77 #ifndef NDEBUG
     78       dbgs() << "Formal argument #" << i << " has unhandled type "
     79              << EVT(ArgVT).getEVTString();
     80 #endif
     81       llvm_unreachable(0);
     82     }
     83   }
     84 }
     85 
     86 /// CheckReturn - Analyze the return values of a function, returning true if
     87 /// the return can be performed without sret-demotion, and false otherwise.
     88 bool CCState::CheckReturn(const SmallVectorImpl<ISD::OutputArg> &Outs,
     89                           CCAssignFn Fn) {
     90   // Determine which register each value should be copied into.
     91   for (unsigned i = 0, e = Outs.size(); i != e; ++i) {
     92     MVT VT = Outs[i].VT;
     93     ISD::ArgFlagsTy ArgFlags = Outs[i].Flags;
     94     if (Fn(i, VT, VT, CCValAssign::Full, ArgFlags, *this))
     95       return false;
     96   }
     97   return true;
     98 }
     99 
    100 /// AnalyzeReturn - Analyze the returned values of a return,
    101 /// incorporating info about the result values into this state.
    102 void CCState::AnalyzeReturn(const SmallVectorImpl<ISD::OutputArg> &Outs,
    103                             CCAssignFn Fn) {
    104   // Determine which register each value should be copied into.
    105   for (unsigned i = 0, e = Outs.size(); i != e; ++i) {
    106     MVT VT = Outs[i].VT;
    107     ISD::ArgFlagsTy ArgFlags = Outs[i].Flags;
    108     if (Fn(i, VT, VT, CCValAssign::Full, ArgFlags, *this)) {
    109 #ifndef NDEBUG
    110       dbgs() << "Return operand #" << i << " has unhandled type "
    111              << EVT(VT).getEVTString();
    112 #endif
    113       llvm_unreachable(0);
    114     }
    115   }
    116 }
    117 
    118 /// AnalyzeCallOperands - Analyze the outgoing arguments to a call,
    119 /// incorporating info about the passed values into this state.
    120 void CCState::AnalyzeCallOperands(const SmallVectorImpl<ISD::OutputArg> &Outs,
    121                                   CCAssignFn Fn) {
    122   unsigned NumOps = Outs.size();
    123   for (unsigned i = 0; i != NumOps; ++i) {
    124     MVT ArgVT = Outs[i].VT;
    125     ISD::ArgFlagsTy ArgFlags = Outs[i].Flags;
    126     if (Fn(i, ArgVT, ArgVT, CCValAssign::Full, ArgFlags, *this)) {
    127 #ifndef NDEBUG
    128       dbgs() << "Call operand #" << i << " has unhandled type "
    129              << EVT(ArgVT).getEVTString();
    130 #endif
    131       llvm_unreachable(0);
    132     }
    133   }
    134 }
    135 
    136 /// AnalyzeCallOperands - Same as above except it takes vectors of types
    137 /// and argument flags.
    138 void CCState::AnalyzeCallOperands(SmallVectorImpl<MVT> &ArgVTs,
    139                                   SmallVectorImpl<ISD::ArgFlagsTy> &Flags,
    140                                   CCAssignFn Fn) {
    141   unsigned NumOps = ArgVTs.size();
    142   for (unsigned i = 0; i != NumOps; ++i) {
    143     MVT ArgVT = ArgVTs[i];
    144     ISD::ArgFlagsTy ArgFlags = Flags[i];
    145     if (Fn(i, ArgVT, ArgVT, CCValAssign::Full, ArgFlags, *this)) {
    146 #ifndef NDEBUG
    147       dbgs() << "Call operand #" << i << " has unhandled type "
    148              << EVT(ArgVT).getEVTString();
    149 #endif
    150       llvm_unreachable(0);
    151     }
    152   }
    153 }
    154 
    155 /// AnalyzeCallResult - Analyze the return values of a call,
    156 /// incorporating info about the passed values into this state.
    157 void CCState::AnalyzeCallResult(const SmallVectorImpl<ISD::InputArg> &Ins,
    158                                 CCAssignFn Fn) {
    159   for (unsigned i = 0, e = Ins.size(); i != e; ++i) {
    160     MVT VT = Ins[i].VT;
    161     ISD::ArgFlagsTy Flags = Ins[i].Flags;
    162     if (Fn(i, VT, VT, CCValAssign::Full, Flags, *this)) {
    163 #ifndef NDEBUG
    164       dbgs() << "Call result #" << i << " has unhandled type "
    165              << EVT(VT).getEVTString() << "\n";
    166 #endif
    167       llvm_unreachable(0);
    168     }
    169   }
    170 }
    171 
    172 /// AnalyzeCallResult - Same as above except it's specialized for calls which
    173 /// produce a single value.
    174 void CCState::AnalyzeCallResult(MVT VT, CCAssignFn Fn) {
    175   if (Fn(0, VT, VT, CCValAssign::Full, ISD::ArgFlagsTy(), *this)) {
    176 #ifndef NDEBUG
    177     dbgs() << "Call result has unhandled type "
    178            << EVT(VT).getEVTString();
    179 #endif
    180     llvm_unreachable(0);
    181   }
    182 }
    183