forked from OSchip/llvm-project
[Alignment][NFC] Migrate HandleByVal to Align
Summary: Note to downstream target maintainers: this might silently change the semantics of your code if you override `TargetLowering::HandleByVal` without marking it `override`. This patch is part of a series to introduce an Alignment type. See this thread for context: http://lists.llvm.org/pipermail/llvm-dev/2019-July/133851.html See this patch for the introduction of the type: https://reviews.llvm.org/D64790 Reviewers: courbet Subscribers: sdardis, hiraditya, jrtc27, atanasyan, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D81365
This commit is contained in:
parent
526352bae3
commit
94b0c32a0b
|
@ -461,9 +461,9 @@ public:
|
|||
// HandleByVal - Allocate a stack slot large enough to pass an argument by
|
||||
// value. The size and alignment information of the argument is encoded in its
|
||||
// parameter attribute.
|
||||
void HandleByVal(unsigned ValNo, MVT ValVT,
|
||||
MVT LocVT, CCValAssign::LocInfo LocInfo,
|
||||
int MinSize, int MinAlign, ISD::ArgFlagsTy ArgFlags);
|
||||
void HandleByVal(unsigned ValNo, MVT ValVT, MVT LocVT,
|
||||
CCValAssign::LocInfo LocInfo, int MinSize, Align MinAlign,
|
||||
ISD::ArgFlagsTy ArgFlags);
|
||||
|
||||
// Returns count of byval arguments that are to be stored (even partly)
|
||||
// in registers.
|
||||
|
|
|
@ -3837,7 +3837,7 @@ public:
|
|||
}
|
||||
|
||||
/// Target-specific cleanup for formal ByVal parameters.
|
||||
virtual void HandleByVal(CCState *, unsigned &, unsigned) const {}
|
||||
virtual void HandleByVal(CCState *, unsigned &, Align) const {}
|
||||
|
||||
/// This hook should be implemented to check whether the return values
|
||||
/// described by the Outs array can fit into the return registers. If false
|
||||
|
|
|
@ -42,8 +42,7 @@ CCState::CCState(CallingConv::ID CC, bool isVarArg, MachineFunction &mf,
|
|||
/// its parameter attribute.
|
||||
void CCState::HandleByVal(unsigned ValNo, MVT ValVT, MVT LocVT,
|
||||
CCValAssign::LocInfo LocInfo, int MinSize,
|
||||
int MinAlignment, ISD::ArgFlagsTy ArgFlags) {
|
||||
Align MinAlign(MinAlignment);
|
||||
Align MinAlign, ISD::ArgFlagsTy ArgFlags) {
|
||||
Align Alignment = ArgFlags.getNonZeroByValAlign();
|
||||
unsigned Size = ArgFlags.getByValSize();
|
||||
if (MinSize > (int)Size)
|
||||
|
@ -51,8 +50,7 @@ void CCState::HandleByVal(unsigned ValNo, MVT ValVT, MVT LocVT,
|
|||
if (MinAlign > Alignment)
|
||||
Alignment = MinAlign;
|
||||
ensureMaxAlignment(Alignment);
|
||||
MF.getSubtarget().getTargetLowering()->HandleByVal(this, Size,
|
||||
Alignment.value());
|
||||
MF.getSubtarget().getTargetLowering()->HandleByVal(this, Size, Alignment);
|
||||
Size = unsigned(alignTo(Size, MinAlign));
|
||||
unsigned Offset = AllocateStack(Size, Alignment.value());
|
||||
addLoc(CCValAssign::getMem(ValNo, ValVT, Offset, LocVT, LocInfo));
|
||||
|
|
|
@ -2563,15 +2563,15 @@ ARMTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
|
|||
/// and then confiscate the rest of the parameter registers to insure
|
||||
/// this.
|
||||
void ARMTargetLowering::HandleByVal(CCState *State, unsigned &Size,
|
||||
unsigned Align) const {
|
||||
Align Alignment) const {
|
||||
// Byval (as with any stack) slots are always at least 4 byte aligned.
|
||||
Align = std::max(Align, 4U);
|
||||
Alignment = std::max(Alignment, Align(4));
|
||||
|
||||
unsigned Reg = State->AllocateReg(GPRArgRegs);
|
||||
if (!Reg)
|
||||
return;
|
||||
|
||||
unsigned AlignInRegs = Align / 4;
|
||||
unsigned AlignInRegs = Alignment.value() / 4;
|
||||
unsigned Waste = (ARM::R4 - Reg) % AlignInRegs;
|
||||
for (unsigned i = 0; i < Waste; ++i)
|
||||
Reg = State->AllocateReg(GPRArgRegs);
|
||||
|
|
|
@ -826,7 +826,7 @@ class VectorType;
|
|||
SmallVectorImpl<SDValue> &InVals) const override;
|
||||
|
||||
/// HandleByVal - Target-specific cleanup for ByVal support.
|
||||
void HandleByVal(CCState *, unsigned &, unsigned) const override;
|
||||
void HandleByVal(CCState *, unsigned &, Align) const override;
|
||||
|
||||
/// IsEligibleForTailCallOptimization - Check whether the call is eligible
|
||||
/// for tail call optimization. Targets which want to do tail call
|
||||
|
|
|
@ -514,7 +514,7 @@ static void AnalyzeArguments(CCState &State,
|
|||
|
||||
// Handle byval arguments
|
||||
if (ArgFlags.isByVal()) {
|
||||
State.HandleByVal(ValNo++, ArgVT, LocVT, LocInfo, 2, 2, ArgFlags);
|
||||
State.HandleByVal(ValNo++, ArgVT, LocVT, LocInfo, 2, Align(2), ArgFlags);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
|
@ -4522,12 +4522,12 @@ void MipsTargetLowering::writeVarArgRegs(std::vector<SDValue> &OutChains,
|
|||
}
|
||||
|
||||
void MipsTargetLowering::HandleByVal(CCState *State, unsigned &Size,
|
||||
unsigned Align) const {
|
||||
Align Alignment) const {
|
||||
const TargetFrameLowering *TFL = Subtarget.getFrameLowering();
|
||||
|
||||
assert(Size && "Byval argument's size shouldn't be 0.");
|
||||
|
||||
Align = std::min(Align, TFL->getStackAlignment());
|
||||
Alignment = std::min(Alignment, TFL->getStackAlign());
|
||||
|
||||
unsigned FirstReg = 0;
|
||||
unsigned NumRegs = 0;
|
||||
|
@ -4541,17 +4541,17 @@ void MipsTargetLowering::HandleByVal(CCState *State, unsigned &Size,
|
|||
|
||||
// We used to check the size as well but we can't do that anymore since
|
||||
// CCState::HandleByVal() rounds up the size after calling this function.
|
||||
assert(!(Align % RegSizeInBytes) &&
|
||||
"Byval argument's alignment should be a multiple of"
|
||||
"RegSizeInBytes.");
|
||||
assert(
|
||||
Alignment >= Align(RegSizeInBytes) &&
|
||||
"Byval argument's alignment should be a multiple of RegSizeInBytes.");
|
||||
|
||||
FirstReg = State->getFirstUnallocated(IntArgRegs);
|
||||
|
||||
// If Align > RegSizeInBytes, the first arg register must be even.
|
||||
// If Alignment > RegSizeInBytes, the first arg register must be even.
|
||||
// FIXME: This condition happens to do the right thing but it's not the
|
||||
// right way to test it. We want to check that the stack frame offset
|
||||
// of the register is aligned.
|
||||
if ((Align > RegSizeInBytes) && (FirstReg % 2)) {
|
||||
if ((Alignment > RegSizeInBytes) && (FirstReg % 2)) {
|
||||
State->AllocateReg(IntArgRegs[FirstReg], ShadowRegs[FirstReg]);
|
||||
++FirstReg;
|
||||
}
|
||||
|
|
|
@ -346,7 +346,7 @@ class TargetRegisterClass;
|
|||
void AdjustInstrPostInstrSelection(MachineInstr &MI,
|
||||
SDNode *Node) const override;
|
||||
|
||||
void HandleByVal(CCState *, unsigned &, unsigned) const override;
|
||||
void HandleByVal(CCState *, unsigned &, Align) const override;
|
||||
|
||||
Register getRegisterByName(const char* RegName, LLT VT,
|
||||
const MachineFunction &MF) const override;
|
||||
|
|
|
@ -275,9 +275,8 @@ void CallingConvEmitter::EmitAction(Record *Action,
|
|||
} else if (Action->isSubClassOf("CCPassByVal")) {
|
||||
int Size = Action->getValueAsInt("Size");
|
||||
int Align = Action->getValueAsInt("Align");
|
||||
O << IndentStr
|
||||
<< "State.HandleByVal(ValNo, ValVT, LocVT, LocInfo, "
|
||||
<< Size << ", " << Align << ", ArgFlags);\n";
|
||||
O << IndentStr << "State.HandleByVal(ValNo, ValVT, LocVT, LocInfo, "
|
||||
<< Size << ", Align(" << Align << "), ArgFlags);\n";
|
||||
O << IndentStr << "return false;\n";
|
||||
} else if (Action->isSubClassOf("CCCustom")) {
|
||||
O << IndentStr
|
||||
|
|
Loading…
Reference in New Issue