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 #include "src/base/platform/mutex.h" 15 #include "src/globals.h" 16 17 namespace v8 { 18 namespace internal { 19 20 class BasicBlockProfiler { 21 public: 22 class Data { 23 public: n_blocks()24 size_t n_blocks() const { return n_blocks_; } counts()25 const uint32_t* counts() const { return &counts_[0]; } 26 27 void SetCode(std::ostringstream* os); 28 void SetFunctionName(std::unique_ptr<char[]> name); 29 void SetSchedule(std::ostringstream* os); 30 void SetBlockRpoNumber(size_t offset, int32_t block_rpo); 31 intptr_t GetCounterAddress(size_t offset); 32 33 private: 34 friend class BasicBlockProfiler; 35 friend std::ostream& operator<<(std::ostream& os, 36 const BasicBlockProfiler::Data& s); 37 38 explicit Data(size_t n_blocks); 39 ~Data(); 40 41 void ResetCounts(); 42 43 const size_t n_blocks_; 44 std::vector<int32_t> block_rpo_numbers_; 45 std::vector<uint32_t> counts_; 46 std::string function_name_; 47 std::string schedule_; 48 std::string code_; 49 DISALLOW_COPY_AND_ASSIGN(Data); 50 }; 51 52 typedef std::list<Data*> DataList; 53 54 BasicBlockProfiler(); 55 ~BasicBlockProfiler(); 56 57 V8_EXPORT_PRIVATE static BasicBlockProfiler* Get(); 58 Data* NewData(size_t n_blocks); 59 void ResetCounts(); 60 data_list()61 const DataList* data_list() { return &data_list_; } 62 63 private: 64 friend V8_EXPORT_PRIVATE std::ostream& operator<<( 65 std::ostream& os, const BasicBlockProfiler& s); 66 67 DataList data_list_; 68 base::Mutex data_list_mutex_; 69 70 DISALLOW_COPY_AND_ASSIGN(BasicBlockProfiler); 71 }; 72 73 V8_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& os, 74 const BasicBlockProfiler& s); 75 std::ostream& operator<<(std::ostream& os, const BasicBlockProfiler::Data& s); 76 77 } // namespace internal 78 } // namespace v8 79 80 #endif // V8_BASIC_BLOCK_PROFILER_H_ 81