| 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 #include "platform/assert.h" | 5 #include "platform/assert.h" |
| 6 | 6 |
| 7 #include "vm/dart_api_impl.h" | 7 #include "vm/dart_api_impl.h" |
| 8 #include "vm/dart_api_state.h" | 8 #include "vm/dart_api_state.h" |
| 9 #include "vm/globals.h" | 9 #include "vm/globals.h" |
| 10 #include "vm/profiler.h" | 10 #include "vm/profiler.h" |
| (...skipping 2431 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2442 // See OffsetForPC in profiler_service.cc for more context. | 2442 // See OffsetForPC in profiler_service.cc for more context. |
| 2443 const intptr_t return_address_offset = i > 0 ? 1 : 0; | 2443 const intptr_t return_address_offset = i > 0 ? 1 : 0; |
| 2444 sample->SetAt(i, pc_offsets[i] + return_address_offset); | 2444 sample->SetAt(i, pc_offsets[i] + return_address_offset); |
| 2445 i++; | 2445 i++; |
| 2446 } | 2446 } |
| 2447 sample->SetAt(i, 0); | 2447 sample->SetAt(i, 0); |
| 2448 } | 2448 } |
| 2449 | 2449 |
| 2450 | 2450 |
| 2451 static uword FindPCForTokenPosition(const Code& code, | 2451 static uword FindPCForTokenPosition(const Code& code, |
| 2452 const CodeSourceMap& code_source_map, | |
| 2453 TokenPosition tp) { | 2452 TokenPosition tp) { |
| 2454 CodeSourceMap::Iterator it(code_source_map); | 2453 GrowableArray<const Function*> functions; |
| 2455 | 2454 GrowableArray<TokenPosition> token_positions; |
| 2456 while (it.MoveNext()) { | 2455 for (intptr_t pc_offset = 0; pc_offset < code.Size(); pc_offset++) { |
| 2457 if (it.TokenPos() == tp) { | 2456 code.GetInlinedFunctionsAt(pc_offset, &functions, &token_positions); |
| 2458 return it.PcOffset() + code.PayloadStart(); | 2457 if (token_positions[0] == tp) { |
| 2458 return code.PayloadStart() + pc_offset; |
| 2459 } | 2459 } |
| 2460 } | 2460 } |
| 2461 | 2461 |
| 2462 return 0; | 2462 return 0; |
| 2463 } | 2463 } |
| 2464 | 2464 |
| 2465 | 2465 |
| 2466 TEST_CASE(Profiler_GetSourceReport) { | 2466 TEST_CASE(Profiler_GetSourceReport) { |
| 2467 const char* kScript = | 2467 const char* kScript = |
| 2468 "doWork(i) => i * i;\n" | 2468 "doWork(i) => i * i;\n" |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2515 | 2515 |
| 2516 const Script& script = Script::Handle(main.script()); | 2516 const Script& script = Script::Handle(main.script()); |
| 2517 EXPECT(!script.IsNull()); | 2517 EXPECT(!script.IsNull()); |
| 2518 | 2518 |
| 2519 const Code& main_code = Code::Handle(main.CurrentCode()); | 2519 const Code& main_code = Code::Handle(main.CurrentCode()); |
| 2520 EXPECT(!main_code.IsNull()); | 2520 EXPECT(!main_code.IsNull()); |
| 2521 | 2521 |
| 2522 const Code& do_work_code = Code::Handle(do_work.CurrentCode()); | 2522 const Code& do_work_code = Code::Handle(do_work.CurrentCode()); |
| 2523 EXPECT(!do_work_code.IsNull()); | 2523 EXPECT(!do_work_code.IsNull()); |
| 2524 | 2524 |
| 2525 const CodeSourceMap& main_code_source_map = | |
| 2526 CodeSourceMap::Handle(main_code.code_source_map()); | |
| 2527 EXPECT(!main_code_source_map.IsNull()); | |
| 2528 | |
| 2529 const CodeSourceMap& do_work_code_source_map = | |
| 2530 CodeSourceMap::Handle(do_work_code.code_source_map()); | |
| 2531 EXPECT(!do_work_code_source_map.IsNull()); | |
| 2532 | |
| 2533 // Dump code source map. | 2525 // Dump code source map. |
| 2534 CodeSourceMap::Dump(do_work_code_source_map, do_work_code, main); | 2526 do_work_code.DumpSourcePositions(); |
| 2535 CodeSourceMap::Dump(main_code_source_map, main_code, main); | 2527 main_code.DumpSourcePositions(); |
| 2536 | 2528 |
| 2537 // Look up some source token position's pc. | 2529 // Look up some source token position's pc. |
| 2538 uword squarePositionPc = FindPCForTokenPosition( | 2530 uword squarePositionPc = FindPCForTokenPosition(do_work_code, squarePosition); |
| 2539 do_work_code, do_work_code_source_map, squarePosition); | |
| 2540 EXPECT(squarePositionPc != 0); | 2531 EXPECT(squarePositionPc != 0); |
| 2541 | 2532 |
| 2542 uword callPositionPc = | 2533 uword callPositionPc = FindPCForTokenPosition(main_code, callPosition); |
| 2543 FindPCForTokenPosition(main_code, main_code_source_map, callPosition); | |
| 2544 EXPECT(callPositionPc != 0); | 2534 EXPECT(callPositionPc != 0); |
| 2545 | 2535 |
| 2546 // Look up some classifying token position's pc. | 2536 // Look up some classifying token position's pc. |
| 2547 uword controlFlowPc = FindPCForTokenPosition( | 2537 uword controlFlowPc = |
| 2548 do_work_code, do_work_code_source_map, TokenPosition::kControlFlow); | 2538 FindPCForTokenPosition(do_work_code, TokenPosition::kControlFlow); |
| 2549 EXPECT(controlFlowPc != 0); | 2539 EXPECT(controlFlowPc != 0); |
| 2550 | 2540 |
| 2551 uword tempMovePc = FindPCForTokenPosition(main_code, main_code_source_map, | 2541 uword tempMovePc = |
| 2552 TokenPosition::kTempMove); | 2542 FindPCForTokenPosition(main_code, TokenPosition::kTempMove); |
| 2553 EXPECT(tempMovePc != 0); | 2543 EXPECT(tempMovePc != 0); |
| 2554 | 2544 |
| 2555 // Insert fake samples. | 2545 // Insert fake samples. |
| 2556 | 2546 |
| 2557 // Sample 1: | 2547 // Sample 1: |
| 2558 // squarePositionPc exclusive. | 2548 // squarePositionPc exclusive. |
| 2559 // callPositionPc inclusive. | 2549 // callPositionPc inclusive. |
| 2560 uword sample1[] = {squarePositionPc, // doWork. | 2550 uword sample1[] = {squarePositionPc, // doWork. |
| 2561 callPositionPc, // main. | 2551 callPositionPc, // main. |
| 2562 0}; | 2552 0}; |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2602 EXPECT_SUBSTRING("\"positions\":[\"TempMove\",39]", js.ToCString()); | 2592 EXPECT_SUBSTRING("\"positions\":[\"TempMove\",39]", js.ToCString()); |
| 2603 // Verify exclusive ticks in main. | 2593 // Verify exclusive ticks in main. |
| 2604 EXPECT_SUBSTRING("\"exclusiveTicks\":[1,0]", js.ToCString()); | 2594 EXPECT_SUBSTRING("\"exclusiveTicks\":[1,0]", js.ToCString()); |
| 2605 // Verify inclusive ticks in main. | 2595 // Verify inclusive ticks in main. |
| 2606 EXPECT_SUBSTRING("\"inclusiveTicks\":[1,2]", js.ToCString()); | 2596 EXPECT_SUBSTRING("\"inclusiveTicks\":[1,2]", js.ToCString()); |
| 2607 } | 2597 } |
| 2608 | 2598 |
| 2609 #endif // !PRODUCT | 2599 #endif // !PRODUCT |
| 2610 | 2600 |
| 2611 } // namespace dart | 2601 } // namespace dart |
| OLD | NEW |