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

Unified Diff: src/objects.cc

Issue 2109673003: Use source position table in turbofan code. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: drive-by fix for relocation info size reservation 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/objects.h ('k') | src/objects-inl.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/objects.cc
diff --git a/src/objects.cc b/src/objects.cc
index defde30c44468f4b6190a14dabddcce05dd1284a..cd9ccce272fe5854193e3fef1cf1f51526909586 100644
--- a/src/objects.cc
+++ b/src/objects.cc
@@ -13582,65 +13582,6 @@ void Code::CopyFrom(const CodeDesc& desc) {
Assembler::FlushICache(GetIsolate(), instruction_start(), instruction_size());
}
-// Locate the source position which is closest to the code offset. This is
-// using the source position information embedded in the relocation info.
-// The position returned is relative to the beginning of the script where the
-// source for this function is found.
-int Code::SourcePosition(int code_offset) {
- int position = RelocInfo::kNoPosition; // Initially no position found.
- // Subtract one because the current PC is one instruction after the call site.
- code_offset--;
- // Find the closest position attached to a pc lower or equal to the current.
- // Note that the pc of reloc infos grow monotonically.
- if (kind() == FUNCTION || (is_optimized_code() && !is_turbofanned())) {
- for (SourcePositionTableIterator it(source_position_table());
- !it.done() && it.code_offset() <= code_offset; it.Advance()) {
- position = it.source_position();
- }
- } else {
- Address pc = instruction_start() + code_offset;
- for (RelocIterator it(this, RelocInfo::kPositionMask);
- !it.done() && it.rinfo()->pc() <= pc; it.next()) {
- position = static_cast<int>(it.rinfo()->data());
- }
- }
- DCHECK(kind() == FUNCTION || (is_optimized_code() && is_turbofanned()) ||
- is_wasm_code() || position == RelocInfo::kNoPosition);
- return position;
-}
-
-
-// Same as Code::SourcePosition above except it only looks for statement
-// positions.
-int Code::SourceStatementPosition(int code_offset) {
- // First find the closest position.
- int position = SourcePosition(code_offset);
- // Now find the closest statement position before the position.
- int statement_position = 0;
- if (kind() == FUNCTION || (is_optimized_code() && !is_turbofanned())) {
- for (SourcePositionTableIterator it(source_position_table()); !it.done();
- it.Advance()) {
- if (it.is_statement()) {
- int p = it.source_position();
- if (statement_position < p && p <= position) {
- statement_position = p;
- }
- }
- }
- } else {
- for (RelocIterator it(this, RelocInfo::kPositionMask); !it.done();
- it.next()) {
- if (RelocInfo::IsStatementPosition(it.rinfo()->rmode())) {
- int p = static_cast<int>(it.rinfo()->data());
- if (statement_position < p && p <= position) {
- statement_position = p;
- }
- }
- }
- }
- return statement_position;
-}
-
SafepointEntry Code::GetSafepointEntry(Address pc) {
SafepointTable table(this);
@@ -13715,13 +13656,32 @@ void Code::ClearInlineCaches() {
}
int AbstractCode::SourcePosition(int offset) {
- return IsBytecodeArray() ? GetBytecodeArray()->SourcePosition(offset)
- : GetCode()->SourcePosition(offset);
+ int position = 0;
+ // Subtract one because the current PC is one instruction after the call site.
+ if (IsCode()) offset--;
+ for (SourcePositionTableIterator iterator(source_position_table());
+ !iterator.done() && iterator.code_offset() <= offset;
+ iterator.Advance()) {
+ position = iterator.source_position();
+ }
+ return position;
}
int AbstractCode::SourceStatementPosition(int offset) {
- return IsBytecodeArray() ? GetBytecodeArray()->SourceStatementPosition(offset)
- : GetCode()->SourceStatementPosition(offset);
+ // First find the closest position.
+ int position = SourcePosition(offset);
+ // Now find the closest statement position before the position.
+ int statement_position = 0;
+ for (SourcePositionTableIterator it(source_position_table()); !it.done();
+ it.Advance()) {
+ if (it.is_statement()) {
+ int p = it.source_position();
+ if (statement_position < p && p <= position) {
+ statement_position = p;
+ }
+ }
+ }
+ return statement_position;
}
void JSFunction::ClearTypeFeedbackInfo() {
@@ -14437,32 +14397,6 @@ void Code::Disassemble(const char* name, std::ostream& os) { // NOLINT
}
#endif // ENABLE_DISASSEMBLER
-int BytecodeArray::SourcePosition(int offset) {
- int last_position = 0;
- for (SourcePositionTableIterator iterator(source_position_table());
- !iterator.done() && iterator.code_offset() <= offset;
- iterator.Advance()) {
- last_position = iterator.source_position();
- }
- return last_position;
-}
-
-int BytecodeArray::SourceStatementPosition(int offset) {
- // First find the closest position.
- int position = SourcePosition(offset);
- // Now find the closest statement position before the position.
- int statement_position = 0;
- for (SourcePositionTableIterator it(source_position_table()); !it.done();
- it.Advance()) {
- if (it.is_statement()) {
- int p = it.source_position();
- if (statement_position < p && p <= position) {
- statement_position = p;
- }
- }
- }
- return statement_position;
-}
void BytecodeArray::Disassemble(std::ostream& os) {
os << "Parameter count " << parameter_count() << "\n";
@@ -18970,19 +18904,23 @@ void PropertyCell::SetValueWithInvalidation(Handle<PropertyCell> cell,
int JSGeneratorObject::source_position() const {
CHECK(is_suspended());
+ AbstractCode* code;
+ int code_offset;
if (function()->shared()->HasBytecodeArray()) {
// New-style generators.
- int offset = Smi::cast(input_or_debug_pos())->value();
+ code_offset = Smi::cast(input_or_debug_pos())->value();
// The stored bytecode offset is relative to a different base than what
// is used in the source position table, hence the subtraction.
- offset -= BytecodeArray::kHeaderSize - kHeapObjectTag;
- return function()->shared()->bytecode_array()->SourcePosition(offset);
+ code_offset -= BytecodeArray::kHeaderSize - kHeapObjectTag;
+ code = AbstractCode::cast(function()->shared()->bytecode_array());
} else {
// Old-style generators.
- int offset = continuation();
- CHECK(0 <= offset && offset < function()->code()->instruction_size());
- return function()->code()->SourcePosition(offset);
+ code_offset = continuation();
+ CHECK(0 <= code_offset);
+ CHECK(code_offset < function()->code()->instruction_size());
+ code = AbstractCode::cast(function()->shared()->code());
}
+ return code->SourcePosition(code_offset);
}
// static
« no previous file with comments | « src/objects.h ('k') | src/objects-inl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698