| 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 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 81 ASSERT(IsCodeTarget(rmode_) || rmode_ == RUNTIME_ENTRY); | 81 ASSERT(IsCodeTarget(rmode_) || rmode_ == RUNTIME_ENTRY); |
| 82 return reinterpret_cast<Address>(pc_); | 82 return reinterpret_cast<Address>(pc_); |
| 83 } | 83 } |
| 84 | 84 |
| 85 | 85 |
| 86 int RelocInfo::target_address_size() { | 86 int RelocInfo::target_address_size() { |
| 87 return Assembler::kExternalTargetSize; | 87 return Assembler::kExternalTargetSize; |
| 88 } | 88 } |
| 89 | 89 |
| 90 | 90 |
| 91 void RelocInfo::set_target_address(Address target) { | 91 void RelocInfo::set_target_address(Address target, Code* code) { |
| 92 ASSERT(IsCodeTarget(rmode_) || rmode_ == RUNTIME_ENTRY); | 92 ASSERT(IsCodeTarget(rmode_) || rmode_ == RUNTIME_ENTRY); |
| 93 if (code != NULL && IsCodeTarget(rmode_)) { |
| 94 Object* target_code = Code::GetCodeFromTargetAddress(target); |
| 95 IncrementalMarking::RecordWrite(code, HeapObject::cast(target_code)); |
| 96 } |
| 93 Assembler::set_target_address_at(pc_, target); | 97 Assembler::set_target_address_at(pc_, target); |
| 94 } | 98 } |
| 95 | 99 |
| 96 | 100 |
| 97 Object* RelocInfo::target_object() { | 101 Object* RelocInfo::target_object() { |
| 98 ASSERT(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); | 102 ASSERT(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); |
| 99 return Memory::Object_at(pc_); | 103 return Memory::Object_at(pc_); |
| 100 } | 104 } |
| 101 | 105 |
| 102 | 106 |
| 103 Handle<Object> RelocInfo::target_object_handle(Assembler* origin) { | 107 Handle<Object> RelocInfo::target_object_handle(Assembler* origin) { |
| 104 ASSERT(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); | 108 ASSERT(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); |
| 105 return Memory::Object_Handle_at(pc_); | 109 return Memory::Object_Handle_at(pc_); |
| 106 } | 110 } |
| 107 | 111 |
| 108 | 112 |
| 109 Object** RelocInfo::target_object_address() { | 113 Object** RelocInfo::target_object_address() { |
| 110 ASSERT(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); | 114 ASSERT(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); |
| 111 return &Memory::Object_at(pc_); | 115 return &Memory::Object_at(pc_); |
| 112 } | 116 } |
| 113 | 117 |
| 114 | 118 |
| 115 void RelocInfo::set_target_object(Object* target) { | 119 void RelocInfo::set_target_object(Object* target, Code* code) { |
| 116 ASSERT(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); | 120 ASSERT(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); |
| 117 Memory::Object_at(pc_) = target; | 121 Memory::Object_at(pc_) = target; |
| 118 CPU::FlushICache(pc_, sizeof(Address)); | 122 CPU::FlushICache(pc_, sizeof(Address)); |
| 123 if (code != NULL && target->IsHeapObject()) { |
| 124 IncrementalMarking::RecordWrite(code, HeapObject::cast(target)); |
| 125 } |
| 119 } | 126 } |
| 120 | 127 |
| 121 | 128 |
| 122 Address* RelocInfo::target_reference_address() { | 129 Address* RelocInfo::target_reference_address() { |
| 123 ASSERT(rmode_ == RelocInfo::EXTERNAL_REFERENCE); | 130 ASSERT(rmode_ == RelocInfo::EXTERNAL_REFERENCE); |
| 124 return reinterpret_cast<Address*>(pc_); | 131 return reinterpret_cast<Address*>(pc_); |
| 125 } | 132 } |
| 126 | 133 |
| 127 | 134 |
| 128 Handle<JSGlobalPropertyCell> RelocInfo::target_cell_handle() { | 135 Handle<JSGlobalPropertyCell> RelocInfo::target_cell_handle() { |
| 129 ASSERT(rmode_ == RelocInfo::GLOBAL_PROPERTY_CELL); | 136 ASSERT(rmode_ == RelocInfo::GLOBAL_PROPERTY_CELL); |
| 130 Address address = Memory::Address_at(pc_); | 137 Address address = Memory::Address_at(pc_); |
| 131 return Handle<JSGlobalPropertyCell>( | 138 return Handle<JSGlobalPropertyCell>( |
| 132 reinterpret_cast<JSGlobalPropertyCell**>(address)); | 139 reinterpret_cast<JSGlobalPropertyCell**>(address)); |
| 133 } | 140 } |
| 134 | 141 |
| 135 | 142 |
| 136 JSGlobalPropertyCell* RelocInfo::target_cell() { | 143 JSGlobalPropertyCell* RelocInfo::target_cell() { |
| 137 ASSERT(rmode_ == RelocInfo::GLOBAL_PROPERTY_CELL); | 144 ASSERT(rmode_ == RelocInfo::GLOBAL_PROPERTY_CELL); |
| 138 Address address = Memory::Address_at(pc_); | 145 Address address = Memory::Address_at(pc_); |
| 139 Object* object = HeapObject::FromAddress( | 146 Object* object = HeapObject::FromAddress( |
| 140 address - JSGlobalPropertyCell::kValueOffset); | 147 address - JSGlobalPropertyCell::kValueOffset); |
| 141 return reinterpret_cast<JSGlobalPropertyCell*>(object); | 148 return reinterpret_cast<JSGlobalPropertyCell*>(object); |
| 142 } | 149 } |
| 143 | 150 |
| 144 | 151 |
| 145 void RelocInfo::set_target_cell(JSGlobalPropertyCell* cell) { | 152 void RelocInfo::set_target_cell(JSGlobalPropertyCell* cell, Code* code) { |
| 146 ASSERT(rmode_ == RelocInfo::GLOBAL_PROPERTY_CELL); | 153 ASSERT(rmode_ == RelocInfo::GLOBAL_PROPERTY_CELL); |
| 147 Address address = cell->address() + JSGlobalPropertyCell::kValueOffset; | 154 Address address = cell->address() + JSGlobalPropertyCell::kValueOffset; |
| 148 Memory::Address_at(pc_) = address; | 155 Memory::Address_at(pc_) = address; |
| 149 CPU::FlushICache(pc_, sizeof(Address)); | 156 CPU::FlushICache(pc_, sizeof(Address)); |
| 157 if (code != NULL) IncrementalMarking::RecordWrite(code, cell); |
| 150 } | 158 } |
| 151 | 159 |
| 152 | 160 |
| 153 Address RelocInfo::call_address() { | 161 Address RelocInfo::call_address() { |
| 154 ASSERT((IsJSReturn(rmode()) && IsPatchedReturnSequence()) || | 162 ASSERT((IsJSReturn(rmode()) && IsPatchedReturnSequence()) || |
| 155 (IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence())); | 163 (IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence())); |
| 156 return Assembler::target_address_at(pc_ + 1); | 164 return Assembler::target_address_at(pc_ + 1); |
| 157 } | 165 } |
| 158 | 166 |
| 159 | 167 |
| (...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 420 | 428 |
| 421 Operand::Operand(int32_t disp, RelocInfo::Mode rmode) { | 429 Operand::Operand(int32_t disp, RelocInfo::Mode rmode) { |
| 422 // [disp/r] | 430 // [disp/r] |
| 423 set_modrm(0, ebp); | 431 set_modrm(0, ebp); |
| 424 set_dispr(disp, rmode); | 432 set_dispr(disp, rmode); |
| 425 } | 433 } |
| 426 | 434 |
| 427 } } // namespace v8::internal | 435 } } // namespace v8::internal |
| 428 | 436 |
| 429 #endif // V8_IA32_ASSEMBLER_IA32_INL_H_ | 437 #endif // V8_IA32_ASSEMBLER_IA32_INL_H_ |
| OLD | NEW |