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 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
110 DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); | 110 DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); |
111 return Handle<HeapObject>::cast(Memory::Object_Handle_at(pc_)); | 111 return Handle<HeapObject>::cast(Memory::Object_Handle_at(pc_)); |
112 } | 112 } |
113 | 113 |
114 void RelocInfo::set_target_object(HeapObject* target, | 114 void RelocInfo::set_target_object(HeapObject* target, |
115 WriteBarrierMode write_barrier_mode, | 115 WriteBarrierMode write_barrier_mode, |
116 ICacheFlushMode icache_flush_mode) { | 116 ICacheFlushMode icache_flush_mode) { |
117 DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); | 117 DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); |
118 Memory::Object_at(pc_) = target; | 118 Memory::Object_at(pc_) = target; |
119 if (icache_flush_mode != SKIP_ICACHE_FLUSH) { | 119 if (icache_flush_mode != SKIP_ICACHE_FLUSH) { |
120 Assembler::FlushICache(isolate_, pc_, sizeof(Address)); | 120 Assembler::FlushICache(target->GetIsolate(), pc_, sizeof(Address)); |
121 } | 121 } |
122 if (write_barrier_mode == UPDATE_WRITE_BARRIER && host() != NULL) { | 122 if (write_barrier_mode == UPDATE_WRITE_BARRIER && host() != NULL) { |
123 host()->GetHeap()->RecordWriteIntoCode(host(), this, target); | 123 host()->GetHeap()->RecordWriteIntoCode(host(), this, target); |
124 host()->GetHeap()->incremental_marking()->RecordWriteIntoCode(host(), this, | 124 host()->GetHeap()->incremental_marking()->RecordWriteIntoCode(host(), this, |
125 target); | 125 target); |
126 } | 126 } |
127 } | 127 } |
128 | 128 |
129 | 129 |
130 Address RelocInfo::target_external_reference() { | 130 Address RelocInfo::target_external_reference() { |
(...skipping 12 matching lines...) Expand all Loading... |
143 DCHECK(rmode_ == INTERNAL_REFERENCE); | 143 DCHECK(rmode_ == INTERNAL_REFERENCE); |
144 return reinterpret_cast<Address>(pc_); | 144 return reinterpret_cast<Address>(pc_); |
145 } | 145 } |
146 | 146 |
147 | 147 |
148 Address RelocInfo::target_runtime_entry(Assembler* origin) { | 148 Address RelocInfo::target_runtime_entry(Assembler* origin) { |
149 DCHECK(IsRuntimeEntry(rmode_)); | 149 DCHECK(IsRuntimeEntry(rmode_)); |
150 return reinterpret_cast<Address>(*reinterpret_cast<int32_t*>(pc_)); | 150 return reinterpret_cast<Address>(*reinterpret_cast<int32_t*>(pc_)); |
151 } | 151 } |
152 | 152 |
153 | 153 void RelocInfo::set_target_runtime_entry(Isolate* isolate, Address target, |
154 void RelocInfo::set_target_runtime_entry(Address target, | |
155 WriteBarrierMode write_barrier_mode, | 154 WriteBarrierMode write_barrier_mode, |
156 ICacheFlushMode icache_flush_mode) { | 155 ICacheFlushMode icache_flush_mode) { |
157 DCHECK(IsRuntimeEntry(rmode_)); | 156 DCHECK(IsRuntimeEntry(rmode_)); |
158 if (target_address() != target) { | 157 if (target_address() != target) { |
159 set_target_address(target, write_barrier_mode, icache_flush_mode); | 158 set_target_address(isolate, target, write_barrier_mode, icache_flush_mode); |
160 } | 159 } |
161 } | 160 } |
162 | 161 |
163 | 162 |
164 Handle<Cell> RelocInfo::target_cell_handle() { | 163 Handle<Cell> RelocInfo::target_cell_handle() { |
165 DCHECK(rmode_ == RelocInfo::CELL); | 164 DCHECK(rmode_ == RelocInfo::CELL); |
166 Address address = Memory::Address_at(pc_); | 165 Address address = Memory::Address_at(pc_); |
167 return Handle<Cell>(reinterpret_cast<Cell**>(address)); | 166 return Handle<Cell>(reinterpret_cast<Cell**>(address)); |
168 } | 167 } |
169 | 168 |
170 | 169 |
171 Cell* RelocInfo::target_cell() { | 170 Cell* RelocInfo::target_cell() { |
172 DCHECK(rmode_ == RelocInfo::CELL); | 171 DCHECK(rmode_ == RelocInfo::CELL); |
173 return Cell::FromValueAddress(Memory::Address_at(pc_)); | 172 return Cell::FromValueAddress(Memory::Address_at(pc_)); |
174 } | 173 } |
175 | 174 |
176 | 175 |
177 void RelocInfo::set_target_cell(Cell* cell, | 176 void RelocInfo::set_target_cell(Cell* cell, |
178 WriteBarrierMode write_barrier_mode, | 177 WriteBarrierMode write_barrier_mode, |
179 ICacheFlushMode icache_flush_mode) { | 178 ICacheFlushMode icache_flush_mode) { |
180 DCHECK(cell->IsCell()); | 179 DCHECK(cell->IsCell()); |
181 DCHECK(rmode_ == RelocInfo::CELL); | 180 DCHECK(rmode_ == RelocInfo::CELL); |
182 Address address = cell->address() + Cell::kValueOffset; | 181 Address address = cell->address() + Cell::kValueOffset; |
183 Memory::Address_at(pc_) = address; | 182 Memory::Address_at(pc_) = address; |
184 if (icache_flush_mode != SKIP_ICACHE_FLUSH) { | 183 if (icache_flush_mode != SKIP_ICACHE_FLUSH) { |
185 Assembler::FlushICache(isolate_, pc_, sizeof(Address)); | 184 Assembler::FlushICache(cell->GetIsolate(), pc_, sizeof(Address)); |
186 } | 185 } |
187 if (write_barrier_mode == UPDATE_WRITE_BARRIER && host() != NULL) { | 186 if (write_barrier_mode == UPDATE_WRITE_BARRIER && host() != NULL) { |
188 host()->GetHeap()->incremental_marking()->RecordWriteIntoCode(host(), this, | 187 host()->GetHeap()->incremental_marking()->RecordWriteIntoCode(host(), this, |
189 cell); | 188 cell); |
190 } | 189 } |
191 } | 190 } |
192 | 191 |
193 Handle<Code> RelocInfo::code_age_stub_handle(Assembler* origin) { | 192 Handle<Code> RelocInfo::code_age_stub_handle(Assembler* origin) { |
194 DCHECK(rmode_ == RelocInfo::CODE_AGE_SEQUENCE); | 193 DCHECK(rmode_ == RelocInfo::CODE_AGE_SEQUENCE); |
195 DCHECK(*pc_ == kCallOpcode); | 194 DCHECK(*pc_ == kCallOpcode); |
196 return Handle<Code>::cast(Memory::Object_Handle_at(pc_ + 1)); | 195 return Handle<Code>::cast(Memory::Object_Handle_at(pc_ + 1)); |
197 } | 196 } |
198 | 197 |
199 | 198 |
200 Code* RelocInfo::code_age_stub() { | 199 Code* RelocInfo::code_age_stub() { |
201 DCHECK(rmode_ == RelocInfo::CODE_AGE_SEQUENCE); | 200 DCHECK(rmode_ == RelocInfo::CODE_AGE_SEQUENCE); |
202 DCHECK(*pc_ == kCallOpcode); | 201 DCHECK(*pc_ == kCallOpcode); |
203 return Code::GetCodeFromTargetAddress( | 202 return Code::GetCodeFromTargetAddress( |
204 Assembler::target_address_at(pc_ + 1, host_)); | 203 Assembler::target_address_at(pc_ + 1, host_)); |
205 } | 204 } |
206 | 205 |
207 | 206 |
208 void RelocInfo::set_code_age_stub(Code* stub, | 207 void RelocInfo::set_code_age_stub(Code* stub, |
209 ICacheFlushMode icache_flush_mode) { | 208 ICacheFlushMode icache_flush_mode) { |
210 DCHECK(*pc_ == kCallOpcode); | 209 DCHECK(*pc_ == kCallOpcode); |
211 DCHECK(rmode_ == RelocInfo::CODE_AGE_SEQUENCE); | 210 DCHECK(rmode_ == RelocInfo::CODE_AGE_SEQUENCE); |
212 Assembler::set_target_address_at( | 211 Assembler::set_target_address_at(stub->GetIsolate(), pc_ + 1, host_, |
213 isolate_, pc_ + 1, host_, stub->instruction_start(), icache_flush_mode); | 212 stub->instruction_start(), |
| 213 icache_flush_mode); |
214 } | 214 } |
215 | 215 |
216 | 216 |
217 Address RelocInfo::debug_call_address() { | 217 Address RelocInfo::debug_call_address() { |
218 DCHECK(IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence()); | 218 DCHECK(IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence()); |
219 Address location = pc_ + Assembler::kPatchDebugBreakSlotAddressOffset; | 219 Address location = pc_ + Assembler::kPatchDebugBreakSlotAddressOffset; |
220 return Assembler::target_address_at(location, host_); | 220 return Assembler::target_address_at(location, host_); |
221 } | 221 } |
222 | 222 |
223 | 223 void RelocInfo::set_debug_call_address(Isolate* isolate, Address target) { |
224 void RelocInfo::set_debug_call_address(Address target) { | |
225 DCHECK(IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence()); | 224 DCHECK(IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence()); |
226 Address location = pc_ + Assembler::kPatchDebugBreakSlotAddressOffset; | 225 Address location = pc_ + Assembler::kPatchDebugBreakSlotAddressOffset; |
227 Assembler::set_target_address_at(isolate_, location, host_, target); | 226 Assembler::set_target_address_at(isolate, location, host_, target); |
228 if (host() != NULL) { | 227 if (host() != NULL) { |
229 Code* target_code = Code::GetCodeFromTargetAddress(target); | 228 Code* target_code = Code::GetCodeFromTargetAddress(target); |
230 host()->GetHeap()->incremental_marking()->RecordWriteIntoCode(host(), this, | 229 host()->GetHeap()->incremental_marking()->RecordWriteIntoCode(host(), this, |
231 target_code); | 230 target_code); |
232 } | 231 } |
233 } | 232 } |
234 | 233 |
235 | 234 void RelocInfo::WipeOut(Isolate* isolate) { |
236 void RelocInfo::WipeOut() { | |
237 if (IsEmbeddedObject(rmode_) || IsExternalReference(rmode_) || | 235 if (IsEmbeddedObject(rmode_) || IsExternalReference(rmode_) || |
238 IsInternalReference(rmode_)) { | 236 IsInternalReference(rmode_)) { |
239 Memory::Address_at(pc_) = NULL; | 237 Memory::Address_at(pc_) = NULL; |
240 } else if (IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_)) { | 238 } else if (IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_)) { |
241 // Effectively write zero into the relocation. | 239 // Effectively write zero into the relocation. |
242 Assembler::set_target_address_at(isolate_, pc_, host_, | 240 Assembler::set_target_address_at(isolate, pc_, host_, |
243 pc_ + sizeof(int32_t)); | 241 pc_ + sizeof(int32_t)); |
244 } else { | 242 } else { |
245 UNREACHABLE(); | 243 UNREACHABLE(); |
246 } | 244 } |
247 } | 245 } |
248 | 246 |
249 template <typename ObjectVisitor> | 247 template <typename ObjectVisitor> |
250 void RelocInfo::Visit(Isolate* isolate, ObjectVisitor* visitor) { | 248 void RelocInfo::Visit(Isolate* isolate, ObjectVisitor* visitor) { |
251 RelocInfo::Mode mode = rmode(); | 249 RelocInfo::Mode mode = rmode(); |
252 if (mode == RelocInfo::EMBEDDED_OBJECT) { | 250 if (mode == RelocInfo::EMBEDDED_OBJECT) { |
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
427 | 425 |
428 | 426 |
429 Address Assembler::target_address_at(Address pc, Address constant_pool) { | 427 Address Assembler::target_address_at(Address pc, Address constant_pool) { |
430 return pc + sizeof(int32_t) + *reinterpret_cast<int32_t*>(pc); | 428 return pc + sizeof(int32_t) + *reinterpret_cast<int32_t*>(pc); |
431 } | 429 } |
432 | 430 |
433 | 431 |
434 void Assembler::set_target_address_at(Isolate* isolate, Address pc, | 432 void Assembler::set_target_address_at(Isolate* isolate, Address pc, |
435 Address constant_pool, Address target, | 433 Address constant_pool, Address target, |
436 ICacheFlushMode icache_flush_mode) { | 434 ICacheFlushMode icache_flush_mode) { |
| 435 DCHECK_IMPLIES(isolate == nullptr, icache_flush_mode == SKIP_ICACHE_FLUSH); |
437 int32_t* p = reinterpret_cast<int32_t*>(pc); | 436 int32_t* p = reinterpret_cast<int32_t*>(pc); |
438 *p = target - (pc + sizeof(int32_t)); | 437 *p = target - (pc + sizeof(int32_t)); |
439 if (icache_flush_mode != SKIP_ICACHE_FLUSH) { | 438 if (icache_flush_mode != SKIP_ICACHE_FLUSH) { |
440 Assembler::FlushICache(isolate, p, sizeof(int32_t)); | 439 Assembler::FlushICache(isolate, p, sizeof(int32_t)); |
441 } | 440 } |
442 } | 441 } |
443 | 442 |
444 Address Assembler::target_address_at(Address pc, Code* code) { | 443 Address Assembler::target_address_at(Address pc, Code* code) { |
445 Address constant_pool = code ? code->constant_pool() : NULL; | 444 Address constant_pool = code ? code->constant_pool() : NULL; |
446 return target_address_at(pc, constant_pool); | 445 return target_address_at(pc, constant_pool); |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
545 | 544 |
546 Operand::Operand(Immediate imm) { | 545 Operand::Operand(Immediate imm) { |
547 // [disp/r] | 546 // [disp/r] |
548 set_modrm(0, ebp); | 547 set_modrm(0, ebp); |
549 set_dispr(imm.x_, imm.rmode_); | 548 set_dispr(imm.x_, imm.rmode_); |
550 } | 549 } |
551 } // namespace internal | 550 } // namespace internal |
552 } // namespace v8 | 551 } // namespace v8 |
553 | 552 |
554 #endif // V8_IA32_ASSEMBLER_IA32_INL_H_ | 553 #endif // V8_IA32_ASSEMBLER_IA32_INL_H_ |
OLD | NEW |