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/base/adapters.h" | 8 #include "src/base/adapters.h" |
9 #include "src/compiler/code-generator-impl.h" | 9 #include "src/compiler/code-generator-impl.h" |
10 #include "src/compiler/linkage.h" | 10 #include "src/compiler/linkage.h" |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
52 translations_(code->zone()), | 52 translations_(code->zone()), |
53 last_lazy_deopt_pc_(0), | 53 last_lazy_deopt_pc_(0), |
54 jump_tables_(nullptr), | 54 jump_tables_(nullptr), |
55 ools_(nullptr), | 55 ools_(nullptr), |
56 osr_pc_offset_(-1), | 56 osr_pc_offset_(-1), |
57 source_position_table_builder_(info->isolate(), zone()) { | 57 source_position_table_builder_(info->isolate(), zone()) { |
58 for (int i = 0; i < code->InstructionBlockCount(); ++i) { | 58 for (int i = 0; i < code->InstructionBlockCount(); ++i) { |
59 new (&labels_[i]) Label; | 59 new (&labels_[i]) Label; |
60 } | 60 } |
61 CreateFrameAccessState(frame); | 61 CreateFrameAccessState(frame); |
| 62 if (FLAG_perf_prof_unwinding_info) { |
| 63 unwinding_info_writer_.Reset(new UnwindingInfoWriter); |
| 64 } |
62 } | 65 } |
63 | 66 |
64 void CodeGenerator::CreateFrameAccessState(Frame* frame) { | 67 void CodeGenerator::CreateFrameAccessState(Frame* frame) { |
65 FinishFrame(frame); | 68 FinishFrame(frame); |
66 frame_access_state_ = new (code()->zone()) FrameAccessState(frame); | 69 frame_access_state_ = new (code()->zone()) FrameAccessState(frame); |
67 } | 70 } |
68 | 71 |
69 Handle<Code> CodeGenerator::GenerateCode() { | 72 Handle<Code> CodeGenerator::GenerateCode() { |
70 CompilationInfo* info = this->info(); | 73 CompilationInfo* info = this->info(); |
71 | 74 |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
105 for (const InstructionBlock* block : code()->instruction_blocks()) { | 108 for (const InstructionBlock* block : code()->instruction_blocks()) { |
106 if (block->IsDeferred() == (deferred == 0)) { | 109 if (block->IsDeferred() == (deferred == 0)) { |
107 continue; | 110 continue; |
108 } | 111 } |
109 // Align loop headers on 16-byte boundaries. | 112 // Align loop headers on 16-byte boundaries. |
110 if (block->IsLoopHeader()) masm()->Align(16); | 113 if (block->IsLoopHeader()) masm()->Align(16); |
111 // Ensure lazy deopt doesn't patch handler entry points. | 114 // Ensure lazy deopt doesn't patch handler entry points. |
112 if (block->IsHandler()) EnsureSpaceForLazyDeopt(); | 115 if (block->IsHandler()) EnsureSpaceForLazyDeopt(); |
113 // Bind a label for a block. | 116 // Bind a label for a block. |
114 current_block_ = block->rpo_number(); | 117 current_block_ = block->rpo_number(); |
| 118 if (!unwinding_info_writer_.is_empty()) { |
| 119 unwinding_info_writer_->BeginInstructionBlock(masm()->pc_offset(), |
| 120 block); |
| 121 } |
115 if (FLAG_code_comments) { | 122 if (FLAG_code_comments) { |
116 // TODO(titzer): these code comments are a giant memory leak. | 123 // TODO(titzer): these code comments are a giant memory leak. |
117 Vector<char> buffer = Vector<char>::New(200); | 124 Vector<char> buffer = Vector<char>::New(200); |
118 char* buffer_start = buffer.start(); | 125 char* buffer_start = buffer.start(); |
119 | 126 |
120 int next = SNPrintF( | 127 int next = SNPrintF( |
121 buffer, "-- B%d start%s%s%s%s", block->rpo_number().ToInt(), | 128 buffer, "-- B%d start%s%s%s%s", block->rpo_number().ToInt(), |
122 block->IsDeferred() ? " (deferred)" : "", | 129 block->IsDeferred() ? " (deferred)" : "", |
123 block->needs_frame() ? "" : " (no frame)", | 130 block->needs_frame() ? "" : " (no frame)", |
124 block->must_construct_frame() ? " (construct frame)" : "", | 131 block->must_construct_frame() ? " (construct frame)" : "", |
(...skipping 30 matching lines...) Expand all Loading... |
155 } | 162 } |
156 | 163 |
157 CodeGenResult result; | 164 CodeGenResult result; |
158 if (FLAG_enable_embedded_constant_pool && !block->needs_frame()) { | 165 if (FLAG_enable_embedded_constant_pool && !block->needs_frame()) { |
159 ConstantPoolUnavailableScope constant_pool_unavailable(masm()); | 166 ConstantPoolUnavailableScope constant_pool_unavailable(masm()); |
160 result = AssembleBlock(block); | 167 result = AssembleBlock(block); |
161 } else { | 168 } else { |
162 result = AssembleBlock(block); | 169 result = AssembleBlock(block); |
163 } | 170 } |
164 if (result != kSuccess) return Handle<Code>(); | 171 if (result != kSuccess) return Handle<Code>(); |
| 172 if (!unwinding_info_writer_.is_empty()) { |
| 173 unwinding_info_writer_->EndInstructionBlock(block); |
| 174 } |
165 } | 175 } |
166 } | 176 } |
167 | 177 |
168 // Assemble all out-of-line code. | 178 // Assemble all out-of-line code. |
169 if (ools_) { | 179 if (ools_) { |
170 masm()->RecordComment("-- Out of line code --"); | 180 masm()->RecordComment("-- Out of line code --"); |
171 for (OutOfLineCode* ool = ools_; ool; ool = ool->next()) { | 181 for (OutOfLineCode* ool = ools_; ool; ool = ool->next()) { |
172 masm()->bind(ool->entry()); | 182 masm()->bind(ool->entry()); |
173 ool->Generate(); | 183 ool->Generate(); |
174 if (ool->exit()->is_bound()) masm()->jmp(ool->exit()); | 184 if (ool->exit()->is_bound()) masm()->jmp(ool->exit()); |
(...skipping 20 matching lines...) Expand all Loading... |
195 if (jump_tables_) { | 205 if (jump_tables_) { |
196 masm()->Align(kPointerSize); | 206 masm()->Align(kPointerSize); |
197 for (JumpTable* table = jump_tables_; table; table = table->next()) { | 207 for (JumpTable* table = jump_tables_; table; table = table->next()) { |
198 masm()->bind(table->label()); | 208 masm()->bind(table->label()); |
199 AssembleJumpTable(table->targets(), table->target_count()); | 209 AssembleJumpTable(table->targets(), table->target_count()); |
200 } | 210 } |
201 } | 211 } |
202 | 212 |
203 safepoints()->Emit(masm(), frame()->GetTotalFrameSlotCount()); | 213 safepoints()->Emit(masm(), frame()->GetTotalFrameSlotCount()); |
204 | 214 |
205 Handle<Code> result = | 215 EhFrameWriter* eh_frame_writer = nullptr; |
206 v8::internal::CodeGenerator::MakeCodeEpilogue(masm(), nullptr, info); | 216 if (!unwinding_info_writer_.is_empty()) { |
| 217 unwinding_info_writer_->Finish(masm()->pc_offset()); |
| 218 eh_frame_writer = unwinding_info_writer_->eh_frame_writer(); |
| 219 } |
| 220 |
| 221 Handle<Code> result = v8::internal::CodeGenerator::MakeCodeEpilogue( |
| 222 masm(), eh_frame_writer, info); |
207 result->set_is_turbofanned(true); | 223 result->set_is_turbofanned(true); |
208 result->set_stack_slots(frame()->GetTotalFrameSlotCount()); | 224 result->set_stack_slots(frame()->GetTotalFrameSlotCount()); |
209 result->set_safepoint_table_offset(safepoints()->GetCodeOffset()); | 225 result->set_safepoint_table_offset(safepoints()->GetCodeOffset()); |
210 Handle<ByteArray> source_positions = | 226 Handle<ByteArray> source_positions = |
211 source_position_table_builder_.ToSourcePositionTable(); | 227 source_position_table_builder_.ToSourcePositionTable(); |
212 result->set_source_position_table(*source_positions); | 228 result->set_source_position_table(*source_positions); |
213 source_position_table_builder_.EndJitLogging(AbstractCode::cast(*result)); | 229 source_position_table_builder_.EndJitLogging(AbstractCode::cast(*result)); |
214 | 230 |
215 // Emit exception handler table. | 231 // Emit exception handler table. |
216 if (!handlers_.empty()) { | 232 if (!handlers_.empty()) { |
(...skipping 680 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
897 : frame_(gen->frame()), masm_(gen->masm()), next_(gen->ools_) { | 913 : frame_(gen->frame()), masm_(gen->masm()), next_(gen->ools_) { |
898 gen->ools_ = this; | 914 gen->ools_ = this; |
899 } | 915 } |
900 | 916 |
901 | 917 |
902 OutOfLineCode::~OutOfLineCode() {} | 918 OutOfLineCode::~OutOfLineCode() {} |
903 | 919 |
904 } // namespace compiler | 920 } // namespace compiler |
905 } // namespace internal | 921 } // namespace internal |
906 } // namespace v8 | 922 } // namespace v8 |
OLD | NEW |