OLD | NEW |
1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
277 } else { | 277 } else { |
278 return SourcePositionInfo(pos, function); | 278 return SourcePositionInfo(pos, function); |
279 } | 279 } |
280 } | 280 } |
281 | 281 |
282 } // namespace | 282 } // namespace |
283 | 283 |
284 void PerfJitLogger::LogWriteDebugInfo(Code* code, SharedFunctionInfo* shared) { | 284 void PerfJitLogger::LogWriteDebugInfo(Code* code, SharedFunctionInfo* shared) { |
285 // Compute the entry count and get the name of the script. | 285 // Compute the entry count and get the name of the script. |
286 uint32_t entry_count = 0; | 286 uint32_t entry_count = 0; |
287 for (SourcePositionTableIterator iterator(code->source_position_table()); | 287 for (SourcePositionTableIterator iterator(code->SourcePositionTable()); |
288 !iterator.done(); iterator.Advance()) { | 288 !iterator.done(); iterator.Advance()) { |
289 entry_count++; | 289 entry_count++; |
290 } | 290 } |
291 if (entry_count == 0) return; | 291 if (entry_count == 0) return; |
292 Handle<Script> script(Script::cast(shared->script())); | 292 Handle<Script> script(Script::cast(shared->script())); |
293 | 293 |
294 PerfJitCodeDebugInfo debug_info; | 294 PerfJitCodeDebugInfo debug_info; |
295 | 295 |
296 debug_info.event_ = PerfJitCodeLoad::kDebugInfo; | 296 debug_info.event_ = PerfJitCodeLoad::kDebugInfo; |
297 debug_info.time_stamp_ = GetTimestamp(); | 297 debug_info.time_stamp_ = GetTimestamp(); |
298 debug_info.address_ = reinterpret_cast<uint64_t>(code->instruction_start()); | 298 debug_info.address_ = reinterpret_cast<uint64_t>(code->instruction_start()); |
299 debug_info.entry_count_ = entry_count; | 299 debug_info.entry_count_ = entry_count; |
300 | 300 |
301 uint32_t size = sizeof(debug_info); | 301 uint32_t size = sizeof(debug_info); |
302 // Add the sizes of fixed parts of entries. | 302 // Add the sizes of fixed parts of entries. |
303 size += entry_count * sizeof(PerfJitDebugEntry); | 303 size += entry_count * sizeof(PerfJitDebugEntry); |
304 // Add the size of the name after each entry. | 304 // Add the size of the name after each entry. |
305 | 305 |
306 Handle<Code> code_handle(code); | 306 Handle<Code> code_handle(code); |
307 Handle<SharedFunctionInfo> function_handle(shared); | 307 Handle<SharedFunctionInfo> function_handle(shared); |
308 for (SourcePositionTableIterator iterator(code->source_position_table()); | 308 for (SourcePositionTableIterator iterator(code->SourcePositionTable()); |
309 !iterator.done(); iterator.Advance()) { | 309 !iterator.done(); iterator.Advance()) { |
310 SourcePositionInfo info(GetSourcePositionInfo(code_handle, function_handle, | 310 SourcePositionInfo info(GetSourcePositionInfo(code_handle, function_handle, |
311 iterator.source_position())); | 311 iterator.source_position())); |
312 Handle<Script> script(Script::cast(info.function->script())); | 312 Handle<Script> script(Script::cast(info.function->script())); |
313 std::unique_ptr<char[]> name_string = GetScriptName(script); | 313 std::unique_ptr<char[]> name_string = GetScriptName(script); |
314 size += (static_cast<uint32_t>(strlen(name_string.get())) + 1); | 314 size += (static_cast<uint32_t>(strlen(name_string.get())) + 1); |
315 } | 315 } |
316 | 316 |
317 int padding = ((size + 7) & (~7)) - size; | 317 int padding = ((size + 7) & (~7)) - size; |
318 debug_info.size_ = size + padding; | 318 debug_info.size_ = size + padding; |
319 LogWriteBytes(reinterpret_cast<const char*>(&debug_info), sizeof(debug_info)); | 319 LogWriteBytes(reinterpret_cast<const char*>(&debug_info), sizeof(debug_info)); |
320 | 320 |
321 Address code_start = code->instruction_start(); | 321 Address code_start = code->instruction_start(); |
322 | 322 |
323 for (SourcePositionTableIterator iterator(code->source_position_table()); | 323 for (SourcePositionTableIterator iterator(code->SourcePositionTable()); |
324 !iterator.done(); iterator.Advance()) { | 324 !iterator.done(); iterator.Advance()) { |
325 SourcePositionInfo info(GetSourcePositionInfo(code_handle, function_handle, | 325 SourcePositionInfo info(GetSourcePositionInfo(code_handle, function_handle, |
326 iterator.source_position())); | 326 iterator.source_position())); |
327 PerfJitDebugEntry entry; | 327 PerfJitDebugEntry entry; |
328 // The entry point of the function will be placed straight after the ELF | 328 // The entry point of the function will be placed straight after the ELF |
329 // header when processed by "perf inject". Adjust the position addresses | 329 // header when processed by "perf inject". Adjust the position addresses |
330 // accordingly. | 330 // accordingly. |
331 entry.address_ = reinterpret_cast<intptr_t>( | 331 entry.address_ = reinterpret_cast<intptr_t>( |
332 code_start + iterator.code_offset() + kElfHeaderSize); | 332 code_start + iterator.code_offset() + kElfHeaderSize); |
333 entry.line_number_ = info.line + 1; | 333 entry.line_number_ = info.line + 1; |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
401 header.time_stamp_ = | 401 header.time_stamp_ = |
402 static_cast<uint64_t>(base::OS::TimeCurrentMillis() * 1000.0); | 402 static_cast<uint64_t>(base::OS::TimeCurrentMillis() * 1000.0); |
403 header.flags_ = 0; | 403 header.flags_ = 0; |
404 | 404 |
405 LogWriteBytes(reinterpret_cast<const char*>(&header), sizeof(header)); | 405 LogWriteBytes(reinterpret_cast<const char*>(&header), sizeof(header)); |
406 } | 406 } |
407 | 407 |
408 #endif // V8_OS_LINUX | 408 #endif // V8_OS_LINUX |
409 } // namespace internal | 409 } // namespace internal |
410 } // namespace v8 | 410 } // namespace v8 |
OLD | NEW |