| Index: src/safepoint-table.h
|
| diff --git a/src/safepoint-table.h b/src/safepoint-table.h
|
| index 0bdd43104d5a89ce1e2e55f43c25d77f1ad80824..d91a1956daf14f2789c0c8a4112b2e1e45403f68 100644
|
| --- a/src/safepoint-table.h
|
| +++ b/src/safepoint-table.h
|
| @@ -17,9 +17,10 @@ struct Register;
|
|
|
| class SafepointEntry BASE_EMBEDDED {
|
| public:
|
| - SafepointEntry() : info_(0), bits_(NULL) {}
|
| + SafepointEntry() : info_(0), deoptimization_pc_(0), bits_(NULL) {}
|
|
|
| - SafepointEntry(unsigned info, uint8_t* bits) : info_(info), bits_(bits) {
|
| + SafepointEntry(unsigned info, unsigned deoptimization_pc, uint8_t* bits)
|
| + : info_(info), deoptimization_pc_(deoptimization_pc), bits_(bits) {
|
| DCHECK(is_valid());
|
| }
|
|
|
| @@ -39,6 +40,11 @@ class SafepointEntry BASE_EMBEDDED {
|
| return DeoptimizationIndexField::decode(info_);
|
| }
|
|
|
| + unsigned deoptimization_pc() const {
|
| + DCHECK(is_valid());
|
| + return deoptimization_pc_;
|
| + }
|
| +
|
| static const int kArgumentsFieldBits = 3;
|
| static const int kSaveDoublesFieldBits = 1;
|
| static const int kDeoptIndexBits =
|
| @@ -74,6 +80,7 @@ class SafepointEntry BASE_EMBEDDED {
|
|
|
| private:
|
| unsigned info_;
|
| + unsigned deoptimization_pc_;
|
| uint8_t* bits_;
|
| };
|
|
|
| @@ -84,7 +91,8 @@ class SafepointTable BASE_EMBEDDED {
|
|
|
| int size() const {
|
| return kHeaderSize +
|
| - (length_ * (kPcAndDeoptimizationIndexSize + entry_size_)); }
|
| + (length_ * (kPcAndDeoptimizationInfoSize + entry_size_));
|
| + }
|
| unsigned length() const { return length_; }
|
| unsigned entry_size() const { return entry_size_; }
|
|
|
| @@ -93,11 +101,17 @@ class SafepointTable BASE_EMBEDDED {
|
| return Memory::uint32_at(GetPcOffsetLocation(index));
|
| }
|
|
|
| + unsigned GetDeoptimizationPcOffset(unsigned index) const {
|
| + DCHECK(index < length_);
|
| + return Memory::uint32_at(GetDeoptimizationPcLocation(index));
|
| + }
|
| +
|
| SafepointEntry GetEntry(unsigned index) const {
|
| DCHECK(index < length_);
|
| unsigned info = Memory::uint32_at(GetInfoLocation(index));
|
| + unsigned deopt_pc = Memory::uint32_at(GetDeoptimizationPcLocation(index));
|
| uint8_t* bits = &Memory::uint8_at(entries_ + (index * entry_size_));
|
| - return SafepointEntry(info, bits);
|
| + return SafepointEntry(info, deopt_pc, bits);
|
| }
|
|
|
| // Returns the entry for the given pc.
|
| @@ -114,18 +128,23 @@ class SafepointTable BASE_EMBEDDED {
|
|
|
| static const int kPcSize = kIntSize;
|
| static const int kDeoptimizationIndexSize = kIntSize;
|
| - static const int kPcAndDeoptimizationIndexSize =
|
| - kPcSize + kDeoptimizationIndexSize;
|
| + static const int kDeoptimizationPcSize = kIntSize;
|
| + static const int kPcAndDeoptimizationInfoSize =
|
| + kPcSize + kDeoptimizationIndexSize + kDeoptimizationPcSize;
|
|
|
| Address GetPcOffsetLocation(unsigned index) const {
|
| return pc_and_deoptimization_indexes_ +
|
| - (index * kPcAndDeoptimizationIndexSize);
|
| + (index * kPcAndDeoptimizationInfoSize);
|
| }
|
|
|
| Address GetInfoLocation(unsigned index) const {
|
| return GetPcOffsetLocation(index) + kPcSize;
|
| }
|
|
|
| + Address GetDeoptimizationPcLocation(unsigned index) const {
|
| + return GetInfoLocation(index) + kDeoptimizationIndexSize;
|
| + }
|
| +
|
| static void PrintBits(OStream& os, // NOLINT
|
| uint8_t byte, int digits);
|
|
|
| @@ -158,15 +177,30 @@ class Safepoint BASE_EMBEDDED {
|
| kLazyDeopt
|
| };
|
|
|
| + class Id {
|
| + private:
|
| + explicit Id(int id) : id_(id) {}
|
| +
|
| + int id_;
|
| +
|
| + friend class SafepointTableBuilder;
|
| + friend class Safepoint;
|
| + };
|
| +
|
| static const int kNoDeoptimizationIndex =
|
| (1 << (SafepointEntry::kDeoptIndexBits)) - 1;
|
|
|
| + static const unsigned kNoDeoptimizationPc = ~0U;
|
| +
|
| void DefinePointerSlot(int index, Zone* zone) { indexes_->Add(index, zone); }
|
| void DefinePointerRegister(Register reg, Zone* zone);
|
|
|
| + Id id() const { return Id(id_); }
|
| +
|
| private:
|
| - Safepoint(ZoneList<int>* indexes, ZoneList<int>* registers) :
|
| - indexes_(indexes), registers_(registers) { }
|
| + Safepoint(int id, ZoneList<int>* indexes, ZoneList<int>* registers)
|
| + : id_(id), indexes_(indexes), registers_(registers) {}
|
| + int id_;
|
| ZoneList<int>* indexes_;
|
| ZoneList<int>* registers_;
|
|
|
| @@ -200,6 +234,11 @@ class SafepointTableBuilder BASE_EMBEDDED {
|
| void BumpLastLazySafepointIndex() {
|
| last_lazy_safepoint_ = deopt_index_list_.length();
|
| }
|
| + void SetDeoptimizationPc(Safepoint::Id safepoint_id,
|
| + unsigned deoptimization_pc) {
|
| + deoptimization_info_[safepoint_id.id_].deoptimization_pc =
|
| + deoptimization_pc;
|
| + }
|
|
|
| // Emit the safepoint table after the body. The number of bits per
|
| // entry must be enough to hold all the pointer indexes.
|
| @@ -211,6 +250,7 @@ class SafepointTableBuilder BASE_EMBEDDED {
|
| unsigned pc;
|
| unsigned arguments;
|
| bool has_doubles;
|
| + unsigned deoptimization_pc;
|
| };
|
|
|
| uint32_t EncodeExceptPC(const DeoptimizationInfo& info, unsigned index);
|
|
|