OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #ifndef VM_PROFILER_H_ | 5 #ifndef VM_PROFILER_H_ |
6 #define VM_PROFILER_H_ | 6 #define VM_PROFILER_H_ |
7 | 7 |
8 #include "vm/allocation.h" | 8 #include "vm/allocation.h" |
9 #include "vm/bitfield.h" | 9 #include "vm/bitfield.h" |
10 #include "vm/code_observers.h" | 10 #include "vm/code_observers.h" |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
152 } | 152 } |
153 | 153 |
154 void Clear() { | 154 void Clear() { |
155 isolate_ = NULL; | 155 isolate_ = NULL; |
156 pc_marker_ = 0; | 156 pc_marker_ = 0; |
157 for (intptr_t i = 0; i < kStackBufferSizeInWords; i++) { | 157 for (intptr_t i = 0; i < kStackBufferSizeInWords; i++) { |
158 stack_buffer_[i] = 0; | 158 stack_buffer_[i] = 0; |
159 } | 159 } |
160 vm_tag_ = VMTag::kInvalidTagId; | 160 vm_tag_ = VMTag::kInvalidTagId; |
161 user_tag_ = UserTags::kDefaultUserTag; | 161 user_tag_ = UserTags::kDefaultUserTag; |
162 sp_ = 0; | |
163 lr_ = 0; | 162 lr_ = 0; |
164 fp_ = 0; | 163 metadata_ = 0; |
165 state_ = 0; | 164 state_ = 0; |
166 uword* pcs = GetPCArray(); | 165 uword* pcs = GetPCArray(); |
167 for (intptr_t i = 0; i < pcs_length_; i++) { | 166 for (intptr_t i = 0; i < pcs_length_; i++) { |
168 pcs[i] = 0; | 167 pcs[i] = 0; |
169 } | 168 } |
170 } | 169 } |
171 | 170 |
172 // Timestamp sample was taken at. | 171 // Timestamp sample was taken at. |
173 int64_t timestamp() const { | 172 int64_t timestamp() const { |
174 return timestamp_; | 173 return timestamp_; |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
211 } | 210 } |
212 | 211 |
213 uword pc_marker() const { | 212 uword pc_marker() const { |
214 return pc_marker_; | 213 return pc_marker_; |
215 } | 214 } |
216 | 215 |
217 void set_pc_marker(uword pc_marker) { | 216 void set_pc_marker(uword pc_marker) { |
218 pc_marker_ = pc_marker; | 217 pc_marker_ = pc_marker; |
219 } | 218 } |
220 | 219 |
221 uword sp() const { | |
222 return sp_; | |
223 } | |
224 | |
225 void set_sp(uword sp) { | |
226 sp_ = sp; | |
227 } | |
228 | |
229 uword fp() const { | |
230 return fp_; | |
231 } | |
232 | |
233 void set_fp(uword fp) { | |
234 fp_ = fp; | |
235 } | |
236 | |
237 uword lr() const { | 220 uword lr() const { |
238 return lr_; | 221 return lr_; |
239 } | 222 } |
240 | 223 |
241 void set_lr(uword link_register) { | 224 void set_lr(uword link_register) { |
242 lr_ = link_register; | 225 lr_ = link_register; |
243 } | 226 } |
244 | 227 |
245 void InsertCallerForTopFrame(uword pc) { | 228 void InsertCallerForTopFrame(uword pc) { |
246 if (pcs_length_ == 1) { | 229 if (pcs_length_ == 1) { |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
299 } | 282 } |
300 | 283 |
301 bool truncated_trace() const { | 284 bool truncated_trace() const { |
302 return TruncatedTraceBit::decode(state_); | 285 return TruncatedTraceBit::decode(state_); |
303 } | 286 } |
304 | 287 |
305 void set_truncated_trace(bool truncated_trace) { | 288 void set_truncated_trace(bool truncated_trace) { |
306 state_ = TruncatedTraceBit::update(truncated_trace, state_); | 289 state_ = TruncatedTraceBit::update(truncated_trace, state_); |
307 } | 290 } |
308 | 291 |
| 292 bool is_allocation_sample() const { |
| 293 return ClassAllocationSampleBit::decode(state_); |
| 294 } |
| 295 |
| 296 void set_is_allocation_sample(bool allocation_sample) { |
| 297 state_ = ClassAllocationSampleBit::update(allocation_sample, state_); |
| 298 } |
| 299 |
| 300 intptr_t allocation_cid() const { |
| 301 ASSERT(is_allocation_sample()); |
| 302 return metadata_; |
| 303 } |
| 304 |
| 305 void set_metadata(intptr_t metadata) { |
| 306 metadata_ = metadata; |
| 307 } |
| 308 |
309 static void InitOnce(); | 309 static void InitOnce(); |
310 | 310 |
311 static intptr_t instance_size() { | 311 static intptr_t instance_size() { |
312 return instance_size_; | 312 return instance_size_; |
313 } | 313 } |
314 | 314 |
315 uword* GetPCArray() const; | 315 uword* GetPCArray() const; |
316 | 316 |
317 static const int kStackBufferSizeInWords = 2; | 317 static const int kStackBufferSizeInWords = 2; |
318 uword* GetStackBuffer() { | 318 uword* GetStackBuffer() { |
319 return &stack_buffer_[0]; | 319 return &stack_buffer_[0]; |
320 } | 320 } |
321 | 321 |
322 private: | 322 private: |
323 static intptr_t instance_size_; | 323 static intptr_t instance_size_; |
324 static intptr_t pcs_length_; | 324 static intptr_t pcs_length_; |
325 enum StateBits { | 325 enum StateBits { |
326 kProcessedBit = 0, | 326 kProcessedBit = 0, |
327 kLeafFrameIsDartBit = 1, | 327 kLeafFrameIsDartBit = 1, |
328 kIgnoreBit = 2, | 328 kIgnoreBit = 2, |
329 kExitFrameBit = 3, | 329 kExitFrameBit = 3, |
330 kMissingFrameInsertedBit = 4, | 330 kMissingFrameInsertedBit = 4, |
331 kTruncatedTrace = 5, | 331 kTruncatedTrace = 5, |
| 332 kClassAllocationSample = 6, |
332 }; | 333 }; |
333 class ProcessedBit : public BitField<bool, kProcessedBit, 1> {}; | 334 class ProcessedBit : public BitField<bool, kProcessedBit, 1> {}; |
334 class LeafFrameIsDart : public BitField<bool, kLeafFrameIsDartBit, 1> {}; | 335 class LeafFrameIsDart : public BitField<bool, kLeafFrameIsDartBit, 1> {}; |
335 class IgnoreBit : public BitField<bool, kIgnoreBit, 1> {}; | 336 class IgnoreBit : public BitField<bool, kIgnoreBit, 1> {}; |
336 class ExitFrameBit : public BitField<bool, kExitFrameBit, 1> {}; | 337 class ExitFrameBit : public BitField<bool, kExitFrameBit, 1> {}; |
337 class MissingFrameInsertedBit | 338 class MissingFrameInsertedBit |
338 : public BitField<bool, kMissingFrameInsertedBit, 1> {}; | 339 : public BitField<bool, kMissingFrameInsertedBit, 1> {}; |
339 class TruncatedTraceBit : public BitField<bool, kTruncatedTrace, 1> {}; | 340 class TruncatedTraceBit : public BitField<bool, kTruncatedTrace, 1> {}; |
| 341 class ClassAllocationSampleBit |
| 342 : public BitField<bool, kClassAllocationSample, 1> {}; |
340 | 343 |
341 int64_t timestamp_; | 344 int64_t timestamp_; |
342 ThreadId tid_; | 345 ThreadId tid_; |
343 Isolate* isolate_; | 346 Isolate* isolate_; |
344 uword pc_marker_; | 347 uword pc_marker_; |
345 uword stack_buffer_[kStackBufferSizeInWords]; | 348 uword stack_buffer_[kStackBufferSizeInWords]; |
346 uword vm_tag_; | 349 uword vm_tag_; |
347 uword user_tag_; | 350 uword user_tag_; |
348 uword sp_; | 351 uword metadata_; |
349 uword fp_; | |
350 uword lr_; | 352 uword lr_; |
351 uword state_; | 353 uword state_; |
352 | 354 |
353 /* There are a variable number of words that follow, the words hold the | 355 /* There are a variable number of words that follow, the words hold the |
354 * sampled pc values. Access via GetPCArray() */ | 356 * sampled pc values. Access via GetPCArray() */ |
355 | 357 |
356 DISALLOW_COPY_AND_ASSIGN(Sample); | 358 DISALLOW_COPY_AND_ASSIGN(Sample); |
357 }; | 359 }; |
358 | 360 |
359 | 361 |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
409 intptr_t capacity_; | 411 intptr_t capacity_; |
410 uintptr_t cursor_; | 412 uintptr_t cursor_; |
411 | 413 |
412 DISALLOW_COPY_AND_ASSIGN(SampleBuffer); | 414 DISALLOW_COPY_AND_ASSIGN(SampleBuffer); |
413 }; | 415 }; |
414 | 416 |
415 | 417 |
416 } // namespace dart | 418 } // namespace dart |
417 | 419 |
418 #endif // VM_PROFILER_H_ | 420 #endif // VM_PROFILER_H_ |
OLD | NEW |