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 | 5 // modification, are permitted provided that the following conditions |
6 // are met: | 6 // are 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 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
63 - static_cast<int32_t>(delta); | 63 - static_cast<int32_t>(delta); |
64 instr >>= 32; // Clear the 4-byte displacement field. | 64 instr >>= 32; // Clear the 4-byte displacement field. |
65 instr <<= 32; | 65 instr <<= 32; |
66 instr |= static_cast<uint32_t>(dis / 2); | 66 instr |= static_cast<uint32_t>(dis / 2); |
67 Instruction::SetInstructionBits<SixByteInstr>(reinterpret_cast<byte*>(pc_), | 67 Instruction::SetInstructionBits<SixByteInstr>(reinterpret_cast<byte*>(pc_), |
68 instr); | 68 instr); |
69 } else { | 69 } else { |
70 // mov sequence | 70 // mov sequence |
71 DCHECK(IsInternalReferenceEncoded(rmode_)); | 71 DCHECK(IsInternalReferenceEncoded(rmode_)); |
72 Address target = Assembler::target_address_at(pc_, host_); | 72 Address target = Assembler::target_address_at(pc_, host_); |
73 Assembler::set_target_address_at(isolate_, pc_, host_, target + delta, | 73 Assembler::set_target_address_at(nullptr, pc_, host_, target + delta, |
74 SKIP_ICACHE_FLUSH); | 74 SKIP_ICACHE_FLUSH); |
75 } | 75 } |
76 } | 76 } |
77 | 77 |
78 Address RelocInfo::target_internal_reference() { | 78 Address RelocInfo::target_internal_reference() { |
79 if (IsInternalReference(rmode_)) { | 79 if (IsInternalReference(rmode_)) { |
80 // Jump table entry | 80 // Jump table entry |
81 return Memory::Address_at(pc_); | 81 return Memory::Address_at(pc_); |
82 } else { | 82 } else { |
83 // mov sequence | 83 // mov sequence |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
165 Assembler::target_address_at(pc_, host_))); | 165 Assembler::target_address_at(pc_, host_))); |
166 } else { | 166 } else { |
167 return Handle<HeapObject>::cast(origin->code_target_object_handle_at(pc_)); | 167 return Handle<HeapObject>::cast(origin->code_target_object_handle_at(pc_)); |
168 } | 168 } |
169 } | 169 } |
170 | 170 |
171 void RelocInfo::set_target_object(HeapObject* target, | 171 void RelocInfo::set_target_object(HeapObject* target, |
172 WriteBarrierMode write_barrier_mode, | 172 WriteBarrierMode write_barrier_mode, |
173 ICacheFlushMode icache_flush_mode) { | 173 ICacheFlushMode icache_flush_mode) { |
174 DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); | 174 DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); |
175 Assembler::set_target_address_at(isolate_, pc_, host_, | 175 Assembler::set_target_address_at(target->GetIsolate(), pc_, host_, |
176 reinterpret_cast<Address>(target), | 176 reinterpret_cast<Address>(target), |
177 icache_flush_mode); | 177 icache_flush_mode); |
178 if (write_barrier_mode == UPDATE_WRITE_BARRIER && host() != NULL && | 178 if (write_barrier_mode == UPDATE_WRITE_BARRIER && host() != NULL) { |
179 target->IsHeapObject()) { | 179 host()->GetHeap()->incremental_marking()->RecordWriteIntoCode(host(), this, |
180 host()->GetHeap()->incremental_marking()->RecordWriteIntoCode( | 180 target); |
181 host(), this, HeapObject::cast(target)); | |
182 host()->GetHeap()->RecordWriteIntoCode(host(), this, target); | 181 host()->GetHeap()->RecordWriteIntoCode(host(), this, target); |
183 } | 182 } |
184 } | 183 } |
185 | 184 |
186 Address RelocInfo::target_external_reference() { | 185 Address RelocInfo::target_external_reference() { |
187 DCHECK(rmode_ == EXTERNAL_REFERENCE); | 186 DCHECK(rmode_ == EXTERNAL_REFERENCE); |
188 return Assembler::target_address_at(pc_, host_); | 187 return Assembler::target_address_at(pc_, host_); |
189 } | 188 } |
190 | 189 |
191 Address RelocInfo::target_runtime_entry(Assembler* origin) { | 190 Address RelocInfo::target_runtime_entry(Assembler* origin) { |
192 DCHECK(IsRuntimeEntry(rmode_)); | 191 DCHECK(IsRuntimeEntry(rmode_)); |
193 return target_address(); | 192 return target_address(); |
194 } | 193 } |
195 | 194 |
196 void RelocInfo::set_target_runtime_entry(Address target, | 195 void RelocInfo::set_target_runtime_entry(Isolate* isolate, Address target, |
197 WriteBarrierMode write_barrier_mode, | 196 WriteBarrierMode write_barrier_mode, |
198 ICacheFlushMode icache_flush_mode) { | 197 ICacheFlushMode icache_flush_mode) { |
199 DCHECK(IsRuntimeEntry(rmode_)); | 198 DCHECK(IsRuntimeEntry(rmode_)); |
200 if (target_address() != target) | 199 if (target_address() != target) |
201 set_target_address(target, write_barrier_mode, icache_flush_mode); | 200 set_target_address(isolate, target, write_barrier_mode, icache_flush_mode); |
202 } | 201 } |
203 | 202 |
204 Handle<Cell> RelocInfo::target_cell_handle() { | 203 Handle<Cell> RelocInfo::target_cell_handle() { |
205 DCHECK(rmode_ == RelocInfo::CELL); | 204 DCHECK(rmode_ == RelocInfo::CELL); |
206 Address address = Memory::Address_at(pc_); | 205 Address address = Memory::Address_at(pc_); |
207 return Handle<Cell>(reinterpret_cast<Cell**>(address)); | 206 return Handle<Cell>(reinterpret_cast<Cell**>(address)); |
208 } | 207 } |
209 | 208 |
210 Cell* RelocInfo::target_cell() { | 209 Cell* RelocInfo::target_cell() { |
211 DCHECK(rmode_ == RelocInfo::CELL); | 210 DCHECK(rmode_ == RelocInfo::CELL); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
253 | 252 |
254 Code* RelocInfo::code_age_stub() { | 253 Code* RelocInfo::code_age_stub() { |
255 DCHECK(rmode_ == RelocInfo::CODE_AGE_SEQUENCE); | 254 DCHECK(rmode_ == RelocInfo::CODE_AGE_SEQUENCE); |
256 return Code::GetCodeFromTargetAddress( | 255 return Code::GetCodeFromTargetAddress( |
257 Assembler::target_address_at(pc_ + kCodeAgingTargetDelta, host_)); | 256 Assembler::target_address_at(pc_ + kCodeAgingTargetDelta, host_)); |
258 } | 257 } |
259 | 258 |
260 void RelocInfo::set_code_age_stub(Code* stub, | 259 void RelocInfo::set_code_age_stub(Code* stub, |
261 ICacheFlushMode icache_flush_mode) { | 260 ICacheFlushMode icache_flush_mode) { |
262 DCHECK(rmode_ == RelocInfo::CODE_AGE_SEQUENCE); | 261 DCHECK(rmode_ == RelocInfo::CODE_AGE_SEQUENCE); |
263 Assembler::set_target_address_at(isolate_, pc_ + kCodeAgingTargetDelta, host_, | 262 Assembler::set_target_address_at( |
264 stub->instruction_start(), | 263 stub->GetIsolate(), pc_ + kCodeAgingTargetDelta, host_, |
265 icache_flush_mode); | 264 stub->instruction_start(), icache_flush_mode); |
266 } | 265 } |
267 | 266 |
268 Address RelocInfo::debug_call_address() { | 267 Address RelocInfo::debug_call_address() { |
269 DCHECK(IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence()); | 268 DCHECK(IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence()); |
270 return Assembler::target_address_at(pc_, host_); | 269 return Assembler::target_address_at(pc_, host_); |
271 } | 270 } |
272 | 271 |
273 void RelocInfo::set_debug_call_address(Address target) { | 272 void RelocInfo::set_debug_call_address(Isolate* isolate, Address target) { |
274 DCHECK(IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence()); | 273 DCHECK(IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence()); |
275 Assembler::set_target_address_at(isolate_, pc_, host_, target); | 274 Assembler::set_target_address_at(isolate, pc_, host_, target); |
276 if (host() != NULL) { | 275 if (host() != NULL) { |
277 Code* target_code = Code::GetCodeFromTargetAddress(target); | 276 Code* target_code = Code::GetCodeFromTargetAddress(target); |
278 host()->GetHeap()->incremental_marking()->RecordWriteIntoCode(host(), this, | 277 host()->GetHeap()->incremental_marking()->RecordWriteIntoCode(host(), this, |
279 target_code); | 278 target_code); |
280 } | 279 } |
281 } | 280 } |
282 | 281 |
283 void RelocInfo::WipeOut() { | 282 void RelocInfo::WipeOut(Isolate* isolate) { |
284 DCHECK(IsEmbeddedObject(rmode_) || IsCodeTarget(rmode_) || | 283 DCHECK(IsEmbeddedObject(rmode_) || IsCodeTarget(rmode_) || |
285 IsRuntimeEntry(rmode_) || IsExternalReference(rmode_) || | 284 IsRuntimeEntry(rmode_) || IsExternalReference(rmode_) || |
286 IsInternalReference(rmode_) || IsInternalReferenceEncoded(rmode_)); | 285 IsInternalReference(rmode_) || IsInternalReferenceEncoded(rmode_)); |
287 if (IsInternalReference(rmode_)) { | 286 if (IsInternalReference(rmode_)) { |
288 // Jump table entry | 287 // Jump table entry |
289 Memory::Address_at(pc_) = NULL; | 288 Memory::Address_at(pc_) = NULL; |
290 } else if (IsInternalReferenceEncoded(rmode_)) { | 289 } else if (IsInternalReferenceEncoded(rmode_)) { |
291 // mov sequence | 290 // mov sequence |
292 // Currently used only by deserializer, no need to flush. | 291 // Currently used only by deserializer, no need to flush. |
293 Assembler::set_target_address_at(isolate_, pc_, host_, NULL, | 292 Assembler::set_target_address_at(isolate, pc_, host_, NULL, |
294 SKIP_ICACHE_FLUSH); | 293 SKIP_ICACHE_FLUSH); |
295 } else { | 294 } else { |
296 Assembler::set_target_address_at(isolate_, pc_, host_, NULL); | 295 Assembler::set_target_address_at(isolate, pc_, host_, NULL); |
297 } | 296 } |
298 } | 297 } |
299 | 298 |
300 template <typename ObjectVisitor> | 299 template <typename ObjectVisitor> |
301 void RelocInfo::Visit(Isolate* isolate, ObjectVisitor* visitor) { | 300 void RelocInfo::Visit(Isolate* isolate, ObjectVisitor* visitor) { |
302 RelocInfo::Mode mode = rmode(); | 301 RelocInfo::Mode mode = rmode(); |
303 if (mode == RelocInfo::EMBEDDED_OBJECT) { | 302 if (mode == RelocInfo::EMBEDDED_OBJECT) { |
304 visitor->VisitEmbeddedPointer(this); | 303 visitor->VisitEmbeddedPointer(this); |
305 } else if (RelocInfo::IsCodeTarget(mode)) { | 304 } else if (RelocInfo::IsCodeTarget(mode)) { |
306 visitor->VisitCodeTarget(this); | 305 visitor->VisitCodeTarget(this); |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
500 set_target_address_at(isolate, pc, code, target, SKIP_ICACHE_FLUSH); | 499 set_target_address_at(isolate, pc, code, target, SKIP_ICACHE_FLUSH); |
501 } else { | 500 } else { |
502 Memory::Address_at(pc) = target; | 501 Memory::Address_at(pc) = target; |
503 } | 502 } |
504 } | 503 } |
505 | 504 |
506 // This code assumes the FIXED_SEQUENCE of IIHF/IILF | 505 // This code assumes the FIXED_SEQUENCE of IIHF/IILF |
507 void Assembler::set_target_address_at(Isolate* isolate, Address pc, | 506 void Assembler::set_target_address_at(Isolate* isolate, Address pc, |
508 Address constant_pool, Address target, | 507 Address constant_pool, Address target, |
509 ICacheFlushMode icache_flush_mode) { | 508 ICacheFlushMode icache_flush_mode) { |
| 509 DCHECK_IMPLIES(isolate == nullptr, icache_flush_mode == SKIP_ICACHE_FLUSH); |
| 510 |
510 // Check for instructions generated by Asm::mov() | 511 // Check for instructions generated by Asm::mov() |
511 Opcode op1 = Instruction::S390OpcodeValue(reinterpret_cast<const byte*>(pc)); | 512 Opcode op1 = Instruction::S390OpcodeValue(reinterpret_cast<const byte*>(pc)); |
512 SixByteInstr instr_1 = | 513 SixByteInstr instr_1 = |
513 Instruction::InstructionBits(reinterpret_cast<const byte*>(pc)); | 514 Instruction::InstructionBits(reinterpret_cast<const byte*>(pc)); |
514 bool patched = false; | 515 bool patched = false; |
515 | 516 |
516 if (BRASL == op1 || BRCL == op1) { | 517 if (BRASL == op1 || BRCL == op1) { |
517 instr_1 >>= 32; // Zero out the lower 32-bits | 518 instr_1 >>= 32; // Zero out the lower 32-bits |
518 instr_1 <<= 32; | 519 instr_1 <<= 32; |
519 int32_t halfwords = (target - pc) / 2; // number of halfwords | 520 int32_t halfwords = (target - pc) / 2; // number of halfwords |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
570 } | 571 } |
571 #endif | 572 #endif |
572 } | 573 } |
573 if (!patched) UNREACHABLE(); | 574 if (!patched) UNREACHABLE(); |
574 } | 575 } |
575 | 576 |
576 } // namespace internal | 577 } // namespace internal |
577 } // namespace v8 | 578 } // namespace v8 |
578 | 579 |
579 #endif // V8_S390_ASSEMBLER_S390_INL_H_ | 580 #endif // V8_S390_ASSEMBLER_S390_INL_H_ |
OLD | NEW |