//===--- 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
