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 328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
339 | 339 |
340 // The maximum size for a call instruction including pc-jump. | 340 // The maximum size for a call instruction including pc-jump. |
341 static const int kMaxCallSize = 6; | 341 static const int kMaxCallSize = 6; |
342 | 342 |
343 // The maximum pc delta that will use the short encoding. | 343 // The maximum pc delta that will use the short encoding. |
344 static const int kMaxSmallPCDelta; | 344 static const int kMaxSmallPCDelta; |
345 | 345 |
346 enum Mode { | 346 enum Mode { |
347 // Please note the order is important (see IsCodeTarget, IsGCRelocMode). | 347 // Please note the order is important (see IsCodeTarget, IsGCRelocMode). |
348 CODE_TARGET, | 348 CODE_TARGET, |
349 CODE_TARGET_WITH_ID, | |
350 EMBEDDED_OBJECT, | 349 EMBEDDED_OBJECT, |
351 // Wasm entries are to relocate pointers into the wasm memory embedded in | 350 // Wasm entries are to relocate pointers into the wasm memory embedded in |
352 // wasm code. Everything after WASM_MEMORY_REFERENCE (inclusive) is not | 351 // wasm code. Everything after WASM_MEMORY_REFERENCE (inclusive) is not |
353 // GC'ed. | 352 // GC'ed. |
354 WASM_MEMORY_REFERENCE, | 353 WASM_MEMORY_REFERENCE, |
355 WASM_GLOBAL_REFERENCE, | 354 WASM_GLOBAL_REFERENCE, |
356 WASM_MEMORY_SIZE_REFERENCE, | 355 WASM_MEMORY_SIZE_REFERENCE, |
357 WASM_FUNCTION_TABLE_SIZE_REFERENCE, | 356 WASM_FUNCTION_TABLE_SIZE_REFERENCE, |
358 WASM_PROTECTED_INSTRUCTION_LANDING, | 357 WASM_PROTECTED_INSTRUCTION_LANDING, |
359 CELL, | 358 CELL, |
(...skipping 29 matching lines...) Expand all Loading... |
389 | 388 |
390 // Pseudo-types | 389 // Pseudo-types |
391 NUMBER_OF_MODES, | 390 NUMBER_OF_MODES, |
392 NONE32, // never recorded 32-bit value | 391 NONE32, // never recorded 32-bit value |
393 NONE64, // never recorded 64-bit value | 392 NONE64, // never recorded 64-bit value |
394 CODE_AGE_SEQUENCE, // Not stored in RelocInfo array, used explictly by | 393 CODE_AGE_SEQUENCE, // Not stored in RelocInfo array, used explictly by |
395 // code aging. | 394 // code aging. |
396 | 395 |
397 FIRST_REAL_RELOC_MODE = CODE_TARGET, | 396 FIRST_REAL_RELOC_MODE = CODE_TARGET, |
398 LAST_REAL_RELOC_MODE = VENEER_POOL, | 397 LAST_REAL_RELOC_MODE = VENEER_POOL, |
399 LAST_CODE_ENUM = CODE_TARGET_WITH_ID, | 398 LAST_CODE_ENUM = CODE_TARGET, |
400 LAST_GCED_ENUM = EMBEDDED_OBJECT, | 399 LAST_GCED_ENUM = EMBEDDED_OBJECT, |
401 FIRST_SHAREABLE_RELOC_MODE = CELL, | 400 FIRST_SHAREABLE_RELOC_MODE = CELL, |
402 }; | 401 }; |
403 | 402 |
404 STATIC_ASSERT(NUMBER_OF_MODES <= kBitsPerInt); | 403 STATIC_ASSERT(NUMBER_OF_MODES <= kBitsPerInt); |
405 | 404 |
406 RelocInfo() = default; | 405 RelocInfo() = default; |
407 | 406 |
408 RelocInfo(byte* pc, Mode rmode, intptr_t data, Code* host) | 407 RelocInfo(byte* pc, Mode rmode, intptr_t data, Code* host) |
409 : pc_(pc), rmode_(rmode), data_(data), host_(host) {} | 408 : pc_(pc), rmode_(rmode), data_(data), host_(host) {} |
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
635 #ifdef ENABLE_DISASSEMBLER | 634 #ifdef ENABLE_DISASSEMBLER |
636 // Printing | 635 // Printing |
637 static const char* RelocModeName(Mode rmode); | 636 static const char* RelocModeName(Mode rmode); |
638 void Print(Isolate* isolate, std::ostream& os); // NOLINT | 637 void Print(Isolate* isolate, std::ostream& os); // NOLINT |
639 #endif // ENABLE_DISASSEMBLER | 638 #endif // ENABLE_DISASSEMBLER |
640 #ifdef VERIFY_HEAP | 639 #ifdef VERIFY_HEAP |
641 void Verify(Isolate* isolate); | 640 void Verify(Isolate* isolate); |
642 #endif | 641 #endif |
643 | 642 |
644 static const int kCodeTargetMask = (1 << (LAST_CODE_ENUM + 1)) - 1; | 643 static const int kCodeTargetMask = (1 << (LAST_CODE_ENUM + 1)) - 1; |
645 static const int kDataMask = (1 << CODE_TARGET_WITH_ID) | (1 << COMMENT); | |
646 static const int kDebugBreakSlotMask = 1 << DEBUG_BREAK_SLOT_AT_POSITION | | 644 static const int kDebugBreakSlotMask = 1 << DEBUG_BREAK_SLOT_AT_POSITION | |
647 1 << DEBUG_BREAK_SLOT_AT_RETURN | | 645 1 << DEBUG_BREAK_SLOT_AT_RETURN | |
648 1 << DEBUG_BREAK_SLOT_AT_CALL; | 646 1 << DEBUG_BREAK_SLOT_AT_CALL; |
649 static const int kApplyMask; // Modes affected by apply. Depends on arch. | 647 static const int kApplyMask; // Modes affected by apply. Depends on arch. |
650 | 648 |
651 private: | 649 private: |
652 void unchecked_update_wasm_memory_reference(Isolate* isolate, Address address, | 650 void unchecked_update_wasm_memory_reference(Isolate* isolate, Address address, |
653 ICacheFlushMode flush_mode); | 651 ICacheFlushMode flush_mode); |
654 void unchecked_update_wasm_size(Isolate* isolate, uint32_t size, | 652 void unchecked_update_wasm_size(Isolate* isolate, uint32_t size, |
655 ICacheFlushMode flush_mode); | 653 ICacheFlushMode flush_mode); |
656 | 654 |
657 // On ARM, note that pc_ is the address of the constant pool entry | 655 // On ARM, note that pc_ is the address of the constant pool entry |
658 // to be relocated and not the address of the instruction | 656 // to be relocated and not the address of the instruction |
659 // referencing the constant pool entry (except when rmode_ == | 657 // referencing the constant pool entry (except when rmode_ == |
660 // comment). | 658 // comment). |
661 byte* pc_; | 659 byte* pc_; |
662 Mode rmode_; | 660 Mode rmode_; |
663 intptr_t data_; | 661 intptr_t data_; |
664 Code* host_; | 662 Code* host_; |
665 friend class RelocIterator; | 663 friend class RelocIterator; |
666 }; | 664 }; |
667 | 665 |
668 | 666 |
669 // RelocInfoWriter serializes a stream of relocation info. It writes towards | 667 // RelocInfoWriter serializes a stream of relocation info. It writes towards |
670 // lower addresses. | 668 // lower addresses. |
671 class RelocInfoWriter BASE_EMBEDDED { | 669 class RelocInfoWriter BASE_EMBEDDED { |
672 public: | 670 public: |
673 RelocInfoWriter() : pos_(NULL), last_pc_(NULL), last_id_(0) {} | 671 RelocInfoWriter() : pos_(NULL), last_pc_(NULL) {} |
674 RelocInfoWriter(byte* pos, byte* pc) : pos_(pos), last_pc_(pc), last_id_(0) {} | 672 RelocInfoWriter(byte* pos, byte* pc) : pos_(pos), last_pc_(pc) {} |
675 | 673 |
676 byte* pos() const { return pos_; } | 674 byte* pos() const { return pos_; } |
677 byte* last_pc() const { return last_pc_; } | 675 byte* last_pc() const { return last_pc_; } |
678 | 676 |
679 void Write(const RelocInfo* rinfo); | 677 void Write(const RelocInfo* rinfo); |
680 | 678 |
681 // Update the state of the stream after reloc info buffer | 679 // Update the state of the stream after reloc info buffer |
682 // and/or code is moved while the stream is active. | 680 // and/or code is moved while the stream is active. |
683 void Reposition(byte* pos, byte* pc) { | 681 void Reposition(byte* pos, byte* pc) { |
684 pos_ = pos; | 682 pos_ = pos; |
685 last_pc_ = pc; | 683 last_pc_ = pc; |
686 } | 684 } |
687 | 685 |
688 // Max size (bytes) of a written RelocInfo. Longest encoding is | 686 // Max size (bytes) of a written RelocInfo. Longest encoding is |
689 // ExtraTag, VariableLengthPCJump, ExtraTag, pc_delta, data_delta. | 687 // ExtraTag, VariableLengthPCJump, ExtraTag, pc_delta, data_delta. |
690 // On ia32 and arm this is 1 + 4 + 1 + 1 + 4 = 11. | 688 // On ia32 and arm this is 1 + 4 + 1 + 1 + 4 = 11. |
691 // On x64 this is 1 + 4 + 1 + 1 + 8 == 15; | 689 // On x64 this is 1 + 4 + 1 + 1 + 8 == 15; |
692 // Here we use the maximum of the two. | 690 // Here we use the maximum of the two. |
693 static const int kMaxSize = 15; | 691 static const int kMaxSize = 15; |
694 | 692 |
695 private: | 693 private: |
696 inline uint32_t WriteLongPCJump(uint32_t pc_delta); | 694 inline uint32_t WriteLongPCJump(uint32_t pc_delta); |
697 | 695 |
698 inline void WriteShortTaggedPC(uint32_t pc_delta, int tag); | 696 inline void WriteShortTaggedPC(uint32_t pc_delta, int tag); |
699 inline void WriteShortTaggedData(intptr_t data_delta, int tag); | 697 inline void WriteShortData(intptr_t data_delta); |
700 | 698 |
701 inline void WriteMode(RelocInfo::Mode rmode); | 699 inline void WriteMode(RelocInfo::Mode rmode); |
702 inline void WriteModeAndPC(uint32_t pc_delta, RelocInfo::Mode rmode); | 700 inline void WriteModeAndPC(uint32_t pc_delta, RelocInfo::Mode rmode); |
703 inline void WriteIntData(int data_delta); | 701 inline void WriteIntData(int data_delta); |
704 inline void WriteData(intptr_t data_delta); | 702 inline void WriteData(intptr_t data_delta); |
705 | 703 |
706 byte* pos_; | 704 byte* pos_; |
707 byte* last_pc_; | 705 byte* last_pc_; |
708 int last_id_; | |
709 RelocInfo::Mode last_mode_; | 706 RelocInfo::Mode last_mode_; |
710 | 707 |
711 DISALLOW_COPY_AND_ASSIGN(RelocInfoWriter); | 708 DISALLOW_COPY_AND_ASSIGN(RelocInfoWriter); |
712 }; | 709 }; |
713 | 710 |
714 | 711 |
715 // A RelocIterator iterates over relocation information. | 712 // A RelocIterator iterates over relocation information. |
716 // Typical use: | 713 // Typical use: |
717 // | 714 // |
718 // for (RelocIterator it(code); !it.done(); it.next()) { | 715 // for (RelocIterator it(code); !it.done(); it.next()) { |
(...skipping 23 matching lines...) Expand all Loading... |
742 private: | 739 private: |
743 // Advance* moves the position before/after reading. | 740 // Advance* moves the position before/after reading. |
744 // *Read* reads from current byte(s) into rinfo_. | 741 // *Read* reads from current byte(s) into rinfo_. |
745 // *Get* just reads and returns info on current byte. | 742 // *Get* just reads and returns info on current byte. |
746 void Advance(int bytes = 1) { pos_ -= bytes; } | 743 void Advance(int bytes = 1) { pos_ -= bytes; } |
747 int AdvanceGetTag(); | 744 int AdvanceGetTag(); |
748 RelocInfo::Mode GetMode(); | 745 RelocInfo::Mode GetMode(); |
749 | 746 |
750 void AdvanceReadLongPCJump(); | 747 void AdvanceReadLongPCJump(); |
751 | 748 |
752 int GetShortDataTypeTag(); | |
753 void ReadShortTaggedPC(); | 749 void ReadShortTaggedPC(); |
754 void ReadShortTaggedId(); | 750 void ReadShortData(); |
755 void ReadShortTaggedData(); | |
756 | 751 |
757 void AdvanceReadPC(); | 752 void AdvanceReadPC(); |
758 void AdvanceReadId(); | |
759 void AdvanceReadInt(); | 753 void AdvanceReadInt(); |
760 void AdvanceReadData(); | 754 void AdvanceReadData(); |
761 | 755 |
762 // If the given mode is wanted, set it in rinfo_ and return true. | 756 // If the given mode is wanted, set it in rinfo_ and return true. |
763 // Else return false. Used for efficiently skipping unwanted modes. | 757 // Else return false. Used for efficiently skipping unwanted modes. |
764 bool SetMode(RelocInfo::Mode mode) { | 758 bool SetMode(RelocInfo::Mode mode) { |
765 return (mode_mask_ & (1 << mode)) ? (rinfo_.rmode_ = mode, true) : false; | 759 return (mode_mask_ & (1 << mode)) ? (rinfo_.rmode_ = mode, true) : false; |
766 } | 760 } |
767 | 761 |
768 byte* pos_; | 762 byte* pos_; |
769 byte* end_; | 763 byte* end_; |
770 byte* code_age_sequence_; | 764 byte* code_age_sequence_; |
771 RelocInfo rinfo_; | 765 RelocInfo rinfo_; |
772 bool done_; | 766 bool done_; |
773 int mode_mask_; | 767 int mode_mask_; |
774 int last_id_; | |
775 DISALLOW_COPY_AND_ASSIGN(RelocIterator); | 768 DISALLOW_COPY_AND_ASSIGN(RelocIterator); |
776 }; | 769 }; |
777 | 770 |
778 | 771 |
779 //------------------------------------------------------------------------------ | 772 //------------------------------------------------------------------------------ |
780 // External function | 773 // External function |
781 | 774 |
782 //---------------------------------------------------------------------------- | 775 //---------------------------------------------------------------------------- |
783 class SCTableReference; | 776 class SCTableReference; |
784 class Debug_Address; | 777 class Debug_Address; |
(...skipping 505 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1290 std::vector<ConstantPoolEntry> shared_entries; | 1283 std::vector<ConstantPoolEntry> shared_entries; |
1291 }; | 1284 }; |
1292 | 1285 |
1293 Label emitted_label_; // Records pc_offset of emitted pool | 1286 Label emitted_label_; // Records pc_offset of emitted pool |
1294 PerTypeEntryInfo info_[ConstantPoolEntry::NUMBER_OF_TYPES]; | 1287 PerTypeEntryInfo info_[ConstantPoolEntry::NUMBER_OF_TYPES]; |
1295 }; | 1288 }; |
1296 | 1289 |
1297 } // namespace internal | 1290 } // namespace internal |
1298 } // namespace v8 | 1291 } // namespace v8 |
1299 #endif // V8_ASSEMBLER_H_ | 1292 #endif // V8_ASSEMBLER_H_ |
OLD | NEW |