OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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/compiler/code-generator.h" | 5 #include "src/compiler/code-generator.h" |
6 | 6 |
7 #include "src/address-map.h" | 7 #include "src/address-map.h" |
8 #include "src/compiler/code-generator-impl.h" | 8 #include "src/compiler/code-generator-impl.h" |
9 #include "src/compiler/linkage.h" | 9 #include "src/compiler/linkage.h" |
10 #include "src/compiler/pipeline.h" | 10 #include "src/compiler/pipeline.h" |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
45 safepoints_(code->zone()), | 45 safepoints_(code->zone()), |
46 handlers_(code->zone()), | 46 handlers_(code->zone()), |
47 deoptimization_exits_(code->zone()), | 47 deoptimization_exits_(code->zone()), |
48 deoptimization_states_(code->zone()), | 48 deoptimization_states_(code->zone()), |
49 deoptimization_literals_(code->zone()), | 49 deoptimization_literals_(code->zone()), |
50 inlined_function_count_(0), | 50 inlined_function_count_(0), |
51 translations_(code->zone()), | 51 translations_(code->zone()), |
52 last_lazy_deopt_pc_(0), | 52 last_lazy_deopt_pc_(0), |
53 jump_tables_(nullptr), | 53 jump_tables_(nullptr), |
54 ools_(nullptr), | 54 ools_(nullptr), |
55 osr_pc_offset_(-1) { | 55 osr_pc_offset_(-1), |
| 56 source_position_table_builder_(info->isolate(), zone()) { |
56 for (int i = 0; i < code->InstructionBlockCount(); ++i) { | 57 for (int i = 0; i < code->InstructionBlockCount(); ++i) { |
57 new (&labels_[i]) Label; | 58 new (&labels_[i]) Label; |
58 } | 59 } |
59 CreateFrameAccessState(frame); | 60 CreateFrameAccessState(frame); |
60 } | 61 } |
61 | 62 |
62 void CodeGenerator::CreateFrameAccessState(Frame* frame) { | 63 void CodeGenerator::CreateFrameAccessState(Frame* frame) { |
63 FinishFrame(frame); | 64 FinishFrame(frame); |
64 frame_access_state_ = new (code()->zone()) FrameAccessState(frame); | 65 frame_access_state_ = new (code()->zone()) FrameAccessState(frame); |
65 } | 66 } |
66 | 67 |
67 Handle<Code> CodeGenerator::GenerateCode() { | 68 Handle<Code> CodeGenerator::GenerateCode() { |
68 CompilationInfo* info = this->info(); | 69 CompilationInfo* info = this->info(); |
69 | 70 |
70 // Open a frame scope to indicate that there is a frame on the stack. The | 71 // Open a frame scope to indicate that there is a frame on the stack. The |
71 // MANUAL indicates that the scope shouldn't actually generate code to set up | 72 // MANUAL indicates that the scope shouldn't actually generate code to set up |
72 // the frame (that is done in AssemblePrologue). | 73 // the frame (that is done in AssemblePrologue). |
73 FrameScope frame_scope(masm(), StackFrame::MANUAL); | 74 FrameScope frame_scope(masm(), StackFrame::MANUAL); |
74 | 75 |
75 // Emit a code line info recording start event. | 76 // Emit a code line info recording start event. |
76 PositionsRecorder* recorder = masm()->positions_recorder(); | 77 LOG_CODE_EVENT(isolate(), CodeStartLinePosInfoRecordEvent( |
77 LOG_CODE_EVENT(isolate(), CodeStartLinePosInfoRecordEvent(recorder)); | 78 &source_position_table_builder_)); |
78 | 79 |
79 // Place function entry hook if requested to do so. | 80 // Place function entry hook if requested to do so. |
80 if (linkage()->GetIncomingDescriptor()->IsJSFunctionCall()) { | 81 if (linkage()->GetIncomingDescriptor()->IsJSFunctionCall()) { |
81 ProfileEntryHookStub::MaybeCallEntryHook(masm()); | 82 ProfileEntryHookStub::MaybeCallEntryHook(masm()); |
82 } | 83 } |
83 // Architecture-specific, linkage-specific prologue. | 84 // Architecture-specific, linkage-specific prologue. |
84 info->set_prologue_offset(masm()->pc_offset()); | 85 info->set_prologue_offset(masm()->pc_offset()); |
85 | 86 |
86 // Define deoptimization literals for all inlined functions. | 87 // Define deoptimization literals for all inlined functions. |
87 DCHECK_EQ(0u, deoptimization_literals_.size()); | 88 DCHECK_EQ(0u, deoptimization_literals_.size()); |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
202 } | 203 } |
203 } | 204 } |
204 | 205 |
205 safepoints()->Emit(masm(), frame()->GetTotalFrameSlotCount()); | 206 safepoints()->Emit(masm(), frame()->GetTotalFrameSlotCount()); |
206 | 207 |
207 Handle<Code> result = | 208 Handle<Code> result = |
208 v8::internal::CodeGenerator::MakeCodeEpilogue(masm(), info); | 209 v8::internal::CodeGenerator::MakeCodeEpilogue(masm(), info); |
209 result->set_is_turbofanned(true); | 210 result->set_is_turbofanned(true); |
210 result->set_stack_slots(frame()->GetTotalFrameSlotCount()); | 211 result->set_stack_slots(frame()->GetTotalFrameSlotCount()); |
211 result->set_safepoint_table_offset(safepoints()->GetCodeOffset()); | 212 result->set_safepoint_table_offset(safepoints()->GetCodeOffset()); |
| 213 Handle<ByteArray> source_positions = |
| 214 source_position_table_builder_.ToSourcePositionTable(); |
| 215 result->set_source_position_table(*source_positions); |
212 | 216 |
213 // Emit exception handler table. | 217 // Emit exception handler table. |
214 if (!handlers_.empty()) { | 218 if (!handlers_.empty()) { |
215 Handle<HandlerTable> table = | 219 Handle<HandlerTable> table = |
216 Handle<HandlerTable>::cast(isolate()->factory()->NewFixedArray( | 220 Handle<HandlerTable>::cast(isolate()->factory()->NewFixedArray( |
217 HandlerTable::LengthForReturn(static_cast<int>(handlers_.size())), | 221 HandlerTable::LengthForReturn(static_cast<int>(handlers_.size())), |
218 TENURED)); | 222 TENURED)); |
219 for (size_t i = 0; i < handlers_.size(); ++i) { | 223 for (size_t i = 0; i < handlers_.size(); ++i) { |
220 int position = handlers_[i].handler->pos(); | 224 int position = handlers_[i].handler->pos(); |
221 HandlerTable::CatchPrediction prediction = handlers_[i].caught_locally | 225 HandlerTable::CatchPrediction prediction = handlers_[i].caught_locally |
222 ? HandlerTable::CAUGHT | 226 ? HandlerTable::CAUGHT |
223 : HandlerTable::UNCAUGHT; | 227 : HandlerTable::UNCAUGHT; |
224 table->SetReturnOffset(static_cast<int>(i), handlers_[i].pc_offset); | 228 table->SetReturnOffset(static_cast<int>(i), handlers_[i].pc_offset); |
225 table->SetReturnHandler(static_cast<int>(i), position, prediction); | 229 table->SetReturnHandler(static_cast<int>(i), position, prediction); |
226 } | 230 } |
227 result->set_handler_table(*table); | 231 result->set_handler_table(*table); |
228 } | 232 } |
229 | 233 |
230 PopulateDeoptimizationData(result); | 234 PopulateDeoptimizationData(result); |
231 | 235 |
232 // Ensure there is space for lazy deoptimization in the relocation info. | 236 // Ensure there is space for lazy deoptimization in the relocation info. |
233 if (info->ShouldEnsureSpaceForLazyDeopt()) { | 237 if (info->ShouldEnsureSpaceForLazyDeopt()) { |
234 Deoptimizer::EnsureRelocSpaceForLazyDeoptimization(result); | 238 Deoptimizer::EnsureRelocSpaceForLazyDeoptimization(result); |
235 } | 239 } |
236 | 240 |
237 // Emit a code line info recording stop event. | 241 // Emit a code line info recording stop event. |
238 void* line_info = recorder->DetachJITHandlerData(); | 242 void* line_info = source_position_table_builder_.DetachJITHandlerData(); |
239 LOG_CODE_EVENT(isolate(), CodeEndLinePosInfoRecordEvent( | 243 LOG_CODE_EVENT(isolate(), CodeEndLinePosInfoRecordEvent( |
240 AbstractCode::cast(*result), line_info)); | 244 AbstractCode::cast(*result), line_info)); |
241 | 245 |
242 return result; | 246 return result; |
243 } | 247 } |
244 | 248 |
245 | 249 |
246 bool CodeGenerator::IsNextInAssemblyOrder(RpoNumber block) const { | 250 bool CodeGenerator::IsNextInAssemblyOrder(RpoNumber block) const { |
247 return code() | 251 return code() |
248 ->InstructionBlockAt(current_block_) | 252 ->InstructionBlockAt(current_block_) |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
391 } | 395 } |
392 | 396 |
393 | 397 |
394 void CodeGenerator::AssembleSourcePosition(Instruction* instr) { | 398 void CodeGenerator::AssembleSourcePosition(Instruction* instr) { |
395 SourcePosition source_position; | 399 SourcePosition source_position; |
396 if (!code()->GetSourcePosition(instr, &source_position)) return; | 400 if (!code()->GetSourcePosition(instr, &source_position)) return; |
397 if (source_position == current_source_position_) return; | 401 if (source_position == current_source_position_) return; |
398 current_source_position_ = source_position; | 402 current_source_position_ = source_position; |
399 if (source_position.IsUnknown()) return; | 403 if (source_position.IsUnknown()) return; |
400 int code_pos = source_position.raw(); | 404 int code_pos = source_position.raw(); |
401 masm()->positions_recorder()->RecordPosition(code_pos); | 405 source_position_table_builder_.AddPosition(masm()->pc_offset(), code_pos, |
| 406 false); |
402 if (FLAG_code_comments) { | 407 if (FLAG_code_comments) { |
403 CompilationInfo* info = this->info(); | 408 CompilationInfo* info = this->info(); |
404 if (!info->parse_info()) return; | 409 if (!info->parse_info()) return; |
405 Vector<char> buffer = Vector<char>::New(256); | 410 Vector<char> buffer = Vector<char>::New(256); |
406 int ln = Script::GetLineNumber(info->script(), code_pos); | 411 int ln = Script::GetLineNumber(info->script(), code_pos); |
407 int cn = Script::GetColumnNumber(info->script(), code_pos); | 412 int cn = Script::GetColumnNumber(info->script(), code_pos); |
408 if (info->script()->name()->IsString()) { | 413 if (info->script()->name()->IsString()) { |
409 Handle<String> file(String::cast(info->script()->name())); | 414 Handle<String> file(String::cast(info->script()->name())); |
410 base::OS::SNPrintF(buffer.start(), buffer.length(), "-- %s:%d:%d --", | 415 base::OS::SNPrintF(buffer.start(), buffer.length(), "-- %s:%d:%d --", |
411 file->ToCString().get(), ln, cn); | 416 file->ToCString().get(), ln, cn); |
(...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
815 : frame_(gen->frame()), masm_(gen->masm()), next_(gen->ools_) { | 820 : frame_(gen->frame()), masm_(gen->masm()), next_(gen->ools_) { |
816 gen->ools_ = this; | 821 gen->ools_ = this; |
817 } | 822 } |
818 | 823 |
819 | 824 |
820 OutOfLineCode::~OutOfLineCode() {} | 825 OutOfLineCode::~OutOfLineCode() {} |
821 | 826 |
822 } // namespace compiler | 827 } // namespace compiler |
823 } // namespace internal | 828 } // namespace internal |
824 } // namespace v8 | 829 } // namespace v8 |
OLD | NEW |