162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// Copyright 2016 the V8 project authors. All rights reserved.
262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// found in the LICENSE file.
462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#ifndef V8_IC_IC_STATS_H_
662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#define V8_IC_IC_STATS_H_
762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include <memory>
962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include <string>
1062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include <unordered_map>
1162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include <vector>
1262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
1362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/base/atomicops.h"
1462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/base/lazy-instance.h"
1562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
1662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochnamespace v8 {
1762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
1862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochnamespace tracing {
1962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass TracedValue;
2062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
2162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
2262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochnamespace internal {
2362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
2462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass JSFunction;
2562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass Script;
2662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
2762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochstruct ICInfo {
2862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  ICInfo();
2962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  void Reset();
3062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  void AppendToTracedValue(v8::tracing::TracedValue* value) const;
3162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  std::string type;
3262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  const char* function_name;
3362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  int script_offset;
3462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  const char* script_name;
3562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  int line_num;
3662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  bool is_constructor;
3762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  bool is_optimized;
3862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  std::string state;
3962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // Address of the map.
4062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  void* map;
4162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // Whether map is a dictionary map.
4262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  bool is_dictionary_map;
4362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // Number of own descriptors.
4462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  unsigned number_of_own_descriptors;
4562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  std::string instance_type;
4662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch};
4762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
4862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass ICStats {
4962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch public:
5062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  const int MAX_IC_INFO = 4096;
5162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
5262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  ICStats();
5362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  void Dump();
5462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  void Begin();
5562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  void End();
5662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  void Reset();
5762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V8_INLINE ICInfo& Current() {
5862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    DCHECK(pos_ >= 0 && pos_ < MAX_IC_INFO);
5962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return ic_infos_[pos_];
6062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
6162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  const char* GetOrCacheScriptName(Script* script);
6262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  const char* GetOrCacheFunctionName(JSFunction* function);
6362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V8_INLINE static ICStats* instance() { return instance_.Pointer(); }
6462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
6562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch private:
6662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  static base::LazyInstance<ICStats>::type instance_;
6762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  base::Atomic32 enabled_;
6862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  std::vector<ICInfo> ic_infos_;
6962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  std::unordered_map<Script*, std::unique_ptr<char[]>> script_name_map_;
7062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  std::unordered_map<JSFunction*, std::unique_ptr<char[]>> function_name_map_;
7162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  int pos_;
7262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch};
7362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
7462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}  // namespace internal
7562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}  // namespace v8
7662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
7762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#endif  // V8_IC_IC_STATS_H_
78