| 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/cpu.h" | 10 #include "vm/cpu.h" |
| (...skipping 11483 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 11494 if (value) { | 11494 if (value) { |
| 11495 *byte_addr |= byte_mask; | 11495 *byte_addr |= byte_mask; |
| 11496 } else { | 11496 } else { |
| 11497 *byte_addr &= ~byte_mask; | 11497 *byte_addr &= ~byte_mask; |
| 11498 } | 11498 } |
| 11499 } | 11499 } |
| 11500 | 11500 |
| 11501 | 11501 |
| 11502 RawStackmap* Stackmap::New(intptr_t pc_offset, | 11502 RawStackmap* Stackmap::New(intptr_t pc_offset, |
| 11503 BitmapBuilder* bmap, | 11503 BitmapBuilder* bmap, |
| 11504 intptr_t register_bit_count) { | 11504 intptr_t slow_path_bit_count) { |
| 11505 ASSERT(Object::stackmap_class() != Class::null()); | 11505 ASSERT(Object::stackmap_class() != Class::null()); |
| 11506 ASSERT(bmap != NULL); | 11506 ASSERT(bmap != NULL); |
| 11507 Stackmap& result = Stackmap::Handle(); | 11507 Stackmap& result = Stackmap::Handle(); |
| 11508 // Guard against integer overflow of the instance size computation. | 11508 // Guard against integer overflow of the instance size computation. |
| 11509 intptr_t length = bmap->Length(); | 11509 intptr_t length = bmap->Length(); |
| 11510 intptr_t payload_size = | 11510 intptr_t payload_size = |
| 11511 Utils::RoundUp(length, kBitsPerByte) / kBitsPerByte; | 11511 Utils::RoundUp(length, kBitsPerByte) / kBitsPerByte; |
| 11512 if ((payload_size < 0) || | 11512 if ((payload_size < 0) || |
| 11513 (payload_size > kMaxLengthInBytes)) { | 11513 (payload_size > kMaxLengthInBytes)) { |
| 11514 // This should be caught before we reach here. | 11514 // This should be caught before we reach here. |
| (...skipping 11 matching lines...) Expand all Loading... |
| 11526 result.SetLength(length); | 11526 result.SetLength(length); |
| 11527 } | 11527 } |
| 11528 // When constructing a stackmap we store the pc offset in the stackmap's | 11528 // When constructing a stackmap we store the pc offset in the stackmap's |
| 11529 // PC. StackmapTableBuilder::FinalizeStackmaps will replace it with the pc | 11529 // PC. StackmapTableBuilder::FinalizeStackmaps will replace it with the pc |
| 11530 // address. | 11530 // address. |
| 11531 ASSERT(pc_offset >= 0); | 11531 ASSERT(pc_offset >= 0); |
| 11532 result.SetPcOffset(pc_offset); | 11532 result.SetPcOffset(pc_offset); |
| 11533 for (intptr_t i = 0; i < length; ++i) { | 11533 for (intptr_t i = 0; i < length; ++i) { |
| 11534 result.SetBit(i, bmap->Get(i)); | 11534 result.SetBit(i, bmap->Get(i)); |
| 11535 } | 11535 } |
| 11536 result.SetRegisterBitCount(register_bit_count); | 11536 result.SetSlowPathBitCount(slow_path_bit_count); |
| 11537 return result.raw(); | 11537 return result.raw(); |
| 11538 } | 11538 } |
| 11539 | 11539 |
| 11540 | 11540 |
| 11541 RawStackmap* Stackmap::New(intptr_t length, | 11541 RawStackmap* Stackmap::New(intptr_t length, |
| 11542 intptr_t register_bit_count, | 11542 intptr_t slow_path_bit_count, |
| 11543 intptr_t pc_offset) { | 11543 intptr_t pc_offset) { |
| 11544 ASSERT(Object::stackmap_class() != Class::null()); | 11544 ASSERT(Object::stackmap_class() != Class::null()); |
| 11545 Stackmap& result = Stackmap::Handle(); | 11545 Stackmap& result = Stackmap::Handle(); |
| 11546 // Guard against integer overflow of the instance size computation. | 11546 // Guard against integer overflow of the instance size computation. |
| 11547 intptr_t payload_size = | 11547 intptr_t payload_size = |
| 11548 Utils::RoundUp(length, kBitsPerByte) / kBitsPerByte; | 11548 Utils::RoundUp(length, kBitsPerByte) / kBitsPerByte; |
| 11549 if ((payload_size < 0) || | 11549 if ((payload_size < 0) || |
| 11550 (payload_size > kMaxLengthInBytes)) { | 11550 (payload_size > kMaxLengthInBytes)) { |
| 11551 // This should be caught before we reach here. | 11551 // This should be caught before we reach here. |
| 11552 FATAL1("Fatal error in Stackmap::New: invalid length %" Pd "\n", | 11552 FATAL1("Fatal error in Stackmap::New: invalid length %" Pd "\n", |
| 11553 length); | 11553 length); |
| 11554 } | 11554 } |
| 11555 { | 11555 { |
| 11556 // Stackmap data objects are associated with a code object, allocate them | 11556 // Stackmap data objects are associated with a code object, allocate them |
| 11557 // in old generation. | 11557 // in old generation. |
| 11558 RawObject* raw = Object::Allocate(Stackmap::kClassId, | 11558 RawObject* raw = Object::Allocate(Stackmap::kClassId, |
| 11559 Stackmap::InstanceSize(length), | 11559 Stackmap::InstanceSize(length), |
| 11560 Heap::kOld); | 11560 Heap::kOld); |
| 11561 NoSafepointScope no_safepoint; | 11561 NoSafepointScope no_safepoint; |
| 11562 result ^= raw; | 11562 result ^= raw; |
| 11563 result.SetLength(length); | 11563 result.SetLength(length); |
| 11564 } | 11564 } |
| 11565 // When constructing a stackmap we store the pc offset in the stackmap's | 11565 // When constructing a stackmap we store the pc offset in the stackmap's |
| 11566 // PC. StackmapTableBuilder::FinalizeStackmaps will replace it with the pc | 11566 // PC. StackmapTableBuilder::FinalizeStackmaps will replace it with the pc |
| 11567 // address. | 11567 // address. |
| 11568 ASSERT(pc_offset >= 0); | 11568 ASSERT(pc_offset >= 0); |
| 11569 result.SetPcOffset(pc_offset); | 11569 result.SetPcOffset(pc_offset); |
| 11570 result.SetRegisterBitCount(register_bit_count); | 11570 result.SetSlowPathBitCount(slow_path_bit_count); |
| 11571 return result.raw(); | 11571 return result.raw(); |
| 11572 } | 11572 } |
| 11573 | 11573 |
| 11574 | 11574 |
| 11575 const char* Stackmap::ToCString() const { | 11575 const char* Stackmap::ToCString() const { |
| 11576 #define FORMAT "%#x: " | 11576 #define FORMAT "%#x: " |
| 11577 if (IsNull()) { | 11577 if (IsNull()) { |
| 11578 return "{null}"; | 11578 return "{null}"; |
| 11579 } else { | 11579 } else { |
| 11580 intptr_t fixed_length = OS::SNPrint(NULL, 0, FORMAT, PcOffset()) + 1; | 11580 intptr_t fixed_length = OS::SNPrint(NULL, 0, FORMAT, PcOffset()) + 1; |
| (...skipping 10290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 21871 return UserTag::null(); | 21871 return UserTag::null(); |
| 21872 } | 21872 } |
| 21873 | 21873 |
| 21874 | 21874 |
| 21875 const char* UserTag::ToCString() const { | 21875 const char* UserTag::ToCString() const { |
| 21876 const String& tag_label = String::Handle(label()); | 21876 const String& tag_label = String::Handle(label()); |
| 21877 return tag_label.ToCString(); | 21877 return tag_label.ToCString(); |
| 21878 } | 21878 } |
| 21879 | 21879 |
| 21880 } // namespace dart | 21880 } // namespace dart |
| OLD | NEW |