blob: 010f58c8c08c20431ea85b012383c6bcdf894ea9 [file] [log] [blame]
//===--- SILGenProfiling.h - Instrumentation based profiling ----*- C++ -*-===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2016 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See http://swift.org/LICENSE.txt for license information
// See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
#ifndef SWIFT_SILGEN_PROFILING_H
#define SWIFT_SILGEN_PROFILING_H
#include "llvm/ADT/DenseMap.h"
#include "swift/AST/ASTNode.h"
#include "swift/AST/Stmt.h"
#include "swift/SIL/FormalLinkage.h"
namespace swift {
class AbstractFunctionDecl;
namespace Lowering {
class SILGenModule;
class SILGenBuilder;
struct ProfilerRAII;
/// Profiling state.
class SILGenProfiling {
private:
SILGenModule &SGM;
bool EmitCoverageMapping;
// The current function's name and counter data.
std::string CurrentFuncName;
StringRef CurrentFileName;
FormalLinkage CurrentFuncLinkage;
unsigned NumRegionCounters;
uint64_t FunctionHash;
llvm::DenseMap<ASTNode, unsigned> RegionCounterMap;
std::vector<std::tuple<std::string, uint64_t, std::string>> CoverageData;
public:
SILGenProfiling(SILGenModule &SGM, bool EmitCoverageMapping)
: SGM(SGM), EmitCoverageMapping(EmitCoverageMapping),
NumRegionCounters(0), FunctionHash(0) {}
bool hasRegionCounters() const { return NumRegionCounters != 0; }
/// Emit SIL to increment the counter for \c Node.
void emitCounterIncrement(SILGenBuilder &Builder, ASTNode Node);
private:
/// Map counters to ASTNodes and set them up for profiling the given function.
void assignRegionCounters(AbstractFunctionDecl *Root);
friend struct ProfilerRAII;
};
/// RAII object to set up profiling for a function.
struct ProfilerRAII {
SILGenModule &SGM;
std::unique_ptr<SILGenProfiling> PreviousProfiler;
ProfilerRAII(SILGenModule &SGM, AbstractFunctionDecl *D);
~ProfilerRAII();
};
} // end namespace Lowering
} // end namespace swift
#endif // SWIFT_SILGEN_PROFILING