diff options
Diffstat (limited to 'llvm/lib/Target/AArch64')
| -rw-r--r-- | llvm/lib/Target/AArch64/AArch64ISelLowering.cpp | 49 | ||||
| -rw-r--r-- | llvm/lib/Target/AArch64/AArch64ISelLowering.h | 4 | 
2 files changed, 53 insertions, 0 deletions
diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp index 5b98d328c00..a8f8837486e 100644 --- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp +++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp @@ -3419,6 +3419,55 @@ bool AArch64TargetLowering::LowerReturn(MachineIRBuilder &MIRBuilder,    }    return true;  } + +bool AArch64TargetLowering::LowerFormalArguments( +    MachineIRBuilder &MIRBuilder, const Function::ArgumentListType &Args, +    const SmallVectorImpl<unsigned> &VRegs) const { +  MachineFunction &MF = MIRBuilder.getMF(); +  const Function &F = *MF.getFunction(); + +  SmallVector<CCValAssign, 16> ArgLocs; +  CCState CCInfo(F.getCallingConv(), F.isVarArg(), MF, ArgLocs, F.getContext()); + +  unsigned NumArgs = Args.size(); +  Function::const_arg_iterator CurOrigArg = Args.begin(); +  for (unsigned i = 0; i != NumArgs; ++i, ++CurOrigArg) { +    MVT ValVT = MVT::getVT(CurOrigArg->getType()); +    CCAssignFn *AssignFn = +        CCAssignFnForCall(F.getCallingConv(), /*IsVarArg=*/false); +    bool Res = +        AssignFn(i, ValVT, ValVT, CCValAssign::Full, ISD::ArgFlagsTy(), CCInfo); +    assert(!Res && "Call operand has unhandled type"); +    (void)Res; +  } +  assert(ArgLocs.size() == Args.size() && +         "We have a different number of location and args?!"); +  for (unsigned i = 0, e = ArgLocs.size(); i != e; ++i) { +    CCValAssign &VA = ArgLocs[i]; + +    assert(VA.isRegLoc() && "Not yet implemented"); +    // Transform the arguments in physical registers into virtual ones. +    MIRBuilder.getMBB().addLiveIn(VA.getLocReg()); +    MIRBuilder.buildInstr(TargetOpcode::COPY, VRegs[i], VA.getLocReg()); + +    switch (VA.getLocInfo()) { +    default: +      llvm_unreachable("Unknown loc info!"); +    case CCValAssign::Full: +      break; +    case CCValAssign::BCvt: +      // We don't care about bitcast. +      break; +    case CCValAssign::AExt: +    case CCValAssign::SExt: +    case CCValAssign::ZExt: +      // Zero/Sign extend the register. +      assert(0 && "Not yet implemented"); +      break; +    } +  } +  return true; +}  #endif  //===----------------------------------------------------------------------===// diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.h b/llvm/lib/Target/AArch64/AArch64ISelLowering.h index 12c586d42e4..2879c030a1f 100644 --- a/llvm/lib/Target/AArch64/AArch64ISelLowering.h +++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.h @@ -455,6 +455,10 @@ private:  #ifdef LLVM_BUILD_GLOBAL_ISEL    bool LowerReturn(MachineIRBuilder &MIRBuiler, const Value *Val,                     unsigned VReg) const override; +  bool +  LowerFormalArguments(MachineIRBuilder &MIRBuilder, +                       const Function::ArgumentListType &Args, +                       const SmallVectorImpl<unsigned> &VRegs) const override;  #endif    SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;  | 

