| 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 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 193 Address Assembler::target_address_from_return_address(Address pc) { | 193 Address Assembler::target_address_from_return_address(Address pc) { |
| 194 return pc - kCallTargetAddressOffset; | 194 return pc - kCallTargetAddressOffset; |
| 195 } | 195 } |
| 196 | 196 |
| 197 | 197 |
| 198 Address Assembler::break_address_from_return_address(Address pc) { | 198 Address Assembler::break_address_from_return_address(Address pc) { |
| 199 return pc - Assembler::kPatchDebugBreakSlotReturnOffset; | 199 return pc - Assembler::kPatchDebugBreakSlotReturnOffset; |
| 200 } | 200 } |
| 201 | 201 |
| 202 | 202 |
| 203 void Assembler::set_target_internal_reference_encoded_at(Address pc, |
| 204 Address target) { |
| 205 // Encoded internal references are lui/ori load of 32-bit abolute address. |
| 206 Instr instr_lui = Assembler::instr_at(pc + 0 * Assembler::kInstrSize); |
| 207 Instr instr_ori = Assembler::instr_at(pc + 1 * Assembler::kInstrSize); |
| 208 DCHECK(Assembler::IsLui(instr_lui)); |
| 209 DCHECK(Assembler::IsOri(instr_ori)); |
| 210 instr_lui &= ~kImm16Mask; |
| 211 instr_ori &= ~kImm16Mask; |
| 212 int32_t imm = reinterpret_cast<int32_t>(target); |
| 213 DCHECK((imm & 3) == 0); |
| 214 Assembler::instr_at_put(pc + 0 * Assembler::kInstrSize, |
| 215 instr_lui | ((imm >> kLuiShift) & kImm16Mask)); |
| 216 Assembler::instr_at_put(pc + 1 * Assembler::kInstrSize, |
| 217 instr_ori | (imm & kImm16Mask)); |
| 218 |
| 219 // Currently used only by deserializer, and all code will be flushed |
| 220 // after complete deserialization, no need to flush on each reference. |
| 221 } |
| 222 |
| 223 |
| 203 void Assembler::deserialization_set_target_internal_reference_at( | 224 void Assembler::deserialization_set_target_internal_reference_at( |
| 204 Address pc, Address target) { | 225 Address pc, Address target, RelocInfo::Mode mode) { |
| 205 if (IsLui(instr_at(pc))) { | 226 if (mode == RelocInfo::INTERNAL_REFERENCE_ENCODED) { |
| 206 // Encoded internal references are lui/ori load of 32-bit abolute address. | 227 DCHECK(IsLui(instr_at(pc))); |
| 207 Instr instr_lui = Assembler::instr_at(pc + 0 * Assembler::kInstrSize); | 228 set_target_internal_reference_encoded_at(pc, target); |
| 208 Instr instr_ori = Assembler::instr_at(pc + 1 * Assembler::kInstrSize); | |
| 209 DCHECK(Assembler::IsLui(instr_lui)); | |
| 210 DCHECK(Assembler::IsOri(instr_ori)); | |
| 211 instr_lui &= ~kImm16Mask; | |
| 212 instr_ori &= ~kImm16Mask; | |
| 213 int32_t imm = reinterpret_cast<int32_t>(target); | |
| 214 DCHECK((imm & 3) == 0); | |
| 215 Assembler::instr_at_put(pc + 0 * Assembler::kInstrSize, | |
| 216 instr_lui | ((imm >> kLuiShift) & kImm16Mask)); | |
| 217 Assembler::instr_at_put(pc + 1 * Assembler::kInstrSize, | |
| 218 instr_ori | (imm & kImm16Mask)); | |
| 219 } else { | 229 } else { |
| 230 DCHECK(mode == RelocInfo::INTERNAL_REFERENCE); |
| 220 Memory::Address_at(pc) = target; | 231 Memory::Address_at(pc) = target; |
| 221 } | 232 } |
| 222 } | 233 } |
| 223 | 234 |
| 224 | 235 |
| 225 Object* RelocInfo::target_object() { | 236 Object* RelocInfo::target_object() { |
| 226 DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); | 237 DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); |
| 227 return reinterpret_cast<Object*>(Assembler::target_address_at(pc_, host_)); | 238 return reinterpret_cast<Object*>(Assembler::target_address_at(pc_, host_)); |
| 228 } | 239 } |
| 229 | 240 |
| (...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 390 } | 401 } |
| 391 | 402 |
| 392 | 403 |
| 393 void RelocInfo::WipeOut() { | 404 void RelocInfo::WipeOut() { |
| 394 DCHECK(IsEmbeddedObject(rmode_) || IsCodeTarget(rmode_) || | 405 DCHECK(IsEmbeddedObject(rmode_) || IsCodeTarget(rmode_) || |
| 395 IsRuntimeEntry(rmode_) || IsExternalReference(rmode_) || | 406 IsRuntimeEntry(rmode_) || IsExternalReference(rmode_) || |
| 396 IsInternalReference(rmode_) || IsInternalReferenceEncoded(rmode_)); | 407 IsInternalReference(rmode_) || IsInternalReferenceEncoded(rmode_)); |
| 397 if (IsInternalReference(rmode_)) { | 408 if (IsInternalReference(rmode_)) { |
| 398 Memory::Address_at(pc_) = NULL; | 409 Memory::Address_at(pc_) = NULL; |
| 399 } else if (IsInternalReferenceEncoded(rmode_)) { | 410 } else if (IsInternalReferenceEncoded(rmode_)) { |
| 400 Instr instr_lui = Assembler::instr_at(pc_ + 0 * Assembler::kInstrSize); | 411 Assembler::set_target_internal_reference_encoded_at(pc_, nullptr); |
| 401 Instr instr_ori = Assembler::instr_at(pc_ + 1 * Assembler::kInstrSize); | |
| 402 DCHECK(Assembler::IsLui(instr_lui)); | |
| 403 DCHECK(Assembler::IsOri(instr_ori)); | |
| 404 instr_lui &= ~kImm16Mask; | |
| 405 instr_ori &= ~kImm16Mask; | |
| 406 int32_t imm = 0; | |
| 407 Assembler::instr_at_put(pc_ + 0 * Assembler::kInstrSize, | |
| 408 instr_lui | ((imm >> kLuiShift) & kImm16Mask)); | |
| 409 Assembler::instr_at_put(pc_ + 1 * Assembler::kInstrSize, | |
| 410 instr_ori | (imm & kImm16Mask)); | |
| 411 // Currently used only by deserializer, and all code will be flushed | |
| 412 // after complete deserialization, no need to flush on each reference. | |
| 413 } else { | 412 } else { |
| 414 Assembler::set_target_address_at(pc_, host_, NULL); | 413 Assembler::set_target_address_at(pc_, host_, NULL); |
| 415 } | 414 } |
| 416 } | 415 } |
| 417 | 416 |
| 418 | 417 |
| 419 bool RelocInfo::IsPatchedReturnSequence() { | 418 bool RelocInfo::IsPatchedReturnSequence() { |
| 420 Instr instr0 = Assembler::instr_at(pc_); | 419 Instr instr0 = Assembler::instr_at(pc_); |
| 421 Instr instr1 = Assembler::instr_at(pc_ + 1 * Assembler::kInstrSize); | 420 Instr instr1 = Assembler::instr_at(pc_ + 1 * Assembler::kInstrSize); |
| 422 Instr instr2 = Assembler::instr_at(pc_ + 2 * Assembler::kInstrSize); | 421 Instr instr2 = Assembler::instr_at(pc_ + 2 * Assembler::kInstrSize); |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 514 } | 513 } |
| 515 *reinterpret_cast<Instr*>(pc_) = x; | 514 *reinterpret_cast<Instr*>(pc_) = x; |
| 516 pc_ += kInstrSize; | 515 pc_ += kInstrSize; |
| 517 CheckTrampolinePoolQuick(); | 516 CheckTrampolinePoolQuick(); |
| 518 } | 517 } |
| 519 | 518 |
| 520 | 519 |
| 521 } } // namespace v8::internal | 520 } } // namespace v8::internal |
| 522 | 521 |
| 523 #endif // V8_MIPS_ASSEMBLER_MIPS_INL_H_ | 522 #endif // V8_MIPS_ASSEMBLER_MIPS_INL_H_ |
| OLD | NEW |