| 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 626 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 637 // is returned by RelocInfo::target_reference_address(). | 637 // is returned by RelocInfo::target_reference_address(). |
| 638 Address reconstructed_adr_ptr_; | 638 Address reconstructed_adr_ptr_; |
| 639 friend class RelocIterator; | 639 friend class RelocIterator; |
| 640 }; | 640 }; |
| 641 | 641 |
| 642 | 642 |
| 643 // RelocInfoWriter serializes a stream of relocation info. It writes towards | 643 // RelocInfoWriter serializes a stream of relocation info. It writes towards |
| 644 // lower addresses. | 644 // lower addresses. |
| 645 class RelocInfoWriter BASE_EMBEDDED { | 645 class RelocInfoWriter BASE_EMBEDDED { |
| 646 public: | 646 public: |
| 647 RelocInfoWriter() : pos_(NULL), | 647 RelocInfoWriter() |
| 648 last_pc_(NULL), | 648 : pos_(NULL), |
| 649 last_id_(0), | 649 last_pc_(NULL), |
| 650 last_position_(0) {} | 650 last_id_(0), |
| 651 RelocInfoWriter(byte* pos, byte* pc) : pos_(pos), | 651 last_position_(0), |
| 652 last_pc_(pc), | 652 last_mode_(RelocInfo::NUMBER_OF_MODES), |
| 653 last_id_(0), | 653 next_position_candidate_pos_delta_(0), |
| 654 last_position_(0) {} | 654 next_position_candidate_pc_delta_(0), |
| 655 next_position_candidate_flushed_(true) {} |
| 656 RelocInfoWriter(byte* pos, byte* pc) |
| 657 : pos_(pos), |
| 658 last_pc_(pc), |
| 659 last_id_(0), |
| 660 last_position_(0), |
| 661 last_mode_(RelocInfo::NUMBER_OF_MODES), |
| 662 next_position_candidate_pos_delta_(0), |
| 663 next_position_candidate_pc_delta_(0), |
| 664 next_position_candidate_flushed_(true) {} |
| 655 | 665 |
| 656 byte* pos() const { return pos_; } | 666 byte* pos() const { return pos_; } |
| 657 byte* last_pc() const { return last_pc_; } | 667 byte* last_pc() const { return last_pc_; } |
| 658 | 668 |
| 659 void Write(const RelocInfo* rinfo); | 669 void Write(const RelocInfo* rinfo); |
| 660 | 670 |
| 661 // Update the state of the stream after reloc info buffer | 671 // Update the state of the stream after reloc info buffer |
| 662 // and/or code is moved while the stream is active. | 672 // and/or code is moved while the stream is active. |
| 663 void Reposition(byte* pos, byte* pc) { | 673 void Reposition(byte* pos, byte* pc) { |
| 664 pos_ = pos; | 674 pos_ = pos; |
| 665 last_pc_ = pc; | 675 last_pc_ = pc; |
| 666 } | 676 } |
| 667 | 677 |
| 678 void Finish() { FlushPosition(); } |
| 679 |
| 668 // Max size (bytes) of a written RelocInfo. Longest encoding is | 680 // Max size (bytes) of a written RelocInfo. Longest encoding is |
| 669 // ExtraTag, VariableLengthPCJump, ExtraTag, pc_delta, ExtraTag, data_delta. | 681 // ExtraTag, VariableLengthPCJump, ExtraTag, pc_delta, ExtraTag, data_delta. |
| 670 // On ia32 and arm this is 1 + 4 + 1 + 1 + 1 + 4 = 12. | 682 // On ia32 and arm this is 1 + 4 + 1 + 1 + 1 + 4 = 12. |
| 671 // On x64 this is 1 + 4 + 1 + 1 + 1 + 8 == 16; | 683 // On x64 this is 1 + 4 + 1 + 1 + 1 + 8 == 16; |
| 672 // Here we use the maximum of the two. | 684 // Here we use the maximum of the two. |
| 673 static const int kMaxSize = 16; | 685 static const int kMaxSize = 16; |
| 674 | 686 |
| 675 private: | 687 private: |
| 676 inline uint32_t WriteVariableLengthPCJump(uint32_t pc_delta); | 688 inline uint32_t WriteVariableLengthPCJump(uint32_t pc_delta); |
| 677 inline void WriteTaggedPC(uint32_t pc_delta, int tag); | 689 inline void WriteTaggedPC(uint32_t pc_delta, int tag); |
| 678 inline void WriteExtraTaggedPC(uint32_t pc_delta, int extra_tag); | 690 inline void WriteExtraTaggedPC(uint32_t pc_delta, int extra_tag); |
| 679 inline void WriteExtraTaggedIntData(int data_delta, int top_tag); | 691 inline void WriteExtraTaggedIntData(int data_delta, int top_tag); |
| 680 inline void WriteExtraTaggedPoolData(int data, int pool_type); | 692 inline void WriteExtraTaggedPoolData(int data, int pool_type); |
| 681 inline void WriteExtraTaggedData(intptr_t data_delta, int top_tag); | 693 inline void WriteExtraTaggedData(intptr_t data_delta, int top_tag); |
| 682 inline void WriteTaggedData(intptr_t data_delta, int tag); | 694 inline void WriteTaggedData(intptr_t data_delta, int tag); |
| 683 inline void WriteExtraTag(int extra_tag, int top_tag); | 695 inline void WriteExtraTag(int extra_tag, int top_tag); |
| 696 inline void WritePosition(int pc_delta, int pos_delta, RelocInfo::Mode rmode); |
| 697 |
| 698 void FlushPosition(); |
| 684 | 699 |
| 685 byte* pos_; | 700 byte* pos_; |
| 686 byte* last_pc_; | 701 byte* last_pc_; |
| 687 int last_id_; | 702 int last_id_; |
| 688 int last_position_; | 703 int last_position_; |
| 704 RelocInfo::Mode last_mode_; |
| 705 int next_position_candidate_pos_delta_; |
| 706 uint32_t next_position_candidate_pc_delta_; |
| 707 bool next_position_candidate_flushed_; |
| 708 |
| 689 DISALLOW_COPY_AND_ASSIGN(RelocInfoWriter); | 709 DISALLOW_COPY_AND_ASSIGN(RelocInfoWriter); |
| 690 }; | 710 }; |
| 691 | 711 |
| 692 | 712 |
| 693 // A RelocIterator iterates over relocation information. | 713 // A RelocIterator iterates over relocation information. |
| 694 // Typical use: | 714 // Typical use: |
| 695 // | 715 // |
| 696 // for (RelocIterator it(code); !it.done(); it.next()) { | 716 // for (RelocIterator it(code); !it.done(); it.next()) { |
| 697 // // do something with it.rinfo() here | 717 // // do something with it.rinfo() here |
| 698 // } | 718 // } |
| (...skipping 433 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1132 NullCallWrapper() { } | 1152 NullCallWrapper() { } |
| 1133 virtual ~NullCallWrapper() { } | 1153 virtual ~NullCallWrapper() { } |
| 1134 virtual void BeforeCall(int call_size) const { } | 1154 virtual void BeforeCall(int call_size) const { } |
| 1135 virtual void AfterCall() const { } | 1155 virtual void AfterCall() const { } |
| 1136 }; | 1156 }; |
| 1137 | 1157 |
| 1138 | 1158 |
| 1139 } } // namespace v8::internal | 1159 } } // namespace v8::internal |
| 1140 | 1160 |
| 1141 #endif // V8_ASSEMBLER_H_ | 1161 #endif // V8_ASSEMBLER_H_ |
| OLD | NEW |