1 // Copyright 2014 the V8 project authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef V8_BASIC_BLOCK_PROFILER_H_ 6 #define V8_BASIC_BLOCK_PROFILER_H_ 7 8 #include <iosfwd> 9 #include <list> 10 #include <string> 11 #include <vector> 12 13 #include "src/base/macros.h" 14 15 namespace v8 { 16 namespace internal { 17 18 class BasicBlockProfiler { 19 public: 20 class Data { 21 public: 22 size_t n_blocks() const { return n_blocks_; } 23 const uint32_t* counts() const { return &counts_[0]; } 24 25 void SetCode(std::ostringstream* os); 26 void SetFunctionName(std::ostringstream* os); 27 void SetSchedule(std::ostringstream* os); 28 void SetBlockId(size_t offset, size_t block_id); 29 uint32_t* GetCounterAddress(size_t offset); 30 31 private: 32 friend class BasicBlockProfiler; 33 friend std::ostream& operator<<(std::ostream& os, 34 const BasicBlockProfiler::Data& s); 35 36 explicit Data(size_t n_blocks); 37 ~Data(); 38 39 void ResetCounts(); 40 41 const size_t n_blocks_; 42 std::vector<size_t> block_ids_; 43 std::vector<uint32_t> counts_; 44 std::string function_name_; 45 std::string schedule_; 46 std::string code_; 47 DISALLOW_COPY_AND_ASSIGN(Data); 48 }; 49 50 typedef std::list<Data*> DataList; 51 52 BasicBlockProfiler(); 53 ~BasicBlockProfiler(); 54 55 Data* NewData(size_t n_blocks); 56 void ResetCounts(); 57 58 const DataList* data_list() { return &data_list_; } 59 60 private: 61 friend std::ostream& operator<<(std::ostream& os, 62 const BasicBlockProfiler& s); 63 64 DataList data_list_; 65 66 DISALLOW_COPY_AND_ASSIGN(BasicBlockProfiler); 67 }; 68 69 std::ostream& operator<<(std::ostream& os, const BasicBlockProfiler& s); 70 std::ostream& operator<<(std::ostream& os, const BasicBlockProfiler::Data& s); 71 72 } // namespace internal 73 } // namespace v8 74 75 #endif // V8_BASIC_BLOCK_PROFILER_H_ 76