Reapply "OpaquePtr: Turn inalloca into a type attribute"

This reverts commit 20d5c42e0e.
This commit is contained in:
Matt Arsenault
2021-03-28 13:05:17 -04:00
parent 01ae6e5ead
commit fc9df30991
92 changed files with 448 additions and 266 deletions

View File

@@ -1624,6 +1624,8 @@ Error BitcodeReader::parseAttributeGroupBlock() {
B.addByValAttr(nullptr);
else if (Kind == Attribute::StructRet)
B.addStructRetAttr(nullptr);
else if (Kind == Attribute::InAlloca)
B.addInAllocaAttr(nullptr);
B.addAttribute(Kind);
} else if (Record[i] == 1) { // Integer attribute
@@ -1675,6 +1677,8 @@ Error BitcodeReader::parseAttributeGroupBlock() {
B.addByRefAttr(getTypeByID(Record[++i]));
} else if (Kind == Attribute::Preallocated) {
B.addPreallocatedAttr(getTypeByID(Record[++i]));
} else if (Kind == Attribute::InAlloca) {
B.addInAllocaAttr(HasType ? getTypeByID(Record[++i]) : nullptr);
}
}
}
@@ -3328,7 +3332,8 @@ Error BitcodeReader::parseFunctionRecord(ArrayRef<uint64_t> Record) {
// argument's pointee type. There should be no opaque pointers where the byval
// type is implicit.
for (unsigned i = 0; i != Func->arg_size(); ++i) {
for (Attribute::AttrKind Kind : {Attribute::ByVal, Attribute::StructRet}) {
for (Attribute::AttrKind Kind : {Attribute::ByVal, Attribute::StructRet,
Attribute::InAlloca}) {
if (!Func->hasParamAttribute(i, Kind))
continue;
@@ -3336,10 +3341,21 @@ Error BitcodeReader::parseFunctionRecord(ArrayRef<uint64_t> Record) {
Type *PTy = cast<FunctionType>(FullFTy)->getParamType(i);
Type *PtrEltTy = getPointerElementFlatType(PTy);
Attribute NewAttr =
Kind == Attribute::ByVal
? Attribute::getWithByValType(Context, PtrEltTy)
: Attribute::getWithStructRetType(Context, PtrEltTy);
Attribute NewAttr;
switch (Kind) {
case Attribute::ByVal:
NewAttr = Attribute::getWithByValType(Context, PtrEltTy);
break;
case Attribute::StructRet:
NewAttr = Attribute::getWithStructRetType(Context, PtrEltTy);
break;
case Attribute::InAlloca:
NewAttr = Attribute::getWithInAllocaType(Context, PtrEltTy);
break;
default:
llvm_unreachable("not an upgraded type attribute");
}
Func->addParamAttr(i, NewAttr);
}
}
@@ -3805,17 +3821,29 @@ Error BitcodeReader::typeCheckLoadStoreInst(Type *ValType, Type *PtrType) {
void BitcodeReader::propagateByValSRetTypes(CallBase *CB,
ArrayRef<Type *> ArgsFullTys) {
for (unsigned i = 0; i != CB->arg_size(); ++i) {
for (Attribute::AttrKind Kind : {Attribute::ByVal, Attribute::StructRet}) {
for (Attribute::AttrKind Kind : {Attribute::ByVal, Attribute::StructRet,
Attribute::InAlloca}) {
if (!CB->paramHasAttr(i, Kind))
continue;
CB->removeParamAttr(i, Kind);
Type *PtrEltTy = getPointerElementFlatType(ArgsFullTys[i]);
Attribute NewAttr =
Kind == Attribute::ByVal
? Attribute::getWithByValType(Context, PtrEltTy)
: Attribute::getWithStructRetType(Context, PtrEltTy);
Attribute NewAttr;
switch (Kind) {
case Attribute::ByVal:
NewAttr = Attribute::getWithByValType(Context, PtrEltTy);
break;
case Attribute::StructRet:
NewAttr = Attribute::getWithStructRetType(Context, PtrEltTy);
break;
case Attribute::InAlloca:
NewAttr = Attribute::getWithInAllocaType(Context, PtrEltTy);
break;
default:
llvm_unreachable("not an upgraded type attribute");
}
CB->addParamAttr(i, NewAttr);
}
}