forked from OSchip/llvm-project
GlobalISel: Move AArch64 AssignFnVarArg to base class
We can handle the distinction easily enough in the generic code, and this makes it easier to abstract the selection of type/location from the code to insert code.
This commit is contained in:
parent
fec2945998
commit
2bdfcf0cac
|
@ -144,9 +144,17 @@ public:
|
||||||
/// class abstracts the differences.
|
/// class abstracts the differences.
|
||||||
struct ValueHandler {
|
struct ValueHandler {
|
||||||
ValueHandler(bool IsIncoming, MachineIRBuilder &MIRBuilder,
|
ValueHandler(bool IsIncoming, MachineIRBuilder &MIRBuilder,
|
||||||
MachineRegisterInfo &MRI, CCAssignFn *AssignFn)
|
MachineRegisterInfo &MRI, CCAssignFn *AssignFn_,
|
||||||
: MIRBuilder(MIRBuilder), MRI(MRI), AssignFn(AssignFn),
|
CCAssignFn *AssignFnVarArg_ = nullptr)
|
||||||
IsIncomingArgumentHandler(IsIncoming) {}
|
: MIRBuilder(MIRBuilder), MRI(MRI), AssignFn(AssignFn_),
|
||||||
|
AssignFnVarArg(AssignFnVarArg_),
|
||||||
|
IsIncomingArgumentHandler(IsIncoming) {
|
||||||
|
|
||||||
|
// Some targets change the handler depending on whether the call is
|
||||||
|
// varargs or not. If
|
||||||
|
if (!AssignFnVarArg)
|
||||||
|
AssignFnVarArg = AssignFn;
|
||||||
|
}
|
||||||
|
|
||||||
virtual ~ValueHandler() = default;
|
virtual ~ValueHandler() = default;
|
||||||
|
|
||||||
|
@ -226,13 +234,26 @@ public:
|
||||||
virtual bool assignArg(unsigned ValNo, EVT OrigVT, MVT ValVT, MVT LocVT,
|
virtual bool assignArg(unsigned ValNo, EVT OrigVT, MVT ValVT, MVT LocVT,
|
||||||
CCValAssign::LocInfo LocInfo, const ArgInfo &Info,
|
CCValAssign::LocInfo LocInfo, const ArgInfo &Info,
|
||||||
ISD::ArgFlagsTy Flags, CCState &State) {
|
ISD::ArgFlagsTy Flags, CCState &State) {
|
||||||
return AssignFn(ValNo, ValVT, LocVT, LocInfo, Flags, State);
|
return getAssignFn(State.isVarArg())(ValNo, ValVT, LocVT, LocInfo, Flags,
|
||||||
|
State);
|
||||||
}
|
}
|
||||||
|
|
||||||
MachineIRBuilder &MIRBuilder;
|
MachineIRBuilder &MIRBuilder;
|
||||||
MachineRegisterInfo &MRI;
|
MachineRegisterInfo &MRI;
|
||||||
|
|
||||||
|
/// Assignment function to use for a general call.
|
||||||
CCAssignFn *AssignFn;
|
CCAssignFn *AssignFn;
|
||||||
|
|
||||||
|
/// Assignment function to use for a variadic call. This is usually the same
|
||||||
|
/// as AssignFn.
|
||||||
|
CCAssignFn *AssignFnVarArg;
|
||||||
|
|
||||||
|
/// Select the appropriate assignment function depending on whether this is
|
||||||
|
/// a variadic call.
|
||||||
|
CCAssignFn *getAssignFn(bool IsVarArg) const {
|
||||||
|
return IsVarArg ? AssignFnVarArg : AssignFn;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool IsIncomingArgumentHandler;
|
bool IsIncomingArgumentHandler;
|
||||||
virtual void anchor();
|
virtual void anchor();
|
||||||
|
@ -240,8 +261,9 @@ public:
|
||||||
|
|
||||||
struct IncomingValueHandler : public ValueHandler {
|
struct IncomingValueHandler : public ValueHandler {
|
||||||
IncomingValueHandler(MachineIRBuilder &MIRBuilder, MachineRegisterInfo &MRI,
|
IncomingValueHandler(MachineIRBuilder &MIRBuilder, MachineRegisterInfo &MRI,
|
||||||
CCAssignFn *AssignFn)
|
CCAssignFn *AssignFn_,
|
||||||
: ValueHandler(true, MIRBuilder, MRI, AssignFn) {}
|
CCAssignFn *AssignFnVarArg_ = nullptr)
|
||||||
|
: ValueHandler(true, MIRBuilder, MRI, AssignFn_, AssignFnVarArg_) {}
|
||||||
|
|
||||||
/// Insert G_ASSERT_ZEXT/G_ASSERT_SEXT or other hint instruction based on \p
|
/// Insert G_ASSERT_ZEXT/G_ASSERT_SEXT or other hint instruction based on \p
|
||||||
/// VA, returning the new register if a hint was inserted.
|
/// VA, returning the new register if a hint was inserted.
|
||||||
|
@ -254,8 +276,9 @@ public:
|
||||||
|
|
||||||
struct OutgoingValueHandler : public ValueHandler {
|
struct OutgoingValueHandler : public ValueHandler {
|
||||||
OutgoingValueHandler(MachineIRBuilder &MIRBuilder, MachineRegisterInfo &MRI,
|
OutgoingValueHandler(MachineIRBuilder &MIRBuilder, MachineRegisterInfo &MRI,
|
||||||
CCAssignFn *AssignFn)
|
CCAssignFn *AssignFn,
|
||||||
: ValueHandler(false, MIRBuilder, MRI, AssignFn) {}
|
CCAssignFn *AssignFnVarArg = nullptr)
|
||||||
|
: ValueHandler(false, MIRBuilder, MRI, AssignFn, AssignFnVarArg) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
|
@ -138,7 +138,8 @@ struct IncomingArgHandler : public CallLowering::IncomingValueHandler {
|
||||||
const CallLowering::ArgInfo &Info, ISD::ArgFlagsTy Flags,
|
const CallLowering::ArgInfo &Info, ISD::ArgFlagsTy Flags,
|
||||||
CCState &State) override {
|
CCState &State) override {
|
||||||
applyStackPassedSmallTypeDAGHack(OrigVT, ValVT, LocVT);
|
applyStackPassedSmallTypeDAGHack(OrigVT, ValVT, LocVT);
|
||||||
return AssignFn(ValNo, ValVT, LocVT, LocInfo, Flags, State);
|
return getAssignFn(State.isVarArg())(ValNo, ValVT, LocVT, LocInfo, Flags,
|
||||||
|
State);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// How the physical register gets marked varies between formal
|
/// How the physical register gets marked varies between formal
|
||||||
|
@ -187,9 +188,9 @@ struct OutgoingArgHandler : public CallLowering::OutgoingValueHandler {
|
||||||
MachineInstrBuilder MIB, CCAssignFn *AssignFn,
|
MachineInstrBuilder MIB, CCAssignFn *AssignFn,
|
||||||
CCAssignFn *AssignFnVarArg, bool IsReturn,
|
CCAssignFn *AssignFnVarArg, bool IsReturn,
|
||||||
bool IsTailCall = false, int FPDiff = 0)
|
bool IsTailCall = false, int FPDiff = 0)
|
||||||
: OutgoingValueHandler(MIRBuilder, MRI, AssignFn), MIB(MIB),
|
: OutgoingValueHandler(MIRBuilder, MRI, AssignFn, AssignFnVarArg),
|
||||||
AssignFnVarArg(AssignFnVarArg), IsReturn(IsReturn),
|
MIB(MIB), IsReturn(IsReturn), IsTailCall(IsTailCall), FPDiff(FPDiff),
|
||||||
IsTailCall(IsTailCall), FPDiff(FPDiff), StackSize(0), SPReg(0),
|
StackSize(0), SPReg(0),
|
||||||
Subtarget(MIRBuilder.getMF().getSubtarget<AArch64Subtarget>()) {}
|
Subtarget(MIRBuilder.getMF().getSubtarget<AArch64Subtarget>()) {}
|
||||||
|
|
||||||
Register getStackAddress(uint64_t Size, int64_t Offset,
|
Register getStackAddress(uint64_t Size, int64_t Offset,
|
||||||
|
@ -296,7 +297,6 @@ struct OutgoingArgHandler : public CallLowering::OutgoingValueHandler {
|
||||||
}
|
}
|
||||||
|
|
||||||
MachineInstrBuilder MIB;
|
MachineInstrBuilder MIB;
|
||||||
CCAssignFn *AssignFnVarArg;
|
|
||||||
|
|
||||||
/// Track if this is used for a return instead of function argument
|
/// Track if this is used for a return instead of function argument
|
||||||
/// passing. We apply a hack to i1/i8/i16 stack passed values, but do not use
|
/// passing. We apply a hack to i1/i8/i16 stack passed values, but do not use
|
||||||
|
|
Loading…
Reference in New Issue