diff options
author | Ryan Dahl <ry@tinyclouds.org> | 2011-01-17 11:32:56 -0800 |
---|---|---|
committer | Ryan Dahl <ry@tinyclouds.org> | 2011-01-17 11:32:56 -0800 |
commit | cf2e4f44afbfb208c5976786c96ec963930323cc (patch) | |
tree | 7e9ddac16d51490f1428abb610afd02eda98aacf /deps/v8/src/safepoint-table.cc | |
parent | 082a4b6033df22a68518c58d320e86f688db7bda (diff) | |
download | android-node-v8-cf2e4f44afbfb208c5976786c96ec963930323cc.tar.gz android-node-v8-cf2e4f44afbfb208c5976786c96ec963930323cc.tar.bz2 android-node-v8-cf2e4f44afbfb208c5976786c96ec963930323cc.zip |
Upgrade V8 to 3.0.8
Diffstat (limited to 'deps/v8/src/safepoint-table.cc')
-rw-r--r-- | deps/v8/src/safepoint-table.cc | 95 |
1 files changed, 69 insertions, 26 deletions
diff --git a/deps/v8/src/safepoint-table.cc b/deps/v8/src/safepoint-table.cc index b9468a50bf..e79dcff09a 100644 --- a/deps/v8/src/safepoint-table.cc +++ b/deps/v8/src/safepoint-table.cc @@ -26,11 +26,34 @@ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "safepoint-table.h" + #include "disasm.h" +#include "macro-assembler.h" namespace v8 { namespace internal { + +bool SafepointEntry::HasRegisters() const { + ASSERT(is_valid()); + ASSERT(IsAligned(kNumSafepointRegisters, kBitsPerByte)); + const int num_reg_bytes = kNumSafepointRegisters >> kBitsPerByteLog2; + for (int i = 0; i < num_reg_bytes; i++) { + if (bits_[i] != SafepointTable::kNoRegisters) return true; + } + return false; +} + + +bool SafepointEntry::HasRegisterAt(int reg_index) const { + ASSERT(is_valid()); + ASSERT(reg_index >= 0 && reg_index < kNumSafepointRegisters); + int byte_index = reg_index >> kBitsPerByteLog2; + int bit_index = reg_index & (kBitsPerByte - 1); + return (bits_[byte_index] & (1 << bit_index)) != 0; +} + + SafepointTable::SafepointTable(Code* code) { ASSERT(code->kind() == Code::OPTIMIZED_FUNCTION); code_ = code; @@ -41,45 +64,39 @@ SafepointTable::SafepointTable(Code* code) { entries_ = pc_and_deoptimization_indexes_ + (length_ * kPcAndDeoptimizationIndexSize); ASSERT(entry_size_ > 0); - ASSERT_EQ(DeoptimizationIndexField::max(), Safepoint::kNoDeoptimizationIndex); + ASSERT_EQ(SafepointEntry::DeoptimizationIndexField::max(), + Safepoint::kNoDeoptimizationIndex); } -bool SafepointTable::HasRegisters(uint8_t* entry) { - ASSERT(IsAligned(kNumSafepointRegisters, kBitsPerByte)); - const int num_reg_bytes = kNumSafepointRegisters >> kBitsPerByteLog2; - for (int i = 0; i < num_reg_bytes; i++) { - if (entry[i] != kNoRegisters) return true; +SafepointEntry SafepointTable::FindEntry(Address pc) const { + unsigned pc_offset = static_cast<unsigned>(pc - code_->instruction_start()); + for (unsigned i = 0; i < length(); i++) { + // TODO(kasperl): Replace the linear search with binary search. + if (GetPcOffset(i) == pc_offset) return GetEntry(i); } - return false; -} - - -bool SafepointTable::HasRegisterAt(uint8_t* entry, int reg_index) { - ASSERT(reg_index >= 0 && reg_index < kNumSafepointRegisters); - int byte_index = reg_index >> kBitsPerByteLog2; - int bit_index = reg_index & (kBitsPerByte - 1); - return (entry[byte_index] & (1 << bit_index)) != 0; + return SafepointEntry(); } void SafepointTable::PrintEntry(unsigned index) const { disasm::NameConverter converter; - uint8_t* entry = GetEntry(index); + SafepointEntry entry = GetEntry(index); + uint8_t* bits = entry.bits(); // Print the stack slot bits. if (entry_size_ > 0) { ASSERT(IsAligned(kNumSafepointRegisters, kBitsPerByte)); const int first = kNumSafepointRegisters >> kBitsPerByteLog2; int last = entry_size_ - 1; - for (int i = first; i < last; i++) PrintBits(entry[i], kBitsPerByte); + for (int i = first; i < last; i++) PrintBits(bits[i], kBitsPerByte); int last_bits = code_->stack_slots() - ((last - first) * kBitsPerByte); - PrintBits(entry[last], last_bits); + PrintBits(bits[last], last_bits); // Print the registers (if any). - if (!HasRegisters(entry)) return; + if (!entry.HasRegisters()) return; for (int j = 0; j < kNumSafepointRegisters; j++) { - if (HasRegisterAt(entry, j)) { + if (entry.HasRegisterAt(j)) { PrintF(" | %s", converter.NameOfCPURegister(j)); } } @@ -95,6 +112,11 @@ void SafepointTable::PrintBits(uint8_t byte, int digits) { } +void Safepoint::DefinePointerRegister(Register reg) { + registers_->Add(reg.code()); +} + + Safepoint SafepointTableBuilder::DefineSafepoint(Assembler* assembler, int deoptimization_index) { ASSERT(deoptimization_index != -1); @@ -102,6 +124,8 @@ Safepoint SafepointTableBuilder::DefineSafepoint(Assembler* assembler, pc_and_deoptimization_index.pc = assembler->pc_offset(); pc_and_deoptimization_index.deoptimization_index = deoptimization_index; pc_and_deoptimization_index.pc_after_gap = assembler->pc_offset(); + pc_and_deoptimization_index.arguments = 0; + pc_and_deoptimization_index.has_doubles = false; deoptimization_info_.Add(pc_and_deoptimization_index); indexes_.Add(new ZoneList<int>(8)); registers_.Add(NULL); @@ -112,11 +136,13 @@ Safepoint SafepointTableBuilder::DefineSafepoint(Assembler* assembler, Safepoint SafepointTableBuilder::DefineSafepointWithRegisters( Assembler* assembler, int arguments, int deoptimization_index) { ASSERT(deoptimization_index != -1); - ASSERT(arguments == 0); // Only case that works for now. + ASSERT(arguments >= 0); DeoptimizationInfo pc_and_deoptimization_index; pc_and_deoptimization_index.pc = assembler->pc_offset(); pc_and_deoptimization_index.deoptimization_index = deoptimization_index; pc_and_deoptimization_index.pc_after_gap = assembler->pc_offset(); + pc_and_deoptimization_index.arguments = arguments; + pc_and_deoptimization_index.has_doubles = false; deoptimization_info_.Add(pc_and_deoptimization_index); indexes_.Add(new ZoneList<int>(8)); registers_.Add(new ZoneList<int>(4)); @@ -124,6 +150,22 @@ Safepoint SafepointTableBuilder::DefineSafepointWithRegisters( } +Safepoint SafepointTableBuilder::DefineSafepointWithRegistersAndDoubles( + Assembler* assembler, int arguments, int deoptimization_index) { + ASSERT(deoptimization_index != -1); + ASSERT(arguments >= 0); + DeoptimizationInfo pc_and_deoptimization_index; + pc_and_deoptimization_index.pc = assembler->pc_offset(); + pc_and_deoptimization_index.deoptimization_index = deoptimization_index; + pc_and_deoptimization_index.pc_after_gap = assembler->pc_offset(); + pc_and_deoptimization_index.arguments = arguments; + pc_and_deoptimization_index.has_doubles = true; + deoptimization_info_.Add(pc_and_deoptimization_index); + indexes_.Add(new ZoneList<int>(8)); + registers_.Add(new ZoneList<int>(4)); + return Safepoint(indexes_.last(), registers_.last()); +} + unsigned SafepointTableBuilder::GetCodeOffset() const { ASSERT(emitted_); return offset_; @@ -152,7 +194,7 @@ void SafepointTableBuilder::Emit(Assembler* assembler, int bits_per_entry) { // pc after gap information. for (int i = 0; i < length; i++) { assembler->dd(deoptimization_info_[i].pc); - assembler->dd(EncodeDeoptimizationIndexAndGap(deoptimization_info_[i])); + assembler->dd(EncodeExceptPC(deoptimization_info_[i])); } // Emit table of bitmaps. @@ -197,12 +239,13 @@ void SafepointTableBuilder::Emit(Assembler* assembler, int bits_per_entry) { } -uint32_t SafepointTableBuilder::EncodeDeoptimizationIndexAndGap( - DeoptimizationInfo info) { +uint32_t SafepointTableBuilder::EncodeExceptPC(const DeoptimizationInfo& info) { unsigned index = info.deoptimization_index; unsigned gap_size = info.pc_after_gap - info.pc; - uint32_t encoding = SafepointTable::DeoptimizationIndexField::encode(index); - encoding |= SafepointTable::GapCodeSizeField::encode(gap_size); + uint32_t encoding = SafepointEntry::DeoptimizationIndexField::encode(index); + encoding |= SafepointEntry::GapCodeSizeField::encode(gap_size); + encoding |= SafepointEntry::ArgumentsField::encode(info.arguments); + encoding |= SafepointEntry::SaveDoublesField::encode(info.has_doubles); return encoding; } |