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

Unified Diff: runtime/vm/assembler.h

Issue 1713853003: VM: Share object pool entries for optimized static calls. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 10 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 | « no previous file | runtime/vm/assembler.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/assembler.h
diff --git a/runtime/vm/assembler.h b/runtime/vm/assembler.h
index c414c0d56e740fea35f538ae8d46ccc468a2db37..5d20c01b691cb3731f7ee60819f8bc36d21cf31c 100644
--- a/runtime/vm/assembler.h
+++ b/runtime/vm/assembler.h
@@ -212,11 +212,30 @@ class AssemblerBuffer : public ValueObject {
};
+struct ObjectPoolWrapperEntry {
+ ObjectPoolWrapperEntry()
+ : raw_value_(), type_(), equivalence_() { }
+ explicit ObjectPoolWrapperEntry(const Object* obj)
+ : obj_(obj), type_(ObjectPool::kTaggedObject), equivalence_(obj) { }
+ explicit ObjectPoolWrapperEntry(const Object* obj, const Object* eqv)
+ : obj_(obj), type_(ObjectPool::kTaggedObject), equivalence_(eqv) { }
+ ObjectPoolWrapperEntry(uword value, ObjectPool::EntryType info)
+ : raw_value_(value), type_(info), equivalence_() { }
+
+ union {
+ const Object* obj_;
+ uword raw_value_;
+ };
+ ObjectPool::EntryType type_;
+ const Object* equivalence_;
+};
+
+
// Pair type parameter for DirectChainedHashMap used for the constant pool.
class ObjIndexPair {
public:
// Typedefs needed for the DirectChainedHashMap template.
- typedef ObjectPool::Entry Key;
+ typedef ObjectPoolWrapperEntry Key;
typedef intptr_t Value;
typedef ObjIndexPair Pair;
@@ -233,6 +252,11 @@ class ObjIndexPair {
} else {
key_.obj_ = &Object::ZoneHandle(key.obj_->raw());
}
+ if (key.equivalence_->IsNotTemporaryScopedHandle()) {
+ key_.equivalence_ = key.equivalence_;
+ } else {
+ key_.equivalence_ = &Object::ZoneHandle(key.equivalence_->raw());
+ }
} else {
key_.raw_value_ = key.raw_value_;
}
@@ -268,7 +292,8 @@ class ObjIndexPair {
static inline bool IsKeyEqual(Pair kv, Key key) {
if (kv.key_.type_ != key.type_) return false;
if (kv.key_.type_ == ObjectPool::kTaggedObject) {
- return kv.key_.obj_->raw() == key.obj_->raw();
+ return (kv.key_.obj_->raw() == key.obj_->raw()) &&
+ (kv.key_.equivalence_->raw() == key.equivalence_->raw());
}
return kv.key_.raw_value_ == key.raw_value_;
}
@@ -293,6 +318,8 @@ class ObjectPoolWrapper : public ValueObject {
intptr_t FindObject(const Object& obj,
Patchability patchable = kNotPatchable);
+ intptr_t FindObject(const Object& obj,
+ const Object& equivalence);
intptr_t FindImmediate(uword imm);
intptr_t FindNativeEntry(const ExternalLabel* label,
Patchability patchable);
@@ -300,11 +327,11 @@ class ObjectPoolWrapper : public ValueObject {
RawObjectPool* MakeObjectPool();
private:
- intptr_t AddObject(ObjectPool::Entry entry, Patchability patchable);
- intptr_t FindObject(ObjectPool::Entry entry, Patchability patchable);
+ intptr_t AddObject(ObjectPoolWrapperEntry entry, Patchability patchable);
+ intptr_t FindObject(ObjectPoolWrapperEntry entry, Patchability patchable);
// Objects and jump targets.
- GrowableArray<ObjectPool::Entry> object_pool_;
+ GrowableArray<ObjectPoolWrapperEntry> object_pool_;
// Hashmap for fast lookup in object pool.
DirectChainedHashMap<ObjIndexPair> object_pool_index_table_;
« no previous file with comments | « no previous file | runtime/vm/assembler.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698