| OLD | NEW |
| 1 // Copyright (c) 1994-2006 Sun Microsystems Inc. | 1 // Copyright (c) 1994-2006 Sun Microsystems Inc. |
| 2 // All Rights Reserved. | 2 // All Rights Reserved. |
| 3 // | 3 // |
| 4 // Redistribution and use in source and binary forms, with or without | 4 // Redistribution and use in source and binary forms, with or without |
| 5 // modification, are permitted provided that the following conditions are | 5 // modification, are permitted provided that the following conditions are |
| 6 // met: | 6 // met: |
| 7 // | 7 // |
| 8 // - Redistributions of source code must retain the above copyright notice, | 8 // - Redistributions of source code must retain the above copyright notice, |
| 9 // this list of conditions and the following disclaimer. | 9 // this list of conditions and the following disclaimer. |
| 10 // | 10 // |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 109 ASSERT(IsCodeTarget(rmode_) || rmode_ == RUNTIME_ENTRY); | 109 ASSERT(IsCodeTarget(rmode_) || rmode_ == RUNTIME_ENTRY); |
| 110 return reinterpret_cast<Address>(pc_); | 110 return reinterpret_cast<Address>(pc_); |
| 111 } | 111 } |
| 112 | 112 |
| 113 | 113 |
| 114 int RelocInfo::target_address_size() { | 114 int RelocInfo::target_address_size() { |
| 115 return Assembler::kExternalTargetSize; | 115 return Assembler::kExternalTargetSize; |
| 116 } | 116 } |
| 117 | 117 |
| 118 | 118 |
| 119 void RelocInfo::set_target_address(Address target) { | 119 void RelocInfo::set_target_address(Address target, WriteBarrierMode mode) { |
| 120 ASSERT(IsCodeTarget(rmode_) || rmode_ == RUNTIME_ENTRY); | 120 ASSERT(IsCodeTarget(rmode_) || rmode_ == RUNTIME_ENTRY); |
| 121 Assembler::set_target_address_at(pc_, target); | 121 Assembler::set_target_address_at(pc_, target); |
| 122 if (host() != NULL && IsCodeTarget(rmode_)) { | 122 if (mode == UPDATE_WRITE_BARRIER && host() != NULL && IsCodeTarget(rmode_)) { |
| 123 Object* target_code = Code::GetCodeFromTargetAddress(target); | 123 Object* target_code = Code::GetCodeFromTargetAddress(target); |
| 124 host()->GetHeap()->incremental_marking()->RecordWriteIntoCode( | 124 host()->GetHeap()->incremental_marking()->RecordWriteIntoCode( |
| 125 host(), this, HeapObject::cast(target_code)); | 125 host(), this, HeapObject::cast(target_code)); |
| 126 } | 126 } |
| 127 } | 127 } |
| 128 | 128 |
| 129 | 129 |
| 130 Object* RelocInfo::target_object() { | 130 Object* RelocInfo::target_object() { |
| 131 ASSERT(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); | 131 ASSERT(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); |
| 132 return reinterpret_cast<Object*>(Assembler::target_address_at(pc_)); | 132 return reinterpret_cast<Object*>(Assembler::target_address_at(pc_)); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 143 Object** RelocInfo::target_object_address() { | 143 Object** RelocInfo::target_object_address() { |
| 144 // Provide a "natural pointer" to the embedded object, | 144 // Provide a "natural pointer" to the embedded object, |
| 145 // which can be de-referenced during heap iteration. | 145 // which can be de-referenced during heap iteration. |
| 146 ASSERT(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); | 146 ASSERT(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); |
| 147 reconstructed_obj_ptr_ = | 147 reconstructed_obj_ptr_ = |
| 148 reinterpret_cast<Object*>(Assembler::target_address_at(pc_)); | 148 reinterpret_cast<Object*>(Assembler::target_address_at(pc_)); |
| 149 return &reconstructed_obj_ptr_; | 149 return &reconstructed_obj_ptr_; |
| 150 } | 150 } |
| 151 | 151 |
| 152 | 152 |
| 153 void RelocInfo::set_target_object(Object* target) { | 153 void RelocInfo::set_target_object(Object* target, WriteBarrierMode mode) { |
| 154 ASSERT(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); | 154 ASSERT(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); |
| 155 Assembler::set_target_address_at(pc_, reinterpret_cast<Address>(target)); | 155 Assembler::set_target_address_at(pc_, reinterpret_cast<Address>(target)); |
| 156 if (host() != NULL && target->IsHeapObject()) { | 156 if (mode == UPDATE_WRITE_BARRIER && |
| 157 host() != NULL && |
| 158 target->IsHeapObject()) { |
| 157 host()->GetHeap()->incremental_marking()->RecordWrite( | 159 host()->GetHeap()->incremental_marking()->RecordWrite( |
| 158 host(), &Memory::Object_at(pc_), HeapObject::cast(target)); | 160 host(), &Memory::Object_at(pc_), HeapObject::cast(target)); |
| 159 } | 161 } |
| 160 } | 162 } |
| 161 | 163 |
| 162 | 164 |
| 163 Address* RelocInfo::target_reference_address() { | 165 Address* RelocInfo::target_reference_address() { |
| 164 ASSERT(rmode_ == EXTERNAL_REFERENCE); | 166 ASSERT(rmode_ == EXTERNAL_REFERENCE); |
| 165 reconstructed_adr_ptr_ = Assembler::target_address_at(pc_); | 167 reconstructed_adr_ptr_ = Assembler::target_address_at(pc_); |
| 166 return &reconstructed_adr_ptr_; | 168 return &reconstructed_adr_ptr_; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 177 | 179 |
| 178 JSGlobalPropertyCell* RelocInfo::target_cell() { | 180 JSGlobalPropertyCell* RelocInfo::target_cell() { |
| 179 ASSERT(rmode_ == RelocInfo::GLOBAL_PROPERTY_CELL); | 181 ASSERT(rmode_ == RelocInfo::GLOBAL_PROPERTY_CELL); |
| 180 Address address = Memory::Address_at(pc_); | 182 Address address = Memory::Address_at(pc_); |
| 181 Object* object = HeapObject::FromAddress( | 183 Object* object = HeapObject::FromAddress( |
| 182 address - JSGlobalPropertyCell::kValueOffset); | 184 address - JSGlobalPropertyCell::kValueOffset); |
| 183 return reinterpret_cast<JSGlobalPropertyCell*>(object); | 185 return reinterpret_cast<JSGlobalPropertyCell*>(object); |
| 184 } | 186 } |
| 185 | 187 |
| 186 | 188 |
| 187 void RelocInfo::set_target_cell(JSGlobalPropertyCell* cell) { | 189 void RelocInfo::set_target_cell(JSGlobalPropertyCell* cell, |
| 190 WriteBarrierMode mode) { |
| 188 ASSERT(rmode_ == RelocInfo::GLOBAL_PROPERTY_CELL); | 191 ASSERT(rmode_ == RelocInfo::GLOBAL_PROPERTY_CELL); |
| 189 Address address = cell->address() + JSGlobalPropertyCell::kValueOffset; | 192 Address address = cell->address() + JSGlobalPropertyCell::kValueOffset; |
| 190 Memory::Address_at(pc_) = address; | 193 Memory::Address_at(pc_) = address; |
| 191 if (host() != NULL) { | 194 if (mode == UPDATE_WRITE_BARRIER && host() != NULL) { |
| 192 // TODO(1550) We are passing NULL as a slot because cell can never be on | 195 // TODO(1550) We are passing NULL as a slot because cell can never be on |
| 193 // evacuation candidate. | 196 // evacuation candidate. |
| 194 host()->GetHeap()->incremental_marking()->RecordWrite( | 197 host()->GetHeap()->incremental_marking()->RecordWrite( |
| 195 host(), NULL, cell); | 198 host(), NULL, cell); |
| 196 } | 199 } |
| 197 } | 200 } |
| 198 | 201 |
| 199 | 202 |
| 200 Address RelocInfo::call_address() { | 203 Address RelocInfo::call_address() { |
| 201 ASSERT((IsJSReturn(rmode()) && IsPatchedReturnSequence()) || | 204 ASSERT((IsJSReturn(rmode()) && IsPatchedReturnSequence()) || |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 332 } | 335 } |
| 333 *reinterpret_cast<Instr*>(pc_) = x; | 336 *reinterpret_cast<Instr*>(pc_) = x; |
| 334 pc_ += kInstrSize; | 337 pc_ += kInstrSize; |
| 335 CheckTrampolinePoolQuick(); | 338 CheckTrampolinePoolQuick(); |
| 336 } | 339 } |
| 337 | 340 |
| 338 | 341 |
| 339 } } // namespace v8::internal | 342 } } // namespace v8::internal |
| 340 | 343 |
| 341 #endif // V8_MIPS_ASSEMBLER_MIPS_INL_H_ | 344 #endif // V8_MIPS_ASSEMBLER_MIPS_INL_H_ |
| OLD | NEW |