Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6)

Side by Side Diff: src/mips/assembler-mips-inl.h

Issue 1019083002: MIPS: Serializer: serialize internal references via object visitor. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/mips/assembler-mips.h ('k') | src/mips64/assembler-mips64.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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::deserialization_set_target_internal_reference_at(
204 Address pc, Address target) {
205 if (IsLui(instr_at(pc))) {
paul.l... 2015/03/18 20:57:07 This is not correct, we need rmode here to differe
206 // Encoded internal references are lui/ori load of 32-bit abolute address.
207 Instr instr_lui = Assembler::instr_at(pc + 0 * Assembler::kInstrSize);
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 {
220 Memory::Address_at(pc) = target;
221 }
222 }
223
224
203 Object* RelocInfo::target_object() { 225 Object* RelocInfo::target_object() {
204 DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); 226 DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT);
205 return reinterpret_cast<Object*>(Assembler::target_address_at(pc_, host_)); 227 return reinterpret_cast<Object*>(Assembler::target_address_at(pc_, host_));
206 } 228 }
207 229
208 230
209 Handle<Object> RelocInfo::target_object_handle(Assembler* origin) { 231 Handle<Object> RelocInfo::target_object_handle(Assembler* origin) {
210 DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); 232 DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT);
211 return Handle<Object>(reinterpret_cast<Object**>( 233 return Handle<Object>(reinterpret_cast<Object**>(
212 Assembler::target_address_at(pc_, host_))); 234 Assembler::target_address_at(pc_, host_)));
(...skipping 19 matching lines...) Expand all
232 Address RelocInfo::target_external_reference() { 254 Address RelocInfo::target_external_reference() {
233 DCHECK(rmode_ == EXTERNAL_REFERENCE); 255 DCHECK(rmode_ == EXTERNAL_REFERENCE);
234 return Assembler::target_address_at(pc_, host_); 256 return Assembler::target_address_at(pc_, host_);
235 } 257 }
236 258
237 259
238 Address RelocInfo::target_internal_reference() { 260 Address RelocInfo::target_internal_reference() {
239 if (rmode_ == INTERNAL_REFERENCE) { 261 if (rmode_ == INTERNAL_REFERENCE) {
240 return Memory::Address_at(pc_); 262 return Memory::Address_at(pc_);
241 } else { 263 } else {
264 // Encoded internal references are lui/ori load of 32-bit abolute address.
242 DCHECK(rmode_ == INTERNAL_REFERENCE_ENCODED); 265 DCHECK(rmode_ == INTERNAL_REFERENCE_ENCODED);
243 Instr instr_lui = Assembler::instr_at(pc_ + 0 * Assembler::kInstrSize); 266 Instr instr_lui = Assembler::instr_at(pc_ + 0 * Assembler::kInstrSize);
244 Instr instr_ori = Assembler::instr_at(pc_ + 1 * Assembler::kInstrSize); 267 Instr instr_ori = Assembler::instr_at(pc_ + 1 * Assembler::kInstrSize);
245 DCHECK(Assembler::IsLui(instr_lui)); 268 DCHECK(Assembler::IsLui(instr_lui));
246 DCHECK(Assembler::IsOri(instr_ori)); 269 DCHECK(Assembler::IsOri(instr_ori));
247 int32_t imm = (instr_lui & static_cast<int32_t>(kImm16Mask)) << kLuiShift; 270 int32_t imm = (instr_lui & static_cast<int32_t>(kImm16Mask)) << kLuiShift;
248 imm |= (instr_ori & static_cast<int32_t>(kImm16Mask)); 271 imm |= (instr_ori & static_cast<int32_t>(kImm16Mask));
249 return reinterpret_cast<Address>(imm); 272 return reinterpret_cast<Address>(imm);
250 } 273 }
251 } 274 }
252 275
253 276
254 void RelocInfo::set_target_internal_reference(Address target) { 277 Address RelocInfo::target_internal_reference_address() {
255 if (rmode_ == INTERNAL_REFERENCE) { 278 DCHECK(rmode_ == INTERNAL_REFERENCE || rmode_ == INTERNAL_REFERENCE_ENCODED);
256 Memory::Address_at(pc_) = target; 279 return reinterpret_cast<Address>(pc_);
257 } else {
258 // Encoded internal references are lui/ori load of 32-bit abolute address.
259 DCHECK(rmode_ == INTERNAL_REFERENCE_ENCODED);
260 Instr instr_lui = Assembler::instr_at(pc_ + 0 * Assembler::kInstrSize);
261 Instr instr_ori = Assembler::instr_at(pc_ + 1 * Assembler::kInstrSize);
262 DCHECK(Assembler::IsLui(instr_lui));
263 DCHECK(Assembler::IsOri(instr_ori));
264 instr_lui &= ~kImm16Mask;
265 instr_ori &= ~kImm16Mask;
266 int32_t imm = reinterpret_cast<int32_t>(target);
267 DCHECK((imm & 3) == 0);
268 Assembler::instr_at_put(pc_ + 0 * Assembler::kInstrSize,
269 instr_lui | ((imm >> kLuiShift) & kImm16Mask));
270 Assembler::instr_at_put(pc_ + 1 * Assembler::kInstrSize,
271 instr_ori | (imm & kImm16Mask));
272 // Currently used only by deserializer, and all code will be flushed
273 // after complete deserialization, no need to flush on each reference.
274 }
275 } 280 }
276 281
277 282
278 Address RelocInfo::target_runtime_entry(Assembler* origin) { 283 Address RelocInfo::target_runtime_entry(Assembler* origin) {
279 DCHECK(IsRuntimeEntry(rmode_)); 284 DCHECK(IsRuntimeEntry(rmode_));
280 return target_address(); 285 return target_address();
281 } 286 }
282 287
283 288
284 void RelocInfo::set_target_runtime_entry(Address target, 289 void RelocInfo::set_target_runtime_entry(Address target,
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
379 return reinterpret_cast<Object**>(pc_ + 2 * Assembler::kInstrSize); 384 return reinterpret_cast<Object**>(pc_ + 2 * Assembler::kInstrSize);
380 } 385 }
381 386
382 387
383 void RelocInfo::set_call_object(Object* target) { 388 void RelocInfo::set_call_object(Object* target) {
384 *call_object_address() = target; 389 *call_object_address() = target;
385 } 390 }
386 391
387 392
388 void RelocInfo::WipeOut() { 393 void RelocInfo::WipeOut() {
389 DCHECK(IsEmbeddedObject(rmode_) || 394 DCHECK(IsEmbeddedObject(rmode_) || IsCodeTarget(rmode_) ||
390 IsCodeTarget(rmode_) || 395 IsRuntimeEntry(rmode_) || IsExternalReference(rmode_) ||
391 IsRuntimeEntry(rmode_) || 396 IsInternalReference(rmode_) || IsInternalReferenceEncoded(rmode_));
392 IsExternalReference(rmode_)); 397 if (IsInternalReference(rmode_)) {
393 Assembler::set_target_address_at(pc_, host_, NULL); 398 Memory::Address_at(pc_) = NULL;
399 } else if (IsInternalReferenceEncoded(rmode_)) {
400 Instr instr_lui = Assembler::instr_at(pc_ + 0 * Assembler::kInstrSize);
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 {
414 Assembler::set_target_address_at(pc_, host_, NULL);
415 }
394 } 416 }
395 417
396 418
397 bool RelocInfo::IsPatchedReturnSequence() { 419 bool RelocInfo::IsPatchedReturnSequence() {
398 Instr instr0 = Assembler::instr_at(pc_); 420 Instr instr0 = Assembler::instr_at(pc_);
399 Instr instr1 = Assembler::instr_at(pc_ + 1 * Assembler::kInstrSize); 421 Instr instr1 = Assembler::instr_at(pc_ + 1 * Assembler::kInstrSize);
400 Instr instr2 = Assembler::instr_at(pc_ + 2 * Assembler::kInstrSize); 422 Instr instr2 = Assembler::instr_at(pc_ + 2 * Assembler::kInstrSize);
401 bool patched_return = ((instr0 & kOpcodeMask) == LUI && 423 bool patched_return = ((instr0 & kOpcodeMask) == LUI &&
402 (instr1 & kOpcodeMask) == ORI && 424 (instr1 & kOpcodeMask) == ORI &&
403 ((instr2 & kOpcodeMask) == JAL || 425 ((instr2 & kOpcodeMask) == JAL ||
(...skipping 12 matching lines...) Expand all
416 void RelocInfo::Visit(Isolate* isolate, ObjectVisitor* visitor) { 438 void RelocInfo::Visit(Isolate* isolate, ObjectVisitor* visitor) {
417 RelocInfo::Mode mode = rmode(); 439 RelocInfo::Mode mode = rmode();
418 if (mode == RelocInfo::EMBEDDED_OBJECT) { 440 if (mode == RelocInfo::EMBEDDED_OBJECT) {
419 visitor->VisitEmbeddedPointer(this); 441 visitor->VisitEmbeddedPointer(this);
420 } else if (RelocInfo::IsCodeTarget(mode)) { 442 } else if (RelocInfo::IsCodeTarget(mode)) {
421 visitor->VisitCodeTarget(this); 443 visitor->VisitCodeTarget(this);
422 } else if (mode == RelocInfo::CELL) { 444 } else if (mode == RelocInfo::CELL) {
423 visitor->VisitCell(this); 445 visitor->VisitCell(this);
424 } else if (mode == RelocInfo::EXTERNAL_REFERENCE) { 446 } else if (mode == RelocInfo::EXTERNAL_REFERENCE) {
425 visitor->VisitExternalReference(this); 447 visitor->VisitExternalReference(this);
448 } else if (mode == RelocInfo::INTERNAL_REFERENCE ||
449 mode == RelocInfo::INTERNAL_REFERENCE_ENCODED) {
450 visitor->VisitInternalReference(this);
426 } else if (RelocInfo::IsCodeAgeSequence(mode)) { 451 } else if (RelocInfo::IsCodeAgeSequence(mode)) {
427 visitor->VisitCodeAgeSequence(this); 452 visitor->VisitCodeAgeSequence(this);
428 } else if (((RelocInfo::IsJSReturn(mode) && 453 } else if (((RelocInfo::IsJSReturn(mode) &&
429 IsPatchedReturnSequence()) || 454 IsPatchedReturnSequence()) ||
430 (RelocInfo::IsDebugBreakSlot(mode) && 455 (RelocInfo::IsDebugBreakSlot(mode) &&
431 IsPatchedDebugBreakSlotSequence())) && 456 IsPatchedDebugBreakSlotSequence())) &&
432 isolate->debug()->has_break_points()) { 457 isolate->debug()->has_break_points()) {
433 visitor->VisitDebugTarget(this); 458 visitor->VisitDebugTarget(this);
434 } else if (RelocInfo::IsRuntimeEntry(mode)) { 459 } else if (RelocInfo::IsRuntimeEntry(mode)) {
435 visitor->VisitRuntimeEntry(this); 460 visitor->VisitRuntimeEntry(this);
436 } 461 }
437 } 462 }
438 463
439 464
440 template<typename StaticVisitor> 465 template<typename StaticVisitor>
441 void RelocInfo::Visit(Heap* heap) { 466 void RelocInfo::Visit(Heap* heap) {
442 RelocInfo::Mode mode = rmode(); 467 RelocInfo::Mode mode = rmode();
443 if (mode == RelocInfo::EMBEDDED_OBJECT) { 468 if (mode == RelocInfo::EMBEDDED_OBJECT) {
444 StaticVisitor::VisitEmbeddedPointer(heap, this); 469 StaticVisitor::VisitEmbeddedPointer(heap, this);
445 } else if (RelocInfo::IsCodeTarget(mode)) { 470 } else if (RelocInfo::IsCodeTarget(mode)) {
446 StaticVisitor::VisitCodeTarget(heap, this); 471 StaticVisitor::VisitCodeTarget(heap, this);
447 } else if (mode == RelocInfo::CELL) { 472 } else if (mode == RelocInfo::CELL) {
448 StaticVisitor::VisitCell(heap, this); 473 StaticVisitor::VisitCell(heap, this);
449 } else if (mode == RelocInfo::EXTERNAL_REFERENCE) { 474 } else if (mode == RelocInfo::EXTERNAL_REFERENCE) {
450 StaticVisitor::VisitExternalReference(this); 475 StaticVisitor::VisitExternalReference(this);
476 } else if (mode == RelocInfo::INTERNAL_REFERENCE ||
477 mode == RelocInfo::INTERNAL_REFERENCE_ENCODED) {
478 StaticVisitor::VisitInternalReference(this);
451 } else if (RelocInfo::IsCodeAgeSequence(mode)) { 479 } else if (RelocInfo::IsCodeAgeSequence(mode)) {
452 StaticVisitor::VisitCodeAgeSequence(heap, this); 480 StaticVisitor::VisitCodeAgeSequence(heap, this);
453 } else if (heap->isolate()->debug()->has_break_points() && 481 } else if (heap->isolate()->debug()->has_break_points() &&
454 ((RelocInfo::IsJSReturn(mode) && 482 ((RelocInfo::IsJSReturn(mode) &&
455 IsPatchedReturnSequence()) || 483 IsPatchedReturnSequence()) ||
456 (RelocInfo::IsDebugBreakSlot(mode) && 484 (RelocInfo::IsDebugBreakSlot(mode) &&
457 IsPatchedDebugBreakSlotSequence()))) { 485 IsPatchedDebugBreakSlotSequence()))) {
458 StaticVisitor::VisitDebugTarget(heap, this); 486 StaticVisitor::VisitDebugTarget(heap, this);
459 } else if (RelocInfo::IsRuntimeEntry(mode)) { 487 } else if (RelocInfo::IsRuntimeEntry(mode)) {
460 StaticVisitor::VisitRuntimeEntry(this); 488 StaticVisitor::VisitRuntimeEntry(this);
(...skipping 25 matching lines...) Expand all
486 } 514 }
487 *reinterpret_cast<Instr*>(pc_) = x; 515 *reinterpret_cast<Instr*>(pc_) = x;
488 pc_ += kInstrSize; 516 pc_ += kInstrSize;
489 CheckTrampolinePoolQuick(); 517 CheckTrampolinePoolQuick();
490 } 518 }
491 519
492 520
493 } } // namespace v8::internal 521 } } // namespace v8::internal
494 522
495 #endif // V8_MIPS_ASSEMBLER_MIPS_INL_H_ 523 #endif // V8_MIPS_ASSEMBLER_MIPS_INL_H_
OLDNEW
« no previous file with comments | « src/mips/assembler-mips.h ('k') | src/mips64/assembler-mips64.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698