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

Side by Side Diff: src/assembler.cc

Issue 2109613004: Remove position info from relocation info. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@turbosourcepos
Patch Set: fix Created 4 years, 5 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/assembler.h ('k') | src/debug/liveedit.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 261 matching lines...) Expand 10 before | Expand all | Expand 10 after
272 // 272 //
273 // 01: code_target: [6-bit pc delta] 01 273 // 01: code_target: [6-bit pc delta] 01
274 // 274 //
275 // 10: short_data_record: [6-bit pc delta] 10 followed by 275 // 10: short_data_record: [6-bit pc delta] 10 followed by
276 // [6-bit data delta] [2-bit data type tag] 276 // [6-bit data delta] [2-bit data type tag]
277 // 277 //
278 // 11: long_record [6 bit reloc mode] 11 278 // 11: long_record [6 bit reloc mode] 11
279 // followed by pc delta 279 // followed by pc delta
280 // followed by optional data depending on type. 280 // followed by optional data depending on type.
281 // 281 //
282 // 2-bit data type tags, used in short_data_record and data_jump long_record: 282 // 1-bit data type tags, used in short_data_record and data_jump long_record:
283 // code_target_with_id: 00 283 // code_target_with_id: 0
284 // position: 01 284 // deopt_reason: 1
285 // statement_position: 10
286 // deopt_reason: 11
287 // 285 //
288 // If a pc delta exceeds 6 bits, it is split into a remainder that fits into 286 // If a pc delta exceeds 6 bits, it is split into a remainder that fits into
289 // 6 bits and a part that does not. The latter is encoded as a long record 287 // 6 bits and a part that does not. The latter is encoded as a long record
290 // with PC_JUMP as pseudo reloc info mode. The former is encoded as part of 288 // with PC_JUMP as pseudo reloc info mode. The former is encoded as part of
291 // the following record in the usual way. The long pc jump record has variable 289 // the following record in the usual way. The long pc jump record has variable
292 // length: 290 // length:
293 // pc-jump: [PC_JUMP] 11 291 // pc-jump: [PC_JUMP] 11
294 // [7 bits data] 0 292 // [7 bits data] 0
295 // ... 293 // ...
296 // [7 bits data] 1 294 // [7 bits data] 1
297 // (Bits 6..31 of pc delta, with leading zeroes 295 // (Bits 6..31 of pc delta, with leading zeroes
298 // dropped, and last non-zero chunk tagged with 1.) 296 // dropped, and last non-zero chunk tagged with 1.)
299 297
300 const int kTagBits = 2; 298 const int kTagBits = 2;
301 const int kTagMask = (1 << kTagBits) - 1; 299 const int kTagMask = (1 << kTagBits) - 1;
302 const int kLongTagBits = 6; 300 const int kLongTagBits = 6;
303 const int kShortDataTypeTagBits = 2; 301 const int kShortDataTypeTagBits = 1;
304 const int kShortDataBits = kBitsPerByte - kShortDataTypeTagBits; 302 const int kShortDataBits = kBitsPerByte - kShortDataTypeTagBits;
305 303
306 const int kEmbeddedObjectTag = 0; 304 const int kEmbeddedObjectTag = 0;
307 const int kCodeTargetTag = 1; 305 const int kCodeTargetTag = 1;
308 const int kLocatableTag = 2; 306 const int kLocatableTag = 2;
309 const int kDefaultTag = 3; 307 const int kDefaultTag = 3;
310 308
311 const int kSmallPCDeltaBits = kBitsPerByte - kTagBits; 309 const int kSmallPCDeltaBits = kBitsPerByte - kTagBits;
312 const int kSmallPCDeltaMask = (1 << kSmallPCDeltaBits) - 1; 310 const int kSmallPCDeltaMask = (1 << kSmallPCDeltaBits) - 1;
313 const int RelocInfo::kMaxSmallPCDelta = kSmallPCDeltaMask; 311 const int RelocInfo::kMaxSmallPCDelta = kSmallPCDeltaMask;
314 312
315 const int kChunkBits = 7; 313 const int kChunkBits = 7;
316 const int kChunkMask = (1 << kChunkBits) - 1; 314 const int kChunkMask = (1 << kChunkBits) - 1;
317 const int kLastChunkTagBits = 1; 315 const int kLastChunkTagBits = 1;
318 const int kLastChunkTagMask = 1; 316 const int kLastChunkTagMask = 1;
319 const int kLastChunkTag = 1; 317 const int kLastChunkTag = 1;
320 318
321 const int kCodeWithIdTag = 0; 319 const int kCodeWithIdTag = 0;
322 const int kNonstatementPositionTag = 1; 320 const int kDeoptReasonTag = 1;
323 const int kStatementPositionTag = 2;
324 const int kDeoptReasonTag = 3;
325 321
326 void RelocInfo::update_wasm_memory_reference( 322 void RelocInfo::update_wasm_memory_reference(
327 Address old_base, Address new_base, uint32_t old_size, uint32_t new_size, 323 Address old_base, Address new_base, uint32_t old_size, uint32_t new_size,
328 ICacheFlushMode icache_flush_mode) { 324 ICacheFlushMode icache_flush_mode) {
329 DCHECK(IsWasmMemoryReference(rmode_) || IsWasmMemorySizeReference(rmode_)); 325 DCHECK(IsWasmMemoryReference(rmode_) || IsWasmMemorySizeReference(rmode_));
330 if (IsWasmMemoryReference(rmode_)) { 326 if (IsWasmMemoryReference(rmode_)) {
331 Address updated_reference; 327 Address updated_reference;
332 DCHECK(old_size == 0 || Memory::IsAddressInRange( 328 DCHECK(old_size == 0 || Memory::IsAddressInRange(
333 old_base, wasm_memory_reference(), old_size)); 329 old_base, wasm_memory_reference(), old_size));
334 updated_reference = new_base + (wasm_memory_reference() - old_base); 330 updated_reference = new_base + (wasm_memory_reference() - old_base);
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
424 420
425 void RelocInfoWriter::WriteData(intptr_t data_delta) { 421 void RelocInfoWriter::WriteData(intptr_t data_delta) {
426 for (int i = 0; i < kIntptrSize; i++) { 422 for (int i = 0; i < kIntptrSize; i++) {
427 *--pos_ = static_cast<byte>(data_delta); 423 *--pos_ = static_cast<byte>(data_delta);
428 // Signed right shift is arithmetic shift. Tested in test-utils.cc. 424 // Signed right shift is arithmetic shift. Tested in test-utils.cc.
429 data_delta = data_delta >> kBitsPerByte; 425 data_delta = data_delta >> kBitsPerByte;
430 } 426 }
431 } 427 }
432 428
433 429
434 void RelocInfoWriter::WritePosition(int pc_delta, int pos_delta,
435 RelocInfo::Mode rmode) {
436 int pos_type_tag = (rmode == RelocInfo::POSITION) ? kNonstatementPositionTag
437 : kStatementPositionTag;
438 // Check if delta is small enough to fit in a tagged byte.
439 if (is_intn(pos_delta, kShortDataBits)) {
440 WriteShortTaggedPC(pc_delta, kLocatableTag);
441 WriteShortTaggedData(pos_delta, pos_type_tag);
442 } else {
443 // Otherwise, use costly encoding.
444 WriteModeAndPC(pc_delta, rmode);
445 WriteIntData(pos_delta);
446 }
447 }
448
449
450 void RelocInfoWriter::FlushPosition() {
451 if (!next_position_candidate_flushed_) {
452 WritePosition(next_position_candidate_pc_delta_,
453 next_position_candidate_pos_delta_, RelocInfo::POSITION);
454 next_position_candidate_pos_delta_ = 0;
455 next_position_candidate_pc_delta_ = 0;
456 next_position_candidate_flushed_ = true;
457 }
458 }
459
460
461 void RelocInfoWriter::Write(const RelocInfo* rinfo) { 430 void RelocInfoWriter::Write(const RelocInfo* rinfo) {
462 RelocInfo::Mode rmode = rinfo->rmode(); 431 RelocInfo::Mode rmode = rinfo->rmode();
463 if (rmode != RelocInfo::POSITION) {
464 FlushPosition();
465 }
466 #ifdef DEBUG 432 #ifdef DEBUG
467 byte* begin_pos = pos_; 433 byte* begin_pos = pos_;
468 #endif 434 #endif
469 DCHECK(rinfo->rmode() < RelocInfo::NUMBER_OF_MODES); 435 DCHECK(rinfo->rmode() < RelocInfo::NUMBER_OF_MODES);
470 DCHECK(rinfo->pc() - last_pc_ >= 0); 436 DCHECK(rinfo->pc() - last_pc_ >= 0);
471 // Use unsigned delta-encoding for pc. 437 // Use unsigned delta-encoding for pc.
472 uint32_t pc_delta = static_cast<uint32_t>(rinfo->pc() - last_pc_); 438 uint32_t pc_delta = static_cast<uint32_t>(rinfo->pc() - last_pc_);
473 439
474 // The two most common modes are given small tags, and usually fit in a byte. 440 // The two most common modes are given small tags, and usually fit in a byte.
475 if (rmode == RelocInfo::EMBEDDED_OBJECT) { 441 if (rmode == RelocInfo::EMBEDDED_OBJECT) {
(...skipping 12 matching lines...) Expand all
488 } else { 454 } else {
489 // Otherwise, use costly encoding. 455 // Otherwise, use costly encoding.
490 WriteModeAndPC(pc_delta, rmode); 456 WriteModeAndPC(pc_delta, rmode);
491 WriteIntData(id_delta); 457 WriteIntData(id_delta);
492 } 458 }
493 last_id_ = static_cast<int>(rinfo->data()); 459 last_id_ = static_cast<int>(rinfo->data());
494 } else if (rmode == RelocInfo::DEOPT_REASON) { 460 } else if (rmode == RelocInfo::DEOPT_REASON) {
495 DCHECK(rinfo->data() < (1 << kShortDataBits)); 461 DCHECK(rinfo->data() < (1 << kShortDataBits));
496 WriteShortTaggedPC(pc_delta, kLocatableTag); 462 WriteShortTaggedPC(pc_delta, kLocatableTag);
497 WriteShortTaggedData(rinfo->data(), kDeoptReasonTag); 463 WriteShortTaggedData(rinfo->data(), kDeoptReasonTag);
498 } else if (RelocInfo::IsPosition(rmode)) {
499 // Use signed delta-encoding for position.
500 DCHECK_EQ(static_cast<int>(rinfo->data()), rinfo->data());
501 int pos_delta = static_cast<int>(rinfo->data()) - last_position_;
502 if (rmode == RelocInfo::STATEMENT_POSITION) {
503 WritePosition(pc_delta, pos_delta, rmode);
504 } else {
505 DCHECK_EQ(rmode, RelocInfo::POSITION);
506 if (pc_delta != 0 || last_mode_ != RelocInfo::POSITION) {
507 FlushPosition();
508 next_position_candidate_pc_delta_ = pc_delta;
509 next_position_candidate_pos_delta_ = pos_delta;
510 } else {
511 next_position_candidate_pos_delta_ += pos_delta;
512 }
513 next_position_candidate_flushed_ = false;
514 }
515 last_position_ = static_cast<int>(rinfo->data());
516 } else { 464 } else {
517 WriteModeAndPC(pc_delta, rmode); 465 WriteModeAndPC(pc_delta, rmode);
518 if (RelocInfo::IsComment(rmode)) { 466 if (RelocInfo::IsComment(rmode)) {
519 WriteData(rinfo->data()); 467 WriteData(rinfo->data());
520 } else if (RelocInfo::IsConstPool(rmode) || 468 } else if (RelocInfo::IsConstPool(rmode) ||
521 RelocInfo::IsVeneerPool(rmode) || 469 RelocInfo::IsVeneerPool(rmode) || RelocInfo::IsDeoptId(rmode) ||
522 RelocInfo::IsDeoptId(rmode)) { 470 RelocInfo::IsDeoptPosition(rmode)) {
523 WriteIntData(static_cast<int>(rinfo->data())); 471 WriteIntData(static_cast<int>(rinfo->data()));
524 } 472 }
525 } 473 }
526 last_pc_ = rinfo->pc(); 474 last_pc_ = rinfo->pc();
527 last_mode_ = rmode; 475 last_mode_ = rmode;
528 #ifdef DEBUG 476 #ifdef DEBUG
529 DCHECK(begin_pos - pos_ <= kMaxSize); 477 DCHECK(begin_pos - pos_ <= kMaxSize);
530 #endif 478 #endif
531 } 479 }
532 480
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
564 512
565 void RelocIterator::AdvanceReadInt() { 513 void RelocIterator::AdvanceReadInt() {
566 int x = 0; 514 int x = 0;
567 for (int i = 0; i < kIntSize; i++) { 515 for (int i = 0; i < kIntSize; i++) {
568 x |= static_cast<int>(*--pos_) << i * kBitsPerByte; 516 x |= static_cast<int>(*--pos_) << i * kBitsPerByte;
569 } 517 }
570 rinfo_.data_ = x; 518 rinfo_.data_ = x;
571 } 519 }
572 520
573 521
574 void RelocIterator::AdvanceReadPosition() {
575 int x = 0;
576 for (int i = 0; i < kIntSize; i++) {
577 x |= static_cast<int>(*--pos_) << i * kBitsPerByte;
578 }
579 last_position_ += x;
580 rinfo_.data_ = last_position_;
581 }
582
583
584 void RelocIterator::AdvanceReadData() { 522 void RelocIterator::AdvanceReadData() {
585 intptr_t x = 0; 523 intptr_t x = 0;
586 for (int i = 0; i < kIntptrSize; i++) { 524 for (int i = 0; i < kIntptrSize; i++) {
587 x |= static_cast<intptr_t>(*--pos_) << i * kBitsPerByte; 525 x |= static_cast<intptr_t>(*--pos_) << i * kBitsPerByte;
588 } 526 }
589 rinfo_.data_ = x; 527 rinfo_.data_ = x;
590 } 528 }
591 529
592 530
593 void RelocIterator::AdvanceReadLongPCJump() { 531 void RelocIterator::AdvanceReadLongPCJump() {
(...skipping 18 matching lines...) Expand all
612 550
613 551
614 inline void RelocIterator::ReadShortTaggedId() { 552 inline void RelocIterator::ReadShortTaggedId() {
615 int8_t signed_b = *pos_; 553 int8_t signed_b = *pos_;
616 // Signed right shift is arithmetic shift. Tested in test-utils.cc. 554 // Signed right shift is arithmetic shift. Tested in test-utils.cc.
617 last_id_ += signed_b >> kShortDataTypeTagBits; 555 last_id_ += signed_b >> kShortDataTypeTagBits;
618 rinfo_.data_ = last_id_; 556 rinfo_.data_ = last_id_;
619 } 557 }
620 558
621 559
622 inline void RelocIterator::ReadShortTaggedPosition() {
623 int8_t signed_b = *pos_;
624 // Signed right shift is arithmetic shift. Tested in test-utils.cc.
625 last_position_ += signed_b >> kShortDataTypeTagBits;
626 rinfo_.data_ = last_position_;
627 }
628
629
630 inline void RelocIterator::ReadShortTaggedData() { 560 inline void RelocIterator::ReadShortTaggedData() {
631 uint8_t unsigned_b = *pos_; 561 uint8_t unsigned_b = *pos_;
632 rinfo_.data_ = unsigned_b >> kTagBits; 562 rinfo_.data_ = unsigned_b >> kShortDataTypeTagBits;
633 } 563 }
634 564
635 565
636 static inline RelocInfo::Mode GetPositionModeFromTag(int tag) {
637 DCHECK(tag == kNonstatementPositionTag ||
638 tag == kStatementPositionTag);
639 return (tag == kNonstatementPositionTag) ?
640 RelocInfo::POSITION :
641 RelocInfo::STATEMENT_POSITION;
642 }
643
644
645 void RelocIterator::next() { 566 void RelocIterator::next() {
646 DCHECK(!done()); 567 DCHECK(!done());
647 // Basically, do the opposite of RelocInfoWriter::Write. 568 // Basically, do the opposite of RelocInfoWriter::Write.
648 // Reading of data is as far as possible avoided for unwanted modes, 569 // Reading of data is as far as possible avoided for unwanted modes,
649 // but we must always update the pc. 570 // but we must always update the pc.
650 // 571 //
651 // We exit this loop by returning when we find a mode we want. 572 // We exit this loop by returning when we find a mode we want.
652 while (pos_ > end_) { 573 while (pos_ > end_) {
653 int tag = AdvanceGetTag(); 574 int tag = AdvanceGetTag();
654 if (tag == kEmbeddedObjectTag) { 575 if (tag == kEmbeddedObjectTag) {
655 ReadShortTaggedPC(); 576 ReadShortTaggedPC();
656 if (SetMode(RelocInfo::EMBEDDED_OBJECT)) return; 577 if (SetMode(RelocInfo::EMBEDDED_OBJECT)) return;
657 } else if (tag == kCodeTargetTag) { 578 } else if (tag == kCodeTargetTag) {
658 ReadShortTaggedPC(); 579 ReadShortTaggedPC();
659 if (SetMode(RelocInfo::CODE_TARGET)) return; 580 if (SetMode(RelocInfo::CODE_TARGET)) return;
660 } else if (tag == kLocatableTag) { 581 } else if (tag == kLocatableTag) {
661 ReadShortTaggedPC(); 582 ReadShortTaggedPC();
662 Advance(); 583 Advance();
663 int data_type_tag = GetShortDataTypeTag(); 584 int data_type_tag = GetShortDataTypeTag();
664 if (data_type_tag == kCodeWithIdTag) { 585 if (data_type_tag == kCodeWithIdTag) {
665 if (SetMode(RelocInfo::CODE_TARGET_WITH_ID)) { 586 if (SetMode(RelocInfo::CODE_TARGET_WITH_ID)) {
666 ReadShortTaggedId(); 587 ReadShortTaggedId();
667 return; 588 return;
668 } 589 }
669 } else if (data_type_tag == kDeoptReasonTag) { 590 } else {
591 DCHECK(data_type_tag == kDeoptReasonTag);
670 if (SetMode(RelocInfo::DEOPT_REASON)) { 592 if (SetMode(RelocInfo::DEOPT_REASON)) {
671 ReadShortTaggedData(); 593 ReadShortTaggedData();
672 return; 594 return;
673 } 595 }
674 } else {
675 DCHECK(data_type_tag == kNonstatementPositionTag ||
676 data_type_tag == kStatementPositionTag);
677 if (mode_mask_ & RelocInfo::kPositionMask) {
678 // Always update the position if we are interested in either
679 // statement positions or non-statement positions.
680 ReadShortTaggedPosition();
681 if (SetMode(GetPositionModeFromTag(data_type_tag))) return;
682 }
683 } 596 }
684 } else { 597 } else {
685 DCHECK(tag == kDefaultTag); 598 DCHECK(tag == kDefaultTag);
686 RelocInfo::Mode rmode = GetMode(); 599 RelocInfo::Mode rmode = GetMode();
687 if (rmode == RelocInfo::PC_JUMP) { 600 if (rmode == RelocInfo::PC_JUMP) {
688 AdvanceReadLongPCJump(); 601 AdvanceReadLongPCJump();
689 } else { 602 } else {
690 AdvanceReadPC(); 603 AdvanceReadPC();
691 if (rmode == RelocInfo::CODE_TARGET_WITH_ID) { 604 if (rmode == RelocInfo::CODE_TARGET_WITH_ID) {
692 if (SetMode(rmode)) { 605 if (SetMode(rmode)) {
693 AdvanceReadId(); 606 AdvanceReadId();
694 return; 607 return;
695 } 608 }
696 Advance(kIntSize); 609 Advance(kIntSize);
697 } else if (RelocInfo::IsComment(rmode)) { 610 } else if (RelocInfo::IsComment(rmode)) {
698 if (SetMode(rmode)) { 611 if (SetMode(rmode)) {
699 AdvanceReadData(); 612 AdvanceReadData();
700 return; 613 return;
701 } 614 }
702 Advance(kIntptrSize); 615 Advance(kIntptrSize);
703 } else if (RelocInfo::IsPosition(rmode)) {
704 if (mode_mask_ & RelocInfo::kPositionMask) {
705 // Always update the position if we are interested in either
706 // statement positions or non-statement positions.
707 AdvanceReadPosition();
708 if (SetMode(rmode)) return;
709 } else {
710 Advance(kIntSize);
711 }
712 } else if (RelocInfo::IsConstPool(rmode) || 616 } else if (RelocInfo::IsConstPool(rmode) ||
713 RelocInfo::IsVeneerPool(rmode) || 617 RelocInfo::IsVeneerPool(rmode) ||
714 RelocInfo::IsDeoptId(rmode)) { 618 RelocInfo::IsDeoptId(rmode) ||
619 RelocInfo::IsDeoptPosition(rmode)) {
715 if (SetMode(rmode)) { 620 if (SetMode(rmode)) {
716 AdvanceReadInt(); 621 AdvanceReadInt();
717 return; 622 return;
718 } 623 }
719 Advance(kIntSize); 624 Advance(kIntSize);
720 } else if (SetMode(static_cast<RelocInfo::Mode>(rmode))) { 625 } else if (SetMode(static_cast<RelocInfo::Mode>(rmode))) {
721 return; 626 return;
722 } 627 }
723 } 628 }
724 } 629 }
(...skipping 15 matching lines...) Expand all
740 : rinfo_(code->map()->GetIsolate()) { 645 : rinfo_(code->map()->GetIsolate()) {
741 rinfo_.host_ = code; 646 rinfo_.host_ = code;
742 rinfo_.pc_ = code->instruction_start(); 647 rinfo_.pc_ = code->instruction_start();
743 rinfo_.data_ = 0; 648 rinfo_.data_ = 0;
744 // Relocation info is read backwards. 649 // Relocation info is read backwards.
745 pos_ = code->relocation_start() + code->relocation_size(); 650 pos_ = code->relocation_start() + code->relocation_size();
746 end_ = code->relocation_start(); 651 end_ = code->relocation_start();
747 done_ = false; 652 done_ = false;
748 mode_mask_ = mode_mask; 653 mode_mask_ = mode_mask;
749 last_id_ = 0; 654 last_id_ = 0;
750 last_position_ = 0;
751 byte* sequence = code->FindCodeAgeSequence(); 655 byte* sequence = code->FindCodeAgeSequence();
752 // We get the isolate from the map, because at serialization time 656 // We get the isolate from the map, because at serialization time
753 // the code pointer has been cloned and isn't really in heap space. 657 // the code pointer has been cloned and isn't really in heap space.
754 Isolate* isolate = code->map()->GetIsolate(); 658 Isolate* isolate = code->map()->GetIsolate();
755 if (sequence != NULL && !Code::IsYoungSequence(isolate, sequence)) { 659 if (sequence != NULL && !Code::IsYoungSequence(isolate, sequence)) {
756 code_age_sequence_ = sequence; 660 code_age_sequence_ = sequence;
757 } else { 661 } else {
758 code_age_sequence_ = NULL; 662 code_age_sequence_ = NULL;
759 } 663 }
760 if (mode_mask_ == 0) pos_ = end_; 664 if (mode_mask_ == 0) pos_ = end_;
761 next(); 665 next();
762 } 666 }
763 667
764 668
765 RelocIterator::RelocIterator(const CodeDesc& desc, int mode_mask) 669 RelocIterator::RelocIterator(const CodeDesc& desc, int mode_mask)
766 : rinfo_(desc.origin->isolate()) { 670 : rinfo_(desc.origin->isolate()) {
767 rinfo_.pc_ = desc.buffer; 671 rinfo_.pc_ = desc.buffer;
768 rinfo_.data_ = 0; 672 rinfo_.data_ = 0;
769 // Relocation info is read backwards. 673 // Relocation info is read backwards.
770 pos_ = desc.buffer + desc.buffer_size; 674 pos_ = desc.buffer + desc.buffer_size;
771 end_ = pos_ - desc.reloc_size; 675 end_ = pos_ - desc.reloc_size;
772 done_ = false; 676 done_ = false;
773 mode_mask_ = mode_mask; 677 mode_mask_ = mode_mask;
774 last_id_ = 0; 678 last_id_ = 0;
775 last_position_ = 0;
776 code_age_sequence_ = NULL; 679 code_age_sequence_ = NULL;
777 if (mode_mask_ == 0) pos_ = end_; 680 if (mode_mask_ == 0) pos_ = end_;
778 next(); 681 next();
779 } 682 }
780 683
781 684
782 // ----------------------------------------------------------------------------- 685 // -----------------------------------------------------------------------------
783 // Implementation of RelocInfo 686 // Implementation of RelocInfo
784 687
785 bool RelocInfo::IsPatchedDebugBreakSlotSequence() { 688 bool RelocInfo::IsPatchedDebugBreakSlotSequence() {
(...skipping 29 matching lines...) Expand all
815 case CODE_TARGET: 718 case CODE_TARGET:
816 return "code target"; 719 return "code target";
817 case CODE_TARGET_WITH_ID: 720 case CODE_TARGET_WITH_ID:
818 return "code target with id"; 721 return "code target with id";
819 case CELL: 722 case CELL:
820 return "property cell"; 723 return "property cell";
821 case RUNTIME_ENTRY: 724 case RUNTIME_ENTRY:
822 return "runtime entry"; 725 return "runtime entry";
823 case COMMENT: 726 case COMMENT:
824 return "comment"; 727 return "comment";
825 case POSITION:
826 return "position";
827 case STATEMENT_POSITION:
828 return "statement position";
829 case EXTERNAL_REFERENCE: 728 case EXTERNAL_REFERENCE:
830 return "external reference"; 729 return "external reference";
831 case INTERNAL_REFERENCE: 730 case INTERNAL_REFERENCE:
832 return "internal reference"; 731 return "internal reference";
833 case INTERNAL_REFERENCE_ENCODED: 732 case INTERNAL_REFERENCE_ENCODED:
834 return "encoded internal reference"; 733 return "encoded internal reference";
734 case DEOPT_POSITION:
735 return "deopt position";
835 case DEOPT_REASON: 736 case DEOPT_REASON:
836 return "deopt reason"; 737 return "deopt reason";
837 case DEOPT_ID: 738 case DEOPT_ID:
838 return "deopt index"; 739 return "deopt index";
839 case CONST_POOL: 740 case CONST_POOL:
840 return "constant pool"; 741 return "constant pool";
841 case VENEER_POOL: 742 case VENEER_POOL:
842 return "veneer pool"; 743 return "veneer pool";
843 case DEBUG_BREAK_SLOT_AT_POSITION: 744 case DEBUG_BREAK_SLOT_AT_POSITION:
844 return "debug break slot at position"; 745 return "debug break slot at position";
(...skipping 19 matching lines...) Expand all
864 return "number_of_modes"; 765 return "number_of_modes";
865 } 766 }
866 return "unknown relocation type"; 767 return "unknown relocation type";
867 } 768 }
868 769
869 770
870 void RelocInfo::Print(Isolate* isolate, std::ostream& os) { // NOLINT 771 void RelocInfo::Print(Isolate* isolate, std::ostream& os) { // NOLINT
871 os << static_cast<const void*>(pc_) << " " << RelocModeName(rmode_); 772 os << static_cast<const void*>(pc_) << " " << RelocModeName(rmode_);
872 if (IsComment(rmode_)) { 773 if (IsComment(rmode_)) {
873 os << " (" << reinterpret_cast<char*>(data_) << ")"; 774 os << " (" << reinterpret_cast<char*>(data_) << ")";
775 } else if (rmode_ == DEOPT_POSITION) {
776 os << " (" << data() << ")";
874 } else if (rmode_ == DEOPT_REASON) { 777 } else if (rmode_ == DEOPT_REASON) {
875 os << " (" << Deoptimizer::GetDeoptReason( 778 os << " (" << Deoptimizer::GetDeoptReason(
876 static_cast<Deoptimizer::DeoptReason>(data_)) << ")"; 779 static_cast<Deoptimizer::DeoptReason>(data_)) << ")";
877 } else if (rmode_ == EMBEDDED_OBJECT) { 780 } else if (rmode_ == EMBEDDED_OBJECT) {
878 os << " (" << Brief(target_object()) << ")"; 781 os << " (" << Brief(target_object()) << ")";
879 } else if (rmode_ == EXTERNAL_REFERENCE) { 782 } else if (rmode_ == EXTERNAL_REFERENCE) {
880 ExternalReferenceEncoder ref_encoder(isolate); 783 ExternalReferenceEncoder ref_encoder(isolate);
881 os << " (" 784 os << " ("
882 << ref_encoder.NameOfAddress(isolate, target_external_reference()) 785 << ref_encoder.NameOfAddress(isolate, target_external_reference())
883 << ") (" << static_cast<const void*>(target_external_reference()) 786 << ") (" << static_cast<const void*>(target_external_reference())
884 << ")"; 787 << ")";
885 } else if (IsCodeTarget(rmode_)) { 788 } else if (IsCodeTarget(rmode_)) {
886 Code* code = Code::GetCodeFromTargetAddress(target_address()); 789 Code* code = Code::GetCodeFromTargetAddress(target_address());
887 os << " (" << Code::Kind2String(code->kind()) << ") (" 790 os << " (" << Code::Kind2String(code->kind()) << ") ("
888 << static_cast<const void*>(target_address()) << ")"; 791 << static_cast<const void*>(target_address()) << ")";
889 if (rmode_ == CODE_TARGET_WITH_ID) { 792 if (rmode_ == CODE_TARGET_WITH_ID) {
890 os << " (id=" << static_cast<int>(data_) << ")"; 793 os << " (id=" << static_cast<int>(data_) << ")";
891 } 794 }
892 } else if (IsPosition(rmode_)) {
893 os << " (" << data() << ")";
894 } else if (IsRuntimeEntry(rmode_) && 795 } else if (IsRuntimeEntry(rmode_) &&
895 isolate->deoptimizer_data() != NULL) { 796 isolate->deoptimizer_data() != NULL) {
896 // Depotimization bailouts are stored as runtime entries. 797 // Depotimization bailouts are stored as runtime entries.
897 int id = Deoptimizer::GetDeoptimizationId( 798 int id = Deoptimizer::GetDeoptimizationId(
898 isolate, target_address(), Deoptimizer::EAGER); 799 isolate, target_address(), Deoptimizer::EAGER);
899 if (id != Deoptimizer::kNotDeoptimizationEntry) { 800 if (id != Deoptimizer::kNotDeoptimizationEntry) {
900 os << " (deoptimization bailout " << id << ")"; 801 os << " (deoptimization bailout " << id << ")";
901 } 802 }
902 } else if (IsConstPool(rmode_)) { 803 } else if (IsConstPool(rmode_)) {
903 os << " (size " << static_cast<int>(data_) << ")"; 804 os << " (size " << static_cast<int>(data_) << ")";
(...skipping 30 matching lines...) Expand all
934 case INTERNAL_REFERENCE_ENCODED: { 835 case INTERNAL_REFERENCE_ENCODED: {
935 Address target = target_internal_reference(); 836 Address target = target_internal_reference();
936 Address pc = target_internal_reference_address(); 837 Address pc = target_internal_reference_address();
937 Code* code = Code::cast(isolate->FindCodeObject(pc)); 838 Code* code = Code::cast(isolate->FindCodeObject(pc));
938 CHECK(target >= code->instruction_start()); 839 CHECK(target >= code->instruction_start());
939 CHECK(target <= code->instruction_end()); 840 CHECK(target <= code->instruction_end());
940 break; 841 break;
941 } 842 }
942 case RUNTIME_ENTRY: 843 case RUNTIME_ENTRY:
943 case COMMENT: 844 case COMMENT:
944 case POSITION:
945 case STATEMENT_POSITION:
946 case EXTERNAL_REFERENCE: 845 case EXTERNAL_REFERENCE:
846 case DEOPT_POSITION:
947 case DEOPT_REASON: 847 case DEOPT_REASON:
948 case DEOPT_ID: 848 case DEOPT_ID:
949 case CONST_POOL: 849 case CONST_POOL:
950 case VENEER_POOL: 850 case VENEER_POOL:
951 case DEBUG_BREAK_SLOT_AT_POSITION: 851 case DEBUG_BREAK_SLOT_AT_POSITION:
952 case DEBUG_BREAK_SLOT_AT_RETURN: 852 case DEBUG_BREAK_SLOT_AT_RETURN:
953 case DEBUG_BREAK_SLOT_AT_CALL: 853 case DEBUG_BREAK_SLOT_AT_CALL:
954 case DEBUG_BREAK_SLOT_AT_TAIL_CALL: 854 case DEBUG_BREAK_SLOT_AT_TAIL_CALL:
955 case GENERATOR_CONTINUATION: 855 case GENERATOR_CONTINUATION:
956 case WASM_MEMORY_REFERENCE: 856 case WASM_MEMORY_REFERENCE:
(...skipping 769 matching lines...) Expand 10 before | Expand all | Expand 10 after
1726 } 1626 }
1727 1627
1728 1628
1729 std::ostream& operator<<(std::ostream& os, ExternalReference reference) { 1629 std::ostream& operator<<(std::ostream& os, ExternalReference reference) {
1730 os << static_cast<const void*>(reference.address()); 1630 os << static_cast<const void*>(reference.address());
1731 const Runtime::Function* fn = Runtime::FunctionForEntry(reference.address()); 1631 const Runtime::Function* fn = Runtime::FunctionForEntry(reference.address());
1732 if (fn) os << "<" << fn->name << ".entry>"; 1632 if (fn) os << "<" << fn->name << ".entry>";
1733 return os; 1633 return os;
1734 } 1634 }
1735 1635
1736 void AssemblerPositionsRecorder::RecordPosition(int pos) {
1737 DCHECK(pos != RelocInfo::kNoPosition);
1738 DCHECK(pos >= 0);
1739 current_position_ = pos;
1740 LOG_CODE_EVENT(assembler_->isolate(),
1741 CodeLinePosInfoAddPositionEvent(jit_handler_data_,
1742 assembler_->pc_offset(),
1743 pos));
1744 WriteRecordedPositions();
1745 }
1746
1747 void AssemblerPositionsRecorder::RecordStatementPosition(int pos) {
1748 DCHECK(pos != RelocInfo::kNoPosition);
1749 DCHECK(pos >= 0);
1750 current_statement_position_ = pos;
1751 LOG_CODE_EVENT(assembler_->isolate(),
1752 CodeLinePosInfoAddStatementPositionEvent(
1753 jit_handler_data_,
1754 assembler_->pc_offset(),
1755 pos));
1756 RecordPosition(pos);
1757 }
1758
1759 void AssemblerPositionsRecorder::WriteRecordedPositions() {
1760 // Write the statement position if it is different from what was written last
1761 // time.
1762 if (current_statement_position_ != written_statement_position_) {
1763 EnsureSpace ensure_space(assembler_);
1764 assembler_->RecordRelocInfo(RelocInfo::STATEMENT_POSITION,
1765 current_statement_position_);
1766 written_position_ = current_statement_position_;
1767 written_statement_position_ = current_statement_position_;
1768 }
1769
1770 // Write the position if it is different from what was written last time and
1771 // also different from the statement position that was just written.
1772 if (current_position_ != written_position_) {
1773 EnsureSpace ensure_space(assembler_);
1774 assembler_->RecordRelocInfo(RelocInfo::POSITION, current_position_);
1775 written_position_ = current_position_;
1776 }
1777 }
1778
1779 1636
1780 ConstantPoolBuilder::ConstantPoolBuilder(int ptr_reach_bits, 1637 ConstantPoolBuilder::ConstantPoolBuilder(int ptr_reach_bits,
1781 int double_reach_bits) { 1638 int double_reach_bits) {
1782 info_[ConstantPoolEntry::INTPTR].entries.reserve(64); 1639 info_[ConstantPoolEntry::INTPTR].entries.reserve(64);
1783 info_[ConstantPoolEntry::INTPTR].regular_reach_bits = ptr_reach_bits; 1640 info_[ConstantPoolEntry::INTPTR].regular_reach_bits = ptr_reach_bits;
1784 info_[ConstantPoolEntry::DOUBLE].regular_reach_bits = double_reach_bits; 1641 info_[ConstantPoolEntry::DOUBLE].regular_reach_bits = double_reach_bits;
1785 } 1642 }
1786 1643
1787 1644
1788 ConstantPoolEntry::Access ConstantPoolBuilder::NextAccess( 1645 ConstantPoolEntry::Access ConstantPoolBuilder::NextAccess(
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after
1977 1834
1978 return !empty ? emitted_label_.pos() : 0; 1835 return !empty ? emitted_label_.pos() : 0;
1979 } 1836 }
1980 1837
1981 1838
1982 // Platform specific but identical code for all the platforms. 1839 // Platform specific but identical code for all the platforms.
1983 1840
1984 void Assembler::RecordDeoptReason(const int reason, int raw_position, int id) { 1841 void Assembler::RecordDeoptReason(const int reason, int raw_position, int id) {
1985 if (FLAG_trace_deopt || isolate()->is_profiling()) { 1842 if (FLAG_trace_deopt || isolate()->is_profiling()) {
1986 EnsureSpace ensure_space(this); 1843 EnsureSpace ensure_space(this);
1987 RecordRelocInfo(RelocInfo::POSITION, raw_position); 1844 RecordRelocInfo(RelocInfo::DEOPT_POSITION, raw_position);
1988 RecordRelocInfo(RelocInfo::DEOPT_REASON, reason); 1845 RecordRelocInfo(RelocInfo::DEOPT_REASON, reason);
1989 RecordRelocInfo(RelocInfo::DEOPT_ID, id); 1846 RecordRelocInfo(RelocInfo::DEOPT_ID, id);
1990 } 1847 }
1991 } 1848 }
1992 1849
1993 1850
1994 void Assembler::RecordComment(const char* msg) { 1851 void Assembler::RecordComment(const char* msg) {
1995 if (FLAG_code_comments) { 1852 if (FLAG_code_comments) {
1996 EnsureSpace ensure_space(this); 1853 EnsureSpace ensure_space(this);
1997 RecordRelocInfo(RelocInfo::COMMENT, reinterpret_cast<intptr_t>(msg)); 1854 RecordRelocInfo(RelocInfo::COMMENT, reinterpret_cast<intptr_t>(msg));
(...skipping 15 matching lines...) Expand all
2013 1870
2014 1871
2015 void Assembler::DataAlign(int m) { 1872 void Assembler::DataAlign(int m) {
2016 DCHECK(m >= 2 && base::bits::IsPowerOfTwo32(m)); 1873 DCHECK(m >= 2 && base::bits::IsPowerOfTwo32(m));
2017 while ((pc_offset() & (m - 1)) != 0) { 1874 while ((pc_offset() & (m - 1)) != 0) {
2018 db(0); 1875 db(0);
2019 } 1876 }
2020 } 1877 }
2021 } // namespace internal 1878 } // namespace internal
2022 } // namespace v8 1879 } // namespace v8
OLDNEW
« no previous file with comments | « src/assembler.h ('k') | src/debug/liveedit.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698