Reviewers: Sven Panne,
Description:
Fix out-of-bounds read in SourcePositionToScriptPosition with
--hydrogen-track-positions.
We were indexing into the list of inlined functions with inlining ID, which
is
incorrect.
There can be multiple inlinining IDs corresponding to the same inlined
function,
because inlining ID is inlining path sensitive unique id for an inlining
attempt.
Additionally allow HAbnormalExit to have unknown source position even if we
are
tracking source positions. No code is generated from abnormal exits anyways.
[email protected]
BUG=v8:3184
Please review this at https://codereview.chromium.org/653993005/
Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Affected files (+9, -7 lines):
M src/hydrogen.h
M src/hydrogen.cc
Index: src/hydrogen.cc
diff --git a/src/hydrogen.cc b/src/hydrogen.cc
index
e956947495ebdebb7da03741ce57dc1d97f31173..8bb0538dc2f71527fd94d7f3ee97b077d9b6977c
100644
--- a/src/hydrogen.cc
+++ b/src/hydrogen.cc
@@ -144,7 +144,7 @@ void HBasicBlock::AddInstruction(HInstruction* instr,
entry->set_position(position);
} else {
DCHECK(!FLAG_hydrogen_track_positions ||
- !graph()->info()->IsOptimizing());
+ !graph()->info()->IsOptimizing() || instr->IsAbnormalExit());
}
first_ = last_ = entry;
}
@@ -3446,8 +3446,9 @@ HGraph::HGraph(CompilationInfo* info)
maximum_environment_size_(0),
no_side_effects_scope_count_(0),
disallow_adding_new_values_(false),
- next_inline_id_(0),
- inlined_functions_(5, info->zone()) {
+ inlined_functions_(FLAG_hydrogen_track_positions ? 5 : 0,
info->zone()),
+ inlining_id_to_function_id_(FLAG_hydrogen_track_positions ? 5 : 0,
+ info->zone()) {
if (info->IsStub()) {
CallInterfaceDescriptor descriptor =
info->code_stub()->GetCallInterfaceDescriptor();
@@ -3527,7 +3528,8 @@ int HGraph::TraceInlinedFunction(
}
}
- int inline_id = next_inline_id_++;
+ int inline_id = inlining_id_to_function_id_.length();
+ inlining_id_to_function_id_.Add(id, zone());
if (inline_id != 0) {
CodeTracer::Scope tracing_scope(isolate()->GetCodeTracer());
@@ -3546,8 +3548,8 @@ int
HGraph::SourcePositionToScriptPosition(HSourcePosition pos) {
return pos.raw();
}
- return inlined_functions_[pos.inlining_id()].start_position() +
- pos.position();
+ const int id = inlining_id_to_function_id_[pos.inlining_id()];
+ return inlined_functions_[id].start_position() + pos.position();
}
Index: src/hydrogen.h
diff --git a/src/hydrogen.h b/src/hydrogen.h
index
29885b333999f44940416a1937f1575a2d5b6ca9..437fada407eaf80c894a0f7fd0ffb683d110439d
100644
--- a/src/hydrogen.h
+++ b/src/hydrogen.h
@@ -524,8 +524,8 @@ class HGraph FINAL : public ZoneObject {
int start_position_;
};
- int next_inline_id_;
ZoneList<InlinedFunctionInfo> inlined_functions_;
+ ZoneList<int> inlining_id_to_function_id_;
DISALLOW_COPY_AND_ASSIGN(HGraph);
};
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.