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

Unified 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, 6 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/assembler.h ('k') | src/debug/liveedit.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/assembler.cc
diff --git a/src/assembler.cc b/src/assembler.cc
index 421fed6ac62b1cc53f6984532e49d17cc12461d1..89d0c87da4d0e72d7719a6b7bdc635f604c69778 100644
--- a/src/assembler.cc
+++ b/src/assembler.cc
@@ -279,11 +279,9 @@ int Label::pos() const {
// 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
-// deopt_reason: 11
+// 1-bit data type tags, used in short_data_record and data_jump long_record:
+// code_target_with_id: 0
+// deopt_reason: 1
//
// 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
@@ -300,7 +298,7 @@ int Label::pos() const {
const int kTagBits = 2;
const int kTagMask = (1 << kTagBits) - 1;
const int kLongTagBits = 6;
-const int kShortDataTypeTagBits = 2;
+const int kShortDataTypeTagBits = 1;
const int kShortDataBits = kBitsPerByte - kShortDataTypeTagBits;
const int kEmbeddedObjectTag = 0;
@@ -319,9 +317,7 @@ const int kLastChunkTagMask = 1;
const int kLastChunkTag = 1;
const int kCodeWithIdTag = 0;
-const int kNonstatementPositionTag = 1;
-const int kStatementPositionTag = 2;
-const int kDeoptReasonTag = 3;
+const int kDeoptReasonTag = 1;
void RelocInfo::update_wasm_memory_reference(
Address old_base, Address new_base, uint32_t old_size, uint32_t new_size,
@@ -431,38 +427,8 @@ void RelocInfoWriter::WriteData(intptr_t data_delta) {
}
-void RelocInfoWriter::WritePosition(int pc_delta, int pos_delta,
- RelocInfo::Mode rmode) {
- 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, kShortDataBits)) {
- WriteShortTaggedPC(pc_delta, kLocatableTag);
- WriteShortTaggedData(pos_delta, pos_type_tag);
- } else {
- // Otherwise, use costly encoding.
- WriteModeAndPC(pc_delta, rmode);
- WriteIntData(pos_delta);
- }
-}
-
-
-void RelocInfoWriter::FlushPosition() {
- if (!next_position_candidate_flushed_) {
- WritePosition(next_position_candidate_pc_delta_,
- next_position_candidate_pos_delta_, RelocInfo::POSITION);
- next_position_candidate_pos_delta_ = 0;
- next_position_candidate_pc_delta_ = 0;
- next_position_candidate_flushed_ = true;
- }
-}
-
-
void RelocInfoWriter::Write(const RelocInfo* rinfo) {
RelocInfo::Mode rmode = rinfo->rmode();
- if (rmode != RelocInfo::POSITION) {
- FlushPosition();
- }
#ifdef DEBUG
byte* begin_pos = pos_;
#endif
@@ -495,31 +461,13 @@ void RelocInfoWriter::Write(const RelocInfo* rinfo) {
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());
- int pos_delta = static_cast<int>(rinfo->data()) - last_position_;
- if (rmode == RelocInfo::STATEMENT_POSITION) {
- WritePosition(pc_delta, pos_delta, rmode);
- } else {
- DCHECK_EQ(rmode, RelocInfo::POSITION);
- if (pc_delta != 0 || last_mode_ != RelocInfo::POSITION) {
- FlushPosition();
- next_position_candidate_pc_delta_ = pc_delta;
- next_position_candidate_pos_delta_ = pos_delta;
- } else {
- next_position_candidate_pos_delta_ += pos_delta;
- }
- next_position_candidate_flushed_ = false;
- }
- last_position_ = static_cast<int>(rinfo->data());
} else {
WriteModeAndPC(pc_delta, rmode);
if (RelocInfo::IsComment(rmode)) {
WriteData(rinfo->data());
} else if (RelocInfo::IsConstPool(rmode) ||
- RelocInfo::IsVeneerPool(rmode) ||
- RelocInfo::IsDeoptId(rmode)) {
+ RelocInfo::IsVeneerPool(rmode) || RelocInfo::IsDeoptId(rmode) ||
+ RelocInfo::IsDeoptPosition(rmode)) {
WriteIntData(static_cast<int>(rinfo->data()));
}
}
@@ -571,16 +519,6 @@ void RelocIterator::AdvanceReadInt() {
}
-void RelocIterator::AdvanceReadPosition() {
- int x = 0;
- for (int i = 0; i < kIntSize; i++) {
- x |= static_cast<int>(*--pos_) << i * kBitsPerByte;
- }
- last_position_ += x;
- rinfo_.data_ = last_position_;
-}
-
-
void RelocIterator::AdvanceReadData() {
intptr_t x = 0;
for (int i = 0; i < kIntptrSize; i++) {
@@ -619,26 +557,9 @@ inline void RelocIterator::ReadShortTaggedId() {
}
-inline void RelocIterator::ReadShortTaggedPosition() {
- int8_t signed_b = *pos_;
- // Signed right shift is arithmetic shift. Tested in test-utils.cc.
- last_position_ += signed_b >> kShortDataTypeTagBits;
- rinfo_.data_ = last_position_;
-}
-
-
inline void RelocIterator::ReadShortTaggedData() {
uint8_t unsigned_b = *pos_;
- rinfo_.data_ = unsigned_b >> kTagBits;
-}
-
-
-static inline RelocInfo::Mode GetPositionModeFromTag(int tag) {
- DCHECK(tag == kNonstatementPositionTag ||
- tag == kStatementPositionTag);
- return (tag == kNonstatementPositionTag) ?
- RelocInfo::POSITION :
- RelocInfo::STATEMENT_POSITION;
+ rinfo_.data_ = unsigned_b >> kShortDataTypeTagBits;
}
@@ -666,20 +587,12 @@ void RelocIterator::next() {
ReadShortTaggedId();
return;
}
- } else if (data_type_tag == kDeoptReasonTag) {
+ } else {
+ DCHECK(data_type_tag == kDeoptReasonTag);
if (SetMode(RelocInfo::DEOPT_REASON)) {
ReadShortTaggedData();
return;
}
- } else {
- DCHECK(data_type_tag == kNonstatementPositionTag ||
- data_type_tag == kStatementPositionTag);
- if (mode_mask_ & RelocInfo::kPositionMask) {
- // 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);
@@ -700,18 +613,10 @@ void RelocIterator::next() {
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(rmode)) return;
- } else {
- Advance(kIntSize);
- }
} else if (RelocInfo::IsConstPool(rmode) ||
RelocInfo::IsVeneerPool(rmode) ||
- RelocInfo::IsDeoptId(rmode)) {
+ RelocInfo::IsDeoptId(rmode) ||
+ RelocInfo::IsDeoptPosition(rmode)) {
if (SetMode(rmode)) {
AdvanceReadInt();
return;
@@ -747,7 +652,6 @@ RelocIterator::RelocIterator(Code* code, int mode_mask)
done_ = false;
mode_mask_ = mode_mask;
last_id_ = 0;
- last_position_ = 0;
byte* sequence = code->FindCodeAgeSequence();
// We get the isolate from the map, because at serialization time
// the code pointer has been cloned and isn't really in heap space.
@@ -772,7 +676,6 @@ RelocIterator::RelocIterator(const CodeDesc& desc, int mode_mask)
done_ = false;
mode_mask_ = mode_mask;
last_id_ = 0;
- last_position_ = 0;
code_age_sequence_ = NULL;
if (mode_mask_ == 0) pos_ = end_;
next();
@@ -822,16 +725,14 @@ const char* RelocInfo::RelocModeName(RelocInfo::Mode rmode) {
return "runtime entry";
case COMMENT:
return "comment";
- case POSITION:
- return "position";
- case STATEMENT_POSITION:
- return "statement position";
case EXTERNAL_REFERENCE:
return "external reference";
case INTERNAL_REFERENCE:
return "internal reference";
case INTERNAL_REFERENCE_ENCODED:
return "encoded internal reference";
+ case DEOPT_POSITION:
+ return "deopt position";
case DEOPT_REASON:
return "deopt reason";
case DEOPT_ID:
@@ -871,6 +772,8 @@ void RelocInfo::Print(Isolate* isolate, std::ostream& os) { // NOLINT
os << static_cast<const void*>(pc_) << " " << RelocModeName(rmode_);
if (IsComment(rmode_)) {
os << " (" << reinterpret_cast<char*>(data_) << ")";
+ } else if (rmode_ == DEOPT_POSITION) {
+ os << " (" << data() << ")";
} else if (rmode_ == DEOPT_REASON) {
os << " (" << Deoptimizer::GetDeoptReason(
static_cast<Deoptimizer::DeoptReason>(data_)) << ")";
@@ -889,8 +792,6 @@ void RelocInfo::Print(Isolate* isolate, std::ostream& os) { // NOLINT
if (rmode_ == CODE_TARGET_WITH_ID) {
os << " (id=" << static_cast<int>(data_) << ")";
}
- } else if (IsPosition(rmode_)) {
- os << " (" << data() << ")";
} else if (IsRuntimeEntry(rmode_) &&
isolate->deoptimizer_data() != NULL) {
// Depotimization bailouts are stored as runtime entries.
@@ -941,9 +842,8 @@ void RelocInfo::Verify(Isolate* isolate) {
}
case RUNTIME_ENTRY:
case COMMENT:
- case POSITION:
- case STATEMENT_POSITION:
case EXTERNAL_REFERENCE:
+ case DEOPT_POSITION:
case DEOPT_REASON:
case DEOPT_ID:
case CONST_POOL:
@@ -1733,49 +1633,6 @@ std::ostream& operator<<(std::ostream& os, ExternalReference reference) {
return os;
}
-void AssemblerPositionsRecorder::RecordPosition(int pos) {
- DCHECK(pos != RelocInfo::kNoPosition);
- DCHECK(pos >= 0);
- current_position_ = pos;
- LOG_CODE_EVENT(assembler_->isolate(),
- CodeLinePosInfoAddPositionEvent(jit_handler_data_,
- assembler_->pc_offset(),
- pos));
- WriteRecordedPositions();
-}
-
-void AssemblerPositionsRecorder::RecordStatementPosition(int pos) {
- DCHECK(pos != RelocInfo::kNoPosition);
- DCHECK(pos >= 0);
- current_statement_position_ = pos;
- LOG_CODE_EVENT(assembler_->isolate(),
- CodeLinePosInfoAddStatementPositionEvent(
- jit_handler_data_,
- assembler_->pc_offset(),
- pos));
- RecordPosition(pos);
-}
-
-void AssemblerPositionsRecorder::WriteRecordedPositions() {
- // Write the statement position if it is different from what was written last
- // time.
- if (current_statement_position_ != written_statement_position_) {
- EnsureSpace ensure_space(assembler_);
- assembler_->RecordRelocInfo(RelocInfo::STATEMENT_POSITION,
- current_statement_position_);
- written_position_ = current_statement_position_;
- written_statement_position_ = current_statement_position_;
- }
-
- // Write the position if it is different from what was written last time and
- // also different from the statement position that was just written.
- if (current_position_ != written_position_) {
- EnsureSpace ensure_space(assembler_);
- assembler_->RecordRelocInfo(RelocInfo::POSITION, current_position_);
- written_position_ = current_position_;
- }
-}
-
ConstantPoolBuilder::ConstantPoolBuilder(int ptr_reach_bits,
int double_reach_bits) {
@@ -1984,7 +1841,7 @@ int ConstantPoolBuilder::Emit(Assembler* assm) {
void Assembler::RecordDeoptReason(const int reason, int raw_position, int id) {
if (FLAG_trace_deopt || isolate()->is_profiling()) {
EnsureSpace ensure_space(this);
- RecordRelocInfo(RelocInfo::POSITION, raw_position);
+ RecordRelocInfo(RelocInfo::DEOPT_POSITION, raw_position);
RecordRelocInfo(RelocInfo::DEOPT_REASON, reason);
RecordRelocInfo(RelocInfo::DEOPT_ID, id);
}
« 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