forked from OSchip/llvm-project
[OpaquePtr] Use ArgListEntry::IndirectType for lowering ABI attributes
Consolidate PreallocatedType and ByValType into IndirectType, and use that for inalloca.
This commit is contained in:
parent
89f2d98b98
commit
aad41e2299
|
@ -290,8 +290,7 @@ public:
|
|||
bool IsSwiftError : 1;
|
||||
bool IsCFGuardTarget : 1;
|
||||
MaybeAlign Alignment = None;
|
||||
Type *ByValType = nullptr;
|
||||
Type *PreallocatedType = nullptr;
|
||||
Type *IndirectType = nullptr;
|
||||
|
||||
ArgListEntry()
|
||||
: IsSExt(false), IsZExt(false), IsInReg(false), IsSRet(false),
|
||||
|
|
|
@ -1076,15 +1076,12 @@ bool FastISel::lowerCallTo(CallLoweringInfo &CLI) {
|
|||
}
|
||||
MaybeAlign MemAlign = Arg.Alignment;
|
||||
if (Arg.IsByVal || Arg.IsInAlloca || Arg.IsPreallocated) {
|
||||
PointerType *Ty = cast<PointerType>(Arg.Ty);
|
||||
Type *ElementTy = Ty->getElementType();
|
||||
unsigned FrameSize =
|
||||
DL.getTypeAllocSize(Arg.ByValType ? Arg.ByValType : ElementTy);
|
||||
unsigned FrameSize = DL.getTypeAllocSize(Arg.IndirectType);
|
||||
|
||||
// For ByVal, alignment should come from FE. BE will guess if this info
|
||||
// is not there, but there are cases it cannot get right.
|
||||
if (!MemAlign)
|
||||
MemAlign = Align(TLI.getByValTypeAlignment(ElementTy, DL));
|
||||
MemAlign = Align(TLI.getByValTypeAlignment(Arg.IndirectType, DL));
|
||||
Flags.setByValSize(FrameSize);
|
||||
} else if (!MemAlign) {
|
||||
MemAlign = DL.getABITypeAlign(Arg.Ty);
|
||||
|
|
|
@ -9578,18 +9578,14 @@ TargetLowering::LowerCallTo(TargetLowering::CallLoweringInfo &CLI) const {
|
|||
}
|
||||
Align MemAlign;
|
||||
if (Args[i].IsByVal || Args[i].IsInAlloca || Args[i].IsPreallocated) {
|
||||
PointerType *Ty = cast<PointerType>(Args[i].Ty);
|
||||
Type *ElementTy = Ty->getElementType();
|
||||
|
||||
unsigned FrameSize = DL.getTypeAllocSize(
|
||||
Args[i].ByValType ? Args[i].ByValType : ElementTy);
|
||||
unsigned FrameSize = DL.getTypeAllocSize(Args[i].IndirectType);
|
||||
Flags.setByValSize(FrameSize);
|
||||
|
||||
// info is not there but there are cases it cannot get right.
|
||||
if (auto MA = Args[i].Alignment)
|
||||
MemAlign = *MA;
|
||||
else
|
||||
MemAlign = Align(getByValTypeAlignment(ElementTy, DL));
|
||||
MemAlign = Align(getByValTypeAlignment(Args[i].IndirectType, DL));
|
||||
} else if (auto MA = Args[i].Alignment) {
|
||||
MemAlign = *MA;
|
||||
} else {
|
||||
|
|
|
@ -119,15 +119,18 @@ void TargetLoweringBase::ArgListEntry::setAttributes(const CallBase *Call,
|
|||
IsSwiftAsync = Call->paramHasAttr(ArgIdx, Attribute::SwiftAsync);
|
||||
IsSwiftError = Call->paramHasAttr(ArgIdx, Attribute::SwiftError);
|
||||
Alignment = Call->getParamStackAlign(ArgIdx);
|
||||
ByValType = nullptr;
|
||||
IndirectType = nullptr;
|
||||
assert(IsByVal + IsPreallocated + IsInAlloca <= 1 &&
|
||||
"multiple ABI attributes?");
|
||||
if (IsByVal) {
|
||||
ByValType = Call->getParamByValType(ArgIdx);
|
||||
IndirectType = Call->getParamByValType(ArgIdx);
|
||||
if (!Alignment)
|
||||
Alignment = Call->getParamAlign(ArgIdx);
|
||||
}
|
||||
PreallocatedType = nullptr;
|
||||
if (IsPreallocated)
|
||||
PreallocatedType = Call->getParamPreallocatedType(ArgIdx);
|
||||
IndirectType = Call->getParamPreallocatedType(ArgIdx);
|
||||
if (IsInAlloca)
|
||||
IndirectType = Call->getParamInAllocaType(ArgIdx);
|
||||
}
|
||||
|
||||
/// Generate a libcall taking the given operands as arguments and returning a
|
||||
|
|
Loading…
Reference in New Issue