| Index: runtime/vm/assembler.h
|
| diff --git a/runtime/vm/assembler.h b/runtime/vm/assembler.h
|
| index d8249ba4377fb4dc2645bd26d8c37a9ecfc8dde5..33f405108bebdc18eba33b3db24a4b110ad1605f 100644
|
| --- a/runtime/vm/assembler.h
|
| +++ b/runtime/vm/assembler.h
|
| @@ -49,7 +49,9 @@ class ExternalLabel : public ValueObject {
|
| // into executable memory.
|
| class AssemblerFixup : public ZoneAllocated {
|
| public:
|
| - virtual void Process(const MemoryRegion& region, intptr_t position) = 0;
|
| + virtual void Process(const MemoryRegion& region,
|
| + intptr_t position,
|
| + Assembler* assembler) = 0;
|
|
|
| virtual bool IsPointerOffset() const = 0;
|
|
|
| @@ -74,7 +76,7 @@ class AssemblerFixup : public ZoneAllocated {
|
| // Assembler buffers are used to emit binary code. They grow on demand.
|
| class AssemblerBuffer : public ValueObject {
|
| public:
|
| - AssemblerBuffer();
|
| + explicit AssemblerBuffer(Assembler* assembler);
|
| ~AssemblerBuffer();
|
|
|
| // Basic support for emitting, loading, and storing.
|
| @@ -180,6 +182,7 @@ class AssemblerBuffer : public ValueObject {
|
| uword cursor_;
|
| uword limit_;
|
| AssemblerFixup* fixup_;
|
| + Assembler* assembler_;
|
| ZoneGrowableArray<intptr_t>* pointer_offsets_;
|
| #if defined(DEBUG)
|
| bool fixups_processed_;
|
| @@ -258,36 +261,86 @@ class ObjIndexPair {
|
| };
|
|
|
|
|
| +class UntaggedIndexPair {
|
| + public:
|
| + // Typedefs needed for the DirectChainedHashMap template.
|
| + typedef uword Key;
|
| + typedef intptr_t Value;
|
| + typedef UntaggedIndexPair Pair;
|
| +
|
| + static const intptr_t kNoIndex = -1;
|
| +
|
| + UntaggedIndexPair() : key_(), value_(kNoIndex) { }
|
| +
|
| + UntaggedIndexPair(Key key, Value value) : key_(key), value_(value) { }
|
| +
|
| + static Key KeyOf(Pair kv) { return kv.key_; }
|
| +
|
| + static Value ValueOf(Pair kv) { return kv.value_; }
|
| +
|
| + static intptr_t Hashcode(Key key) {
|
| + return static_cast<intptr_t>(key);
|
| + }
|
| +
|
| + static inline bool IsKeyEqual(Pair kv, Key key) {
|
| + return kv.key_ == key;
|
| + }
|
| +
|
| + private:
|
| + Key key_;
|
| + Value value_;
|
| +};
|
| +
|
| +
|
| enum Patchability {
|
| kPatchable,
|
| kNotPatchable,
|
| };
|
|
|
|
|
| -class ObjectPool : public ValueObject {
|
| +class ObjectPoolHelper : public ValueObject {
|
| public:
|
| - ObjectPool() : object_pool_(GrowableObjectArray::Handle()) { }
|
| -
|
| - intptr_t AddObject(const Object& obj, Patchability patchable);
|
| + intptr_t AddObject(const Object& obj);
|
| + intptr_t AddImmediate(uword imm);
|
| intptr_t AddExternalLabel(const ExternalLabel* label,
|
| Patchability patchable);
|
|
|
| - intptr_t FindObject(const Object& obj, Patchability patchable);
|
| + intptr_t AddFixedObject(const Object& obj);
|
| + intptr_t AddFixedExternalLabel(const ExternalLabel* label);
|
| +
|
| + intptr_t FindObject(const Object& obj);
|
| + intptr_t FindImmediate(uword imm);
|
| intptr_t FindExternalLabel(const ExternalLabel* label,
|
| Patchability patchable);
|
| - const GrowableObjectArray& data() const { return object_pool_; }
|
| +
|
| + RawObjectPool* MakeObjectPool();
|
| +
|
| + intptr_t UntaggedEntryStart() { return tagged_entries_.length(); }
|
|
|
| private:
|
| - // Objects and jump targets.
|
| - GrowableObjectArray& object_pool_;
|
| + intptr_t AddUntagged(uword value, Patchability patchable);
|
| + intptr_t FindUntagged(uword value, Patchability patchable);
|
| +
|
| + GrowableArray<ObjectPool::Entry> fixed_entries_;
|
| +
|
| + GrowableArray<const Object*> tagged_entries_;
|
| + DirectChainedHashMap<ObjIndexPair> object_index_table_;
|
| +
|
| + GrowableArray<uword> untagged_entries_;
|
| + DirectChainedHashMap<UntaggedIndexPair> untagged_index_table_;
|
| +};
|
| +
|
|
|
| - // Patchability of pool entries.
|
| - GrowableArray<Patchability> patchable_pool_entries_;
|
| +class ObjectPoolIndexFixup : public AssemblerFixup {
|
| + public:
|
| + virtual void Process(const MemoryRegion& region,
|
| + intptr_t position,
|
| + Assembler* assembler);
|
|
|
| - // Hashmap for fast lookup in object pool.
|
| - DirectChainedHashMap<ObjIndexPair> object_pool_index_table_;
|
| + virtual bool IsPointerOffset() const { return false; }
|
| };
|
|
|
| +
|
| } // namespace dart
|
|
|
|
|
|
|