Index: src/assembler.h |
diff --git a/src/assembler.h b/src/assembler.h |
index 3670d7fa5c5ca24026b22a235b02b2e7acb7243a..d181e2a5960cb2644cab323eed34ed15764bb610 100644 |
--- a/src/assembler.h |
+++ b/src/assembler.h |
@@ -426,6 +426,7 @@ class RelocInfo { |
NUMBER_OF_MODES, |
NONE32, // never recorded 32-bit value |
NONE64, // never recorded 64-bit value |
+ NONEINTPTR, // never recorded intptr value |
CODE_AGE_SEQUENCE, // Not stored in RelocInfo array, used explictly by |
// code aging. |
@@ -515,7 +516,7 @@ class RelocInfo { |
return mode == DEBUGGER_STATEMENT; |
} |
static inline bool IsNone(Mode mode) { |
- return mode == NONE32 || mode == NONE64; |
+ return mode == NONE32 || mode == NONE64 || mode == NONEINTPTR; |
} |
static inline bool IsCodeAgeSequence(Mode mode) { |
return mode == CODE_AGE_SEQUENCE; |
@@ -1229,12 +1230,19 @@ class CheckDebugStepCallWrapper : public CallWrapper { |
class ConstantPoolEntry { |
public: |
ConstantPoolEntry() {} |
- ConstantPoolEntry(int position, intptr_t value, bool sharing_ok) |
+ ConstantPoolEntry(int position, intptr_t value, bool sharing_ok, |
+ RelocInfo::Mode rmode) |
: position_(position), |
merged_index_(sharing_ok ? SHARING_ALLOWED : SHARING_PROHIBITED), |
+ rmode_(rmode), |
+ type_(INTPTR), |
value_(value) {} |
ConstantPoolEntry(int position, double value) |
- : position_(position), merged_index_(SHARING_ALLOWED), value64_(value) {} |
+ : position_(position), |
+ merged_index_(SHARING_ALLOWED), |
+ rmode_(RelocInfo::NONE64), |
+ type_(DOUBLE), |
+ value64_(value) {} |
int position() const { return position_; } |
bool sharing_ok() const { return merged_index_ != SHARING_PROHIBITED; } |
@@ -1257,18 +1265,29 @@ class ConstantPoolEntry { |
} |
intptr_t value() const { return value_; } |
uint64_t value64() const { return bit_cast<uint64_t>(value64_); } |
+ bool MayBeMergedWith(ConstantPoolEntry& other) const { |
+ return type_ == other.type_ && rmode_ == other.rmode_ && |
+ (type_ == INTPTR ? value() == other.value() |
+ : value64() == other.value64()); |
+ } |
enum Type { INTPTR, DOUBLE, NUMBER_OF_TYPES }; |
- static int size(Type type) { |
+ Type type() const { return type_; } |
+ |
+ static int SizeOfType(Type type) { |
return (type == INTPTR) ? kPointerSize : kDoubleSize; |
} |
+ int size() const { return SizeOfType(type_); } |
+ |
enum Access { REGULAR, OVERFLOWED }; |
private: |
int position_; |
int merged_index_; |
+ RelocInfo::Mode rmode_; |
+ Type type_; |
union { |
intptr_t value_; |
double value64_; |
@@ -1285,16 +1304,17 @@ class ConstantPoolBuilder BASE_EMBEDDED { |
ConstantPoolBuilder(int ptr_reach_bits, int double_reach_bits); |
// Add pointer-sized constant to the embedded constant pool |
- ConstantPoolEntry::Access AddEntry(int position, intptr_t value, |
- bool sharing_ok) { |
- ConstantPoolEntry entry(position, value, sharing_ok); |
- return AddEntry(entry, ConstantPoolEntry::INTPTR); |
+ ConstantPoolEntry::Access AddEntry( |
+ int position, intptr_t value, bool sharing_ok, |
+ RelocInfo::Mode rmode = RelocInfo::NONEINTPTR) { |
+ ConstantPoolEntry entry(position, value, sharing_ok, rmode); |
+ return AddEntry(entry); |
} |
// Add double constant to the embedded constant pool |
ConstantPoolEntry::Access AddEntry(int position, double value) { |
ConstantPoolEntry entry(position, value); |
- return AddEntry(entry, ConstantPoolEntry::DOUBLE); |
+ return AddEntry(entry); |
} |
// Previews the access type required for the next new entry to be added. |
@@ -1319,8 +1339,7 @@ class ConstantPoolBuilder BASE_EMBEDDED { |
inline Label* EmittedPosition() { return &emitted_label_; } |
private: |
- ConstantPoolEntry::Access AddEntry(ConstantPoolEntry& entry, |
- ConstantPoolEntry::Type type); |
+ ConstantPoolEntry::Access AddEntry(ConstantPoolEntry& entry); |
void EmitSharedEntries(Assembler* assm, ConstantPoolEntry::Type type); |
void EmitGroup(Assembler* assm, ConstantPoolEntry::Access access, |
ConstantPoolEntry::Type type); |