| Index: src/assembler.cc
|
| diff --git a/src/assembler.cc b/src/assembler.cc
|
| index d03593f36fef993589c470f2601f3f8f44c13512..49e1acf50b3ec4f8bcf143b593fdabdd1a33a15b 100644
|
| --- a/src/assembler.cc
|
| +++ b/src/assembler.cc
|
| @@ -248,44 +248,22 @@ int Label::pos() const {
|
| // 10: short_data_record: [6-bit pc delta] 10 followed by
|
| // [6-bit data delta] [2-bit data type tag]
|
| //
|
| -// 11: long_record [2-bit high tag][4 bit middle_tag] 11
|
| -// followed by variable data depending on type.
|
| +// 11: long_record [6 bit reloc mode] 11
|
| +// followed by pc delta
|
| +// followed by optional data depending on type.
|
| //
|
| // 2-bit data type tags, used in short_data_record and data_jump long_record:
|
| // code_target_with_id: 00
|
| // position: 01
|
| // statement_position: 10
|
| -// comment: 11 (not used in short_data_record)
|
| -// deopt_reason: 11 (not used in long_data_record)
|
| +// deopt_reason: 11
|
| //
|
| -// Long record format:
|
| -// 4-bit middle_tag:
|
| -// 0000 - 1100 : Short record for RelocInfo::Mode middle_tag + 2
|
| -// (The middle_tag encodes rmode - RelocInfo::LAST_COMPACT_ENUM,
|
| -// and is between 0000 and 1100)
|
| -// The format is:
|
| -// 00 [4 bit middle_tag] 11 followed by
|
| -// 00 [6 bit pc delta]
|
| -//
|
| -// 1101: constant or veneer pool. Used only on ARM and ARM64 for now.
|
| -// The format is: [2-bit sub-type] 1101 11
|
| -// signed int (size of the pool).
|
| -// The 2-bit sub-types are:
|
| -// 00: constant pool
|
| -// 01: veneer pool
|
| -// 1110: long_data_record
|
| -// The format is: [2-bit data_type_tag] 1110 11
|
| -// signed intptr_t, lowest byte written first
|
| -// (except data_type code_target_with_id, which
|
| -// is followed by a signed int, not intptr_t.)
|
| -//
|
| -// 1111: long_pc_jump
|
| -// The format is:
|
| -// pc-jump: 00 1111 11,
|
| -// 00 [6 bits pc delta]
|
| -// or
|
| -// pc-jump (variable length):
|
| -// 01 1111 11,
|
| +// If a pc delta exceeds 6 bits, it is split into a remainder that fits into
|
| +// 6 bits and a part that does not. The latter is encoded as a long record
|
| +// with PC_JUMP as pseudo reloc info mode. The former is encoded as part of
|
| +// the following record in the usual way. The long pc jump record has variable
|
| +// length:
|
| +// pc-jump: [PC_JUMP] 11
|
| // [7 bits data] 0
|
| // ...
|
| // [7 bits data] 1
|
| @@ -294,51 +272,37 @@ int Label::pos() const {
|
|
|
| const int kTagBits = 2;
|
| const int kTagMask = (1 << kTagBits) - 1;
|
| -const int kExtraTagBits = 4;
|
| -const int kLocatableTypeTagBits = 2;
|
| -const int kSmallDataBits = kBitsPerByte - kLocatableTypeTagBits;
|
| +const int kLongTagBits = 6;
|
| +const int kShortDataTypeTagBits = 2;
|
| +const int kShortDataBits = kBitsPerByte - kShortDataTypeTagBits;
|
|
|
| const int kEmbeddedObjectTag = 0;
|
| const int kCodeTargetTag = 1;
|
| const int kLocatableTag = 2;
|
| const int kDefaultTag = 3;
|
|
|
| -const int kPCJumpExtraTag = (1 << kExtraTagBits) - 1;
|
| -
|
| const int kSmallPCDeltaBits = kBitsPerByte - kTagBits;
|
| const int kSmallPCDeltaMask = (1 << kSmallPCDeltaBits) - 1;
|
| const int RelocInfo::kMaxSmallPCDelta = kSmallPCDeltaMask;
|
|
|
| -const int kVariableLengthPCJumpTopTag = 1;
|
| const int kChunkBits = 7;
|
| const int kChunkMask = (1 << kChunkBits) - 1;
|
| const int kLastChunkTagBits = 1;
|
| const int kLastChunkTagMask = 1;
|
| const int kLastChunkTag = 1;
|
|
|
| -
|
| -const int kDataJumpExtraTag = kPCJumpExtraTag - 1;
|
| -
|
| const int kCodeWithIdTag = 0;
|
| const int kNonstatementPositionTag = 1;
|
| const int kStatementPositionTag = 2;
|
| -const int kCommentTag = 3;
|
| -
|
| -// Reuse the same value for deopt reason tag in short record format.
|
| -// It is possible because we use kCommentTag only for the long record format.
|
| const int kDeoptReasonTag = 3;
|
|
|
| -const int kPoolExtraTag = kPCJumpExtraTag - 2;
|
| -const int kConstPoolTag = 0;
|
| -const int kVeneerPoolTag = 1;
|
|
|
| -
|
| -uint32_t RelocInfoWriter::WriteVariableLengthPCJump(uint32_t pc_delta) {
|
| +uint32_t RelocInfoWriter::WriteLongPCJump(uint32_t pc_delta) {
|
| // Return if the pc_delta can fit in kSmallPCDeltaBits bits.
|
| // Otherwise write a variable length PC jump for the bits that do
|
| // not fit in the kSmallPCDeltaBits bits.
|
| if (is_uintn(pc_delta, kSmallPCDeltaBits)) return pc_delta;
|
| - WriteExtraTag(kPCJumpExtraTag, kVariableLengthPCJumpTopTag);
|
| + WriteMode(RelocInfo::PC_JUMP);
|
| uint32_t pc_jump = pc_delta >> kSmallPCDeltaBits;
|
| DCHECK(pc_jump > 0);
|
| // Write kChunkBits size chunks of the pc_jump.
|
| @@ -353,34 +317,33 @@ uint32_t RelocInfoWriter::WriteVariableLengthPCJump(uint32_t pc_delta) {
|
| }
|
|
|
|
|
| -void RelocInfoWriter::WriteTaggedPC(uint32_t pc_delta, int tag) {
|
| - // Write a byte of tagged pc-delta, possibly preceded by var. length pc-jump.
|
| - pc_delta = WriteVariableLengthPCJump(pc_delta);
|
| +void RelocInfoWriter::WriteShortTaggedPC(uint32_t pc_delta, int tag) {
|
| + // Write a byte of tagged pc-delta, possibly preceded by an explicit pc-jump.
|
| + pc_delta = WriteLongPCJump(pc_delta);
|
| *--pos_ = pc_delta << kTagBits | tag;
|
| }
|
|
|
|
|
| -void RelocInfoWriter::WriteTaggedData(intptr_t data_delta, int tag) {
|
| - *--pos_ = static_cast<byte>(data_delta << kLocatableTypeTagBits | tag);
|
| +void RelocInfoWriter::WriteShortTaggedData(intptr_t data_delta, int tag) {
|
| + *--pos_ = static_cast<byte>(data_delta << kShortDataTypeTagBits | tag);
|
| }
|
|
|
|
|
| -void RelocInfoWriter::WriteExtraTag(int extra_tag, int top_tag) {
|
| - *--pos_ = static_cast<int>(top_tag << (kTagBits + kExtraTagBits) |
|
| - extra_tag << kTagBits |
|
| - kDefaultTag);
|
| +void RelocInfoWriter::WriteMode(RelocInfo::Mode rmode) {
|
| + STATIC_ASSERT(RelocInfo::NUMBER_OF_MODES <= (1 << kLongTagBits));
|
| + *--pos_ = static_cast<int>((rmode << kTagBits) | kDefaultTag);
|
| }
|
|
|
|
|
| -void RelocInfoWriter::WriteExtraTaggedPC(uint32_t pc_delta, int extra_tag) {
|
| +void RelocInfoWriter::WriteModeAndPC(uint32_t pc_delta, RelocInfo::Mode rmode) {
|
| // Write two-byte tagged pc-delta, possibly preceded by var. length pc-jump.
|
| - pc_delta = WriteVariableLengthPCJump(pc_delta);
|
| - WriteExtraTag(extra_tag, 0);
|
| + pc_delta = WriteLongPCJump(pc_delta);
|
| + WriteMode(rmode);
|
| *--pos_ = pc_delta;
|
| }
|
|
|
|
|
| -void RelocInfoWriter::WriteInt(int number) {
|
| +void RelocInfoWriter::WriteIntData(int number) {
|
| for (int i = 0; i < kIntSize; i++) {
|
| *--pos_ = static_cast<byte>(number);
|
| // Signed right shift is arithmetic shift. Tested in test-utils.cc.
|
| @@ -389,23 +352,7 @@ void RelocInfoWriter::WriteInt(int number) {
|
| }
|
|
|
|
|
| -void RelocInfoWriter::WriteDebugBreakSlotData(int data) { WriteInt(data); }
|
| -
|
| -
|
| -void RelocInfoWriter::WriteExtraTaggedIntData(int data_delta, int top_tag) {
|
| - WriteExtraTag(kDataJumpExtraTag, top_tag);
|
| - WriteInt(data_delta);
|
| -}
|
| -
|
| -
|
| -void RelocInfoWriter::WriteExtraTaggedPoolData(int data, int pool_type) {
|
| - WriteExtraTag(kPoolExtraTag, pool_type);
|
| - WriteInt(data);
|
| -}
|
| -
|
| -
|
| -void RelocInfoWriter::WriteExtraTaggedData(intptr_t data_delta, int top_tag) {
|
| - WriteExtraTag(kDataJumpExtraTag, top_tag);
|
| +void RelocInfoWriter::WriteData(intptr_t data_delta) {
|
| for (int i = 0; i < kIntptrSize; i++) {
|
| *--pos_ = static_cast<byte>(data_delta);
|
| // Signed right shift is arithmetic shift. Tested in test-utils.cc.
|
| @@ -419,13 +366,13 @@ void RelocInfoWriter::WritePosition(int pc_delta, int pos_delta,
|
| int pos_type_tag = (rmode == RelocInfo::POSITION) ? kNonstatementPositionTag
|
| : kStatementPositionTag;
|
| // Check if delta is small enough to fit in a tagged byte.
|
| - if (is_intn(pos_delta, kSmallDataBits)) {
|
| - WriteTaggedPC(pc_delta, kLocatableTag);
|
| - WriteTaggedData(pos_delta, pos_type_tag);
|
| + if (is_intn(pos_delta, kShortDataBits)) {
|
| + WriteShortTaggedPC(pc_delta, kLocatableTag);
|
| + WriteShortTaggedData(pos_delta, pos_type_tag);
|
| } else {
|
| // Otherwise, use costly encoding.
|
| - WriteExtraTaggedPC(pc_delta, kPCJumpExtraTag);
|
| - WriteExtraTaggedIntData(pos_delta, pos_type_tag);
|
| + WriteModeAndPC(pc_delta, rmode);
|
| + WriteIntData(pos_delta);
|
| }
|
| }
|
|
|
| @@ -456,28 +403,28 @@ void RelocInfoWriter::Write(const RelocInfo* rinfo) {
|
|
|
| // The two most common modes are given small tags, and usually fit in a byte.
|
| if (rmode == RelocInfo::EMBEDDED_OBJECT) {
|
| - WriteTaggedPC(pc_delta, kEmbeddedObjectTag);
|
| + WriteShortTaggedPC(pc_delta, kEmbeddedObjectTag);
|
| } else if (rmode == RelocInfo::CODE_TARGET) {
|
| - WriteTaggedPC(pc_delta, kCodeTargetTag);
|
| + WriteShortTaggedPC(pc_delta, kCodeTargetTag);
|
| DCHECK(begin_pos - pos_ <= RelocInfo::kMaxCallSize);
|
| } else if (rmode == RelocInfo::CODE_TARGET_WITH_ID) {
|
| // Use signed delta-encoding for id.
|
| DCHECK_EQ(static_cast<int>(rinfo->data()), rinfo->data());
|
| int id_delta = static_cast<int>(rinfo->data()) - last_id_;
|
| // Check if delta is small enough to fit in a tagged byte.
|
| - if (is_intn(id_delta, kSmallDataBits)) {
|
| - WriteTaggedPC(pc_delta, kLocatableTag);
|
| - WriteTaggedData(id_delta, kCodeWithIdTag);
|
| + if (is_intn(id_delta, kShortDataBits)) {
|
| + WriteShortTaggedPC(pc_delta, kLocatableTag);
|
| + WriteShortTaggedData(id_delta, kCodeWithIdTag);
|
| } else {
|
| // Otherwise, use costly encoding.
|
| - WriteExtraTaggedPC(pc_delta, kPCJumpExtraTag);
|
| - WriteExtraTaggedIntData(id_delta, kCodeWithIdTag);
|
| + WriteModeAndPC(pc_delta, rmode);
|
| + WriteIntData(id_delta);
|
| }
|
| last_id_ = static_cast<int>(rinfo->data());
|
| } else if (rmode == RelocInfo::DEOPT_REASON) {
|
| - DCHECK(rinfo->data() < (1 << kSmallDataBits));
|
| - WriteTaggedPC(pc_delta, kLocatableTag);
|
| - WriteTaggedData(rinfo->data(), kDeoptReasonTag);
|
| + DCHECK(rinfo->data() < (1 << kShortDataBits));
|
| + WriteShortTaggedPC(pc_delta, kLocatableTag);
|
| + WriteShortTaggedData(rinfo->data(), kDeoptReasonTag);
|
| } else if (RelocInfo::IsPosition(rmode)) {
|
| // Use signed delta-encoding for position.
|
| DCHECK_EQ(static_cast<int>(rinfo->data()), rinfo->data());
|
| @@ -496,29 +443,14 @@ void RelocInfoWriter::Write(const RelocInfo* rinfo) {
|
| next_position_candidate_flushed_ = false;
|
| }
|
| last_position_ = static_cast<int>(rinfo->data());
|
| - } else if (RelocInfo::IsComment(rmode)) {
|
| - // Comments are normally not generated, so we use the costly encoding.
|
| - WriteExtraTaggedPC(pc_delta, kPCJumpExtraTag);
|
| - WriteExtraTaggedData(rinfo->data(), kCommentTag);
|
| - DCHECK(begin_pos - pos_ >= RelocInfo::kMinRelocCommentSize);
|
| - } else if (RelocInfo::IsConstPool(rmode) || RelocInfo::IsVeneerPool(rmode)) {
|
| - WriteExtraTaggedPC(pc_delta, kPCJumpExtraTag);
|
| - WriteExtraTaggedPoolData(
|
| - static_cast<int>(rinfo->data()),
|
| - RelocInfo::IsConstPool(rmode) ? kConstPoolTag : kVeneerPoolTag);
|
| } else {
|
| - DCHECK(rmode > RelocInfo::LAST_COMPACT_ENUM);
|
| - DCHECK(rmode <= RelocInfo::LAST_STANDARD_NONCOMPACT_ENUM);
|
| - STATIC_ASSERT(RelocInfo::LAST_STANDARD_NONCOMPACT_ENUM -
|
| - RelocInfo::LAST_COMPACT_ENUM <=
|
| - kPoolExtraTag);
|
| - int saved_mode = rmode - RelocInfo::LAST_COMPACT_ENUM - 1;
|
| - // For all other modes we simply use the mode as the extra tag.
|
| - // None of these modes need a data component.
|
| - DCHECK(0 <= saved_mode && saved_mode < kPoolExtraTag);
|
| - WriteExtraTaggedPC(pc_delta, saved_mode);
|
| - if (RelocInfo::IsDebugBreakSlot(rmode)) {
|
| - WriteDebugBreakSlotData(static_cast<int>(rinfo->data()));
|
| + WriteModeAndPC(pc_delta, rmode);
|
| + if (RelocInfo::IsComment(rmode)) {
|
| + WriteData(rinfo->data());
|
| + } else if (RelocInfo::IsConstPool(rmode) ||
|
| + RelocInfo::IsVeneerPool(rmode) ||
|
| + RelocInfo::IsDebugBreakSlot(rmode)) {
|
| + WriteIntData(static_cast<int>(rinfo->data()));
|
| }
|
| }
|
| last_pc_ = rinfo->pc();
|
| @@ -534,17 +466,13 @@ inline int RelocIterator::AdvanceGetTag() {
|
| }
|
|
|
|
|
| -inline int RelocIterator::GetExtraTag() {
|
| - return (*pos_ >> kTagBits) & ((1 << kExtraTagBits) - 1);
|
| +inline RelocInfo::Mode RelocIterator::GetMode() {
|
| + return static_cast<RelocInfo::Mode>((*pos_ >> kTagBits) &
|
| + ((1 << kLongTagBits) - 1));
|
| }
|
|
|
|
|
| -inline int RelocIterator::GetTopTag() {
|
| - return *pos_ >> (kTagBits + kExtraTagBits);
|
| -}
|
| -
|
| -
|
| -inline void RelocIterator::ReadTaggedPC() {
|
| +inline void RelocIterator::ReadShortTaggedPC() {
|
| rinfo_.pc_ += *pos_ >> kTagBits;
|
| }
|
|
|
| @@ -573,12 +501,6 @@ void RelocIterator::AdvanceReadInt() {
|
| }
|
|
|
|
|
| -void RelocIterator::AdvanceReadPoolData() { AdvanceReadInt(); }
|
| -
|
| -
|
| -void RelocIterator::AdvanceReadDebugBreakSlotData() { AdvanceReadInt(); }
|
| -
|
| -
|
| void RelocIterator::AdvanceReadPosition() {
|
| int x = 0;
|
| for (int i = 0; i < kIntSize; i++) {
|
| @@ -598,7 +520,7 @@ void RelocIterator::AdvanceReadData() {
|
| }
|
|
|
|
|
| -void RelocIterator::AdvanceReadVariableLengthPCJump() {
|
| +void RelocIterator::AdvanceReadLongPCJump() {
|
| // Read the 32-kSmallPCDeltaBits most significant bits of the
|
| // pc jump in kChunkBits bit chunks and shift them into place.
|
| // Stop when the last chunk is encountered.
|
| @@ -614,28 +536,28 @@ void RelocIterator::AdvanceReadVariableLengthPCJump() {
|
| }
|
|
|
|
|
| -inline int RelocIterator::GetLocatableTypeTag() {
|
| - return *pos_ & ((1 << kLocatableTypeTagBits) - 1);
|
| +inline int RelocIterator::GetShortDataTypeTag() {
|
| + return *pos_ & ((1 << kShortDataTypeTagBits) - 1);
|
| }
|
|
|
|
|
| -inline void RelocIterator::ReadTaggedId() {
|
| +inline void RelocIterator::ReadShortTaggedId() {
|
| int8_t signed_b = *pos_;
|
| // Signed right shift is arithmetic shift. Tested in test-utils.cc.
|
| - last_id_ += signed_b >> kLocatableTypeTagBits;
|
| + last_id_ += signed_b >> kShortDataTypeTagBits;
|
| rinfo_.data_ = last_id_;
|
| }
|
|
|
|
|
| -inline void RelocIterator::ReadTaggedPosition() {
|
| +inline void RelocIterator::ReadShortTaggedPosition() {
|
| int8_t signed_b = *pos_;
|
| // Signed right shift is arithmetic shift. Tested in test-utils.cc.
|
| - last_position_ += signed_b >> kLocatableTypeTagBits;
|
| + last_position_ += signed_b >> kShortDataTypeTagBits;
|
| rinfo_.data_ = last_position_;
|
| }
|
|
|
|
|
| -inline void RelocIterator::ReadTaggedData() {
|
| +inline void RelocIterator::ReadShortTaggedData() {
|
| uint8_t unsigned_b = *pos_;
|
| rinfo_.data_ = unsigned_b >> kTagBits;
|
| }
|
| @@ -660,86 +582,72 @@ void RelocIterator::next() {
|
| while (pos_ > end_) {
|
| int tag = AdvanceGetTag();
|
| if (tag == kEmbeddedObjectTag) {
|
| - ReadTaggedPC();
|
| + ReadShortTaggedPC();
|
| if (SetMode(RelocInfo::EMBEDDED_OBJECT)) return;
|
| } else if (tag == kCodeTargetTag) {
|
| - ReadTaggedPC();
|
| + ReadShortTaggedPC();
|
| if (SetMode(RelocInfo::CODE_TARGET)) return;
|
| } else if (tag == kLocatableTag) {
|
| - ReadTaggedPC();
|
| + ReadShortTaggedPC();
|
| Advance();
|
| - int locatable_tag = GetLocatableTypeTag();
|
| - if (locatable_tag == kCodeWithIdTag) {
|
| + int data_type_tag = GetShortDataTypeTag();
|
| + if (data_type_tag == kCodeWithIdTag) {
|
| if (SetMode(RelocInfo::CODE_TARGET_WITH_ID)) {
|
| - ReadTaggedId();
|
| + ReadShortTaggedId();
|
| + return;
|
| + }
|
| + } else if (data_type_tag == kDeoptReasonTag) {
|
| + if (SetMode(RelocInfo::DEOPT_REASON)) {
|
| + ReadShortTaggedData();
|
| return;
|
| }
|
| - } else if (locatable_tag == kDeoptReasonTag) {
|
| - ReadTaggedData();
|
| - if (SetMode(RelocInfo::DEOPT_REASON)) return;
|
| } else {
|
| - DCHECK(locatable_tag == kNonstatementPositionTag ||
|
| - locatable_tag == kStatementPositionTag);
|
| + DCHECK(data_type_tag == kNonstatementPositionTag ||
|
| + data_type_tag == kStatementPositionTag);
|
| if (mode_mask_ & RelocInfo::kPositionMask) {
|
| - ReadTaggedPosition();
|
| - if (SetMode(GetPositionModeFromTag(locatable_tag))) return;
|
| + // Always update the position if we are interested in either
|
| + // statement positions or non-statement positions.
|
| + ReadShortTaggedPosition();
|
| + if (SetMode(GetPositionModeFromTag(data_type_tag))) return;
|
| }
|
| }
|
| } else {
|
| DCHECK(tag == kDefaultTag);
|
| - int extra_tag = GetExtraTag();
|
| - if (extra_tag == kPCJumpExtraTag) {
|
| - if (GetTopTag() == kVariableLengthPCJumpTopTag) {
|
| - AdvanceReadVariableLengthPCJump();
|
| - } else {
|
| - AdvanceReadPC();
|
| - }
|
| - } else if (extra_tag == kDataJumpExtraTag) {
|
| - int locatable_tag = GetTopTag();
|
| - if (locatable_tag == kCodeWithIdTag) {
|
| - if (SetMode(RelocInfo::CODE_TARGET_WITH_ID)) {
|
| + RelocInfo::Mode rmode = GetMode();
|
| + if (rmode == RelocInfo::PC_JUMP) {
|
| + AdvanceReadLongPCJump();
|
| + } else {
|
| + AdvanceReadPC();
|
| + if (rmode == RelocInfo::CODE_TARGET_WITH_ID) {
|
| + if (SetMode(rmode)) {
|
| AdvanceReadId();
|
| return;
|
| }
|
| Advance(kIntSize);
|
| - } else if (locatable_tag != kCommentTag) {
|
| - DCHECK(locatable_tag == kNonstatementPositionTag ||
|
| - locatable_tag == kStatementPositionTag);
|
| + } else if (RelocInfo::IsComment(rmode)) {
|
| + if (SetMode(rmode)) {
|
| + AdvanceReadData();
|
| + return;
|
| + }
|
| + Advance(kIntptrSize);
|
| + } else if (RelocInfo::IsPosition(rmode)) {
|
| if (mode_mask_ & RelocInfo::kPositionMask) {
|
| + // Always update the position if we are interested in either
|
| + // statement positions or non-statement positions.
|
| AdvanceReadPosition();
|
| - if (SetMode(GetPositionModeFromTag(locatable_tag))) return;
|
| + if (SetMode(rmode)) return;
|
| } else {
|
| Advance(kIntSize);
|
| }
|
| - } else {
|
| - DCHECK(locatable_tag == kCommentTag);
|
| - if (SetMode(RelocInfo::COMMENT)) {
|
| - AdvanceReadData();
|
| - return;
|
| - }
|
| - Advance(kIntptrSize);
|
| - }
|
| - } else if (extra_tag == kPoolExtraTag) {
|
| - int pool_type = GetTopTag();
|
| - DCHECK(pool_type == kConstPoolTag || pool_type == kVeneerPoolTag);
|
| - RelocInfo::Mode rmode = (pool_type == kConstPoolTag) ?
|
| - RelocInfo::CONST_POOL : RelocInfo::VENEER_POOL;
|
| - if (SetMode(rmode)) {
|
| - AdvanceReadPoolData();
|
| - return;
|
| - }
|
| - Advance(kIntSize);
|
| - } else {
|
| - AdvanceReadPC();
|
| - RelocInfo::Mode rmode = static_cast<RelocInfo::Mode>(
|
| - extra_tag + RelocInfo::LAST_COMPACT_ENUM + 1);
|
| - if (RelocInfo::IsDebugBreakSlot(rmode)) {
|
| + } else if (RelocInfo::IsConstPool(rmode) ||
|
| + RelocInfo::IsVeneerPool(rmode) ||
|
| + RelocInfo::IsDebugBreakSlot(rmode)) {
|
| if (SetMode(rmode)) {
|
| - AdvanceReadDebugBreakSlotData();
|
| + AdvanceReadInt();
|
| return;
|
| }
|
| Advance(kIntSize);
|
| - } else if (SetMode(rmode)) {
|
| + } else if (SetMode(static_cast<RelocInfo::Mode>(rmode))) {
|
| return;
|
| }
|
| }
|
| @@ -821,49 +729,50 @@ bool RelocInfo::RequiresRelocation(const CodeDesc& desc) {
|
| #ifdef ENABLE_DISASSEMBLER
|
| const char* RelocInfo::RelocModeName(RelocInfo::Mode rmode) {
|
| switch (rmode) {
|
| - case RelocInfo::NONE32:
|
| + case NONE32:
|
| return "no reloc 32";
|
| - case RelocInfo::NONE64:
|
| + case NONE64:
|
| return "no reloc 64";
|
| - case RelocInfo::EMBEDDED_OBJECT:
|
| + case EMBEDDED_OBJECT:
|
| return "embedded object";
|
| - case RelocInfo::CONSTRUCT_CALL:
|
| + case CONSTRUCT_CALL:
|
| return "code target (js construct call)";
|
| - case RelocInfo::DEBUG_BREAK:
|
| + case DEBUG_BREAK:
|
| return "debug break";
|
| - case RelocInfo::CODE_TARGET:
|
| + case CODE_TARGET:
|
| return "code target";
|
| - case RelocInfo::CODE_TARGET_WITH_ID:
|
| + case CODE_TARGET_WITH_ID:
|
| return "code target with id";
|
| - case RelocInfo::CELL:
|
| + case CELL:
|
| return "property cell";
|
| - case RelocInfo::RUNTIME_ENTRY:
|
| + case RUNTIME_ENTRY:
|
| return "runtime entry";
|
| - case RelocInfo::JS_RETURN:
|
| + case JS_RETURN:
|
| return "js return";
|
| - case RelocInfo::COMMENT:
|
| + case COMMENT:
|
| return "comment";
|
| - case RelocInfo::POSITION:
|
| + case POSITION:
|
| return "position";
|
| - case RelocInfo::STATEMENT_POSITION:
|
| + case STATEMENT_POSITION:
|
| return "statement position";
|
| - case RelocInfo::EXTERNAL_REFERENCE:
|
| + case EXTERNAL_REFERENCE:
|
| return "external reference";
|
| - case RelocInfo::INTERNAL_REFERENCE:
|
| + case INTERNAL_REFERENCE:
|
| return "internal reference";
|
| - case RelocInfo::INTERNAL_REFERENCE_ENCODED:
|
| + case INTERNAL_REFERENCE_ENCODED:
|
| return "encoded internal reference";
|
| - case RelocInfo::DEOPT_REASON:
|
| + case DEOPT_REASON:
|
| return "deopt reason";
|
| - case RelocInfo::CONST_POOL:
|
| + case CONST_POOL:
|
| return "constant pool";
|
| - case RelocInfo::VENEER_POOL:
|
| + case VENEER_POOL:
|
| return "veneer pool";
|
| - case RelocInfo::DEBUG_BREAK_SLOT:
|
| + case DEBUG_BREAK_SLOT:
|
| return "debug break slot";
|
| - case RelocInfo::CODE_AGE_SEQUENCE:
|
| + case CODE_AGE_SEQUENCE:
|
| return "code_age_sequence";
|
| - case RelocInfo::NUMBER_OF_MODES:
|
| + case NUMBER_OF_MODES:
|
| + case PC_JUMP:
|
| UNREACHABLE();
|
| return "number_of_modes";
|
| }
|
| @@ -966,6 +875,7 @@ void RelocInfo::Verify(Isolate* isolate) {
|
| case NONE64:
|
| break;
|
| case NUMBER_OF_MODES:
|
| + case PC_JUMP:
|
| UNREACHABLE();
|
| break;
|
| case CODE_AGE_SEQUENCE:
|
|
|