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

Side by Side Diff: runtime/vm/object.h

Issue 1343373003: Revert "VM: New calling convention for generated code." (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years, 3 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 unified diff | Download patch
« no previous file with comments | « runtime/vm/native_entry.cc ('k') | runtime/vm/object.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #ifndef VM_OBJECT_H_ 5 #ifndef VM_OBJECT_H_
6 #define VM_OBJECT_H_ 6 #define VM_OBJECT_H_
7 7
8 #include "include/dart_api.h" 8 #include "include/dart_api.h"
9 #include "platform/assert.h" 9 #include "platform/assert.h"
10 #include "platform/utils.h" 10 #include "platform/utils.h"
(...skipping 2152 matching lines...) Expand 10 before | Expand all | Expand 10 after
2163 void AttachCode(const Code& value) const; 2163 void AttachCode(const Code& value) const;
2164 void SetInstructions(const Code& value) const; 2164 void SetInstructions(const Code& value) const;
2165 void ClearCode() const; 2165 void ClearCode() const;
2166 2166
2167 // Disables optimized code and switches to unoptimized code. 2167 // Disables optimized code and switches to unoptimized code.
2168 void SwitchToUnoptimizedCode() const; 2168 void SwitchToUnoptimizedCode() const;
2169 2169
2170 // Return the most recently compiled and installed code for this function. 2170 // Return the most recently compiled and installed code for this function.
2171 // It is not the only Code object that points to this function. 2171 // It is not the only Code object that points to this function.
2172 RawCode* CurrentCode() const { 2172 RawCode* CurrentCode() const {
2173 return raw_ptr()->code_; 2173 return raw_ptr()->instructions_->ptr()->code_;
2174 } 2174 }
2175 2175
2176 RawCode* unoptimized_code() const { return raw_ptr()->unoptimized_code_; } 2176 RawCode* unoptimized_code() const { return raw_ptr()->unoptimized_code_; }
2177 void set_unoptimized_code(const Code& value) const; 2177 void set_unoptimized_code(const Code& value) const;
2178 bool HasCode() const; 2178 bool HasCode() const;
2179 2179
2180 static intptr_t code_offset() {
2181 return OFFSET_OF(RawFunction, code_);
2182 }
2183
2184 static intptr_t entry_point_offset() { 2180 static intptr_t entry_point_offset() {
2185 return OFFSET_OF(RawFunction, entry_point_); 2181 return OFFSET_OF(RawFunction, entry_point_);
2186 } 2182 }
2187 2183
2188 // Returns true if there is at least one debugger breakpoint 2184 // Returns true if there is at least one debugger breakpoint
2189 // set in this function. 2185 // set in this function.
2190 bool HasBreakpoint() const; 2186 bool HasBreakpoint() const;
2191 2187
2192 RawContextScope* context_scope() const; 2188 RawContextScope* context_scope() const;
2193 void set_context_scope(const ContextScope& value) const; 2189 void set_context_scope(const ContextScope& value) const;
(...skipping 1517 matching lines...) Expand 10 before | Expand all | Expand 10 after
3711 FINAL_HEAP_OBJECT_IMPLEMENTATION(ObjectPool, Object); 3707 FINAL_HEAP_OBJECT_IMPLEMENTATION(ObjectPool, Object);
3712 friend class Class; 3708 friend class Class;
3713 friend class Object; 3709 friend class Object;
3714 friend class RawObjectPool; 3710 friend class RawObjectPool;
3715 }; 3711 };
3716 3712
3717 3713
3718 class Instructions : public Object { 3714 class Instructions : public Object {
3719 public: 3715 public:
3720 intptr_t size() const { return raw_ptr()->size_; } // Excludes HeaderSize(). 3716 intptr_t size() const { return raw_ptr()->size_; } // Excludes HeaderSize().
3717 RawCode* code() const { return raw_ptr()->code_; }
3718 static intptr_t code_offset() {
3719 return OFFSET_OF(RawInstructions, code_);
3720 }
3721 RawObjectPool* object_pool() const { return raw_ptr()->object_pool_; }
3722 static intptr_t object_pool_offset() {
3723 return OFFSET_OF(RawInstructions, object_pool_);
3724 }
3721 3725
3722 uword EntryPoint() const { 3726 uword EntryPoint() const {
3723 return reinterpret_cast<uword>(raw_ptr()) + HeaderSize(); 3727 return reinterpret_cast<uword>(raw_ptr()) + HeaderSize();
3724 } 3728 }
3725 3729
3726 static const intptr_t kMaxElements = (kMaxInt32 - 3730 static const intptr_t kMaxElements = (kMaxInt32 -
3727 (sizeof(RawInstructions) + 3731 (sizeof(RawInstructions) +
3728 sizeof(RawObject) + 3732 sizeof(RawObject) +
3729 (2 * OS::kMaxPreferredCodeAlignment))); 3733 (2 * OS::kMaxPreferredCodeAlignment)));
3730 3734
(...skipping 18 matching lines...) Expand all
3749 3753
3750 static RawInstructions* FromEntryPoint(uword entry_point) { 3754 static RawInstructions* FromEntryPoint(uword entry_point) {
3751 return reinterpret_cast<RawInstructions*>( 3755 return reinterpret_cast<RawInstructions*>(
3752 entry_point - HeaderSize() + kHeapObjectTag); 3756 entry_point - HeaderSize() + kHeapObjectTag);
3753 } 3757 }
3754 3758
3755 private: 3759 private:
3756 void set_size(intptr_t size) const { 3760 void set_size(intptr_t size) const {
3757 StoreNonPointer(&raw_ptr()->size_, size); 3761 StoreNonPointer(&raw_ptr()->size_, size);
3758 } 3762 }
3763 void set_code(RawCode* code) const {
3764 StorePointer(&raw_ptr()->code_, code);
3765 }
3766 void set_object_pool(RawObjectPool* object_pool) const {
3767 StorePointer(&raw_ptr()->object_pool_, object_pool);
3768 }
3759 3769
3760 // New is a private method as RawInstruction and RawCode objects should 3770 // New is a private method as RawInstruction and RawCode objects should
3761 // only be created using the Code::FinalizeCode method. This method creates 3771 // only be created using the Code::FinalizeCode method. This method creates
3762 // the RawInstruction and RawCode objects, sets up the pointer offsets 3772 // the RawInstruction and RawCode objects, sets up the pointer offsets
3763 // and links the two in a GC safe manner. 3773 // and links the two in a GC safe manner.
3764 static RawInstructions* New(intptr_t size); 3774 static RawInstructions* New(intptr_t size);
3765 3775
3766 FINAL_HEAP_OBJECT_IMPLEMENTATION(Instructions, Object); 3776 FINAL_HEAP_OBJECT_IMPLEMENTATION(Instructions, Object);
3767 friend class Class; 3777 friend class Class;
3768 friend class Code; 3778 friend class Code;
(...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after
4080 private: 4090 private:
4081 static void UnpackInto(const Array& table, 4091 static void UnpackInto(const Array& table,
4082 const TypedData& packed, 4092 const TypedData& packed,
4083 GrowableArray<DeoptInstr*>* instructions, 4093 GrowableArray<DeoptInstr*>* instructions,
4084 intptr_t length); 4094 intptr_t length);
4085 }; 4095 };
4086 4096
4087 4097
4088 class Code : public Object { 4098 class Code : public Object {
4089 public: 4099 public:
4090 RawInstructions* active_instructions() const {
4091 return raw_ptr()->active_instructions_;
4092 }
4093
4094 RawInstructions* instructions() const { return raw_ptr()->instructions_; } 4100 RawInstructions* instructions() const { return raw_ptr()->instructions_; }
4095 4101
4096 static intptr_t saved_instructions_offset() {
4097 return OFFSET_OF(RawCode, instructions_);
4098 }
4099
4100 static intptr_t entry_point_offset() { 4102 static intptr_t entry_point_offset() {
4101 return OFFSET_OF(RawCode, entry_point_); 4103 return OFFSET_OF(RawCode, entry_point_);
4102 } 4104 }
4103 4105
4104 RawObjectPool* object_pool() const { return raw_ptr()->object_pool_; }
4105 static intptr_t object_pool_offset() {
4106 return OFFSET_OF(RawCode, object_pool_);
4107 }
4108
4109 intptr_t pointer_offsets_length() const { 4106 intptr_t pointer_offsets_length() const {
4110 return PtrOffBits::decode(raw_ptr()->state_bits_); 4107 return PtrOffBits::decode(raw_ptr()->state_bits_);
4111 } 4108 }
4112 4109
4113 bool is_optimized() const { 4110 bool is_optimized() const {
4114 return OptimizedBit::decode(raw_ptr()->state_bits_); 4111 return OptimizedBit::decode(raw_ptr()->state_bits_);
4115 } 4112 }
4116 void set_is_optimized(bool value) const; 4113 void set_is_optimized(bool value) const;
4117 bool is_alive() const { 4114 bool is_alive() const {
4118 return AliveBit::decode(raw_ptr()->state_bits_); 4115 return AliveBit::decode(raw_ptr()->state_bits_);
4119 } 4116 }
4120 void set_is_alive(bool value) const; 4117 void set_is_alive(bool value) const;
4121 4118
4122 uword EntryPoint() const { 4119 uword EntryPoint() const {
4123 return Instructions::Handle(instructions()).EntryPoint(); 4120 ASSERT(raw_ptr()->entry_point_ ==
4121 Instructions::Handle(instructions()).EntryPoint());
4122 return raw_ptr()->entry_point_;
4124 } 4123 }
4125 intptr_t Size() const { 4124 intptr_t Size() const {
4126 const Instructions& instr = Instructions::Handle(instructions()); 4125 const Instructions& instr = Instructions::Handle(instructions());
4127 return instr.size(); 4126 return instr.size();
4128 } 4127 }
4129 RawObjectPool* GetObjectPool() const { 4128 RawObjectPool* GetObjectPool() const {
4130 return object_pool(); 4129 const Instructions& instr = Instructions::Handle(instructions());
4130 return instr.object_pool();
4131 } 4131 }
4132 bool ContainsInstructionAt(uword addr) const { 4132 bool ContainsInstructionAt(uword addr) const {
4133 const Instructions& instr = Instructions::Handle(instructions()); 4133 const Instructions& instr = Instructions::Handle(instructions());
4134 const uword offset = addr - instr.EntryPoint(); 4134 const uword offset = addr - instr.EntryPoint();
4135 return offset < static_cast<uword>(instr.size()); 4135 return offset < static_cast<uword>(instr.size());
4136 } 4136 }
4137 4137
4138 // Returns true if there is a debugger breakpoint set in this code object. 4138 // Returns true if there is a debugger breakpoint set in this code object.
4139 bool HasBreakpoint() const; 4139 bool HasBreakpoint() const;
4140 4140
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
4315 int32_t GetPointerOffsetAt(int index) const { 4315 int32_t GetPointerOffsetAt(int index) const {
4316 NoSafepointScope no_safepoint; 4316 NoSafepointScope no_safepoint;
4317 return *PointerOffsetAddrAt(index); 4317 return *PointerOffsetAddrAt(index);
4318 } 4318 }
4319 intptr_t GetTokenIndexOfPC(uword pc) const; 4319 intptr_t GetTokenIndexOfPC(uword pc) const;
4320 4320
4321 enum { 4321 enum {
4322 kInvalidPc = -1 4322 kInvalidPc = -1
4323 }; 4323 };
4324 4324
4325 // Returns 0 if code is not patchable
4326 uword GetEntryPatchPc() const;
4327 uword GetPatchCodePc() const;
4328
4325 uword GetLazyDeoptPc() const; 4329 uword GetLazyDeoptPc() const;
4326 4330
4327 // Find pc, return 0 if not found. 4331 // Find pc, return 0 if not found.
4328 uword GetPcForDeoptId(intptr_t deopt_id, RawPcDescriptors::Kind kind) const; 4332 uword GetPcForDeoptId(intptr_t deopt_id, RawPcDescriptors::Kind kind) const;
4329 intptr_t GetDeoptIdForOsr(uword pc) const; 4333 intptr_t GetDeoptIdForOsr(uword pc) const;
4330 4334
4331 RawString* Name() const; 4335 RawString* Name() const;
4332 RawString* PrettyName() const; 4336 RawString* PrettyName() const;
4333 4337
4334 int64_t compile_timestamp() const { 4338 int64_t compile_timestamp() const {
4335 return raw_ptr()->compile_timestamp_; 4339 return raw_ptr()->compile_timestamp_;
4336 } 4340 }
4337 4341
4342 intptr_t entry_patch_pc_offset() const {
4343 return raw_ptr()->entry_patch_pc_offset_;
4344 }
4345 void set_entry_patch_pc_offset(intptr_t pc) const {
4346 StoreNonPointer(&raw_ptr()->entry_patch_pc_offset_, pc);
4347 }
4348
4349
4350 intptr_t patch_code_pc_offset() const {
4351 return raw_ptr()->patch_code_pc_offset_;
4352 }
4353 void set_patch_code_pc_offset(intptr_t pc) const {
4354 StoreNonPointer(&raw_ptr()->patch_code_pc_offset_, pc);
4355 }
4356
4357
4338 intptr_t lazy_deopt_pc_offset() const { 4358 intptr_t lazy_deopt_pc_offset() const {
4339 return raw_ptr()->lazy_deopt_pc_offset_; 4359 return raw_ptr()->lazy_deopt_pc_offset_;
4340 } 4360 }
4341 void set_lazy_deopt_pc_offset(intptr_t pc) const { 4361 void set_lazy_deopt_pc_offset(intptr_t pc) const {
4342 StoreNonPointer(&raw_ptr()->lazy_deopt_pc_offset_, pc); 4362 StoreNonPointer(&raw_ptr()->lazy_deopt_pc_offset_, pc);
4343 } 4363 }
4344 4364
4345 bool IsAllocationStubCode() const; 4365 bool IsAllocationStubCode() const;
4346 bool IsStubCode() const; 4366 bool IsStubCode() const;
4347 bool IsFunctionCode() const; 4367 bool IsFunctionCode() const;
4348 4368
4349 private: 4369 private:
4350 void set_state_bits(intptr_t bits) const; 4370 void set_state_bits(intptr_t bits) const;
4351 4371
4352 void set_object_pool(RawObjectPool* object_pool) const {
4353 StorePointer(&raw_ptr()->object_pool_, object_pool);
4354 }
4355
4356 friend class RawObject; // For RawObject::SizeFromClass(). 4372 friend class RawObject; // For RawObject::SizeFromClass().
4357 friend class RawCode; 4373 friend class RawCode;
4358 enum { 4374 enum {
4359 kOptimizedBit = 0, 4375 kOptimizedBit = 0,
4360 kAliveBit = 1, 4376 kAliveBit = 1,
4361 kPtrOffBit = 2, 4377 kPtrOffBit = 2,
4362 kPtrOffSize = 30, 4378 kPtrOffSize = 30,
4363 }; 4379 };
4364 4380
4365 class OptimizedBit : public BitField<bool, kOptimizedBit, 1> {}; 4381 class OptimizedBit : public BitField<bool, kOptimizedBit, 1> {};
4366 class AliveBit : public BitField<bool, kAliveBit, 1> {}; 4382 class AliveBit : public BitField<bool, kAliveBit, 1> {};
4367 class PtrOffBits : public BitField<intptr_t, kPtrOffBit, kPtrOffSize> {}; 4383 class PtrOffBits : public BitField<intptr_t, kPtrOffBit, kPtrOffSize> {};
4368 4384
4369 // An object finder visitor interface. 4385 // An object finder visitor interface.
4370 class FindRawCodeVisitor : public FindObjectVisitor { 4386 class FindRawCodeVisitor : public FindObjectVisitor {
4371 public: 4387 public:
4372 explicit FindRawCodeVisitor(uword pc) 4388 explicit FindRawCodeVisitor(uword pc)
4373 : FindObjectVisitor(Isolate::Current()), pc_(pc) { } 4389 : FindObjectVisitor(Isolate::Current()), pc_(pc) { }
4374 virtual ~FindRawCodeVisitor() { } 4390 virtual ~FindRawCodeVisitor() { }
4375 4391
4392 virtual uword filter_addr() const { return pc_; }
4393
4376 // Check if object matches find condition. 4394 // Check if object matches find condition.
4377 virtual bool FindObject(RawObject* obj) const; 4395 virtual bool FindObject(RawObject* obj) const;
4378 4396
4379 private: 4397 private:
4380 const uword pc_; 4398 const uword pc_;
4381 4399
4382 DISALLOW_COPY_AND_ASSIGN(FindRawCodeVisitor); 4400 DISALLOW_COPY_AND_ASSIGN(FindRawCodeVisitor);
4383 }; 4401 };
4384 4402
4385 static bool IsOptimized(RawCode* code) { 4403 static bool IsOptimized(RawCode* code) {
4386 return Code::OptimizedBit::decode(code->ptr()->state_bits_); 4404 return Code::OptimizedBit::decode(code->ptr()->state_bits_);
4387 } 4405 }
4388 4406
4389 static const intptr_t kEntrySize = sizeof(int32_t); // NOLINT 4407 static const intptr_t kEntrySize = sizeof(int32_t); // NOLINT
4390 4408
4391 void set_compile_timestamp(int64_t timestamp) const { 4409 void set_compile_timestamp(int64_t timestamp) const {
4392 StoreNonPointer(&raw_ptr()->compile_timestamp_, timestamp); 4410 StoreNonPointer(&raw_ptr()->compile_timestamp_, timestamp);
4393 } 4411 }
4394 4412
4395 void set_active_instructions(RawInstructions* instructions) const { 4413 void set_instructions(RawInstructions* instructions) {
4396 // RawInstructions are never allocated in New space and hence a 4414 // RawInstructions are never allocated in New space and hence a
4397 // store buffer update is not needed here. 4415 // store buffer update is not needed here.
4398 StorePointer(&raw_ptr()->active_instructions_, instructions);
4399 StoreNonPointer(&raw_ptr()->entry_point_,
4400 reinterpret_cast<uword>(instructions->ptr()) +
4401 Instructions::HeaderSize());
4402 }
4403
4404 void set_instructions(RawInstructions* instructions) const {
4405 StorePointer(&raw_ptr()->instructions_, instructions); 4416 StorePointer(&raw_ptr()->instructions_, instructions);
4417 uword entry_point = reinterpret_cast<uword>(instructions->ptr()) +
4418 Instructions::HeaderSize();
4419 StoreNonPointer(&raw_ptr()->entry_point_, entry_point);
4406 } 4420 }
4407 4421
4408 void set_pointer_offsets_length(intptr_t value) { 4422 void set_pointer_offsets_length(intptr_t value) {
4409 // The number of fixups is limited to 1-billion. 4423 // The number of fixups is limited to 1-billion.
4410 ASSERT(Utils::IsUint(30, value)); 4424 ASSERT(Utils::IsUint(30, value));
4411 set_state_bits(PtrOffBits::update(value, raw_ptr()->state_bits_)); 4425 set_state_bits(PtrOffBits::update(value, raw_ptr()->state_bits_));
4412 } 4426 }
4413 int32_t* PointerOffsetAddrAt(int index) const { 4427 int32_t* PointerOffsetAddrAt(int index) const {
4414 ASSERT(index >= 0); 4428 ASSERT(index >= 0);
4415 ASSERT(index < pointer_offsets_length()); 4429 ASSERT(index < pointer_offsets_length());
(...skipping 13 matching lines...) Expand all
4429 4443
4430 // New is a private method as RawInstruction and RawCode objects should 4444 // New is a private method as RawInstruction and RawCode objects should
4431 // only be created using the Code::FinalizeCode method. This method creates 4445 // only be created using the Code::FinalizeCode method. This method creates
4432 // the RawInstruction and RawCode objects, sets up the pointer offsets 4446 // the RawInstruction and RawCode objects, sets up the pointer offsets
4433 // and links the two in a GC safe manner. 4447 // and links the two in a GC safe manner.
4434 static RawCode* New(intptr_t pointer_offsets_length); 4448 static RawCode* New(intptr_t pointer_offsets_length);
4435 4449
4436 FINAL_HEAP_OBJECT_IMPLEMENTATION(Code, Object); 4450 FINAL_HEAP_OBJECT_IMPLEMENTATION(Code, Object);
4437 friend class Class; 4451 friend class Class;
4438 friend class SnapshotWriter; 4452 friend class SnapshotWriter;
4439 friend class CodePatcher; // for set_instructions 4453
4440 // So that the RawFunction pointer visitor can determine whether code the 4454 // So that the RawFunction pointer visitor can determine whether code the
4441 // function points to is optimized. 4455 // function points to is optimized.
4442 friend class RawFunction; 4456 friend class RawFunction;
4443 }; 4457 };
4444 4458
4445 4459
4446 class Context : public Object { 4460 class Context : public Object {
4447 public: 4461 public:
4448 RawContext* parent() const { return raw_ptr()->parent_; } 4462 RawContext* parent() const { return raw_ptr()->parent_; }
4449 void set_parent(const Context& parent) const { 4463 void set_parent(const Context& parent) const {
(...skipping 3670 matching lines...) Expand 10 before | Expand all | Expand 10 after
8120 8134
8121 8135
8122 RawObject* MegamorphicCache::GetTargetFunction(const Array& array, 8136 RawObject* MegamorphicCache::GetTargetFunction(const Array& array,
8123 intptr_t index) { 8137 intptr_t index) {
8124 return array.At((index * kEntryLength) + kTargetFunctionIndex); 8138 return array.At((index * kEntryLength) + kTargetFunctionIndex);
8125 } 8139 }
8126 8140
8127 } // namespace dart 8141 } // namespace dart
8128 8142
8129 #endif // VM_OBJECT_H_ 8143 #endif // VM_OBJECT_H_
OLDNEW
« no previous file with comments | « runtime/vm/native_entry.cc ('k') | runtime/vm/object.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698