Skip to content

Commit d71d3fb

Browse files
authored
[Coverage] Test lowering of ill-formed SIL profiling intrinsics (#16607)
* [Coverage] Parse SIL coverage maps for top-level code decls This adds SIL printer/parser support for SILCoverageMaps representing top-level code decls. * [Coverage] Test lowering of ill-formed SIL profiling intrinsics This adds a test case to exercise a path in IRGen which discards ill-formed profiling intrinsics. rdar://40133800 & r://39146527
1 parent 3e3e0de commit d71d3fb

8 files changed

+51
-26
lines changed

lib/ParseSIL/ParseSIL.cpp

+5-10
Original file line numberDiff line numberDiff line change
@@ -6212,11 +6212,12 @@ bool SILParserTUState::parseSILCoverageMap(Parser &P) {
62126212
return true;
62136213

62146214
// Parse the covered name.
6215-
Identifier FuncName;
6216-
SourceLoc FuncLoc;
6217-
if (State.parseSILIdentifier(FuncName, FuncLoc,
6218-
diag::expected_sil_value_name))
6215+
if (!P.Tok.is(tok::string_literal)) {
6216+
P.diagnose(P.Tok, diag::sil_coverage_expected_quote);
62196217
return true;
6218+
}
6219+
StringRef FuncName = P.Tok.getText().drop_front().drop_back();
6220+
P.consumeToken();
62206221

62216222
// Parse the PGO func name.
62226223
if (!P.Tok.is(tok::string_literal)) {
@@ -6226,12 +6227,6 @@ bool SILParserTUState::parseSILCoverageMap(Parser &P) {
62266227
StringRef PGOFuncName = P.Tok.getText().drop_front().drop_back();
62276228
P.consumeToken();
62286229

6229-
SILFunction *Func = M.lookUpFunction(FuncName.str());
6230-
if (!Func) {
6231-
P.diagnose(FuncLoc, diag::sil_coverage_func_not_found, FuncName);
6232-
return true;
6233-
}
6234-
62356230
uint64_t Hash;
62366231
if (State.parseInteger(Hash, diag::sil_coverage_invalid_hash))
62376232
return true;

lib/SIL/SILPrinter.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -2950,9 +2950,9 @@ void SILDefaultWitnessTable::dump() const {
29502950

29512951
void SILCoverageMap::print(SILPrintContext &PrintCtx) const {
29522952
llvm::raw_ostream &OS = PrintCtx.OS();
2953-
OS << "sil_coverage_map " << QuotedString(getFile()) << " " << getName()
2954-
<< " " << QuotedString(getPGOFuncName()) << " " << getHash() << " {\t// "
2955-
<< demangleSymbol(getName()) << "\n";
2953+
OS << "sil_coverage_map " << QuotedString(getFile()) << " "
2954+
<< QuotedString(getName()) << " " << QuotedString(getPGOFuncName()) << " "
2955+
<< getHash() << " {\t// " << demangleSymbol(getName()) << "\n";
29562956
if (PrintCtx.sortSIL())
29572957
std::sort(MappedRegions.begin(), MappedRegions.end(),
29582958
[](const MappedRegion &LHS, const MappedRegion &RHS) {

test/Profiler/coverage_deinit.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,5 @@ public class Derived: NSString {
1111
}
1212
}
1313

14-
// CHECK-LABEL: sil_coverage_map "{{.*}}coverage_deinit.swift" $S15coverage_deinit7DerivedCfD
14+
// CHECK-LABEL: sil_coverage_map "{{.*}}coverage_deinit.swift" "$S15coverage_deinit7DerivedCfD"
1515
// CHECK-NEXT: [[@LINE-5]]:10 -> [[@LINE-4]]:4 : 0

test/Profiler/coverage_force_emission.swift

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
1-
// RUN: %target-swift-frontend -Xllvm -sil-full-demangle -profile-generate -profile-coverage-mapping -emit-sorted-sil -emit-sil -module-name coverage_force_emission %s | %FileCheck %s -check-prefix=COVERAGE
2-
// RUN: %target-swift-frontend -Xllvm -sil-full-demangle -profile-generate -emit-sorted-sil -emit-sil -module-name coverage_force_emission %s | %FileCheck %s -check-prefix=PGO
1+
// RUN: %target-swift-frontend -Xllvm -sil-full-demangle -profile-generate -profile-coverage-mapping -emit-sil -module-name coverage_force_emission %s | %FileCheck %s -check-prefix=COVERAGE
2+
// RUN: %target-swift-frontend -Xllvm -sil-full-demangle -profile-generate -emit-sil -module-name coverage_force_emission %s | %FileCheck %s -check-prefix=PGO
33

44
final class VarInit {
5-
// COVERAGE: sil_coverage_map {{.*}} $S23coverage_force_emission7VarInitC04lazydE033_7D375D72BA8B0C53C9AD7E4DBC7FF493LLSSvg
5+
// COVERAGE: sil_coverage_map {{.*}} "$S23coverage_force_emission7VarInitC04lazydE033_7D375D72BA8B0C53C9AD7E4DBC7FF493LLSSvgSSyXEfU_"
66
// PGO-LABEL: coverage_force_emission.VarInit.(lazyVarInit in _7D375D72BA8B0C53C9AD7E4DBC7FF493).getter : Swift.String
77
// PGO: int_instrprof_increment
88
private lazy var lazyVarInit: String = {
99
return "Hello"
1010
}()
1111

12-
// CHECK: sil_coverage_map {{.*}} $S23coverage_force_emission7VarInitC05basicdE033_7D375D72BA8B0C53C9AD7E4DBC7FF493LLSSvpfiSSyXEfU_
12+
// CHECK: sil_coverage_map {{.*}} "$S23coverage_force_emission7VarInitC05basicdE033_7D375D72BA8B0C53C9AD7E4DBC7FF493LLSSvpfiSSyXEfU_"
1313
// PGO-LABEL: closure #1 () -> Swift.String in variable initialization expression of coverage_force_emission.VarInit.(basicVarInit in _7D375D72BA8B0C53C9AD7E4DBC7FF493) : Swift.String
1414
// PGO: int_instrprof_increment
1515
private var basicVarInit: String = {
1616
return "Hello"
1717
}()
1818

19-
// CHECK: sil_coverage_map {{.*}} $S23coverage_force_emission7VarInitC06simpleD033_7D375D72BA8B0C53C9AD7E4DBC7FF493LLSSvg
19+
// CHECK: sil_coverage_map {{.*}} "$S23coverage_force_emission7VarInitC06simpleD033_7D375D72BA8B0C53C9AD7E4DBC7FF493LLSSvg"
2020
// PGO-LABEL: coverage_force_emission.VarInit.(simpleVar in _7D375D72BA8B0C53C9AD7E4DBC7FF493).getter : Swift.String
2121
// PGO: int_instrprof_increment
2222
private var simpleVar: String {

test/Profiler/coverage_member_closure.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
class C {
44
// Closures in members receive their own coverage mapping.
5-
// CHECK: sil_coverage_map {{.*}} $S23coverage_member_closure1CC17completionHandleryySS_SaySSGtcvpfiySS_AEtcfU_
5+
// CHECK: sil_coverage_map {{.*}} "$S23coverage_member_closure1CC17completionHandleryySS_SaySSGtcvpfiySS_AEtcfU_"
66
// CHECK: [[@LINE+1]]:55 -> [[@LINE+1]]:79 : 0
77
var completionHandler: (String, [String]) -> Void = { (foo, bar) in return }
88
}

test/Profiler/coverage_var_init.swift

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
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_init7VarInitC04lazydE033_49373CB2DFB47C8DC62FA963604688DFLLSSvgSSyXEfU_
4+
// CHECK: sil_coverage_map {{.*}} "$S17coverage_var_init7VarInitC04lazydE033_49373CB2DFB47C8DC62FA963604688DFLLSSvgSSyXEfU_"
55
// CHECK-NEXT: [[@LINE+1]]:42 -> [[@LINE+3]]:4 : 0
66
private lazy var lazyVarInit: String = {
77
return "lazyVarInit"
88
}()
99

10-
// CHECK: sil_coverage_map {{.*}} $S17coverage_var_init7VarInitC05basicdE033_49373CB2DFB47C8DC62FA963604688DFLLSSvpfiSSyXEfU_
10+
// CHECK: sil_coverage_map {{.*}} "$S17coverage_var_init7VarInitC05basicdE033_49373CB2DFB47C8DC62FA963604688DFLLSSvpfiSSyXEfU_"
1111
// CHECK-NEXT: [[@LINE+1]]:38 -> [[@LINE+3]]:4 : 0
1212
private var basicVarInit: String = {
1313
return "Hello"
1414
}()
1515

16-
// CHECK: sil_coverage_map {{.*}} $S17coverage_var_init7VarInitC06simpleD033_49373CB2DFB47C8DC62FA963604688DFLLSSvg
16+
// CHECK: sil_coverage_map {{.*}} "$S17coverage_var_init7VarInitC06simpleD033_49373CB2DFB47C8DC62FA963604688DFLLSSvg"
1717
// CHECK-NEXT: [[@LINE+1]]:33 -> [[@LINE+3]]:4 : 0
1818
private var simpleVar: String {
1919
return "Hello"
+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// RUN: %target-swift-frontend -assume-parsing-unqualified-ownership-sil %s -profile-generate -profile-coverage-mapping -emit-ir -o - -module-name=irgen | %FileCheck %s
2+
3+
// CHECK-NOT: @__llvm_coverage_mapping
4+
5+
sil_stage canonical
6+
7+
import Builtin
8+
import Swift
9+
import SwiftShims
10+
11+
// main
12+
sil @main : $@convention(c) (Int32, UnsafeMutablePointer<Optional<UnsafeMutablePointer<Int8>>>) -> Int32 {
13+
bb0(%0 : $Int32, %1 : $UnsafeMutablePointer<Optional<UnsafeMutablePointer<Int8>>>):
14+
%2 = string_literal utf8 "<stdin>:__tlcd_line:1:1" // user: %6
15+
%3 = integer_literal $Builtin.Int64, 0 // user: %6
16+
%4 = integer_literal $Builtin.Int32, 2 // user: %6
17+
%5 = integer_literal $Builtin.Int32, 0 // user: %6
18+
19+
// Pass an invalid SIL value to the int_instrprof_increment intrinsic
20+
// to force IRGen to drop it.
21+
%6 = builtin "int_instrprof_increment"(%3 : $Builtin.Int64, %3 : $Builtin.Int64, %4 : $Builtin.Int32, %5 : $Builtin.Int32) : $()
22+
23+
return %0 : $Int32 // id: %33
24+
} // end sil function 'main'
25+
26+
sil_coverage_map "<stdin>" "__tlcd_line:1:1" "<stdin>:__tlcd_line:1:1" 0 { // __tlcd_line:1:1
27+
1:19 -> 1:20 : 1
28+
1:23 -> 1:24 : (0 - 1)
29+
1:1 -> 1:24 : 0
30+
}

test/SIL/Parser/coverage_maps.sil

+3-3
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@ bb0:
66
return %0 : $()
77
}
88

9-
// CHECK-LABEL: sil_coverage_map "coverage_maps.sil" someFunction "coverage_maps.sil:someFunction" 0 {
9+
// CHECK-LABEL: sil_coverage_map "coverage_maps.sil" "someFunction" "coverage_maps.sil:someFunction" 0 {
1010
// CHECK: }
11-
sil_coverage_map "coverage_maps.sil" someFunction "coverage_maps.sil:someFunction" 0 {
11+
sil_coverage_map "coverage_maps.sil" "someFunction" "coverage_maps.sil:someFunction" 0 {
1212
}
1313

14-
// CHECK-LABEL: sil_coverage_map "/some/other/file.sil" someFunction "/some/other/file.sil:someFunction" 0 {
14+
// CHECK-LABEL: sil_coverage_map "/some/other/file.sil" "someFunction" "/some/other/file.sil:someFunction" 0 {
1515
// CHECK: 4:19 -> 31:1 : 0
1616
// CHECK: 7:9 -> 7:16 : (0 + 1)
1717
// CHECK: 7:18 -> 9:3 : zero

0 commit comments

Comments
 (0)