OLD | NEW |
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 3942 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3953 friend class Class; | 3953 friend class Class; |
3954 friend class Object; | 3954 friend class Object; |
3955 friend class RawObjectPool; | 3955 friend class RawObjectPool; |
3956 }; | 3956 }; |
3957 | 3957 |
3958 | 3958 |
3959 class Instructions : public Object { | 3959 class Instructions : public Object { |
3960 public: | 3960 public: |
3961 intptr_t size() const { return raw_ptr()->size_; } // Excludes HeaderSize(). | 3961 intptr_t size() const { return raw_ptr()->size_; } // Excludes HeaderSize(). |
3962 | 3962 |
3963 uword EntryPoint() const { | 3963 uword PayloadStart() const { |
3964 return EntryPoint(raw()); | 3964 return PayloadStart(raw()); |
3965 } | 3965 } |
3966 static uword EntryPoint(RawInstructions* instr) { | 3966 uword UncheckedEntryPoint() const { |
| 3967 return UncheckedEntryPoint(raw()); |
| 3968 } |
| 3969 uword CheckedEntryPoint() const { |
| 3970 return CheckedEntryPoint(raw()); |
| 3971 } |
| 3972 static uword PayloadStart(RawInstructions* instr) { |
3967 return reinterpret_cast<uword>(instr->ptr()) + HeaderSize(); | 3973 return reinterpret_cast<uword>(instr->ptr()) + HeaderSize(); |
3968 } | 3974 } |
3969 | 3975 |
| 3976 #if defined(TARGET_ARCH_IA32) |
| 3977 static const intptr_t kCheckedEntryOffset = 0; |
| 3978 static const intptr_t kUncheckedEntryOffset = 0; |
| 3979 #elif defined(TARGET_ARCH_X64) |
| 3980 static const intptr_t kCheckedEntryOffset = 23; |
| 3981 static const intptr_t kUncheckedEntryOffset = 44; |
| 3982 #elif defined(TARGET_ARCH_ARM) |
| 3983 static const intptr_t kCheckedEntryOffset = 3 * Instr::kInstrSize; |
| 3984 static const intptr_t kUncheckedEntryOffset = 9 * Instr::kInstrSize; |
| 3985 #elif defined(TARGET_ARCH_ARM64) |
| 3986 static const intptr_t kCheckedEntryOffset = 6 * Instr::kInstrSize; |
| 3987 static const intptr_t kUncheckedEntryOffset = 12 * Instr::kInstrSize; |
| 3988 #elif defined(TARGET_ARCH_MIPS) |
| 3989 static const intptr_t kCheckedEntryOffset = 4 * Instr::kInstrSize; |
| 3990 static const intptr_t kUncheckedEntryOffset = 14 * Instr::kInstrSize; |
| 3991 #elif defined(TARGET_ARCH_DBC) |
| 3992 static const intptr_t kCheckedEntryOffset = 0; |
| 3993 static const intptr_t kUncheckedEntryOffset = 0; |
| 3994 #else |
| 3995 #error Missing entry offsets for current architecture |
| 3996 #endif |
| 3997 |
| 3998 static uword UncheckedEntryPoint(RawInstructions* instr) { |
| 3999 return PayloadStart(instr) + kUncheckedEntryOffset; |
| 4000 } |
| 4001 static uword CheckedEntryPoint(RawInstructions* instr) { |
| 4002 return PayloadStart(instr) + kCheckedEntryOffset; |
| 4003 } |
| 4004 |
3970 static const intptr_t kMaxElements = (kMaxInt32 - | 4005 static const intptr_t kMaxElements = (kMaxInt32 - |
3971 (sizeof(RawInstructions) + | 4006 (sizeof(RawInstructions) + |
3972 sizeof(RawObject) + | 4007 sizeof(RawObject) + |
3973 (2 * OS::kMaxPreferredCodeAlignment))); | 4008 (2 * OS::kMaxPreferredCodeAlignment))); |
3974 | 4009 |
3975 static intptr_t InstanceSize() { | 4010 static intptr_t InstanceSize() { |
3976 ASSERT(sizeof(RawInstructions) == | 4011 ASSERT(sizeof(RawInstructions) == |
3977 OFFSET_OF_RETURNED_VALUE(RawInstructions, data)); | 4012 OFFSET_OF_RETURNED_VALUE(RawInstructions, data)); |
3978 return 0; | 4013 return 0; |
3979 } | 4014 } |
3980 | 4015 |
3981 static intptr_t InstanceSize(intptr_t size) { | 4016 static intptr_t InstanceSize(intptr_t size) { |
3982 intptr_t instructions_size = Utils::RoundUp(size, | 4017 intptr_t instructions_size = Utils::RoundUp(size, |
3983 OS::PreferredCodeAlignment()); | 4018 OS::PreferredCodeAlignment()); |
3984 intptr_t result = instructions_size + HeaderSize(); | 4019 intptr_t result = instructions_size + HeaderSize(); |
3985 ASSERT(result % OS::PreferredCodeAlignment() == 0); | 4020 ASSERT(result % OS::PreferredCodeAlignment() == 0); |
3986 return result; | 4021 return result; |
3987 } | 4022 } |
3988 | 4023 |
3989 static intptr_t HeaderSize() { | 4024 static intptr_t HeaderSize() { |
3990 intptr_t alignment = OS::PreferredCodeAlignment(); | 4025 intptr_t alignment = OS::PreferredCodeAlignment(); |
3991 return Utils::RoundUp(sizeof(RawInstructions), alignment); | 4026 return Utils::RoundUp(sizeof(RawInstructions), alignment); |
3992 } | 4027 } |
3993 | 4028 |
3994 static RawInstructions* FromEntryPoint(uword entry_point) { | 4029 static RawInstructions* FromUncheckedEntryPoint(uword entry_point) { |
3995 return reinterpret_cast<RawInstructions*>( | 4030 return reinterpret_cast<RawInstructions*>( |
3996 entry_point - HeaderSize() + kHeapObjectTag); | 4031 entry_point - HeaderSize() - kUncheckedEntryOffset + kHeapObjectTag); |
3997 } | 4032 } |
3998 | 4033 |
3999 bool Equals(const Instructions& other) const { | 4034 bool Equals(const Instructions& other) const { |
4000 if (size() != other.size()) { | 4035 if (size() != other.size()) { |
4001 return false; | 4036 return false; |
4002 } | 4037 } |
4003 NoSafepointScope no_safepoint; | 4038 NoSafepointScope no_safepoint; |
4004 return memcmp(raw_ptr(), other.raw_ptr(), InstanceSize(size())) == 0; | 4039 return memcmp(raw_ptr(), other.raw_ptr(), InstanceSize(size())) == 0; |
4005 } | 4040 } |
4006 | 4041 |
(...skipping 431 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4438 | 4473 |
4439 RawInstructions* instructions() const { return raw_ptr()->instructions_; } | 4474 RawInstructions* instructions() const { return raw_ptr()->instructions_; } |
4440 | 4475 |
4441 static intptr_t saved_instructions_offset() { | 4476 static intptr_t saved_instructions_offset() { |
4442 return OFFSET_OF(RawCode, instructions_); | 4477 return OFFSET_OF(RawCode, instructions_); |
4443 } | 4478 } |
4444 | 4479 |
4445 static intptr_t entry_point_offset() { | 4480 static intptr_t entry_point_offset() { |
4446 return OFFSET_OF(RawCode, entry_point_); | 4481 return OFFSET_OF(RawCode, entry_point_); |
4447 } | 4482 } |
| 4483 static intptr_t checked_entry_point_offset() { |
| 4484 return OFFSET_OF(RawCode, checked_entry_point_); |
| 4485 } |
4448 | 4486 |
4449 RawObjectPool* object_pool() const { return raw_ptr()->object_pool_; } | 4487 RawObjectPool* object_pool() const { return raw_ptr()->object_pool_; } |
4450 static intptr_t object_pool_offset() { | 4488 static intptr_t object_pool_offset() { |
4451 return OFFSET_OF(RawCode, object_pool_); | 4489 return OFFSET_OF(RawCode, object_pool_); |
4452 } | 4490 } |
4453 | 4491 |
4454 intptr_t pointer_offsets_length() const { | 4492 intptr_t pointer_offsets_length() const { |
4455 return PtrOffBits::decode(raw_ptr()->state_bits_); | 4493 return PtrOffBits::decode(raw_ptr()->state_bits_); |
4456 } | 4494 } |
4457 | 4495 |
4458 bool is_optimized() const { | 4496 bool is_optimized() const { |
4459 return OptimizedBit::decode(raw_ptr()->state_bits_); | 4497 return OptimizedBit::decode(raw_ptr()->state_bits_); |
4460 } | 4498 } |
4461 void set_is_optimized(bool value) const; | 4499 void set_is_optimized(bool value) const; |
4462 bool is_alive() const { | 4500 bool is_alive() const { |
4463 return AliveBit::decode(raw_ptr()->state_bits_); | 4501 return AliveBit::decode(raw_ptr()->state_bits_); |
4464 } | 4502 } |
4465 void set_is_alive(bool value) const; | 4503 void set_is_alive(bool value) const; |
4466 | 4504 |
4467 uword EntryPoint() const { | 4505 uword PayloadStart() const { |
4468 return Instructions::Handle(instructions()).EntryPoint(); | 4506 return Instructions::PayloadStart(instructions()); |
| 4507 } |
| 4508 uword UncheckedEntryPoint() const { |
| 4509 return Instructions::UncheckedEntryPoint(instructions()); |
| 4510 } |
| 4511 uword CheckedEntryPoint() const { |
| 4512 return Instructions::CheckedEntryPoint(instructions()); |
4469 } | 4513 } |
4470 intptr_t Size() const { | 4514 intptr_t Size() const { |
4471 const Instructions& instr = Instructions::Handle(instructions()); | 4515 const Instructions& instr = Instructions::Handle(instructions()); |
4472 return instr.size(); | 4516 return instr.size(); |
4473 } | 4517 } |
4474 RawObjectPool* GetObjectPool() const { | 4518 RawObjectPool* GetObjectPool() const { |
4475 return object_pool(); | 4519 return object_pool(); |
4476 } | 4520 } |
4477 bool ContainsInstructionAt(uword addr) const { | 4521 bool ContainsInstructionAt(uword addr) const { |
4478 const Instructions& instr = Instructions::Handle(instructions()); | 4522 const Instructions& instr = Instructions::Handle(instructions()); |
4479 const uword offset = addr - instr.EntryPoint(); | 4523 const uword offset = addr - instr.PayloadStart(); |
4480 return offset < static_cast<uword>(instr.size()); | 4524 return offset < static_cast<uword>(instr.size()); |
4481 } | 4525 } |
4482 | 4526 |
4483 // Returns true if there is a debugger breakpoint set in this code object. | 4527 // Returns true if there is a debugger breakpoint set in this code object. |
4484 bool HasBreakpoint() const; | 4528 bool HasBreakpoint() const; |
4485 | 4529 |
4486 RawPcDescriptors* pc_descriptors() const { | 4530 RawPcDescriptors* pc_descriptors() const { |
4487 return raw_ptr()->pc_descriptors_; | 4531 return raw_ptr()->pc_descriptors_; |
4488 } | 4532 } |
4489 void set_pc_descriptors(const PcDescriptors& descriptors) const { | 4533 void set_pc_descriptors(const PcDescriptors& descriptors) const { |
(...skipping 4244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8734 | 8778 |
8735 inline void TypeArguments::SetHash(intptr_t value) const { | 8779 inline void TypeArguments::SetHash(intptr_t value) const { |
8736 // This is only safe because we create a new Smi, which does not cause | 8780 // This is only safe because we create a new Smi, which does not cause |
8737 // heap allocation. | 8781 // heap allocation. |
8738 StoreSmi(&raw_ptr()->hash_, Smi::New(value)); | 8782 StoreSmi(&raw_ptr()->hash_, Smi::New(value)); |
8739 } | 8783 } |
8740 | 8784 |
8741 } // namespace dart | 8785 } // namespace dart |
8742 | 8786 |
8743 #endif // VM_OBJECT_H_ | 8787 #endif // VM_OBJECT_H_ |
OLD | NEW |