Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(108)

Side by Side Diff: src/objects.cc

Issue 2095893002: Use source position table for unoptimized code. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/objects.h" 5 #include "src/objects.h"
6 6
7 #include <cmath> 7 #include <cmath>
8 #include <iomanip> 8 #include <iomanip>
9 #include <sstream> 9 #include <sstream>
10 10
(...skipping 20 matching lines...) Expand all
31 #include "src/execution.h" 31 #include "src/execution.h"
32 #include "src/field-index-inl.h" 32 #include "src/field-index-inl.h"
33 #include "src/field-index.h" 33 #include "src/field-index.h"
34 #include "src/field-type.h" 34 #include "src/field-type.h"
35 #include "src/frames-inl.h" 35 #include "src/frames-inl.h"
36 #include "src/full-codegen/full-codegen.h" 36 #include "src/full-codegen/full-codegen.h"
37 #include "src/ic/ic.h" 37 #include "src/ic/ic.h"
38 #include "src/identity-map.h" 38 #include "src/identity-map.h"
39 #include "src/interpreter/bytecode-array-iterator.h" 39 #include "src/interpreter/bytecode-array-iterator.h"
40 #include "src/interpreter/interpreter.h" 40 #include "src/interpreter/interpreter.h"
41 #include "src/interpreter/source-position-table.h"
42 #include "src/isolate-inl.h" 41 #include "src/isolate-inl.h"
43 #include "src/keys.h" 42 #include "src/keys.h"
44 #include "src/list.h" 43 #include "src/list.h"
45 #include "src/log.h" 44 #include "src/log.h"
46 #include "src/lookup.h" 45 #include "src/lookup.h"
47 #include "src/macro-assembler.h" 46 #include "src/macro-assembler.h"
48 #include "src/messages.h" 47 #include "src/messages.h"
49 #include "src/objects-body-descriptors-inl.h" 48 #include "src/objects-body-descriptors-inl.h"
50 #include "src/property-descriptor.h" 49 #include "src/property-descriptor.h"
51 #include "src/prototype.h" 50 #include "src/prototype.h"
52 #include "src/regexp/jsregexp.h" 51 #include "src/regexp/jsregexp.h"
53 #include "src/safepoint-table.h" 52 #include "src/safepoint-table.h"
53 #include "src/source-position-table.h"
54 #include "src/string-builder.h" 54 #include "src/string-builder.h"
55 #include "src/string-search.h" 55 #include "src/string-search.h"
56 #include "src/string-stream.h" 56 #include "src/string-stream.h"
57 #include "src/utils.h" 57 #include "src/utils.h"
58 #include "src/zone.h" 58 #include "src/zone.h"
59 59
60 #ifdef ENABLE_DISASSEMBLER 60 #ifdef ENABLE_DISASSEMBLER
61 #include "src/disasm.h" 61 #include "src/disasm.h"
62 #include "src/disassembler.h" 62 #include "src/disassembler.h"
63 #endif 63 #endif
(...skipping 13412 matching lines...) Expand 10 before | Expand all | Expand 10 after
13476 } 13476 }
13477 } 13477 }
13478 Assembler::FlushICache(GetIsolate(), instruction_start(), instruction_size()); 13478 Assembler::FlushICache(GetIsolate(), instruction_start(), instruction_size());
13479 } 13479 }
13480 13480
13481 // Locate the source position which is closest to the code offset. This is 13481 // Locate the source position which is closest to the code offset. This is
13482 // using the source position information embedded in the relocation info. 13482 // using the source position information embedded in the relocation info.
13483 // The position returned is relative to the beginning of the script where the 13483 // The position returned is relative to the beginning of the script where the
13484 // source for this function is found. 13484 // source for this function is found.
13485 int Code::SourcePosition(int code_offset) { 13485 int Code::SourcePosition(int code_offset) {
13486 int position = RelocInfo::kNoPosition; // Initially no position found.
13486 // Subtract one because the current PC is one instruction after the call site. 13487 // Subtract one because the current PC is one instruction after the call site.
13487 Address pc = instruction_start() + code_offset - 1; 13488 code_offset--;
13488 int position = RelocInfo::kNoPosition; // Initially no position found.
13489 // Find the closest position attached to a pc lower or equal to the current. 13489 // Find the closest position attached to a pc lower or equal to the current.
13490 // Note that the pc of reloc infos grow monotonically. 13490 // Note that the pc of reloc infos grow monotonically.
13491 for (RelocIterator it(this, RelocInfo::kPositionMask); 13491 if (kind() == FUNCTION) {
13492 !it.done() && it.rinfo()->pc() <= pc; it.next()) { 13492 for (SourcePositionTableIterator it(source_position_table());
13493 position = static_cast<int>(it.rinfo()->data()); 13493 !it.done() && it.code_offset() <= code_offset; it.Advance()) {
13494 position = it.source_position();
13495 }
13496 } else {
13497 Address pc = instruction_start() + code_offset;
13498 for (RelocIterator it(this, RelocInfo::kPositionMask);
13499 !it.done() && it.rinfo()->pc() <= pc; it.next()) {
13500 position = static_cast<int>(it.rinfo()->data());
13501 }
13494 } 13502 }
13495 DCHECK(kind() == FUNCTION || (is_optimized_code() && is_turbofanned()) || 13503 DCHECK(kind() == FUNCTION || (is_optimized_code() && is_turbofanned()) ||
13496 is_wasm_code() || position == RelocInfo::kNoPosition); 13504 is_wasm_code() || position == RelocInfo::kNoPosition);
13497 return position; 13505 return position;
13498 } 13506 }
13499 13507
13500 13508
13501 // Same as Code::SourcePosition above except it only looks for statement 13509 // Same as Code::SourcePosition above except it only looks for statement
13502 // positions. 13510 // positions.
13503 int Code::SourceStatementPosition(int code_offset) { 13511 int Code::SourceStatementPosition(int code_offset) {
13504 // First find the closest position. 13512 // First find the closest position.
13505 int position = SourcePosition(code_offset); 13513 int position = SourcePosition(code_offset);
13506 // Now find the closest statement position before the position. 13514 // Now find the closest statement position before the position.
13507 int statement_position = 0; 13515 int statement_position = 0;
13508 for (RelocIterator it(this, RelocInfo::kPositionMask); !it.done(); 13516 if (kind() == FUNCTION) {
13509 it.next()) { 13517 for (SourcePositionTableIterator it(source_position_table()); !it.done();
13510 if (RelocInfo::IsStatementPosition(it.rinfo()->rmode())) { 13518 it.Advance()) {
13511 int p = static_cast<int>(it.rinfo()->data()); 13519 if (it.is_statement()) {
13512 if (statement_position < p && p <= position) { 13520 int p = it.source_position();
13513 statement_position = p; 13521 if (statement_position < p && p <= position) {
13522 statement_position = p;
13523 }
13524 }
13525 }
13526 } else {
13527 for (RelocIterator it(this, RelocInfo::kPositionMask); !it.done();
13528 it.next()) {
13529 if (RelocInfo::IsStatementPosition(it.rinfo()->rmode())) {
13530 int p = static_cast<int>(it.rinfo()->data());
13531 if (statement_position < p && p <= position) {
13532 statement_position = p;
13533 }
13514 } 13534 }
13515 } 13535 }
13516 } 13536 }
13517 return statement_position; 13537 return statement_position;
13518 } 13538 }
13519 13539
13520 13540
13521 SafepointEntry Code::GetSafepointEntry(Address pc) { 13541 SafepointEntry Code::GetSafepointEntry(Address pc) {
13522 SafepointTable table(this); 13542 SafepointTable table(this);
13523 return table.FindEntry(pc); 13543 return table.FindEntry(pc);
(...skipping 780 matching lines...) Expand 10 before | Expand all | Expand 10 after
14304 os << "RelocInfo (size = " << relocation_size() << ")\n"; 14324 os << "RelocInfo (size = " << relocation_size() << ")\n";
14305 for (RelocIterator it(this); !it.done(); it.next()) { 14325 for (RelocIterator it(this); !it.done(); it.next()) {
14306 it.rinfo()->Print(GetIsolate(), os); 14326 it.rinfo()->Print(GetIsolate(), os);
14307 } 14327 }
14308 os << "\n"; 14328 os << "\n";
14309 } 14329 }
14310 #endif // ENABLE_DISASSEMBLER 14330 #endif // ENABLE_DISASSEMBLER
14311 14331
14312 int BytecodeArray::SourcePosition(int offset) { 14332 int BytecodeArray::SourcePosition(int offset) {
14313 int last_position = 0; 14333 int last_position = 0;
14314 for (interpreter::SourcePositionTableIterator iterator( 14334 for (SourcePositionTableIterator iterator(source_position_table());
14315 source_position_table()); 14335 !iterator.done() && iterator.code_offset() <= offset;
14316 !iterator.done() && iterator.bytecode_offset() <= offset;
14317 iterator.Advance()) { 14336 iterator.Advance()) {
14318 last_position = iterator.source_position(); 14337 last_position = iterator.source_position();
14319 } 14338 }
14320 return last_position; 14339 return last_position;
14321 } 14340 }
14322 14341
14323 int BytecodeArray::SourceStatementPosition(int offset) { 14342 int BytecodeArray::SourceStatementPosition(int offset) {
14324 // First find the closest position. 14343 // First find the closest position.
14325 int position = SourcePosition(offset); 14344 int position = SourcePosition(offset);
14326 // Now find the closest statement position before the position. 14345 // Now find the closest statement position before the position.
14327 int statement_position = 0; 14346 int statement_position = 0;
14328 for (interpreter::SourcePositionTableIterator it(source_position_table()); 14347 for (SourcePositionTableIterator it(source_position_table()); !it.done();
14329 !it.done(); it.Advance()) { 14348 it.Advance()) {
14330 if (it.is_statement()) { 14349 if (it.is_statement()) {
14331 int p = it.source_position(); 14350 int p = it.source_position();
14332 if (statement_position < p && p <= position) { 14351 if (statement_position < p && p <= position) {
14333 statement_position = p; 14352 statement_position = p;
14334 } 14353 }
14335 } 14354 }
14336 } 14355 }
14337 return statement_position; 14356 return statement_position;
14338 } 14357 }
14339 14358
14340 void BytecodeArray::Disassemble(std::ostream& os) { 14359 void BytecodeArray::Disassemble(std::ostream& os) {
14341 os << "Parameter count " << parameter_count() << "\n"; 14360 os << "Parameter count " << parameter_count() << "\n";
14342 os << "Frame size " << frame_size() << "\n"; 14361 os << "Frame size " << frame_size() << "\n";
14343 14362
14344 const uint8_t* base_address = GetFirstBytecodeAddress(); 14363 const uint8_t* base_address = GetFirstBytecodeAddress();
14345 interpreter::SourcePositionTableIterator source_positions( 14364 SourcePositionTableIterator source_positions(source_position_table());
14346 source_position_table());
14347 14365
14348 interpreter::BytecodeArrayIterator iterator(handle(this)); 14366 interpreter::BytecodeArrayIterator iterator(handle(this));
14349 while (!iterator.done()) { 14367 while (!iterator.done()) {
14350 if (!source_positions.done() && 14368 if (!source_positions.done() &&
14351 iterator.current_offset() == source_positions.bytecode_offset()) { 14369 iterator.current_offset() == source_positions.code_offset()) {
14352 os << std::setw(5) << source_positions.source_position(); 14370 os << std::setw(5) << source_positions.source_position();
14353 os << (source_positions.is_statement() ? " S> " : " E> "); 14371 os << (source_positions.is_statement() ? " S> " : " E> ");
14354 source_positions.Advance(); 14372 source_positions.Advance();
14355 } else { 14373 } else {
14356 os << " "; 14374 os << " ";
14357 } 14375 }
14358 const uint8_t* current_address = base_address + iterator.current_offset(); 14376 const uint8_t* current_address = base_address + iterator.current_offset();
14359 os << reinterpret_cast<const void*>(current_address) << " @ " 14377 os << reinterpret_cast<const void*>(current_address) << " @ "
14360 << std::setw(4) << iterator.current_offset() << " : "; 14378 << std::setw(4) << iterator.current_offset() << " : ";
14361 interpreter::Bytecodes::Decode(os, current_address, parameter_count()); 14379 interpreter::Bytecodes::Decode(os, current_address, parameter_count());
(...skipping 4490 matching lines...) Expand 10 before | Expand all | Expand 10 after
18852 } else { 18870 } else {
18853 // Old-style generators. 18871 // Old-style generators.
18854 int offset = continuation(); 18872 int offset = continuation();
18855 CHECK(0 <= offset && offset < function()->code()->instruction_size()); 18873 CHECK(0 <= offset && offset < function()->code()->instruction_size());
18856 return function()->code()->SourcePosition(offset); 18874 return function()->code()->SourcePosition(offset);
18857 } 18875 }
18858 } 18876 }
18859 18877
18860 } // namespace internal 18878 } // namespace internal
18861 } // namespace v8 18879 } // namespace v8
OLDNEW
« no previous file with comments | « src/objects.h ('k') | src/objects-body-descriptors-inl.h » ('j') | src/objects-inl.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698