Index: src/assembler.h |
diff --git a/src/assembler.h b/src/assembler.h |
index 9433692ed6f8d20251364b2ad354ac04cc919c58..f5349038dac0335c088da76771c2ffd20ef22aec 100644 |
--- a/src/assembler.h |
+++ b/src/assembler.h |
@@ -349,10 +349,9 @@ class RelocInfo { |
// we do not normally record relocation info. |
static const char* const kFillerCommentString; |
- // The minimum size of a comment is equal to three bytes for the extra tagged |
- // pc + the tag for the data, and kPointerSize for the actual pointer to the |
- // comment. |
- static const int kMinRelocCommentSize = 3 + kPointerSize; |
+ // The minimum size of a comment is equal to two bytes for the extra tagged |
+ // pc and kPointerSize for the actual pointer to the comment. |
+ static const int kMinRelocCommentSize = 2 + kPointerSize; |
// The maximum size for a call instruction including pc-jump. |
static const int kMaxCallSize = 6; |
@@ -387,11 +386,14 @@ class RelocInfo { |
CONST_POOL, |
VENEER_POOL, |
- DEOPT_REASON, // Deoptimization reason index. |
+ DEOPT_REASON, // Deoptimization reason index. |
+ |
+ // This is not an actual reloc mode, but used to encode a long pc jump that |
+ // cannot be encoded as part of another record. |
+ PC_JUMP, |
- // add more as needed |
// Pseudo-types |
- NUMBER_OF_MODES, // There are at most 15 modes with noncompact encoding. |
+ NUMBER_OF_MODES, |
NONE32, // never recorded 32-bit value |
NONE64, // never recorded 64-bit value |
CODE_AGE_SEQUENCE, // Not stored in RelocInfo array, used explictly by |
@@ -399,13 +401,8 @@ class RelocInfo { |
FIRST_REAL_RELOC_MODE = CODE_TARGET, |
LAST_REAL_RELOC_MODE = VENEER_POOL, |
- FIRST_PSEUDO_RELOC_MODE = CODE_AGE_SEQUENCE, |
- LAST_PSEUDO_RELOC_MODE = CODE_AGE_SEQUENCE, |
LAST_CODE_ENUM = DEBUG_BREAK, |
LAST_GCED_ENUM = CELL, |
- // Modes <= LAST_COMPACT_ENUM are guaranteed to have compact encoding. |
- LAST_COMPACT_ENUM = CODE_TARGET_WITH_ID, |
- LAST_STANDARD_NONCOMPACT_ENUM = INTERNAL_REFERENCE_ENCODED |
}; |
RelocInfo() {} |
@@ -418,11 +415,6 @@ class RelocInfo { |
return mode >= FIRST_REAL_RELOC_MODE && |
mode <= LAST_REAL_RELOC_MODE; |
} |
- static inline bool IsPseudoRelocMode(Mode mode) { |
- DCHECK(!IsRealRelocMode(mode)); |
- return mode >= FIRST_PSEUDO_RELOC_MODE && |
- mode <= LAST_PSEUDO_RELOC_MODE; |
- } |
static inline bool IsConstructCall(Mode mode) { |
return mode == CONSTRUCT_CALL; |
} |
@@ -686,23 +678,22 @@ class RelocInfoWriter BASE_EMBEDDED { |
void Finish() { FlushPosition(); } |
// Max size (bytes) of a written RelocInfo. Longest encoding is |
- // ExtraTag, VariableLengthPCJump, ExtraTag, pc_delta, ExtraTag, data_delta. |
- // On ia32 and arm this is 1 + 4 + 1 + 1 + 1 + 4 = 12. |
- // On x64 this is 1 + 4 + 1 + 1 + 1 + 8 == 16; |
+ // ExtraTag, VariableLengthPCJump, ExtraTag, pc_delta, data_delta. |
+ // On ia32 and arm this is 1 + 4 + 1 + 1 + 4 = 11. |
+ // On x64 this is 1 + 4 + 1 + 1 + 8 == 15; |
// Here we use the maximum of the two. |
- static const int kMaxSize = 16; |
+ static const int kMaxSize = 15; |
private: |
- inline uint32_t WriteVariableLengthPCJump(uint32_t pc_delta); |
- inline void WriteTaggedPC(uint32_t pc_delta, int tag); |
- inline void WriteExtraTaggedPC(uint32_t pc_delta, int extra_tag); |
- inline void WriteInt(int number); |
- inline void WriteDebugBreakSlotData(int data); |
- inline void WriteExtraTaggedIntData(int data_delta, int top_tag); |
- inline void WriteExtraTaggedPoolData(int data, int pool_type); |
- inline void WriteExtraTaggedData(intptr_t data_delta, int top_tag); |
- inline void WriteTaggedData(intptr_t data_delta, int tag); |
- inline void WriteExtraTag(int extra_tag, int top_tag); |
+ inline uint32_t WriteLongPCJump(uint32_t pc_delta); |
+ |
+ inline void WriteShortTaggedPC(uint32_t pc_delta, int tag); |
+ inline void WriteShortTaggedData(intptr_t data_delta, int tag); |
+ |
+ inline void WriteMode(RelocInfo::Mode rmode); |
+ inline void WriteModeAndPC(uint32_t pc_delta, RelocInfo::Mode rmode); |
+ inline void WriteIntData(int data_delta); |
+ inline void WriteData(intptr_t data_delta); |
inline void WritePosition(int pc_delta, int pos_delta, RelocInfo::Mode rmode); |
void FlushPosition(); |
@@ -753,21 +744,21 @@ class RelocIterator: public Malloced { |
// *Get* just reads and returns info on current byte. |
void Advance(int bytes = 1) { pos_ -= bytes; } |
int AdvanceGetTag(); |
- int GetExtraTag(); |
- int GetTopTag(); |
- void ReadTaggedPC(); |
+ RelocInfo::Mode GetMode(); |
+ |
+ void AdvanceReadLongPCJump(); |
+ |
+ int GetShortDataTypeTag(); |
+ void ReadShortTaggedPC(); |
+ void ReadShortTaggedId(); |
+ void ReadShortTaggedPosition(); |
+ void ReadShortTaggedData(); |
+ |
void AdvanceReadPC(); |
void AdvanceReadId(); |
void AdvanceReadInt(); |
- void AdvanceReadPoolData(); |
- void AdvanceReadDebugBreakSlotData(); |
void AdvanceReadPosition(); |
void AdvanceReadData(); |
- void AdvanceReadVariableLengthPCJump(); |
- int GetLocatableTypeTag(); |
- void ReadTaggedId(); |
- void ReadTaggedPosition(); |
- void ReadTaggedData(); |
// If the given mode is wanted, set it in rinfo_ and return true. |
// Else return false. Used for efficiently skipping unwanted modes. |