| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #include "src/safepoint-table.h" | 7 #include "src/safepoint-table.h" |
| 8 | 8 |
| 9 #include "src/deoptimizer.h" | 9 #include "src/deoptimizer.h" |
| 10 #include "src/disasm.h" | 10 #include "src/disasm.h" |
| (...skipping 25 matching lines...) Expand all Loading... |
| 36 } | 36 } |
| 37 | 37 |
| 38 | 38 |
| 39 SafepointTable::SafepointTable(Code* code) { | 39 SafepointTable::SafepointTable(Code* code) { |
| 40 DCHECK(code->is_crankshafted()); | 40 DCHECK(code->is_crankshafted()); |
| 41 code_ = code; | 41 code_ = code; |
| 42 Address header = code->instruction_start() + code->safepoint_table_offset(); | 42 Address header = code->instruction_start() + code->safepoint_table_offset(); |
| 43 length_ = Memory::uint32_at(header + kLengthOffset); | 43 length_ = Memory::uint32_at(header + kLengthOffset); |
| 44 entry_size_ = Memory::uint32_at(header + kEntrySizeOffset); | 44 entry_size_ = Memory::uint32_at(header + kEntrySizeOffset); |
| 45 pc_and_deoptimization_indexes_ = header + kHeaderSize; | 45 pc_and_deoptimization_indexes_ = header + kHeaderSize; |
| 46 entries_ = pc_and_deoptimization_indexes_ + | 46 entries_ = |
| 47 (length_ * kPcAndDeoptimizationIndexSize); | 47 pc_and_deoptimization_indexes_ + (length_ * kPcAndDeoptimizationInfoSize); |
| 48 DCHECK(entry_size_ > 0); | 48 DCHECK(entry_size_ > 0); |
| 49 STATIC_ASSERT(SafepointEntry::DeoptimizationIndexField::kMax == | 49 STATIC_ASSERT(SafepointEntry::DeoptimizationIndexField::kMax == |
| 50 Safepoint::kNoDeoptimizationIndex); | 50 Safepoint::kNoDeoptimizationIndex); |
| 51 } | 51 } |
| 52 | 52 |
| 53 | 53 |
| 54 SafepointEntry SafepointTable::FindEntry(Address pc) const { | 54 SafepointEntry SafepointTable::FindEntry(Address pc) const { |
| 55 unsigned pc_offset = static_cast<unsigned>(pc - code_->instruction_start()); | 55 unsigned pc_offset = static_cast<unsigned>(pc - code_->instruction_start()); |
| 56 for (unsigned i = 0; i < length(); i++) { | 56 for (unsigned i = 0; i < length(); i++) { |
| 57 // TODO(kasperl): Replace the linear search with binary search. | 57 // TODO(kasperl): Replace the linear search with binary search. |
| 58 if (GetPcOffset(i) == pc_offset) return GetEntry(i); | 58 if (GetPcOffset(i) == pc_offset) return GetEntry(i); |
| 59 if (GetDeoptimizationPcOffset(i) == pc_offset) return GetEntry(i); |
| 59 } | 60 } |
| 60 return SafepointEntry(); | 61 return SafepointEntry(); |
| 61 } | 62 } |
| 62 | 63 |
| 63 | 64 |
| 64 void SafepointTable::PrintEntry(unsigned index, OStream& os) const { // NOLINT | 65 void SafepointTable::PrintEntry(unsigned index, OStream& os) const { // NOLINT |
| 65 disasm::NameConverter converter; | 66 disasm::NameConverter converter; |
| 66 SafepointEntry entry = GetEntry(index); | 67 SafepointEntry entry = GetEntry(index); |
| 67 uint8_t* bits = entry.bits(); | 68 uint8_t* bits = entry.bits(); |
| 68 | 69 |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 103 Safepoint SafepointTableBuilder::DefineSafepoint( | 104 Safepoint SafepointTableBuilder::DefineSafepoint( |
| 104 Assembler* assembler, | 105 Assembler* assembler, |
| 105 Safepoint::Kind kind, | 106 Safepoint::Kind kind, |
| 106 int arguments, | 107 int arguments, |
| 107 Safepoint::DeoptMode deopt_mode) { | 108 Safepoint::DeoptMode deopt_mode) { |
| 108 DCHECK(arguments >= 0); | 109 DCHECK(arguments >= 0); |
| 109 DeoptimizationInfo info; | 110 DeoptimizationInfo info; |
| 110 info.pc = assembler->pc_offset(); | 111 info.pc = assembler->pc_offset(); |
| 111 info.arguments = arguments; | 112 info.arguments = arguments; |
| 112 info.has_doubles = (kind & Safepoint::kWithDoubles); | 113 info.has_doubles = (kind & Safepoint::kWithDoubles); |
| 114 info.deoptimization_pc = Safepoint::kNoDeoptimizationPc; |
| 115 int safepoint_id = deoptimization_info_.length(); |
| 113 deoptimization_info_.Add(info, zone_); | 116 deoptimization_info_.Add(info, zone_); |
| 114 deopt_index_list_.Add(Safepoint::kNoDeoptimizationIndex, zone_); | 117 deopt_index_list_.Add(Safepoint::kNoDeoptimizationIndex, zone_); |
| 115 if (deopt_mode == Safepoint::kNoLazyDeopt) { | 118 if (deopt_mode == Safepoint::kNoLazyDeopt) { |
| 116 last_lazy_safepoint_ = deopt_index_list_.length(); | 119 last_lazy_safepoint_ = deopt_index_list_.length(); |
| 117 } | 120 } |
| 118 indexes_.Add(new(zone_) ZoneList<int>(8, zone_), zone_); | 121 indexes_.Add(new(zone_) ZoneList<int>(8, zone_), zone_); |
| 119 registers_.Add((kind & Safepoint::kWithRegisters) | 122 registers_.Add((kind & Safepoint::kWithRegisters) |
| 120 ? new(zone_) ZoneList<int>(4, zone_) | 123 ? new(zone_) ZoneList<int>(4, zone_) |
| 121 : NULL, | 124 : NULL, |
| 122 zone_); | 125 zone_); |
| 123 return Safepoint(indexes_.last(), registers_.last()); | 126 return Safepoint(safepoint_id, indexes_.last(), registers_.last()); |
| 124 } | 127 } |
| 125 | 128 |
| 126 | 129 |
| 127 void SafepointTableBuilder::RecordLazyDeoptimizationIndex(int index) { | 130 void SafepointTableBuilder::RecordLazyDeoptimizationIndex(int index) { |
| 128 while (last_lazy_safepoint_ < deopt_index_list_.length()) { | 131 while (last_lazy_safepoint_ < deopt_index_list_.length()) { |
| 129 deopt_index_list_[last_lazy_safepoint_++] = index; | 132 deopt_index_list_[last_lazy_safepoint_++] = index; |
| 130 } | 133 } |
| 131 } | 134 } |
| 132 | 135 |
| 133 unsigned SafepointTableBuilder::GetCodeOffset() const { | 136 unsigned SafepointTableBuilder::GetCodeOffset() const { |
| (...skipping 18 matching lines...) Expand all Loading... |
| 152 // Emit the table header. | 155 // Emit the table header. |
| 153 int length = deoptimization_info_.length(); | 156 int length = deoptimization_info_.length(); |
| 154 assembler->dd(length); | 157 assembler->dd(length); |
| 155 assembler->dd(bytes_per_entry); | 158 assembler->dd(bytes_per_entry); |
| 156 | 159 |
| 157 // Emit sorted table of pc offsets together with deoptimization indexes. | 160 // Emit sorted table of pc offsets together with deoptimization indexes. |
| 158 for (int i = 0; i < length; i++) { | 161 for (int i = 0; i < length; i++) { |
| 159 assembler->dd(deoptimization_info_[i].pc); | 162 assembler->dd(deoptimization_info_[i].pc); |
| 160 assembler->dd(EncodeExceptPC(deoptimization_info_[i], | 163 assembler->dd(EncodeExceptPC(deoptimization_info_[i], |
| 161 deopt_index_list_[i])); | 164 deopt_index_list_[i])); |
| 165 assembler->dd(deoptimization_info_[i].deoptimization_pc); |
| 162 } | 166 } |
| 163 | 167 |
| 164 // Emit table of bitmaps. | 168 // Emit table of bitmaps. |
| 165 ZoneList<uint8_t> bits(bytes_per_entry, zone_); | 169 ZoneList<uint8_t> bits(bytes_per_entry, zone_); |
| 166 for (int i = 0; i < length; i++) { | 170 for (int i = 0; i < length; i++) { |
| 167 ZoneList<int>* indexes = indexes_[i]; | 171 ZoneList<int>* indexes = indexes_[i]; |
| 168 ZoneList<int>* registers = registers_[i]; | 172 ZoneList<int>* registers = registers_[i]; |
| 169 bits.Clear(); | 173 bits.Clear(); |
| 170 bits.AddBlock(0, bytes_per_entry, zone_); | 174 bits.AddBlock(0, bytes_per_entry, zone_); |
| 171 | 175 |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 207 unsigned index) { | 211 unsigned index) { |
| 208 uint32_t encoding = SafepointEntry::DeoptimizationIndexField::encode(index); | 212 uint32_t encoding = SafepointEntry::DeoptimizationIndexField::encode(index); |
| 209 encoding |= SafepointEntry::ArgumentsField::encode(info.arguments); | 213 encoding |= SafepointEntry::ArgumentsField::encode(info.arguments); |
| 210 encoding |= SafepointEntry::SaveDoublesField::encode(info.has_doubles); | 214 encoding |= SafepointEntry::SaveDoublesField::encode(info.has_doubles); |
| 211 return encoding; | 215 return encoding; |
| 212 } | 216 } |
| 213 | 217 |
| 214 | 218 |
| 215 | 219 |
| 216 } } // namespace v8::internal | 220 } } // namespace v8::internal |
| OLD | NEW |