mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
Merge remote-tracking branch 'origin/main' into rebranch
This commit is contained in:
@@ -874,7 +874,12 @@ public:
|
||||
/// True if SIL conventions force address-only to be passed by address.
|
||||
bool useLoweredAddresses() const { return loweredAddresses; }
|
||||
|
||||
void setLoweredAddresses(bool val) { loweredAddresses = val; }
|
||||
void setLoweredAddresses(bool val) {
|
||||
loweredAddresses = val;
|
||||
if (val) {
|
||||
Types.setLoweredAddresses();
|
||||
}
|
||||
}
|
||||
|
||||
llvm::IndexedInstrProfReader *getPGOReader() const { return PGOReader.get(); }
|
||||
|
||||
|
||||
@@ -289,9 +289,13 @@ public:
|
||||
private:
|
||||
friend class TypeConverter;
|
||||
|
||||
/// The SIL type of values with this Swift type.
|
||||
SILType LoweredType;
|
||||
virtual void setLoweredAddresses() const {}
|
||||
|
||||
protected:
|
||||
/// The SIL type of values with this Swift type.
|
||||
mutable SILType LoweredType;
|
||||
|
||||
private:
|
||||
RecursiveProperties Properties;
|
||||
|
||||
/// The resilience expansion for this type lowering.
|
||||
@@ -778,6 +782,9 @@ class TypeConverter {
|
||||
void removeNullEntry(const TypeKey &k);
|
||||
#endif
|
||||
|
||||
/// True if SIL conventions force address-only to be passed by address.
|
||||
bool LoweredAddresses;
|
||||
|
||||
CanGenericSignature CurGenericSignature;
|
||||
|
||||
/// Stack of types currently being lowered as part of an aggregate.
|
||||
@@ -824,7 +831,7 @@ public:
|
||||
ModuleDecl &M;
|
||||
ASTContext &Context;
|
||||
|
||||
TypeConverter(ModuleDecl &m);
|
||||
TypeConverter(ModuleDecl &m, bool loweredAddresses = true);
|
||||
~TypeConverter();
|
||||
TypeConverter(TypeConverter const &) = delete;
|
||||
TypeConverter &operator=(TypeConverter const &) = delete;
|
||||
@@ -1218,6 +1225,9 @@ public:
|
||||
|
||||
void setCaptureTypeExpansionContext(SILDeclRef constant,
|
||||
SILModule &M);
|
||||
|
||||
void setLoweredAddresses();
|
||||
|
||||
private:
|
||||
CanType computeLoweredRValueType(TypeExpansionContext context,
|
||||
AbstractionPattern origType,
|
||||
|
||||
@@ -189,7 +189,8 @@ int modulewrap_main(ArrayRef<const char *> Args, const char *Argv0,
|
||||
|
||||
ASTCtx.addModuleLoader(ClangImporter::create(ASTCtx, ""), true);
|
||||
ModuleDecl *M = ModuleDecl::create(ASTCtx.getIdentifier("swiftmodule"), ASTCtx);
|
||||
std::unique_ptr<Lowering::TypeConverter> TC(new Lowering::TypeConverter(*M));
|
||||
std::unique_ptr<Lowering::TypeConverter> TC(
|
||||
new Lowering::TypeConverter(*M, ASTCtx.SILOpts.EnableSILOpaqueValues));
|
||||
std::unique_ptr<SILModule> SM = SILModule::createEmptyModule(M, *TC, SILOpts);
|
||||
createSwiftModuleObjectFile(*SM, (*ErrOrBuf)->getBuffer(),
|
||||
Invocation.getOutputFilename());
|
||||
|
||||
@@ -202,8 +202,10 @@ SerializationOptions CompilerInvocation::computeSerializationOptions(
|
||||
Lowering::TypeConverter &CompilerInstance::getSILTypes() {
|
||||
if (auto *tc = TheSILTypes.get())
|
||||
return *tc;
|
||||
|
||||
auto *tc = new Lowering::TypeConverter(*getMainModule());
|
||||
|
||||
auto *tc = new Lowering::TypeConverter(
|
||||
*getMainModule(),
|
||||
/*loweredAddresses=*/!Context->SILOpts.EnableSILOpaqueValues);
|
||||
TheSILTypes.reset(tc);
|
||||
return *tc;
|
||||
}
|
||||
|
||||
@@ -71,7 +71,7 @@ namespace swift {
|
||||
class IRABIDetailsProviderImpl {
|
||||
public:
|
||||
IRABIDetailsProviderImpl(ModuleDecl &mod, const IRGenOptions &opts)
|
||||
: typeConverter(mod),
|
||||
: typeConverter(mod, /*addressLowered=*/true),
|
||||
silMod(SILModule::createEmptyModule(&mod, typeConverter, silOpts)),
|
||||
IRGen(opts, *silMod), IGM(IRGen, IRGen.createTargetMachine()) {}
|
||||
|
||||
|
||||
@@ -1942,6 +1942,10 @@ namespace {
|
||||
/// Lower address only types as opaque values.
|
||||
class OpaqueValueTypeLowering : public LeafLoadableTypeLowering {
|
||||
public:
|
||||
void setLoweredAddresses() const override {
|
||||
LoweredType = LoweredType.getAddressType();
|
||||
}
|
||||
|
||||
OpaqueValueTypeLowering(SILType type, RecursiveProperties properties,
|
||||
TypeExpansionContext forExpansion)
|
||||
: LeafLoadableTypeLowering(type, properties, IsNotReferenceCounted,
|
||||
@@ -2009,6 +2013,10 @@ namespace {
|
||||
: LeafLoadableTypeLowering(type, properties, IsNotReferenceCounted,
|
||||
forExpansion) {}
|
||||
|
||||
void setLoweredAddresses() const override {
|
||||
LoweredType = LoweredType.getAddressType();
|
||||
}
|
||||
|
||||
void emitCopyInto(SILBuilder &B, SILLocation loc, SILValue src,
|
||||
SILValue dest, IsTake_t isTake,
|
||||
IsInitialization_t isInit) const override {
|
||||
@@ -2046,9 +2054,13 @@ namespace {
|
||||
class LowerType
|
||||
: public TypeClassifierBase<LowerType, TypeLowering *>
|
||||
{
|
||||
bool loweredAddresses;
|
||||
|
||||
public:
|
||||
LowerType(TypeConverter &TC, TypeExpansionContext Expansion)
|
||||
: TypeClassifierBase(TC, Expansion) {}
|
||||
LowerType(TypeConverter &TC, TypeExpansionContext Expansion,
|
||||
bool loweredAddresses)
|
||||
: TypeClassifierBase(TC, Expansion),
|
||||
loweredAddresses(loweredAddresses) {}
|
||||
|
||||
TypeLowering *handleTrivial(CanType type) {
|
||||
return handleTrivial(type, RecursiveProperties::forTrivial());
|
||||
@@ -2105,7 +2117,9 @@ namespace {
|
||||
return new (TC) AddressOnlyTypeLowering(silType, properties,
|
||||
Expansion);
|
||||
}
|
||||
auto silType = SILType::getPrimitiveObjectType(type);
|
||||
auto silType = SILType::getPrimitiveType(
|
||||
type, loweredAddresses ? SILValueCategory::Address
|
||||
: SILValueCategory::Object);
|
||||
return new (TC) OpaqueValueTypeLowering(silType, properties, Expansion);
|
||||
}
|
||||
|
||||
@@ -2399,9 +2413,8 @@ namespace {
|
||||
};
|
||||
} // end anonymous namespace
|
||||
|
||||
TypeConverter::TypeConverter(ModuleDecl &m)
|
||||
: M(m), Context(m.getASTContext()) {
|
||||
}
|
||||
TypeConverter::TypeConverter(ModuleDecl &m, bool loweredAddresses)
|
||||
: LoweredAddresses(loweredAddresses), M(m), Context(m.getASTContext()) {}
|
||||
|
||||
TypeConverter::~TypeConverter() {
|
||||
// The bump pointer allocator destructor will deallocate but not destroy all
|
||||
@@ -2602,7 +2615,7 @@ TypeConverter::getTypeLowering(AbstractionPattern origType,
|
||||
// and cache it.
|
||||
if (loweredSubstType == substType && key.isCacheable()) {
|
||||
lowering =
|
||||
LowerType(*this, forExpansion)
|
||||
LowerType(*this, forExpansion, LoweredAddresses)
|
||||
.visit(key.SubstType, key.OrigType, isTypeExpansionSensitive);
|
||||
|
||||
// Otherwise, check the table at a key that would be used by the
|
||||
@@ -3064,9 +3077,8 @@ const TypeLowering &TypeConverter::getTypeLoweringForLoweredType(
|
||||
forExpansion, origType, loweredType);
|
||||
}
|
||||
|
||||
lowering =
|
||||
LowerType(*this, forExpansion)
|
||||
.visit(loweredType, origType, isTypeExpansionSensitive);
|
||||
lowering = LowerType(*this, forExpansion, LoweredAddresses)
|
||||
.visit(loweredType, origType, isTypeExpansionSensitive);
|
||||
|
||||
if (!lowering->isResilient() && !lowering->isTypeExpansionSensitive())
|
||||
insert(key.getKeyForMinimalExpansion(), lowering);
|
||||
@@ -4363,6 +4375,14 @@ void TypeConverter::setCaptureTypeExpansionContext(SILDeclRef constant,
|
||||
}
|
||||
}
|
||||
|
||||
void TypeConverter::setLoweredAddresses() {
|
||||
assert(!LoweredAddresses);
|
||||
for (auto &pair : this->LoweredTypes) {
|
||||
pair.getSecond()->setLoweredAddresses();
|
||||
}
|
||||
LoweredAddresses = true;
|
||||
}
|
||||
|
||||
static void countNumberOfInnerFields(unsigned &fieldsCount, TypeConverter &TC,
|
||||
SILType Ty,
|
||||
TypeExpansionContext expansion) {
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
// RUN: %target-sil-opt -wmo -enable-sil-verify-all -emit-sorted-sil %s -enable-existential-specializer -existential-specializer -type-lowering-force-opaque-value-lowering 2>&1 | %FileCheck %s
|
||||
|
||||
// Test ExistentialSpecializer with OpaqueValueTypeLowerings.
|
||||
|
||||
import Builtin
|
||||
import Swift
|
||||
import SwiftShims
|
||||
|
||||
public protocol P {}
|
||||
|
||||
public struct S : P {
|
||||
init()
|
||||
|
||||
var o: AnyObject // nontrivial to check ownership conventions
|
||||
}
|
||||
|
||||
// Verify that the opened existential type used in thunk building is properly
|
||||
// address lowered even though it has an OpaqueValueTypeLowering.
|
||||
// CHECK-LABEL: sil hidden [signature_optimized_thunk] [always_inline] @$s6test2_6storePyyAA1P_p_AaC_pztF : {{.*}} {
|
||||
// CHECK: {{bb[0-9]+}}([[IN_ADDR:%[^,]+]] : $*any P, [[OUT_ADDR:%[^,]+]] : $*any P):
|
||||
// CHECK: [[OPENED_IN_ADDR:%[^,]+]] = open_existential_addr mutable_access [[IN_ADDR]] : $*any P to $*@opened([[UUID:".*"]], any P) Self
|
||||
// CHECK: [[OPENED_OUT_ADDR:%[^,]+]] = alloc_stack $@opened([[UUID]], any P) Self
|
||||
// CHECK: copy_addr [[OPENED_IN_ADDR]] to [init] [[OPENED_OUT_ADDR]] : $*@opened([[UUID]], any P) Self
|
||||
// CHECK: apply {{%[^,]+}}<@opened([[UUID]], any P) Self>([[OPENED_OUT_ADDR]], [[OUT_ADDR]])
|
||||
// CHECK: destroy_addr [[IN_ADDR]]
|
||||
// CHECK: dealloc_stack [[OPENED_OUT_ADDR]]
|
||||
// CHECK-LABEL: } // end sil function '$s6test2_6storePyyAA1P_p_AaC_pztF'
|
||||
sil hidden [noinline] @$s6test2_6storePyyAA1P_p_AaC_pztF : $@convention(thin) (@in P, @inout P) -> () {
|
||||
bb0(%0 : $*P, %1 : $*P):
|
||||
copy_addr %0 to [init] %1 : $*P
|
||||
destroy_addr %0 : $*P
|
||||
%5 = tuple ()
|
||||
return %5 : $()
|
||||
}
|
||||
|
||||
sil @$s6test2_6storeS1s1qyAA1SV_AA1P_pztF : $@convention(thin) (S, @inout P) -> () {
|
||||
bb0(%0 : $S, %1 : $*P):
|
||||
%4 = alloc_stack $P
|
||||
%5 = init_existential_addr %4 : $*P, $S
|
||||
store %0 to %5 : $*S
|
||||
%7 = function_ref @$s6test2_6storePyyAA1P_p_AaC_pztF : $@convention(thin) (@in P, @inout P) -> ()
|
||||
%8 = apply %7(%4, %1) : $@convention(thin) (@in P, @inout P) -> ()
|
||||
dealloc_stack %4 : $*P
|
||||
%10 = tuple ()
|
||||
return %10 : $()
|
||||
}
|
||||
|
||||
sil_witness_table S: P module test {}
|
||||
Reference in New Issue
Block a user