bool IsSwiftError : 1;
bool IsCFGuardTarget : 1;
MaybeAlign Alignment = None;
- // Type for byval, inalloca, or preallocated.
- Type *IndirectType = nullptr;
+ Type *ByValType = nullptr;
+ Type *PreallocatedType = nullptr;
ArgListEntry()
: IsSExt(false), IsZExt(false), IsInReg(false), IsSRet(false),
/// Extract the byval type for a call or parameter.
Type *getParamByValType(unsigned ArgNo) const {
- return Attrs.getParamByValType(ArgNo);
- }
-
- /// Extract the inalloca type for a call or parameter.
- Type *getParamInAllocaType(unsigned ArgNo) const {
- return Attrs.getParamInAllocaType(ArgNo);
+ Type *Ty = Attrs.getParamByValType(ArgNo);
+ return Ty ? Ty : getArgOperand(ArgNo)->getType()->getPointerElementType();
}
/// Extract the preallocated type for a call or parameter.
Type *getParamPreallocatedType(unsigned ArgNo) const {
- return Attrs.getParamPreallocatedType(ArgNo);
+ Type *Ty = Attrs.getParamPreallocatedType(ArgNo);
+ return Ty ? Ty : getArgOperand(ArgNo)->getType()->getPointerElementType();
}
/// Extract the number of dereferenceable bytes for a call or
for (auto &Arg : CLI.getArgs()) {
Type *FinalType = Arg.Ty;
if (Arg.IsByVal)
- FinalType = Arg.IndirectType;
+ FinalType = cast<PointerType>(Arg.Ty)->getElementType();
bool NeedsRegBlock = TLI.functionArgumentNeedsConsecutiveRegisters(
FinalType, CLI.CallConv, CLI.IsVarArg);
}
MaybeAlign MemAlign = Arg.Alignment;
if (Arg.IsByVal || Arg.IsInAlloca || Arg.IsPreallocated) {
- Type *ElementTy = Arg.IndirectType;
- assert(ElementTy && "Indirect type not set in ArgListEntry");
-
- unsigned FrameSize = DL.getTypeAllocSize(ElementTy);
+ PointerType *Ty = cast<PointerType>(Arg.Ty);
+ Type *ElementTy = Ty->getElementType();
+ unsigned FrameSize =
+ DL.getTypeAllocSize(Arg.ByValType ? Arg.ByValType : ElementTy);
// For ByVal, alignment should come from FE. BE will guess if this info
// is not there, but there are cases it cannot get right.
// FIXME: Split arguments if CLI.IsPostTypeLegalization
Type *FinalType = Args[i].Ty;
if (Args[i].IsByVal)
- FinalType = Args[i].IndirectType;
+ FinalType = cast<PointerType>(Args[i].Ty)->getElementType();
bool NeedsRegBlock = functionArgumentNeedsConsecutiveRegisters(
FinalType, CLI.CallConv, CLI.IsVarArg);
for (unsigned Value = 0, NumValues = ValueVTs.size(); Value != NumValues;
}
Align MemAlign;
if (Args[i].IsByVal || Args[i].IsInAlloca || Args[i].IsPreallocated) {
- Type *ElementTy = Args[i].IndirectType;
- assert(ElementTy && "Indirect type not set in ArgListEntry");
+ PointerType *Ty = cast<PointerType>(Args[i].Ty);
+ Type *ElementTy = Ty->getElementType();
- unsigned FrameSize = DL.getTypeAllocSize(ElementTy);
+ unsigned FrameSize = DL.getTypeAllocSize(
+ Args[i].ByValType ? Args[i].ByValType : ElementTy);
Flags.setByValSize(FrameSize);
// info is not there but there are cases it cannot get right.
Alignment = Attrs.getParamStackAlignment(ArgIdx);
IsByVal = Attrs.hasParamAttribute(ArgIdx, Attribute::ByVal);
- IsInAlloca = Attrs.hasParamAttribute(ArgIdx, Attribute::InAlloca);
- IsPreallocated = Attrs.hasParamAttribute(ArgIdx, Attribute::Preallocated);
-
- assert(IsByVal + IsInAlloca + IsPreallocated <= 1 &&
- "can't have multiple indirect attributes");
- IndirectType = nullptr;
+ ByValType = nullptr;
if (IsByVal) {
- IndirectType = Call->getParamByValType(ArgIdx);
- assert(IndirectType && "no byval type?");
+ ByValType = Call->getParamByValType(ArgIdx);
if (!Alignment)
Alignment = Call->getParamAlign(ArgIdx);
}
- if (IsInAlloca) {
- IndirectType = Call->getParamInAllocaType(ArgIdx);
- assert(IndirectType && "no inalloca type?");
- }
- if (IsPreallocated) {
- IndirectType = Call->getParamPreallocatedType(ArgIdx);
- assert(IndirectType && "no preallocated type?");
- }
+ IsInAlloca = Attrs.hasParamAttribute(ArgIdx, Attribute::InAlloca);
+ IsPreallocated = Attrs.hasParamAttribute(ArgIdx, Attribute::Preallocated);
+ PreallocatedType = nullptr;
+ if (IsPreallocated)
+ PreallocatedType = Call->getParamPreallocatedType(ArgIdx);
}
/// Generate a libcall taking the given operands as arguments and returning a