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

Unified Diff: runtime/vm/flow_graph_compiler.cc

Issue 1740503002: Build CodeSourceMap for each code object (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 10 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
Index: runtime/vm/flow_graph_compiler.cc
diff --git a/runtime/vm/flow_graph_compiler.cc b/runtime/vm/flow_graph_compiler.cc
index d64690937963ea03d7a98e5bb2c0bd04ee100936..d045c7544efa45d282c8d529bece98faaf6d9d98 100644
--- a/runtime/vm/flow_graph_compiler.cc
+++ b/runtime/vm/flow_graph_compiler.cc
@@ -201,6 +201,8 @@ FlowGraphCompiler::FlowGraphCompiler(
exception_handlers_list_(NULL),
pc_descriptors_list_(NULL),
stackmap_table_builder_(NULL),
+ code_source_map_builder_(NULL),
+ saved_code_size_(0),
block_info_(block_order_.length()),
deopt_infos_(),
static_calls_target_table_(),
@@ -531,7 +533,9 @@ void FlowGraphCompiler::VisitBlocks() {
LoopInfoComment(assembler(), *entry, *loop_headers);
entry->set_offset(assembler()->CodeSize());
+ SaveCodeSize();
entry->EmitNativeCode(this);
+ MaybeEmitCodeSourceMapEntry(entry->token_pos());
// Compile all successors until an exit, branch, or a block entry.
for (ForwardInstructionIterator it(entry); !it.Done(); it.Advance()) {
Instruction* instr = it.Current();
@@ -556,12 +560,14 @@ void FlowGraphCompiler::VisitBlocks() {
if (instr->IsParallelMove()) {
parallel_move_resolver_.EmitNativeCode(instr->AsParallelMove());
} else {
+ SaveCodeSize();
EmitInstructionPrologue(instr);
ASSERT(pending_deoptimization_env_ == NULL);
pending_deoptimization_env_ = instr->env();
instr->EmitNativeCode(this);
pending_deoptimization_env_ = NULL;
EmitInstructionEpilogue(instr);
+ MaybeEmitCodeSourceMapEntry(instr->token_pos());
}
#if defined(DEBUG)
@@ -738,10 +744,14 @@ void FlowGraphCompiler::AddSlowPathCode(SlowPathCode* code) {
void FlowGraphCompiler::GenerateDeferredCode() {
for (intptr_t i = 0; i < slow_path_code_.length(); i++) {
+ SaveCodeSize();
slow_path_code_[i]->GenerateCode(this);
+ MaybeEmitCodeSourceMapEntry(TokenPosition::kDeferredSlowPath);
}
for (intptr_t i = 0; i < deopt_infos_.length(); i++) {
+ SaveCodeSize();
deopt_infos_[i]->GenerateCode(this, i);
+ MaybeEmitCodeSourceMapEntry(TokenPosition::kDeferredDeoptInfo);
}
}
@@ -1438,7 +1448,9 @@ void ParallelMoveResolver::EmitNativeCode(ParallelMoveInstr* parallel_move) {
const MoveOperands& move = *moves_[i];
if (!move.IsEliminated()) {
ASSERT(move.src().IsConstant());
+ compiler_->SaveCodeSize();
EmitMove(i);
+ compiler_->MaybeEmitCodeSourceMapEntry(TokenPosition::kParallelMove);
}
}
@@ -1514,13 +1526,17 @@ void ParallelMoveResolver::PerformMove(int index) {
const MoveOperands& other_move = *moves_[i];
if (other_move.Blocks(destination)) {
ASSERT(other_move.IsPending());
+ compiler_->SaveCodeSize();
EmitSwap(index);
+ compiler_->MaybeEmitCodeSourceMapEntry(TokenPosition::kParallelMove);
return;
}
}
// This move is not blocked.
+ compiler_->SaveCodeSize();
EmitMove(index);
+ compiler_->MaybeEmitCodeSourceMapEntry(TokenPosition::kParallelMove);
}
@@ -1778,6 +1794,25 @@ RawArray* FlowGraphCompiler::CallerInliningIdMap() const {
}
+void FlowGraphCompiler::SaveCodeSize() {
+ // Remember how many bytes of code we emitted. This function
rmacnak 2016/02/25 23:04:40 NOT_IN_PRODUCT
rmacnak 2016/02/25 23:04:40 emitted so far
Cutch 2016/02/26 15:59:22 Done.
Cutch 2016/02/26 15:59:22 Done.
+ // is called before we call into an instruction's EmitNativeCode.
+ saved_code_size_ = assembler()->CodeSize();
+}
+
+
+bool FlowGraphCompiler::MaybeEmitCodeSourceMapEntry(TokenPosition token_pos) {
+ // This function is called after each instructions' EmitNativeCode.
rmacnak 2016/02/25 23:04:40 NOT_IN_PRODUCT
Cutch 2016/02/26 15:59:22 Done.
+ if (saved_code_size_ < assembler()->CodeSize()) {
+ // We emitted code, now associate the emitted code chunk with |token_pos|.
+ code_source_map_builder()->AddEntry(saved_code_size_, token_pos);
+ SaveCodeSize();
+ return true;
+ }
+ return false;
+}
+
+
void FlowGraphCompiler::EmitPolymorphicInstanceCall(
const ICData& ic_data,
intptr_t argument_count,

Powered by Google App Engine
This is Rietveld 408576698