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 #include "vm/object.h" | 5 #include "vm/object.h" |
6 | 6 |
7 #include "include/dart_api.h" | 7 #include "include/dart_api.h" |
8 #include "platform/assert.h" | 8 #include "platform/assert.h" |
9 #include "vm/assembler.h" | 9 #include "vm/assembler.h" |
10 #include "vm/become.h" | 10 #include "vm/become.h" |
(...skipping 11561 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11572 | 11572 |
11573 #undef CHECK_FACTORY_FINGERPRINTS | 11573 #undef CHECK_FACTORY_FINGERPRINTS |
11574 | 11574 |
11575 if (has_errors) { | 11575 if (has_errors) { |
11576 FATAL("Fingerprint mismatch."); | 11576 FATAL("Fingerprint mismatch."); |
11577 } | 11577 } |
11578 } | 11578 } |
11579 #endif // defined(DART_NO_SNAPSHOT) && !defined(PRODUCT). | 11579 #endif // defined(DART_NO_SNAPSHOT) && !defined(PRODUCT). |
11580 | 11580 |
11581 | 11581 |
11582 RawInstructions* Instructions::New(intptr_t size) { | 11582 RawInstructions* Instructions::New(intptr_t size, bool has_single_entry_point) { |
| 11583 ASSERT(size >= 0); |
11583 ASSERT(Object::instructions_class() != Class::null()); | 11584 ASSERT(Object::instructions_class() != Class::null()); |
11584 if (size < 0 || size > kMaxElements) { | 11585 if (size < 0 || size > kMaxElements) { |
11585 // This should be caught before we reach here. | 11586 // This should be caught before we reach here. |
11586 FATAL1("Fatal error in Instructions::New: invalid size %" Pd "\n", size); | 11587 FATAL1("Fatal error in Instructions::New: invalid size %" Pd "\n", size); |
11587 } | 11588 } |
11588 Instructions& result = Instructions::Handle(); | 11589 Instructions& result = Instructions::Handle(); |
11589 { | 11590 { |
11590 uword aligned_size = Instructions::InstanceSize(size); | 11591 uword aligned_size = Instructions::InstanceSize(size); |
11591 RawObject* raw = Object::Allocate(Instructions::kClassId, | 11592 RawObject* raw = Object::Allocate(Instructions::kClassId, |
11592 aligned_size, | 11593 aligned_size, |
11593 Heap::kCode); | 11594 Heap::kCode); |
11594 NoSafepointScope no_safepoint; | 11595 NoSafepointScope no_safepoint; |
11595 result ^= raw; | 11596 result ^= raw; |
11596 result.set_size(size); | 11597 result.set_size(has_single_entry_point ? size : -size); |
11597 } | 11598 } |
11598 return result.raw(); | 11599 return result.raw(); |
11599 } | 11600 } |
11600 | 11601 |
11601 | 11602 |
11602 const char* Instructions::ToCString() const { | 11603 const char* Instructions::ToCString() const { |
11603 return "Instructions"; | 11604 return "Instructions"; |
11604 } | 11605 } |
11605 | 11606 |
11606 | 11607 |
(...skipping 2650 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14257 ObjectPool::Handle(assembler->object_pool_wrapper().MakeObjectPool()); | 14258 ObjectPool::Handle(assembler->object_pool_wrapper().MakeObjectPool()); |
14258 | 14259 |
14259 // Allocate the Code and Instructions objects. Code is allocated first | 14260 // Allocate the Code and Instructions objects. Code is allocated first |
14260 // because a GC during allocation of the code will leave the instruction | 14261 // because a GC during allocation of the code will leave the instruction |
14261 // pages read-only. | 14262 // pages read-only. |
14262 intptr_t pointer_offset_count = assembler->CountPointerOffsets(); | 14263 intptr_t pointer_offset_count = assembler->CountPointerOffsets(); |
14263 Code& code = Code::ZoneHandle(Code::New(pointer_offset_count)); | 14264 Code& code = Code::ZoneHandle(Code::New(pointer_offset_count)); |
14264 #ifdef TARGET_ARCH_IA32 | 14265 #ifdef TARGET_ARCH_IA32 |
14265 assembler->set_code_object(code); | 14266 assembler->set_code_object(code); |
14266 #endif | 14267 #endif |
14267 Instructions& instrs = | 14268 Instructions& instrs = Instructions::ZoneHandle( |
14268 Instructions::ZoneHandle(Instructions::New(assembler->CodeSize())); | 14269 Instructions::New(assembler->CodeSize(), |
| 14270 assembler->has_single_entry_point())); |
14269 INC_STAT(Thread::Current(), total_instr_size, assembler->CodeSize()); | 14271 INC_STAT(Thread::Current(), total_instr_size, assembler->CodeSize()); |
14270 INC_STAT(Thread::Current(), total_code_size, assembler->CodeSize()); | 14272 INC_STAT(Thread::Current(), total_code_size, assembler->CodeSize()); |
14271 | 14273 |
14272 // Copy the instructions into the instruction area and apply all fixups. | 14274 // Copy the instructions into the instruction area and apply all fixups. |
14273 // Embedded pointers are still in handles at this point. | 14275 // Embedded pointers are still in handles at this point. |
14274 MemoryRegion region(reinterpret_cast<void*>(instrs.PayloadStart()), | 14276 MemoryRegion region(reinterpret_cast<void*>(instrs.PayloadStart()), |
14275 instrs.size()); | 14277 instrs.size()); |
14276 assembler->FinalizeInstructions(region); | 14278 assembler->FinalizeInstructions(region); |
14277 CPU::FlushICache(instrs.PayloadStart(), instrs.size()); | 14279 CPU::FlushICache(instrs.PayloadStart(), instrs.size()); |
14278 | 14280 |
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14565 // frame slots which are marked as having objects. | 14567 // frame slots which are marked as having objects. |
14566 *maps = stackmaps(); | 14568 *maps = stackmaps(); |
14567 *map = Stackmap::null(); | 14569 *map = Stackmap::null(); |
14568 for (intptr_t i = 0; i < maps->Length(); i++) { | 14570 for (intptr_t i = 0; i < maps->Length(); i++) { |
14569 *map ^= maps->At(i); | 14571 *map ^= maps->At(i); |
14570 ASSERT(!map->IsNull()); | 14572 ASSERT(!map->IsNull()); |
14571 if (map->PcOffset() == pc_offset) { | 14573 if (map->PcOffset() == pc_offset) { |
14572 return map->raw(); // We found a stack map for this frame. | 14574 return map->raw(); // We found a stack map for this frame. |
14573 } | 14575 } |
14574 } | 14576 } |
14575 ASSERT(!is_optimized() || (pc_offset == Instructions::kUncheckedEntryOffset)); | 14577 // If we are missing a stack map, this must either be unoptimized code, or |
| 14578 // the entry to an osr function. (In which case all stack slots are |
| 14579 // considered to have tagged pointers.) |
| 14580 // Running with --verify-on-transition should hit this. |
| 14581 ASSERT(!is_optimized() || |
| 14582 (pc_offset == UncheckedEntryPoint() - PayloadStart())); |
14576 return Stackmap::null(); | 14583 return Stackmap::null(); |
14577 } | 14584 } |
14578 | 14585 |
14579 | 14586 |
14580 intptr_t Code::GetCallerId(intptr_t inlined_id) const { | 14587 intptr_t Code::GetCallerId(intptr_t inlined_id) const { |
14581 if (inlined_id < 0) { | 14588 if (inlined_id < 0) { |
14582 return -1; | 14589 return -1; |
14583 } | 14590 } |
14584 const Array& map = Array::Handle(GetInlinedCallerIdMap()); | 14591 const Array& map = Array::Handle(GetInlinedCallerIdMap()); |
14585 if (map.IsNull() || (map.Length() == 0)) { | 14592 if (map.IsNull() || (map.Length() == 0)) { |
(...skipping 8442 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
23028 return UserTag::null(); | 23035 return UserTag::null(); |
23029 } | 23036 } |
23030 | 23037 |
23031 | 23038 |
23032 const char* UserTag::ToCString() const { | 23039 const char* UserTag::ToCString() const { |
23033 const String& tag_label = String::Handle(label()); | 23040 const String& tag_label = String::Handle(label()); |
23034 return tag_label.ToCString(); | 23041 return tag_label.ToCString(); |
23035 } | 23042 } |
23036 | 23043 |
23037 } // namespace dart | 23044 } // namespace dart |
OLD | NEW |