| 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 43 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 54 void RelocInfo::apply(intptr_t delta) { | 54 void RelocInfo::apply(intptr_t delta) { | 
| 55   // absolute code pointer inside code object moves with the code object. | 55   // absolute code pointer inside code object moves with the code object. | 
| 56   if (IsInternalReference(rmode_)) { | 56   if (IsInternalReference(rmode_)) { | 
| 57     // Jump table entry | 57     // Jump table entry | 
| 58     Address target = Memory::Address_at(pc_); | 58     Address target = Memory::Address_at(pc_); | 
| 59     Memory::Address_at(pc_) = target + delta; | 59     Memory::Address_at(pc_) = target + delta; | 
| 60   } else { | 60   } else { | 
| 61     // mov sequence | 61     // mov sequence | 
| 62     DCHECK(IsInternalReferenceEncoded(rmode_)); | 62     DCHECK(IsInternalReferenceEncoded(rmode_)); | 
| 63     Address target = Assembler::target_address_at(pc_, host_); | 63     Address target = Assembler::target_address_at(pc_, host_); | 
| 64     Assembler::set_target_address_at(isolate_, pc_, host_, target + delta, | 64     Assembler::set_target_address_at(nullptr, pc_, host_, target + delta, | 
| 65                                      SKIP_ICACHE_FLUSH); | 65                                      SKIP_ICACHE_FLUSH); | 
| 66   } | 66   } | 
| 67 } | 67 } | 
| 68 | 68 | 
| 69 | 69 | 
| 70 Address RelocInfo::target_internal_reference() { | 70 Address RelocInfo::target_internal_reference() { | 
| 71   if (IsInternalReference(rmode_)) { | 71   if (IsInternalReference(rmode_)) { | 
| 72     // Jump table entry | 72     // Jump table entry | 
| 73     return Memory::Address_at(pc_); | 73     return Memory::Address_at(pc_); | 
| 74   } else { | 74   } else { | 
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 184 Handle<HeapObject> RelocInfo::target_object_handle(Assembler* origin) { | 184 Handle<HeapObject> RelocInfo::target_object_handle(Assembler* origin) { | 
| 185   DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); | 185   DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); | 
| 186   return Handle<HeapObject>( | 186   return Handle<HeapObject>( | 
| 187       reinterpret_cast<HeapObject**>(Assembler::target_address_at(pc_, host_))); | 187       reinterpret_cast<HeapObject**>(Assembler::target_address_at(pc_, host_))); | 
| 188 } | 188 } | 
| 189 | 189 | 
| 190 void RelocInfo::set_target_object(HeapObject* target, | 190 void RelocInfo::set_target_object(HeapObject* target, | 
| 191                                   WriteBarrierMode write_barrier_mode, | 191                                   WriteBarrierMode write_barrier_mode, | 
| 192                                   ICacheFlushMode icache_flush_mode) { | 192                                   ICacheFlushMode icache_flush_mode) { | 
| 193   DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); | 193   DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); | 
| 194   Assembler::set_target_address_at(isolate_, pc_, host_, | 194   Assembler::set_target_address_at(target->GetIsolate(), pc_, host_, | 
| 195                                    reinterpret_cast<Address>(target), | 195                                    reinterpret_cast<Address>(target), | 
| 196                                    icache_flush_mode); | 196                                    icache_flush_mode); | 
| 197   if (write_barrier_mode == UPDATE_WRITE_BARRIER && host() != NULL && | 197   if (write_barrier_mode == UPDATE_WRITE_BARRIER && host() != NULL) { | 
| 198       target->IsHeapObject()) { | 198     host()->GetHeap()->incremental_marking()->RecordWriteIntoCode(host(), this, | 
| 199     host()->GetHeap()->incremental_marking()->RecordWriteIntoCode( | 199                                                                   target); | 
| 200         host(), this, HeapObject::cast(target)); |  | 
| 201     host()->GetHeap()->RecordWriteIntoCode(host(), this, target); | 200     host()->GetHeap()->RecordWriteIntoCode(host(), this, target); | 
| 202   } | 201   } | 
| 203 } | 202 } | 
| 204 | 203 | 
| 205 | 204 | 
| 206 Address RelocInfo::target_external_reference() { | 205 Address RelocInfo::target_external_reference() { | 
| 207   DCHECK(rmode_ == EXTERNAL_REFERENCE); | 206   DCHECK(rmode_ == EXTERNAL_REFERENCE); | 
| 208   return Assembler::target_address_at(pc_, host_); | 207   return Assembler::target_address_at(pc_, host_); | 
| 209 } | 208 } | 
| 210 | 209 | 
| 211 | 210 | 
| 212 Address RelocInfo::target_runtime_entry(Assembler* origin) { | 211 Address RelocInfo::target_runtime_entry(Assembler* origin) { | 
| 213   DCHECK(IsRuntimeEntry(rmode_)); | 212   DCHECK(IsRuntimeEntry(rmode_)); | 
| 214   return target_address(); | 213   return target_address(); | 
| 215 } | 214 } | 
| 216 | 215 | 
| 217 | 216 void RelocInfo::set_target_runtime_entry(Isolate* isolate, Address target, | 
| 218 void RelocInfo::set_target_runtime_entry(Address target, |  | 
| 219                                          WriteBarrierMode write_barrier_mode, | 217                                          WriteBarrierMode write_barrier_mode, | 
| 220                                          ICacheFlushMode icache_flush_mode) { | 218                                          ICacheFlushMode icache_flush_mode) { | 
| 221   DCHECK(IsRuntimeEntry(rmode_)); | 219   DCHECK(IsRuntimeEntry(rmode_)); | 
| 222   if (target_address() != target) | 220   if (target_address() != target) | 
| 223     set_target_address(target, write_barrier_mode, icache_flush_mode); | 221     set_target_address(isolate, target, write_barrier_mode, icache_flush_mode); | 
| 224 } | 222 } | 
| 225 | 223 | 
| 226 | 224 | 
| 227 Handle<Cell> RelocInfo::target_cell_handle() { | 225 Handle<Cell> RelocInfo::target_cell_handle() { | 
| 228   DCHECK(rmode_ == RelocInfo::CELL); | 226   DCHECK(rmode_ == RelocInfo::CELL); | 
| 229   Address address = Memory::Address_at(pc_); | 227   Address address = Memory::Address_at(pc_); | 
| 230   return Handle<Cell>(reinterpret_cast<Cell**>(address)); | 228   return Handle<Cell>(reinterpret_cast<Cell**>(address)); | 
| 231 } | 229 } | 
| 232 | 230 | 
| 233 | 231 | 
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 274 Code* RelocInfo::code_age_stub() { | 272 Code* RelocInfo::code_age_stub() { | 
| 275   DCHECK(rmode_ == RelocInfo::CODE_AGE_SEQUENCE); | 273   DCHECK(rmode_ == RelocInfo::CODE_AGE_SEQUENCE); | 
| 276   return Code::GetCodeFromTargetAddress( | 274   return Code::GetCodeFromTargetAddress( | 
| 277       Assembler::target_address_at(pc_ + kCodeAgingTargetDelta, host_)); | 275       Assembler::target_address_at(pc_ + kCodeAgingTargetDelta, host_)); | 
| 278 } | 276 } | 
| 279 | 277 | 
| 280 | 278 | 
| 281 void RelocInfo::set_code_age_stub(Code* stub, | 279 void RelocInfo::set_code_age_stub(Code* stub, | 
| 282                                   ICacheFlushMode icache_flush_mode) { | 280                                   ICacheFlushMode icache_flush_mode) { | 
| 283   DCHECK(rmode_ == RelocInfo::CODE_AGE_SEQUENCE); | 281   DCHECK(rmode_ == RelocInfo::CODE_AGE_SEQUENCE); | 
| 284   Assembler::set_target_address_at(isolate_, pc_ + kCodeAgingTargetDelta, host_, | 282   Assembler::set_target_address_at( | 
| 285                                    stub->instruction_start(), | 283       stub->GetIsolate(), pc_ + kCodeAgingTargetDelta, host_, | 
| 286                                    icache_flush_mode); | 284       stub->instruction_start(), icache_flush_mode); | 
| 287 } | 285 } | 
| 288 | 286 | 
| 289 | 287 | 
| 290 Address RelocInfo::debug_call_address() { | 288 Address RelocInfo::debug_call_address() { | 
| 291   DCHECK(IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence()); | 289   DCHECK(IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence()); | 
| 292   return Assembler::target_address_at(pc_, host_); | 290   return Assembler::target_address_at(pc_, host_); | 
| 293 } | 291 } | 
| 294 | 292 | 
| 295 | 293 void RelocInfo::set_debug_call_address(Isolate* isolate, Address target) { | 
| 296 void RelocInfo::set_debug_call_address(Address target) { |  | 
| 297   DCHECK(IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence()); | 294   DCHECK(IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence()); | 
| 298   Assembler::set_target_address_at(isolate_, pc_, host_, target); | 295   Assembler::set_target_address_at(isolate, pc_, host_, target); | 
| 299   if (host() != NULL) { | 296   if (host() != NULL) { | 
| 300     Code* target_code = Code::GetCodeFromTargetAddress(target); | 297     Code* target_code = Code::GetCodeFromTargetAddress(target); | 
| 301     host()->GetHeap()->incremental_marking()->RecordWriteIntoCode(host(), this, | 298     host()->GetHeap()->incremental_marking()->RecordWriteIntoCode(host(), this, | 
| 302                                                                   target_code); | 299                                                                   target_code); | 
| 303   } | 300   } | 
| 304 } | 301 } | 
| 305 | 302 | 
| 306 | 303 void RelocInfo::WipeOut(Isolate* isolate) { | 
| 307 void RelocInfo::WipeOut() { |  | 
| 308   DCHECK(IsEmbeddedObject(rmode_) || IsCodeTarget(rmode_) || | 304   DCHECK(IsEmbeddedObject(rmode_) || IsCodeTarget(rmode_) || | 
| 309          IsRuntimeEntry(rmode_) || IsExternalReference(rmode_) || | 305          IsRuntimeEntry(rmode_) || IsExternalReference(rmode_) || | 
| 310          IsInternalReference(rmode_) || IsInternalReferenceEncoded(rmode_)); | 306          IsInternalReference(rmode_) || IsInternalReferenceEncoded(rmode_)); | 
| 311   if (IsInternalReference(rmode_)) { | 307   if (IsInternalReference(rmode_)) { | 
| 312     // Jump table entry | 308     // Jump table entry | 
| 313     Memory::Address_at(pc_) = NULL; | 309     Memory::Address_at(pc_) = NULL; | 
| 314   } else if (IsInternalReferenceEncoded(rmode_)) { | 310   } else if (IsInternalReferenceEncoded(rmode_)) { | 
| 315     // mov sequence | 311     // mov sequence | 
| 316     // Currently used only by deserializer, no need to flush. | 312     // Currently used only by deserializer, no need to flush. | 
| 317     Assembler::set_target_address_at(isolate_, pc_, host_, NULL, | 313     Assembler::set_target_address_at(isolate, pc_, host_, NULL, | 
| 318                                      SKIP_ICACHE_FLUSH); | 314                                      SKIP_ICACHE_FLUSH); | 
| 319   } else { | 315   } else { | 
| 320     Assembler::set_target_address_at(isolate_, pc_, host_, NULL); | 316     Assembler::set_target_address_at(isolate, pc_, host_, NULL); | 
| 321   } | 317   } | 
| 322 } | 318 } | 
| 323 | 319 | 
| 324 template <typename ObjectVisitor> | 320 template <typename ObjectVisitor> | 
| 325 void RelocInfo::Visit(Isolate* isolate, ObjectVisitor* visitor) { | 321 void RelocInfo::Visit(Isolate* isolate, ObjectVisitor* visitor) { | 
| 326   RelocInfo::Mode mode = rmode(); | 322   RelocInfo::Mode mode = rmode(); | 
| 327   if (mode == RelocInfo::EMBEDDED_OBJECT) { | 323   if (mode == RelocInfo::EMBEDDED_OBJECT) { | 
| 328     visitor->VisitEmbeddedPointer(this); | 324     visitor->VisitEmbeddedPointer(this); | 
| 329   } else if (RelocInfo::IsCodeTarget(mode)) { | 325   } else if (RelocInfo::IsCodeTarget(mode)) { | 
| 330     visitor->VisitCodeTarget(this); | 326     visitor->VisitCodeTarget(this); | 
| (...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 613   } else { | 609   } else { | 
| 614     Memory::Address_at(pc) = target; | 610     Memory::Address_at(pc) = target; | 
| 615   } | 611   } | 
| 616 } | 612 } | 
| 617 | 613 | 
| 618 | 614 | 
| 619 // This code assumes the FIXED_SEQUENCE of lis/ori | 615 // This code assumes the FIXED_SEQUENCE of lis/ori | 
| 620 void Assembler::set_target_address_at(Isolate* isolate, Address pc, | 616 void Assembler::set_target_address_at(Isolate* isolate, Address pc, | 
| 621                                       Address constant_pool, Address target, | 617                                       Address constant_pool, Address target, | 
| 622                                       ICacheFlushMode icache_flush_mode) { | 618                                       ICacheFlushMode icache_flush_mode) { | 
|  | 619   DCHECK_IMPLIES(isolate == nullptr, icache_flush_mode == SKIP_ICACHE_FLUSH); | 
|  | 620 | 
| 623   if (FLAG_enable_embedded_constant_pool && constant_pool) { | 621   if (FLAG_enable_embedded_constant_pool && constant_pool) { | 
| 624     ConstantPoolEntry::Access access; | 622     ConstantPoolEntry::Access access; | 
| 625     if (IsConstantPoolLoadStart(pc, &access)) { | 623     if (IsConstantPoolLoadStart(pc, &access)) { | 
| 626       Memory::Address_at(target_constant_pool_address_at( | 624       Memory::Address_at(target_constant_pool_address_at( | 
| 627           pc, constant_pool, access, ConstantPoolEntry::INTPTR)) = target; | 625           pc, constant_pool, access, ConstantPoolEntry::INTPTR)) = target; | 
| 628       return; | 626       return; | 
| 629     } | 627     } | 
| 630   } | 628   } | 
| 631 | 629 | 
| 632   Instr instr1 = instr_at(pc); | 630   Instr instr1 = instr_at(pc); | 
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 680     } | 678     } | 
| 681 #endif | 679 #endif | 
| 682     return; | 680     return; | 
| 683   } | 681   } | 
| 684   UNREACHABLE(); | 682   UNREACHABLE(); | 
| 685 } | 683 } | 
| 686 }  // namespace internal | 684 }  // namespace internal | 
| 687 }  // namespace v8 | 685 }  // namespace v8 | 
| 688 | 686 | 
| 689 #endif  // V8_PPC_ASSEMBLER_PPC_INL_H_ | 687 #endif  // V8_PPC_ASSEMBLER_PPC_INL_H_ | 
| OLD | NEW | 
|---|