Skip to content

Commit 7214b0d

Browse files
authored
Merge pull request #27673 from brentdax/does-not-fit-the-profile
Fix property wrapper profiling bug
2 parents e85a715 + e01ce6c commit 7214b0d

File tree

4 files changed

+22
-3
lines changed

4 files changed

+22
-3
lines changed

include/swift/SIL/SILDeclRef.h

+5
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,11 @@ struct SILDeclRef {
249249
bool isStoredPropertyInitializer() const {
250250
return kind == Kind::StoredPropertyInitializer;
251251
}
252+
/// True if the SILDeclRef references the initializer for the backing storage
253+
/// of a property wrapper.
254+
bool isPropertyWrapperBackingInitializer() const {
255+
return kind == Kind::PropertyWrapperBackingInitializer;
256+
}
252257

253258
/// True if the SILDeclRef references the ivar initializer or deinitializer of
254259
/// a class.

lib/SIL/SILProfiler.cpp

+4-1
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ static bool canCreateProfilerForAST(ASTNode N, SILDeclRef forDecl) {
135135
return true;
136136
} else if (auto *E = N.get<Expr *>()) {
137137
if (forDecl.isStoredPropertyInitializer() ||
138+
forDecl.isPropertyWrapperBackingInitializer() ||
138139
forDecl.getAbstractClosureExpr())
139140
return true;
140141
}
@@ -151,8 +152,10 @@ SILProfiler *SILProfiler::create(SILModule &M, ForDefinition_t forDefinition,
151152
if (!doesASTRequireProfiling(M, N) && Opts.UseProfile.empty())
152153
return nullptr;
153154

154-
if (!canCreateProfilerForAST(N, forDecl))
155+
if (!canCreateProfilerForAST(N, forDecl)) {
156+
N.dump(llvm::errs());
155157
llvm_unreachable("Invalid AST node for profiling");
158+
}
156159

157160
auto *Buf = M.allocate<SILProfiler>(1);
158161
auto *SP =

lib/SILGen/SILGen.cpp

+3-2
Original file line numberDiff line numberDiff line change
@@ -1145,10 +1145,11 @@ emitPropertyWrapperBackingInitializer(VarDecl *var) {
11451145
preEmitFunction(constant, var, f, var);
11461146
PrettyStackTraceSILFunction X(
11471147
"silgen emitPropertyWrapperBackingInitializer", f);
1148-
f->createProfiler(var, constant, ForDefinition);
1149-
auto varDC = var->getInnermostDeclContext();
11501148
auto wrapperInfo = var->getPropertyWrapperBackingPropertyInfo();
11511149
assert(wrapperInfo.initializeFromOriginal);
1150+
f->createProfiler(wrapperInfo.initializeFromOriginal, constant,
1151+
ForDefinition);
1152+
auto varDC = var->getInnermostDeclContext();
11521153
SILGenFunction SGF(*this, *f, varDC);
11531154
SGF.emitGeneratorFunction(constant, wrapperInfo.initializeFromOriginal);
11541155
postEmitFunction(constant, f);

test/Profiler/coverage_var_init.swift

+10
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
// RUN: %target-swift-frontend -Xllvm -sil-full-demangle -profile-generate -profile-coverage-mapping -emit-sorted-sil -emit-sil -module-name coverage_var_init %s | %FileCheck %s
22

33
final class VarInit {
4+
// CHECK: sil_coverage_map {{.*}} "$s17coverage_var_init7VarInitC018initializedWrapperE0SivpfP"
5+
// CHECK-NEXT: [[@LINE+1]]:4 -> [[@LINE+1]]:38 : 0
6+
@Wrapper var initializedWrapperInit = 2
7+
48
// CHECK: sil_coverage_map {{.*}} "$s17coverage_var_init7VarInitC04lazydE033_49373CB2DFB47C8DC62FA963604688DFLLSSvgSSyXEfU_"
59
// CHECK-NEXT: [[@LINE+1]]:42 -> [[@LINE+3]]:4 : 0
610
private lazy var lazyVarInit: String = {
@@ -23,7 +27,13 @@ final class VarInit {
2327
print(lazyVarInit)
2428
print(basicVarInit)
2529
print(simpleVar)
30+
print(initializedWrapperInit)
2631
}
2732
}
2833

34+
@propertyWrapper struct Wrapper {
35+
init(wrappedValue: Int) {}
36+
var wrappedValue: Int { 1 }
37+
}
38+
2939
VarInit().coverageFunction()

0 commit comments

Comments
 (0)