OLD | NEW |
1 | 1 |
2 // Copyright (c) 1994-2006 Sun Microsystems Inc. | 2 // Copyright (c) 1994-2006 Sun Microsystems Inc. |
3 // All Rights Reserved. | 3 // All Rights Reserved. |
4 // | 4 // |
5 // Redistribution and use in source and binary forms, with or without | 5 // Redistribution and use in source and binary forms, with or without |
6 // modification, are permitted provided that the following conditions are | 6 // modification, are permitted provided that the following conditions are |
7 // met: | 7 // met: |
8 // | 8 // |
9 // - Redistributions of source code must retain the above copyright notice, | 9 // - Redistributions of source code must retain the above copyright notice, |
10 // this list of conditions and the following disclaimer. | 10 // this list of conditions and the following disclaimer. |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
121 // Absolute code pointer inside code object moves with the code object. | 121 // Absolute code pointer inside code object moves with the code object. |
122 byte* p = reinterpret_cast<byte*>(pc_); | 122 byte* p = reinterpret_cast<byte*>(pc_); |
123 int count = Assembler::RelocateInternalReference(p, delta); | 123 int count = Assembler::RelocateInternalReference(p, delta); |
124 CPU::FlushICache(p, count * sizeof(uint32_t)); | 124 CPU::FlushICache(p, count * sizeof(uint32_t)); |
125 } | 125 } |
126 } | 126 } |
127 | 127 |
128 | 128 |
129 Address RelocInfo::target_address() { | 129 Address RelocInfo::target_address() { |
130 ASSERT(IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_)); | 130 ASSERT(IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_)); |
131 return Assembler::target_address_at(pc_); | 131 return Assembler::target_address_at(pc_, host_); |
132 } | 132 } |
133 | 133 |
134 | 134 |
135 Address RelocInfo::target_address_address() { | 135 Address RelocInfo::target_address_address() { |
136 ASSERT(IsCodeTarget(rmode_) || | 136 ASSERT(IsCodeTarget(rmode_) || |
137 IsRuntimeEntry(rmode_) || | 137 IsRuntimeEntry(rmode_) || |
138 rmode_ == EMBEDDED_OBJECT || | 138 rmode_ == EMBEDDED_OBJECT || |
139 rmode_ == EXTERNAL_REFERENCE); | 139 rmode_ == EXTERNAL_REFERENCE); |
140 // Read the address of the word containing the target_address in an | 140 // Read the address of the word containing the target_address in an |
141 // instruction stream. | 141 // instruction stream. |
(...skipping 20 matching lines...) Expand all Loading... |
162 } | 162 } |
163 | 163 |
164 | 164 |
165 int RelocInfo::target_address_size() { | 165 int RelocInfo::target_address_size() { |
166 return Assembler::kSpecialTargetSize; | 166 return Assembler::kSpecialTargetSize; |
167 } | 167 } |
168 | 168 |
169 | 169 |
170 void RelocInfo::set_target_address(Address target, WriteBarrierMode mode) { | 170 void RelocInfo::set_target_address(Address target, WriteBarrierMode mode) { |
171 ASSERT(IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_)); | 171 ASSERT(IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_)); |
172 Assembler::set_target_address_at(pc_, target); | 172 Assembler::set_target_address_at(pc_, host_, target); |
173 if (mode == UPDATE_WRITE_BARRIER && host() != NULL && IsCodeTarget(rmode_)) { | 173 if (mode == UPDATE_WRITE_BARRIER && host() != NULL && IsCodeTarget(rmode_)) { |
174 Object* target_code = Code::GetCodeFromTargetAddress(target); | 174 Object* target_code = Code::GetCodeFromTargetAddress(target); |
175 host()->GetHeap()->incremental_marking()->RecordWriteIntoCode( | 175 host()->GetHeap()->incremental_marking()->RecordWriteIntoCode( |
176 host(), this, HeapObject::cast(target_code)); | 176 host(), this, HeapObject::cast(target_code)); |
177 } | 177 } |
178 } | 178 } |
179 | 179 |
180 | 180 |
181 Address Assembler::target_address_from_return_address(Address pc) { | 181 Address Assembler::target_address_from_return_address(Address pc) { |
182 return pc - kCallTargetAddressOffset; | 182 return pc - kCallTargetAddressOffset; |
183 } | 183 } |
184 | 184 |
185 | 185 |
186 Object* RelocInfo::target_object() { | 186 Object* RelocInfo::target_object() { |
187 ASSERT(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); | 187 ASSERT(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); |
188 return reinterpret_cast<Object*>(Assembler::target_address_at(pc_)); | 188 return reinterpret_cast<Object*>(Assembler::target_address_at(pc_, host_)); |
189 } | 189 } |
190 | 190 |
191 | 191 |
192 Handle<Object> RelocInfo::target_object_handle(Assembler* origin) { | 192 Handle<Object> RelocInfo::target_object_handle(Assembler* origin) { |
193 ASSERT(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); | 193 ASSERT(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); |
194 return Handle<Object>(reinterpret_cast<Object**>( | 194 return Handle<Object>(reinterpret_cast<Object**>( |
195 Assembler::target_address_at(pc_))); | 195 Assembler::target_address_at(pc_, host_))); |
196 } | 196 } |
197 | 197 |
198 | 198 |
199 void RelocInfo::set_target_object(Object* target, WriteBarrierMode mode) { | 199 void RelocInfo::set_target_object(Object* target, WriteBarrierMode mode) { |
200 ASSERT(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); | 200 ASSERT(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); |
201 ASSERT(!target->IsConsString()); | 201 ASSERT(!target->IsConsString()); |
202 Assembler::set_target_address_at(pc_, reinterpret_cast<Address>(target)); | 202 Assembler::set_target_address_at(pc_, host_, |
| 203 reinterpret_cast<Address>(target)); |
203 if (mode == UPDATE_WRITE_BARRIER && | 204 if (mode == UPDATE_WRITE_BARRIER && |
204 host() != NULL && | 205 host() != NULL && |
205 target->IsHeapObject()) { | 206 target->IsHeapObject()) { |
206 host()->GetHeap()->incremental_marking()->RecordWrite( | 207 host()->GetHeap()->incremental_marking()->RecordWrite( |
207 host(), &Memory::Object_at(pc_), HeapObject::cast(target)); | 208 host(), &Memory::Object_at(pc_), HeapObject::cast(target)); |
208 } | 209 } |
209 } | 210 } |
210 | 211 |
211 | 212 |
212 Address RelocInfo::target_reference() { | 213 Address RelocInfo::target_reference() { |
213 ASSERT(rmode_ == EXTERNAL_REFERENCE); | 214 ASSERT(rmode_ == EXTERNAL_REFERENCE); |
214 return Assembler::target_address_at(pc_); | 215 return Assembler::target_address_at(pc_, host_); |
215 } | 216 } |
216 | 217 |
217 | 218 |
218 Address RelocInfo::target_runtime_entry(Assembler* origin) { | 219 Address RelocInfo::target_runtime_entry(Assembler* origin) { |
219 ASSERT(IsRuntimeEntry(rmode_)); | 220 ASSERT(IsRuntimeEntry(rmode_)); |
220 return target_address(); | 221 return target_address(); |
221 } | 222 } |
222 | 223 |
223 | 224 |
224 void RelocInfo::set_target_runtime_entry(Address target, | 225 void RelocInfo::set_target_runtime_entry(Address target, |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
259 | 260 |
260 Handle<Object> RelocInfo::code_age_stub_handle(Assembler* origin) { | 261 Handle<Object> RelocInfo::code_age_stub_handle(Assembler* origin) { |
261 UNREACHABLE(); // This should never be reached on Arm. | 262 UNREACHABLE(); // This should never be reached on Arm. |
262 return Handle<Object>(); | 263 return Handle<Object>(); |
263 } | 264 } |
264 | 265 |
265 | 266 |
266 Code* RelocInfo::code_age_stub() { | 267 Code* RelocInfo::code_age_stub() { |
267 ASSERT(rmode_ == RelocInfo::CODE_AGE_SEQUENCE); | 268 ASSERT(rmode_ == RelocInfo::CODE_AGE_SEQUENCE); |
268 return Code::GetCodeFromTargetAddress( | 269 return Code::GetCodeFromTargetAddress( |
269 Assembler::target_address_at(pc_ + Assembler::kInstrSize)); | 270 Assembler::target_address_at(pc_ + Assembler::kInstrSize, host_)); |
270 } | 271 } |
271 | 272 |
272 | 273 |
273 void RelocInfo::set_code_age_stub(Code* stub) { | 274 void RelocInfo::set_code_age_stub(Code* stub) { |
274 ASSERT(rmode_ == RelocInfo::CODE_AGE_SEQUENCE); | 275 ASSERT(rmode_ == RelocInfo::CODE_AGE_SEQUENCE); |
275 Assembler::set_target_address_at(pc_ + Assembler::kInstrSize, | 276 Assembler::set_target_address_at(pc_ + Assembler::kInstrSize, |
| 277 host_, |
276 stub->instruction_start()); | 278 stub->instruction_start()); |
277 } | 279 } |
278 | 280 |
279 | 281 |
280 Address RelocInfo::call_address() { | 282 Address RelocInfo::call_address() { |
281 ASSERT((IsJSReturn(rmode()) && IsPatchedReturnSequence()) || | 283 ASSERT((IsJSReturn(rmode()) && IsPatchedReturnSequence()) || |
282 (IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence())); | 284 (IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence())); |
283 // The pc_ offset of 0 assumes mips patched return sequence per | 285 // The pc_ offset of 0 assumes mips patched return sequence per |
284 // debug-mips.cc BreakLocationIterator::SetDebugBreakAtReturn(), or | 286 // debug-mips.cc BreakLocationIterator::SetDebugBreakAtReturn(), or |
285 // debug break slot per BreakLocationIterator::SetDebugBreakAtSlot(). | 287 // debug break slot per BreakLocationIterator::SetDebugBreakAtSlot(). |
286 return Assembler::target_address_at(pc_); | 288 return Assembler::target_address_at(pc_, host_); |
287 } | 289 } |
288 | 290 |
289 | 291 |
290 void RelocInfo::set_call_address(Address target) { | 292 void RelocInfo::set_call_address(Address target) { |
291 ASSERT((IsJSReturn(rmode()) && IsPatchedReturnSequence()) || | 293 ASSERT((IsJSReturn(rmode()) && IsPatchedReturnSequence()) || |
292 (IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence())); | 294 (IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence())); |
293 // The pc_ offset of 0 assumes mips patched return sequence per | 295 // The pc_ offset of 0 assumes mips patched return sequence per |
294 // debug-mips.cc BreakLocationIterator::SetDebugBreakAtReturn(), or | 296 // debug-mips.cc BreakLocationIterator::SetDebugBreakAtReturn(), or |
295 // debug break slot per BreakLocationIterator::SetDebugBreakAtSlot(). | 297 // debug break slot per BreakLocationIterator::SetDebugBreakAtSlot(). |
296 Assembler::set_target_address_at(pc_, target); | 298 Assembler::set_target_address_at(pc_, host_, target); |
297 if (host() != NULL) { | 299 if (host() != NULL) { |
298 Object* target_code = Code::GetCodeFromTargetAddress(target); | 300 Object* target_code = Code::GetCodeFromTargetAddress(target); |
299 host()->GetHeap()->incremental_marking()->RecordWriteIntoCode( | 301 host()->GetHeap()->incremental_marking()->RecordWriteIntoCode( |
300 host(), this, HeapObject::cast(target_code)); | 302 host(), this, HeapObject::cast(target_code)); |
301 } | 303 } |
302 } | 304 } |
303 | 305 |
304 | 306 |
305 Object* RelocInfo::call_object() { | 307 Object* RelocInfo::call_object() { |
306 return *call_object_address(); | 308 return *call_object_address(); |
(...skipping 10 matching lines...) Expand all Loading... |
317 void RelocInfo::set_call_object(Object* target) { | 319 void RelocInfo::set_call_object(Object* target) { |
318 *call_object_address() = target; | 320 *call_object_address() = target; |
319 } | 321 } |
320 | 322 |
321 | 323 |
322 void RelocInfo::WipeOut() { | 324 void RelocInfo::WipeOut() { |
323 ASSERT(IsEmbeddedObject(rmode_) || | 325 ASSERT(IsEmbeddedObject(rmode_) || |
324 IsCodeTarget(rmode_) || | 326 IsCodeTarget(rmode_) || |
325 IsRuntimeEntry(rmode_) || | 327 IsRuntimeEntry(rmode_) || |
326 IsExternalReference(rmode_)); | 328 IsExternalReference(rmode_)); |
327 Assembler::set_target_address_at(pc_, NULL); | 329 Assembler::set_target_address_at(pc_, host_, NULL); |
328 } | 330 } |
329 | 331 |
330 | 332 |
331 bool RelocInfo::IsPatchedReturnSequence() { | 333 bool RelocInfo::IsPatchedReturnSequence() { |
332 Instr instr0 = Assembler::instr_at(pc_); | 334 Instr instr0 = Assembler::instr_at(pc_); |
333 Instr instr1 = Assembler::instr_at(pc_ + 1 * Assembler::kInstrSize); | 335 Instr instr1 = Assembler::instr_at(pc_ + 1 * Assembler::kInstrSize); |
334 Instr instr2 = Assembler::instr_at(pc_ + 2 * Assembler::kInstrSize); | 336 Instr instr2 = Assembler::instr_at(pc_ + 2 * Assembler::kInstrSize); |
335 bool patched_return = ((instr0 & kOpcodeMask) == LUI && | 337 bool patched_return = ((instr0 & kOpcodeMask) == LUI && |
336 (instr1 & kOpcodeMask) == ORI && | 338 (instr1 & kOpcodeMask) == ORI && |
337 ((instr2 & kOpcodeMask) == JAL || | 339 ((instr2 & kOpcodeMask) == JAL || |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
424 } | 426 } |
425 *reinterpret_cast<Instr*>(pc_) = x; | 427 *reinterpret_cast<Instr*>(pc_) = x; |
426 pc_ += kInstrSize; | 428 pc_ += kInstrSize; |
427 CheckTrampolinePoolQuick(); | 429 CheckTrampolinePoolQuick(); |
428 } | 430 } |
429 | 431 |
430 | 432 |
431 } } // namespace v8::internal | 433 } } // namespace v8::internal |
432 | 434 |
433 #endif // V8_MIPS_ASSEMBLER_MIPS_INL_H_ | 435 #endif // V8_MIPS_ASSEMBLER_MIPS_INL_H_ |
OLD | NEW |