Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 0 additions & 3 deletions include/swift/SIL/SILProfiler.h
Original file line number Diff line number Diff line change
Expand Up @@ -94,9 +94,6 @@ class SILProfiler : public SILAllocated<SILProfiler> {
return RegionCounterMap;
}

/// Increment the number of counter updates associated with this profiler.
void recordCounterUpdate();

private:
/// Map counters to ASTNodes and set them up for profiling the function.
void assignRegionCounters();
Expand Down
13 changes: 12 additions & 1 deletion lib/IRGen/GenBuiltin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,9 @@ void irgen::emitBuiltinCall(IRGenFunction &IGF, const BuiltinInfo &Builtin,
if (IID == llvm::Intrinsic::instrprof_increment) {
// If we import profiling intrinsics from a swift module but profiling is
// not enabled, ignore the increment.
if (!IGF.getSILModule().getOptions().GenerateProfile) {
SILModule &SILMod = IGF.getSILModule();
const auto &Opts = SILMod.getOptions();
if (!Opts.GenerateProfile) {
(void)args.claimAll();
return;
}
Expand Down Expand Up @@ -246,6 +248,15 @@ void irgen::emitBuiltinCall(IRGenFunction &IGF, const BuiltinInfo &Builtin,
replacement.add(NameGEP);
replacement.add(args.claimAll());
args = std::move(replacement);

if (Opts.EmitProfileCoverageMapping) {
// Update the associated coverage mapping: it's now safe to emit, because
// a symtab entry for this function is guaranteed (r://39146527).
auto &coverageMaps = SILMod.getCoverageMaps();
auto CovMapIt = coverageMaps.find(PGOFuncName);
if (CovMapIt != coverageMaps.end())
CovMapIt->second->setSymtabEntryGuaranteed();
}
}

if (IID != llvm::Intrinsic::not_intrinsic) {
Expand Down
4 changes: 3 additions & 1 deletion lib/IRGen/GenDecl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1065,7 +1065,6 @@ void IRGenerator::emitGlobalTopLevel(bool emitForParallelEmission) {
CurrentIGMPtr IGM = getGenModule(decl ? decl->getDeclContext() : nullptr);
IGM->emitSILGlobalVariable(&v);
}
PrimaryIGM->emitCoverageMapping();

// Emit SIL functions.
for (SILFunction &f : PrimaryIGM->getSILModule()) {
Expand Down Expand Up @@ -1099,6 +1098,9 @@ void IRGenerator::emitGlobalTopLevel(bool emitForParallelEmission) {
IGM->emitSILProperty(&prop);
}

// Emit code coverage mapping data.
PrimaryIGM->emitCoverageMapping();

for (auto Iter : *this) {
IRGenModule *IGM = Iter.second;
IGM->finishEmitAfterTopLevel();
Expand Down
15 changes: 5 additions & 10 deletions lib/ParseSIL/ParseSIL.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6208,11 +6208,12 @@ bool SILParserTUState::parseSILCoverageMap(Parser &P) {
return true;

// Parse the covered name.
Identifier FuncName;
SourceLoc FuncLoc;
if (State.parseSILIdentifier(FuncName, FuncLoc,
diag::expected_sil_value_name))
if (!P.Tok.is(tok::string_literal)) {
P.diagnose(P.Tok, diag::sil_coverage_expected_quote);
return true;
}
StringRef FuncName = P.Tok.getText().drop_front().drop_back();
P.consumeToken();

// Parse the PGO func name.
if (!P.Tok.is(tok::string_literal)) {
Expand All @@ -6222,12 +6223,6 @@ bool SILParserTUState::parseSILCoverageMap(Parser &P) {
StringRef PGOFuncName = P.Tok.getText().drop_front().drop_back();
P.consumeToken();

SILFunction *Func = M.lookUpFunction(FuncName.str());
if (!Func) {
P.diagnose(FuncLoc, diag::sil_coverage_func_not_found, FuncName);
return true;
}

uint64_t Hash;
if (State.parseInteger(Hash, diag::sil_coverage_invalid_hash))
return true;
Expand Down
6 changes: 3 additions & 3 deletions lib/SIL/SILPrinter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2941,9 +2941,9 @@ void SILDefaultWitnessTable::dump() const {

void SILCoverageMap::print(SILPrintContext &PrintCtx) const {
llvm::raw_ostream &OS = PrintCtx.OS();
OS << "sil_coverage_map " << QuotedString(getFile()) << " " << getName()
<< " " << QuotedString(getPGOFuncName()) << " " << getHash() << " {\t// "
<< demangleSymbol(getName()) << "\n";
OS << "sil_coverage_map " << QuotedString(getFile()) << " "
<< QuotedString(getName()) << " " << QuotedString(getPGOFuncName()) << " "
<< getHash() << " {\t// " << demangleSymbol(getName()) << "\n";
if (PrintCtx.sortSIL())
std::sort(MappedRegions.begin(), MappedRegions.end(),
[](const MappedRegion &LHS, const MappedRegion &RHS) {
Expand Down
7 changes: 0 additions & 7 deletions lib/SIL/SILProfiler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1078,10 +1078,3 @@ Optional<ASTNode> SILProfiler::getPGOParent(ASTNode Node) {
}
return it->getSecond();
}

void SILProfiler::recordCounterUpdate() {
// If a counter update is recorded, the profile symbol table is guaranteed
// to have name data needed by the coverage mapping.
if (CovMap)
CovMap->setSymtabEntryGuaranteed();
}
1 change: 0 additions & 1 deletion lib/SILGen/SILGenFunction.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -657,7 +657,6 @@ void SILGenFunction::emitProfilerIncrement(ASTNode N) {
B.createIntegerLiteral(Loc, Int32Ty, CounterIt->second)};
B.createBuiltin(Loc, C.getIdentifier("int_instrprof_increment"),
SGM.Types.getEmptyTupleType(), {}, Args);
SP->recordCounterUpdate();
}

ProfileCounter SILGenFunction::loadProfilerCount(ASTNode Node) const {
Expand Down
30 changes: 30 additions & 0 deletions test/Profiler/instrprof_symtab_valid.sil
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
// RUN: %target-swift-frontend -assume-parsing-unqualified-ownership-sil %s -profile-generate -profile-coverage-mapping -emit-ir -o - -module-name=irgen | %FileCheck %s

// CHECK-NOT: @__llvm_coverage_mapping

sil_stage canonical

import Builtin
import Swift
import SwiftShims

// main
sil @main : $@convention(c) (Int32, UnsafeMutablePointer<Optional<UnsafeMutablePointer<Int8>>>) -> Int32 {
bb0(%0 : $Int32, %1 : $UnsafeMutablePointer<Optional<UnsafeMutablePointer<Int8>>>):
%2 = string_literal utf8 "<stdin>:__tlcd_line:1:1" // user: %6
%3 = integer_literal $Builtin.Int64, 0 // user: %6
%4 = integer_literal $Builtin.Int32, 2 // user: %6
%5 = integer_literal $Builtin.Int32, 0 // user: %6

// Pass an invalid SIL value to the int_instrprof_increment intrinsic
// to force IRGen to drop it.
%6 = builtin "int_instrprof_increment"(%3 : $Builtin.Int64, %3 : $Builtin.Int64, %4 : $Builtin.Int32, %5 : $Builtin.Int32) : $()

return %0 : $Int32 // id: %33
} // end sil function 'main'

sil_coverage_map "<stdin>" "__tlcd_line:1:1" "<stdin>:__tlcd_line:1:1" 0 { // __tlcd_line:1:1
1:19 -> 1:20 : 1
1:23 -> 1:24 : (0 - 1)
1:1 -> 1:24 : 0
}
6 changes: 3 additions & 3 deletions test/SIL/Parser/coverage_maps.sil
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,12 @@ bb0:
return %0 : $()
}

// CHECK-LABEL: sil_coverage_map "coverage_maps.sil" someFunction "coverage_maps.sil:someFunction" 0 {
// CHECK-LABEL: sil_coverage_map "coverage_maps.sil" "someFunction" "coverage_maps.sil:someFunction" 0 {
// CHECK: }
sil_coverage_map "coverage_maps.sil" someFunction "coverage_maps.sil:someFunction" 0 {
sil_coverage_map "coverage_maps.sil" "someFunction" "coverage_maps.sil:someFunction" 0 {
}

// CHECK-LABEL: sil_coverage_map "/some/other/file.sil" someFunction "/some/other/file.sil:someFunction" 0 {
// CHECK-LABEL: sil_coverage_map "/some/other/file.sil" "someFunction" "/some/other/file.sil:someFunction" 0 {
// CHECK: 4:19 -> 31:1 : 0
// CHECK: 7:9 -> 7:16 : (0 + 1)
// CHECK: 7:18 -> 9:3 : zero
Expand Down
2 changes: 1 addition & 1 deletion test/SILGen/coverage_deinit.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,5 @@ public class Derived: NSString {
}
}

// CHECK-LABEL: sil_coverage_map "{{.*}}coverage_deinit.swift" $S15coverage_deinit7DerivedCfD
// CHECK-LABEL: sil_coverage_map "{{.*}}coverage_deinit.swift" "$S15coverage_deinit7DerivedCfD"
// CHECK-NEXT: [[@LINE-5]]:10 -> [[@LINE-4]]:4 : 0
10 changes: 5 additions & 5 deletions test/SILGen/coverage_force_emission.swift
Original file line number Diff line number Diff line change
@@ -1,22 +1,22 @@
// 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
// 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
// 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
// RUN: %target-swift-frontend -Xllvm -sil-full-demangle -profile-generate -emit-sil -module-name coverage_force_emission %s | %FileCheck %s -check-prefix=PGO

final class VarInit {
// COVERAGE: sil_coverage_map {{.*}} $S23coverage_force_emission7VarInitC04lazydE033_7D375D72BA8B0C53C9AD7E4DBC7FF493LLSSvg
// COVERAGE: sil_coverage_map {{.*}} "$S23coverage_force_emission7VarInitC04lazydE033_7D375D72BA8B0C53C9AD7E4DBC7FF493LLSSvgSSyXEfU_"
// PGO-LABEL: coverage_force_emission.VarInit.(lazyVarInit in _7D375D72BA8B0C53C9AD7E4DBC7FF493).getter : Swift.String
// PGO: int_instrprof_increment
private lazy var lazyVarInit: String = {
return "Hello"
}()

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

// CHECK: sil_coverage_map {{.*}} $S23coverage_force_emission7VarInitC06simpleD033_7D375D72BA8B0C53C9AD7E4DBC7FF493LLSSvg
// CHECK: sil_coverage_map {{.*}} "$S23coverage_force_emission7VarInitC06simpleD033_7D375D72BA8B0C53C9AD7E4DBC7FF493LLSSvg"
// PGO-LABEL: coverage_force_emission.VarInit.(simpleVar in _7D375D72BA8B0C53C9AD7E4DBC7FF493).getter : Swift.String
// PGO: int_instrprof_increment
private var simpleVar: String {
Expand Down
2 changes: 1 addition & 1 deletion test/SILGen/coverage_member_closure.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

class C {
// Closures in members receive their own coverage mapping.
// CHECK: sil_coverage_map {{.*}} $S23coverage_member_closure1CC17completionHandleryySS_SaySSGtcvpfiySS_AEtcfU_
// CHECK: sil_coverage_map {{.*}} "$S23coverage_member_closure1CC17completionHandleryySS_SaySSGtcvpfiySS_AEtcfU_"
// CHECK: [[@LINE+1]]:55 -> [[@LINE+1]]:79 : 0
var completionHandler: (String, [String]) -> Void = { (foo, bar) in return }
}
6 changes: 3 additions & 3 deletions test/SILGen/coverage_var_init.swift
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
// 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

final class VarInit {
// CHECK: sil_coverage_map {{.*}} $S17coverage_var_init7VarInitC04lazydE033_49373CB2DFB47C8DC62FA963604688DFLLSSvgSSyXEfU_
// CHECK: sil_coverage_map {{.*}} "$S17coverage_var_init7VarInitC04lazydE033_49373CB2DFB47C8DC62FA963604688DFLLSSvgSSyXEfU_"
// CHECK-NEXT: [[@LINE+1]]:42 -> [[@LINE+3]]:4 : 0
private lazy var lazyVarInit: String = {
return "lazyVarInit"
}()

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

// CHECK: sil_coverage_map {{.*}} $S17coverage_var_init7VarInitC06simpleD033_49373CB2DFB47C8DC62FA963604688DFLLSSvg
// CHECK: sil_coverage_map {{.*}} "$S17coverage_var_init7VarInitC06simpleD033_49373CB2DFB47C8DC62FA963604688DFLLSSvg"
// CHECK-NEXT: [[@LINE+1]]:33 -> [[@LINE+3]]:4 : 0
private var simpleVar: String {
return "Hello"
Expand Down