diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Target/ARM/ARMCallLowering.cpp')
-rw-r--r-- | contrib/llvm-project/llvm/lib/Target/ARM/ARMCallLowering.cpp | 68 |
1 files changed, 32 insertions, 36 deletions
diff --git a/contrib/llvm-project/llvm/lib/Target/ARM/ARMCallLowering.cpp b/contrib/llvm-project/llvm/lib/Target/ARM/ARMCallLowering.cpp index d860473011e7..6feed82596cc 100644 --- a/contrib/llvm-project/llvm/lib/Target/ARM/ARMCallLowering.cpp +++ b/contrib/llvm-project/llvm/lib/Target/ARM/ARMCallLowering.cpp @@ -85,12 +85,11 @@ namespace { /// Helper class for values going out through an ABI boundary (used for handling /// function return values and call parameters). -struct OutgoingValueHandler : public CallLowering::ValueHandler { - OutgoingValueHandler(MachineIRBuilder &MIRBuilder, MachineRegisterInfo &MRI, - MachineInstrBuilder &MIB, CCAssignFn *AssignFn) - : ValueHandler(MIRBuilder, MRI, AssignFn), MIB(MIB) {} - - bool isIncomingArgumentHandler() const override { return false; } +struct ARMOutgoingValueHandler : public CallLowering::OutgoingValueHandler { + ARMOutgoingValueHandler(MachineIRBuilder &MIRBuilder, + MachineRegisterInfo &MRI, MachineInstrBuilder &MIB, + CCAssignFn *AssignFn) + : OutgoingValueHandler(MIRBuilder, MRI, AssignFn), MIB(MIB) {} Register getStackAddress(uint64_t Size, int64_t Offset, MachinePointerInfo &MPO) override { @@ -258,13 +257,14 @@ bool ARMCallLowering::lowerReturnVal(MachineIRBuilder &MIRBuilder, CCAssignFn *AssignFn = TLI.CCAssignFnForReturn(F.getCallingConv(), F.isVarArg()); - OutgoingValueHandler RetHandler(MIRBuilder, MF.getRegInfo(), Ret, AssignFn); + ARMOutgoingValueHandler RetHandler(MIRBuilder, MF.getRegInfo(), Ret, + AssignFn); return handleAssignments(MIRBuilder, SplitRetInfos, RetHandler); } bool ARMCallLowering::lowerReturn(MachineIRBuilder &MIRBuilder, - const Value *Val, - ArrayRef<Register> VRegs) const { + const Value *Val, ArrayRef<Register> VRegs, + FunctionLoweringInfo &FLI) const { assert(!Val == VRegs.empty() && "Return value without a vreg"); auto const &ST = MIRBuilder.getMF().getSubtarget<ARMSubtarget>(); @@ -282,12 +282,10 @@ namespace { /// Helper class for values coming in through an ABI boundary (used for handling /// formal arguments and call return values). -struct IncomingValueHandler : public CallLowering::ValueHandler { - IncomingValueHandler(MachineIRBuilder &MIRBuilder, MachineRegisterInfo &MRI, - CCAssignFn AssignFn) - : ValueHandler(MIRBuilder, MRI, AssignFn) {} - - bool isIncomingArgumentHandler() const override { return true; } +struct ARMIncomingValueHandler : public CallLowering::IncomingValueHandler { + ARMIncomingValueHandler(MachineIRBuilder &MIRBuilder, + MachineRegisterInfo &MRI, CCAssignFn AssignFn) + : IncomingValueHandler(MIRBuilder, MRI, AssignFn) {} Register getStackAddress(uint64_t Size, int64_t Offset, MachinePointerInfo &MPO) override { @@ -337,8 +335,8 @@ struct IncomingValueHandler : public CallLowering::ValueHandler { assert(VA.isRegLoc() && "Value shouldn't be assigned to reg"); assert(VA.getLocReg() == PhysReg && "Assigning to the wrong reg?"); - auto ValSize = VA.getValVT().getSizeInBits(); - auto LocSize = VA.getLocVT().getSizeInBits(); + uint64_t ValSize = VA.getValVT().getFixedSizeInBits(); + uint64_t LocSize = VA.getLocVT().getFixedSizeInBits(); assert(ValSize <= 64 && "Unsupported value size"); assert(LocSize <= 64 && "Unsupported location size"); @@ -399,10 +397,10 @@ struct IncomingValueHandler : public CallLowering::ValueHandler { virtual void markPhysRegUsed(unsigned PhysReg) = 0; }; -struct FormalArgHandler : public IncomingValueHandler { +struct FormalArgHandler : public ARMIncomingValueHandler { FormalArgHandler(MachineIRBuilder &MIRBuilder, MachineRegisterInfo &MRI, CCAssignFn AssignFn) - : IncomingValueHandler(MIRBuilder, MRI, AssignFn) {} + : ARMIncomingValueHandler(MIRBuilder, MRI, AssignFn) {} void markPhysRegUsed(unsigned PhysReg) override { MIRBuilder.getMRI()->addLiveIn(PhysReg); @@ -412,9 +410,10 @@ struct FormalArgHandler : public IncomingValueHandler { } // end anonymous namespace -bool ARMCallLowering::lowerFormalArguments( - MachineIRBuilder &MIRBuilder, const Function &F, - ArrayRef<ArrayRef<Register>> VRegs) const { +bool ARMCallLowering::lowerFormalArguments(MachineIRBuilder &MIRBuilder, + const Function &F, + ArrayRef<ArrayRef<Register>> VRegs, + FunctionLoweringInfo &FLI) const { auto &TLI = *getTLI<ARMTargetLowering>(); auto Subtarget = TLI.getSubtarget(); @@ -435,7 +434,7 @@ bool ARMCallLowering::lowerFormalArguments( for (auto &Arg : F.args()) { if (!isSupportedType(DL, TLI, Arg.getType())) return false; - if (Arg.hasPassPointeeByValueAttr()) + if (Arg.hasPassPointeeByValueCopyAttr()) return false; } @@ -469,10 +468,10 @@ bool ARMCallLowering::lowerFormalArguments( namespace { -struct CallReturnHandler : public IncomingValueHandler { +struct CallReturnHandler : public ARMIncomingValueHandler { CallReturnHandler(MachineIRBuilder &MIRBuilder, MachineRegisterInfo &MRI, MachineInstrBuilder MIB, CCAssignFn *AssignFn) - : IncomingValueHandler(MIRBuilder, MRI, AssignFn), MIB(MIB) {} + : ARMIncomingValueHandler(MIRBuilder, MRI, AssignFn), MIB(MIB) {} void markPhysRegUsed(unsigned PhysReg) override { MIB.addDef(PhysReg, RegState::Implicit); @@ -482,15 +481,16 @@ struct CallReturnHandler : public IncomingValueHandler { }; // FIXME: This should move to the ARMSubtarget when it supports all the opcodes. -unsigned getCallOpcode(const ARMSubtarget &STI, bool isDirect) { +unsigned getCallOpcode(const MachineFunction &MF, const ARMSubtarget &STI, + bool isDirect) { if (isDirect) return STI.isThumb() ? ARM::tBL : ARM::BL; if (STI.isThumb()) - return ARM::tBLXr; + return gettBLXrOpcode(MF); if (STI.hasV5TOps()) - return ARM::BLX; + return getBLXOpcode(MF); if (STI.hasV4TOps()) return ARM::BX_CALL; @@ -518,7 +518,7 @@ bool ARMCallLowering::lowerCall(MachineIRBuilder &MIRBuilder, CallLoweringInfo & // Create the call instruction so we can add the implicit uses of arg // registers, but don't insert it yet. bool IsDirect = !Info.Callee.isReg(); - auto CallOpcode = getCallOpcode(STI, IsDirect); + auto CallOpcode = getCallOpcode(MF, STI, IsDirect); auto MIB = MIRBuilder.buildInstrNoInsert(CallOpcode); bool IsThumb = STI.isThumb(); @@ -538,23 +538,19 @@ bool ARMCallLowering::lowerCall(MachineIRBuilder &MIRBuilder, CallLoweringInfo & MIB.addRegMask(TRI->getCallPreservedMask(MF, Info.CallConv)); - bool IsVarArg = false; SmallVector<ArgInfo, 8> ArgInfos; for (auto Arg : Info.OrigArgs) { if (!isSupportedType(DL, TLI, Arg.Ty)) return false; - if (!Arg.IsFixed) - IsVarArg = true; - if (Arg.Flags[0].isByVal()) return false; splitToValueTypes(Arg, ArgInfos, MF); } - auto ArgAssignFn = TLI.CCAssignFnForCall(Info.CallConv, IsVarArg); - OutgoingValueHandler ArgHandler(MIRBuilder, MRI, MIB, ArgAssignFn); + auto ArgAssignFn = TLI.CCAssignFnForCall(Info.CallConv, Info.IsVarArg); + ARMOutgoingValueHandler ArgHandler(MIRBuilder, MRI, MIB, ArgAssignFn); if (!handleAssignments(MIRBuilder, ArgInfos, ArgHandler)) return false; @@ -567,7 +563,7 @@ bool ARMCallLowering::lowerCall(MachineIRBuilder &MIRBuilder, CallLoweringInfo & ArgInfos.clear(); splitToValueTypes(Info.OrigRet, ArgInfos, MF); - auto RetAssignFn = TLI.CCAssignFnForReturn(Info.CallConv, IsVarArg); + auto RetAssignFn = TLI.CCAssignFnForReturn(Info.CallConv, Info.IsVarArg); CallReturnHandler RetHandler(MIRBuilder, MRI, MIB, RetAssignFn); if (!handleAssignments(MIRBuilder, ArgInfos, RetHandler)) return false; |