Skip to content

Commit cfbd52d

Browse files
Merge pull request #62343 from nate-chandler/opaque-values/1/20221130
[TypeConverter] Track address lowering.
2 parents 511d78b + e9e93c1 commit cfbd52d

File tree

7 files changed

+103
-17
lines changed

7 files changed

+103
-17
lines changed

include/swift/SIL/SILModule.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -874,7 +874,12 @@ class SILModule {
874874
/// True if SIL conventions force address-only to be passed by address.
875875
bool useLoweredAddresses() const { return loweredAddresses; }
876876

877-
void setLoweredAddresses(bool val) { loweredAddresses = val; }
877+
void setLoweredAddresses(bool val) {
878+
loweredAddresses = val;
879+
if (val) {
880+
Types.setLoweredAddresses();
881+
}
882+
}
878883

879884
llvm::IndexedInstrProfReader *getPGOReader() const { return PGOReader.get(); }
880885

include/swift/SIL/TypeLowering.h

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -289,9 +289,13 @@ class TypeLowering {
289289
private:
290290
friend class TypeConverter;
291291

292+
virtual void setLoweredAddresses() const {}
293+
294+
protected:
292295
/// The SIL type of values with this Swift type.
293-
SILType LoweredType;
296+
mutable SILType LoweredType;
294297

298+
private:
295299
RecursiveProperties Properties;
296300

297301
/// The resilience expansion for this type lowering.
@@ -778,6 +782,9 @@ class TypeConverter {
778782
void removeNullEntry(const TypeKey &k);
779783
#endif
780784

785+
/// True if SIL conventions force address-only to be passed by address.
786+
bool LoweredAddresses;
787+
781788
CanGenericSignature CurGenericSignature;
782789

783790
/// Stack of types currently being lowered as part of an aggregate.
@@ -824,7 +831,7 @@ class TypeConverter {
824831
ModuleDecl &M;
825832
ASTContext &Context;
826833

827-
TypeConverter(ModuleDecl &m);
834+
TypeConverter(ModuleDecl &m, bool loweredAddresses = true);
828835
~TypeConverter();
829836
TypeConverter(TypeConverter const &) = delete;
830837
TypeConverter &operator=(TypeConverter const &) = delete;
@@ -1218,6 +1225,9 @@ class TypeConverter {
12181225

12191226
void setCaptureTypeExpansionContext(SILDeclRef constant,
12201227
SILModule &M);
1228+
1229+
void setLoweredAddresses();
1230+
12211231
private:
12221232
CanType computeLoweredRValueType(TypeExpansionContext context,
12231233
AbstractionPattern origType,

lib/DriverTool/modulewrap_main.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,8 @@ int modulewrap_main(ArrayRef<const char *> Args, const char *Argv0,
189189

190190
ASTCtx.addModuleLoader(ClangImporter::create(ASTCtx, ""), true);
191191
ModuleDecl *M = ModuleDecl::create(ASTCtx.getIdentifier("swiftmodule"), ASTCtx);
192-
std::unique_ptr<Lowering::TypeConverter> TC(new Lowering::TypeConverter(*M));
192+
std::unique_ptr<Lowering::TypeConverter> TC(
193+
new Lowering::TypeConverter(*M, ASTCtx.SILOpts.EnableSILOpaqueValues));
193194
std::unique_ptr<SILModule> SM = SILModule::createEmptyModule(M, *TC, SILOpts);
194195
createSwiftModuleObjectFile(*SM, (*ErrOrBuf)->getBuffer(),
195196
Invocation.getOutputFilename());

lib/Frontend/Frontend.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -202,8 +202,10 @@ SerializationOptions CompilerInvocation::computeSerializationOptions(
202202
Lowering::TypeConverter &CompilerInstance::getSILTypes() {
203203
if (auto *tc = TheSILTypes.get())
204204
return *tc;
205-
206-
auto *tc = new Lowering::TypeConverter(*getMainModule());
205+
206+
auto *tc = new Lowering::TypeConverter(
207+
*getMainModule(),
208+
/*loweredAddresses=*/!Context->SILOpts.EnableSILOpaqueValues);
207209
TheSILTypes.reset(tc);
208210
return *tc;
209211
}

lib/IRGen/IRABIDetailsProvider.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ namespace swift {
7171
class IRABIDetailsProviderImpl {
7272
public:
7373
IRABIDetailsProviderImpl(ModuleDecl &mod, const IRGenOptions &opts)
74-
: typeConverter(mod),
74+
: typeConverter(mod, /*addressLowered=*/true),
7575
silMod(SILModule::createEmptyModule(&mod, typeConverter, silOpts)),
7676
IRGen(opts, *silMod), IGM(IRGen, IRGen.createTargetMachine()) {}
7777

lib/SIL/IR/TypeLowering.cpp

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1942,6 +1942,10 @@ namespace {
19421942
/// Lower address only types as opaque values.
19431943
class OpaqueValueTypeLowering : public LeafLoadableTypeLowering {
19441944
public:
1945+
void setLoweredAddresses() const override {
1946+
LoweredType = LoweredType.getAddressType();
1947+
}
1948+
19451949
OpaqueValueTypeLowering(SILType type, RecursiveProperties properties,
19461950
TypeExpansionContext forExpansion)
19471951
: LeafLoadableTypeLowering(type, properties, IsNotReferenceCounted,
@@ -2009,6 +2013,10 @@ namespace {
20092013
: LeafLoadableTypeLowering(type, properties, IsNotReferenceCounted,
20102014
forExpansion) {}
20112015

2016+
void setLoweredAddresses() const override {
2017+
LoweredType = LoweredType.getAddressType();
2018+
}
2019+
20122020
void emitCopyInto(SILBuilder &B, SILLocation loc, SILValue src,
20132021
SILValue dest, IsTake_t isTake,
20142022
IsInitialization_t isInit) const override {
@@ -2046,9 +2054,13 @@ namespace {
20462054
class LowerType
20472055
: public TypeClassifierBase<LowerType, TypeLowering *>
20482056
{
2057+
bool loweredAddresses;
2058+
20492059
public:
2050-
LowerType(TypeConverter &TC, TypeExpansionContext Expansion)
2051-
: TypeClassifierBase(TC, Expansion) {}
2060+
LowerType(TypeConverter &TC, TypeExpansionContext Expansion,
2061+
bool loweredAddresses)
2062+
: TypeClassifierBase(TC, Expansion),
2063+
loweredAddresses(loweredAddresses) {}
20522064

20532065
TypeLowering *handleTrivial(CanType type) {
20542066
return handleTrivial(type, RecursiveProperties::forTrivial());
@@ -2105,7 +2117,9 @@ namespace {
21052117
return new (TC) AddressOnlyTypeLowering(silType, properties,
21062118
Expansion);
21072119
}
2108-
auto silType = SILType::getPrimitiveObjectType(type);
2120+
auto silType = SILType::getPrimitiveType(
2121+
type, loweredAddresses ? SILValueCategory::Address
2122+
: SILValueCategory::Object);
21092123
return new (TC) OpaqueValueTypeLowering(silType, properties, Expansion);
21102124
}
21112125

@@ -2399,9 +2413,8 @@ namespace {
23992413
};
24002414
} // end anonymous namespace
24012415

2402-
TypeConverter::TypeConverter(ModuleDecl &m)
2403-
: M(m), Context(m.getASTContext()) {
2404-
}
2416+
TypeConverter::TypeConverter(ModuleDecl &m, bool loweredAddresses)
2417+
: LoweredAddresses(loweredAddresses), M(m), Context(m.getASTContext()) {}
24052418

24062419
TypeConverter::~TypeConverter() {
24072420
// The bump pointer allocator destructor will deallocate but not destroy all
@@ -2602,7 +2615,7 @@ TypeConverter::getTypeLowering(AbstractionPattern origType,
26022615
// and cache it.
26032616
if (loweredSubstType == substType && key.isCacheable()) {
26042617
lowering =
2605-
LowerType(*this, forExpansion)
2618+
LowerType(*this, forExpansion, LoweredAddresses)
26062619
.visit(key.SubstType, key.OrigType, isTypeExpansionSensitive);
26072620

26082621
// Otherwise, check the table at a key that would be used by the
@@ -3064,9 +3077,8 @@ const TypeLowering &TypeConverter::getTypeLoweringForLoweredType(
30643077
forExpansion, origType, loweredType);
30653078
}
30663079

3067-
lowering =
3068-
LowerType(*this, forExpansion)
3069-
.visit(loweredType, origType, isTypeExpansionSensitive);
3080+
lowering = LowerType(*this, forExpansion, LoweredAddresses)
3081+
.visit(loweredType, origType, isTypeExpansionSensitive);
30703082

30713083
if (!lowering->isResilient() && !lowering->isTypeExpansionSensitive())
30723084
insert(key.getKeyForMinimalExpansion(), lowering);
@@ -4363,6 +4375,14 @@ void TypeConverter::setCaptureTypeExpansionContext(SILDeclRef constant,
43634375
}
43644376
}
43654377

4378+
void TypeConverter::setLoweredAddresses() {
4379+
assert(!LoweredAddresses);
4380+
for (auto &pair : this->LoweredTypes) {
4381+
pair.getSecond()->setLoweredAddresses();
4382+
}
4383+
LoweredAddresses = true;
4384+
}
4385+
43664386
static void countNumberOfInnerFields(unsigned &fieldsCount, TypeConverter &TC,
43674387
SILType Ty,
43684388
TypeExpansionContext expansion) {
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
// 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
2+
3+
// Test ExistentialSpecializer with OpaqueValueTypeLowerings.
4+
5+
import Builtin
6+
import Swift
7+
import SwiftShims
8+
9+
public protocol P {}
10+
11+
public struct S : P {
12+
init()
13+
14+
var o: AnyObject // nontrivial to check ownership conventions
15+
}
16+
17+
// Verify that the opened existential type used in thunk building is properly
18+
// address lowered even though it has an OpaqueValueTypeLowering.
19+
// CHECK-LABEL: sil hidden [signature_optimized_thunk] [always_inline] @$s6test2_6storePyyAA1P_p_AaC_pztF : {{.*}} {
20+
// CHECK: {{bb[0-9]+}}([[IN_ADDR:%[^,]+]] : $*any P, [[OUT_ADDR:%[^,]+]] : $*any P):
21+
// CHECK: [[OPENED_IN_ADDR:%[^,]+]] = open_existential_addr mutable_access [[IN_ADDR]] : $*any P to $*@opened([[UUID:".*"]], any P) Self
22+
// CHECK: [[OPENED_OUT_ADDR:%[^,]+]] = alloc_stack $@opened([[UUID]], any P) Self
23+
// CHECK: copy_addr [[OPENED_IN_ADDR]] to [init] [[OPENED_OUT_ADDR]] : $*@opened([[UUID]], any P) Self
24+
// CHECK: apply {{%[^,]+}}<@opened([[UUID]], any P) Self>([[OPENED_OUT_ADDR]], [[OUT_ADDR]])
25+
// CHECK: destroy_addr [[IN_ADDR]]
26+
// CHECK: dealloc_stack [[OPENED_OUT_ADDR]]
27+
// CHECK-LABEL: } // end sil function '$s6test2_6storePyyAA1P_p_AaC_pztF'
28+
sil hidden [noinline] @$s6test2_6storePyyAA1P_p_AaC_pztF : $@convention(thin) (@in P, @inout P) -> () {
29+
bb0(%0 : $*P, %1 : $*P):
30+
copy_addr %0 to [init] %1 : $*P
31+
destroy_addr %0 : $*P
32+
%5 = tuple ()
33+
return %5 : $()
34+
}
35+
36+
sil @$s6test2_6storeS1s1qyAA1SV_AA1P_pztF : $@convention(thin) (S, @inout P) -> () {
37+
bb0(%0 : $S, %1 : $*P):
38+
%4 = alloc_stack $P
39+
%5 = init_existential_addr %4 : $*P, $S
40+
store %0 to %5 : $*S
41+
%7 = function_ref @$s6test2_6storePyyAA1P_p_AaC_pztF : $@convention(thin) (@in P, @inout P) -> ()
42+
%8 = apply %7(%4, %1) : $@convention(thin) (@in P, @inout P) -> ()
43+
dealloc_stack %4 : $*P
44+
%10 = tuple ()
45+
return %10 : $()
46+
}
47+
48+
sil_witness_table S: P module test {}

0 commit comments

Comments
 (0)