Skip to content

Commit 9168b81

Browse files
committed
Don't require the stdlib to contain the _finalizeUninitializedArray intrinsic function.
Prevent SILGen to crash if the compiler is used with a stdlib which does not have the _finalizeUninitializedArray intrinsic function. rdar://problem/64195028
1 parent fe8893d commit 9168b81

File tree

4 files changed

+32
-20
lines changed

4 files changed

+32
-20
lines changed

lib/SILGen/SILGenApply.cpp

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4963,17 +4963,26 @@ void SILGenFunction::emitUninitializedArrayDeallocation(SILLocation loc,
49634963
}
49644964

49654965
ManagedValue SILGenFunction::emitUninitializedArrayFinalization(SILLocation loc,
4966-
SILValue array) {
4966+
ManagedValue array) {
49674967
auto &Ctx = getASTContext();
4968-
auto finalize = Ctx.getFinalizeUninitializedArray();
4968+
FuncDecl *finalize = Ctx.getFinalizeUninitializedArray();
4969+
4970+
// The _finalizeUninitializedArray function only needs to be called if the
4971+
// library contains it.
4972+
// The Array implementation in the stdlib <= 5.3 does not use SIL COW
4973+
// support yet and therefore does not provide the _finalizeUninitializedArray
4974+
// intrinsic function.
4975+
if (!finalize)
4976+
return array;
49694977

4970-
CanType arrayTy = array->getType().getASTType();
4978+
SILValue arrayVal = array.forward(*this);
4979+
CanType arrayTy = arrayVal->getType().getASTType();
49714980

49724981
// Invoke the intrinsic.
49734982
auto subMap = arrayTy->getContextSubstitutionMap(SGM.M.getSwiftModule(),
49744983
Ctx.getArrayDecl());
49754984
RValue result = emitApplyOfLibraryIntrinsic(loc, finalize, subMap,
4976-
ManagedValue::forUnmanaged(array),
4985+
ManagedValue::forUnmanaged(arrayVal),
49774986
SGFContext());
49784987
return std::move(result).getScalarValue();
49794988
}

lib/SILGen/SILGenExpr.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2117,7 +2117,7 @@ ManagedValue Lowering::emitEndVarargs(SILGenFunction &SGF, SILLocation loc,
21172117
if (array.hasCleanup())
21182118
SGF.Cleanups.setCleanupState(array.getCleanup(), CleanupState::Active);
21192119

2120-
return SGF.emitUninitializedArrayFinalization(loc, array.forward(SGF));
2120+
return SGF.emitUninitializedArrayFinalization(loc, std::move(array));
21212121
}
21222122

21232123
RValue RValueEmitter::visitTupleExpr(TupleExpr *E, SGFContext C) {

lib/SILGen/SILGenFunction.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1187,7 +1187,8 @@ class LLVM_LIBRARY_VISIBILITY SILGenFunction
11871187

11881188
CleanupHandle enterDeallocateUninitializedArrayCleanup(SILValue array);
11891189
void emitUninitializedArrayDeallocation(SILLocation loc, SILValue array);
1190-
ManagedValue emitUninitializedArrayFinalization(SILLocation loc, SILValue array);
1190+
ManagedValue emitUninitializedArrayFinalization(SILLocation loc,
1191+
ManagedValue array);
11911192

11921193
/// Emit a cleanup for an owned value that should be written back at end of
11931194
/// scope if the value is not forwarded.

lib/SILOptimizer/Mandatory/OSLogOptimization.cpp

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -539,14 +539,15 @@ static SILValue emitCodeForConstantArray(ArrayRef<SILValue> elements,
539539
module.findFunction(allocatorMangledName, SILLinkage::PublicExternal);
540540
assert(arrayAllocateFun);
541541

542-
FuncDecl *arrayFinalizeDecl = astContext.getFinalizeUninitializedArray();
543-
assert(arrayFinalizeDecl);
544-
std::string finalizeMangledName =
545-
SILDeclRef(arrayFinalizeDecl, SILDeclRef::Kind::Func).mangle();
546-
SILFunction *arrayFinalizeFun =
547-
module.findFunction(finalizeMangledName, SILLinkage::SharedExternal);
548-
assert(arrayFinalizeFun);
549-
module.linkFunction(arrayFinalizeFun);
542+
SILFunction *arrayFinalizeFun = nullptr;
543+
if (FuncDecl *arrayFinalizeDecl = astContext.getFinalizeUninitializedArray()) {
544+
std::string finalizeMangledName =
545+
SILDeclRef(arrayFinalizeDecl, SILDeclRef::Kind::Func).mangle();
546+
arrayFinalizeFun =
547+
module.findFunction(finalizeMangledName, SILLinkage::SharedExternal);
548+
assert(arrayFinalizeFun);
549+
module.linkFunction(arrayFinalizeFun);
550+
}
550551

551552
// Call the _allocateUninitializedArray function with numElementsSIL. The
552553
// call returns a two-element tuple, where the first element is the newly
@@ -605,12 +606,13 @@ static SILValue emitCodeForConstantArray(ArrayRef<SILValue> elements,
605606
StoreOwnershipQualifier::Init);
606607
++elementIndex;
607608
}
608-
FunctionRefInst *arrayFinalizeRef =
609-
builder.createFunctionRef(loc, arrayFinalizeFun);
610-
ApplyInst *finalizedArray = builder.createApply(
611-
loc, arrayFinalizeRef, subMap, ArrayRef<SILValue>(arraySIL));
612-
613-
return finalizedArray;
609+
if (arrayFinalizeFun) {
610+
FunctionRefInst *arrayFinalizeRef =
611+
builder.createFunctionRef(loc, arrayFinalizeFun);
612+
arraySIL = builder.createApply(loc, arrayFinalizeRef, subMap,
613+
ArrayRef<SILValue>(arraySIL));
614+
}
615+
return arraySIL;
614616
}
615617

616618
/// Given a SILValue \p value, return the instruction immediately following the

0 commit comments

Comments
 (0)