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

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

Issue 2960413002: Omit JIT compiler from precompiled runtime on ARM, ARM64 and IA32. (Closed)
Patch Set: Moved trace_irregexp flag to flag_list.h Created 3 years, 5 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/object.h ('k') | runtime/vm/precompiler.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 #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 11823 matching lines...) Expand 10 before | Expand all | Expand 10 after
11834 false, // is_const 11834 false, // is_const
11835 owner, token_pos)); 11835 owner, token_pos));
11836 field.set_is_reflectable(false); 11836 field.set_is_reflectable(false);
11837 field.SetFieldType(Object::dynamic_type()); 11837 field.SetFieldType(Object::dynamic_type());
11838 field.SetStaticValue(Array::empty_array(), true); 11838 field.SetStaticValue(Array::empty_array(), true);
11839 set_metadata_field(field); 11839 set_metadata_field(field);
11840 } 11840 }
11841 11841
11842 11842
11843 RawObject* Namespace::GetMetadata() const { 11843 RawObject* Namespace::GetMetadata() const {
11844 #if defined(DART_PRECOMPILED_RUNTIME)
11845 COMPILE_ASSERT(!FLAG_enable_mirrors);
11846 return Object::empty_array().raw();
11847 #else
11844 Field& field = Field::Handle(metadata_field()); 11848 Field& field = Field::Handle(metadata_field());
11845 if (field.IsNull()) { 11849 if (field.IsNull()) {
11846 // There is no metadata for this object. 11850 // There is no metadata for this object.
11847 return Object::empty_array().raw(); 11851 return Object::empty_array().raw();
11848 } 11852 }
11849 Object& metadata = Object::Handle(); 11853 Object& metadata = Object::Handle();
11850 metadata = field.StaticValue(); 11854 metadata = field.StaticValue();
11851 if (field.StaticValue() == Object::empty_array().raw()) { 11855 if (field.StaticValue() == Object::empty_array().raw()) {
11852 metadata = Parser::ParseMetadata(field); 11856 metadata = Parser::ParseMetadata(field);
11853 if (metadata.IsArray()) { 11857 if (metadata.IsArray()) {
11854 ASSERT(Array::Cast(metadata).raw() != Object::empty_array().raw()); 11858 ASSERT(Array::Cast(metadata).raw() != Object::empty_array().raw());
11855 field.SetStaticValue(Array::Cast(metadata), true); 11859 field.SetStaticValue(Array::Cast(metadata), true);
11856 } 11860 }
11857 } 11861 }
11858 return metadata.raw(); 11862 return metadata.raw();
11863 #endif // defined(DART_PRECOMPILED_RUNTIME)
11859 } 11864 }
11860 11865
11861 11866
11862 const char* Namespace::ToCString() const { 11867 const char* Namespace::ToCString() const {
11863 const Library& lib = Library::Handle(library()); 11868 const Library& lib = Library::Handle(library());
11864 return OS::SCreate(Thread::Current()->zone(), "Namespace for library '%s'", 11869 return OS::SCreate(Thread::Current()->zone(), "Namespace for library '%s'",
11865 lib.ToCString()); 11870 lib.ToCString());
11866 } 11871 }
11867 11872
11868 11873
(...skipping 1104 matching lines...) Expand 10 before | Expand all | Expand 10 after
12973 num_chars += OS::SNPrint((buffer + num_chars), (len - num_chars), FORMAT2, 12978 num_chars += OS::SNPrint((buffer + num_chars), (len - num_chars), FORMAT2,
12974 k, type.ToCString()); 12979 k, type.ToCString());
12975 } 12980 }
12976 } 12981 }
12977 return buffer; 12982 return buffer;
12978 #undef FORMAT1 12983 #undef FORMAT1
12979 #undef FORMAT2 12984 #undef FORMAT2
12980 } 12985 }
12981 12986
12982 12987
12983 intptr_t DeoptInfo::FrameSize(const TypedData& packed) {
12984 NoSafepointScope no_safepoint;
12985 typedef ReadStream::Raw<sizeof(intptr_t), intptr_t> Reader;
12986 ReadStream read_stream(reinterpret_cast<uint8_t*>(packed.DataAddr(0)),
12987 packed.LengthInBytes());
12988 return Reader::Read(&read_stream);
12989 }
12990
12991
12992 intptr_t DeoptInfo::NumMaterializations(
12993 const GrowableArray<DeoptInstr*>& unpacked) {
12994 intptr_t num = 0;
12995 while (unpacked[num]->kind() == DeoptInstr::kMaterializeObject) {
12996 num++;
12997 }
12998 return num;
12999 }
13000
13001
13002 void DeoptInfo::UnpackInto(const Array& table,
13003 const TypedData& packed,
13004 GrowableArray<DeoptInstr*>* unpacked,
13005 intptr_t length) {
13006 NoSafepointScope no_safepoint;
13007 typedef ReadStream::Raw<sizeof(intptr_t), intptr_t> Reader;
13008 ReadStream read_stream(reinterpret_cast<uint8_t*>(packed.DataAddr(0)),
13009 packed.LengthInBytes());
13010 const intptr_t frame_size = Reader::Read(&read_stream); // Skip frame size.
13011 USE(frame_size);
13012
13013 const intptr_t suffix_length = Reader::Read(&read_stream);
13014 if (suffix_length != 0) {
13015 ASSERT(suffix_length > 1);
13016 const intptr_t info_number = Reader::Read(&read_stream);
13017
13018 TypedData& suffix = TypedData::Handle();
13019 Smi& offset = Smi::Handle();
13020 Smi& reason_and_flags = Smi::Handle();
13021 DeoptTable::GetEntry(table, info_number, &offset, &suffix,
13022 &reason_and_flags);
13023 UnpackInto(table, suffix, unpacked, suffix_length);
13024 }
13025
13026 while ((read_stream.PendingBytes() > 0) && (unpacked->length() < length)) {
13027 const intptr_t instruction = Reader::Read(&read_stream);
13028 const intptr_t from_index = Reader::Read(&read_stream);
13029 unpacked->Add(DeoptInstr::Create(instruction, from_index));
13030 }
13031 }
13032
13033
13034 void DeoptInfo::Unpack(const Array& table,
13035 const TypedData& packed,
13036 GrowableArray<DeoptInstr*>* unpacked) {
13037 ASSERT(unpacked->is_empty());
13038
13039 // Pass kMaxInt32 as the length to unpack all instructions from the
13040 // packed stream.
13041 UnpackInto(table, packed, unpacked, kMaxInt32);
13042
13043 unpacked->Reverse();
13044 }
13045
13046
13047 const char* DeoptInfo::ToCString(const Array& deopt_table,
13048 const TypedData& packed) {
13049 #define FORMAT "[%s]"
13050 GrowableArray<DeoptInstr*> deopt_instrs;
13051 Unpack(deopt_table, packed, &deopt_instrs);
13052
13053 // Compute the buffer size required.
13054 intptr_t len = 1; // Trailing '\0'.
13055 for (intptr_t i = 0; i < deopt_instrs.length(); i++) {
13056 len += OS::SNPrint(NULL, 0, FORMAT, deopt_instrs[i]->ToCString());
13057 }
13058
13059 // Allocate the buffer.
13060 char* buffer = Thread::Current()->zone()->Alloc<char>(len);
13061
13062 // Layout the fields in the buffer.
13063 intptr_t index = 0;
13064 for (intptr_t i = 0; i < deopt_instrs.length(); i++) {
13065 index += OS::SNPrint((buffer + index), (len - index), FORMAT,
13066 deopt_instrs[i]->ToCString());
13067 }
13068
13069 return buffer;
13070 #undef FORMAT
13071 }
13072
13073
13074 // Returns a bool so it can be asserted.
13075 bool DeoptInfo::VerifyDecompression(const GrowableArray<DeoptInstr*>& original,
13076 const Array& deopt_table,
13077 const TypedData& packed) {
13078 GrowableArray<DeoptInstr*> unpacked;
13079 Unpack(deopt_table, packed, &unpacked);
13080 ASSERT(unpacked.length() == original.length());
13081 for (intptr_t i = 0; i < unpacked.length(); ++i) {
13082 ASSERT(unpacked[i]->Equals(*original[i]));
13083 }
13084 return true;
13085 }
13086
13087
13088 void SingleTargetCache::set_target(const Code& value) const { 12988 void SingleTargetCache::set_target(const Code& value) const {
13089 StorePointer(&raw_ptr()->target_, value.raw()); 12989 StorePointer(&raw_ptr()->target_, value.raw());
13090 } 12990 }
13091 12991
13092 12992
13093 const char* SingleTargetCache::ToCString() const { 12993 const char* SingleTargetCache::ToCString() const {
13094 return "SingleTargetCache"; 12994 return "SingleTargetCache";
13095 } 12995 }
13096 12996
13097 12997
(...skipping 1249 matching lines...) Expand 10 before | Expand all | Expand 10 after
14347 if (!FLAG_support_debugger) { 14247 if (!FLAG_support_debugger) {
14348 return false; 14248 return false;
14349 } 14249 }
14350 return Isolate::Current()->debugger()->HasBreakpoint(*this); 14250 return Isolate::Current()->debugger()->HasBreakpoint(*this);
14351 } 14251 }
14352 14252
14353 14253
14354 RawTypedData* Code::GetDeoptInfoAtPc(uword pc, 14254 RawTypedData* Code::GetDeoptInfoAtPc(uword pc,
14355 ICData::DeoptReasonId* deopt_reason, 14255 ICData::DeoptReasonId* deopt_reason,
14356 uint32_t* deopt_flags) const { 14256 uint32_t* deopt_flags) const {
14257 #if defined(DART_PRECOMPILED_RUNTIME)
14258 ASSERT(Dart::vm_snapshot_kind() == Snapshot::kFullAOT);
14259 return TypedData::null();
14260 #else
14357 ASSERT(is_optimized()); 14261 ASSERT(is_optimized());
14358 const Instructions& instrs = Instructions::Handle(instructions()); 14262 const Instructions& instrs = Instructions::Handle(instructions());
14359 uword code_entry = instrs.PayloadStart(); 14263 uword code_entry = instrs.PayloadStart();
14360 const Array& table = Array::Handle(deopt_info_array()); 14264 const Array& table = Array::Handle(deopt_info_array());
14361 if (table.IsNull()) { 14265 if (table.IsNull()) {
14362 ASSERT(Dart::vm_snapshot_kind() == Snapshot::kFullAOT); 14266 ASSERT(Dart::vm_snapshot_kind() == Snapshot::kFullAOT);
14363 return TypedData::null(); 14267 return TypedData::null();
14364 } 14268 }
14365 // Linear search for the PC offset matching the target PC. 14269 // Linear search for the PC offset matching the target PC.
14366 intptr_t length = DeoptTable::GetLength(table); 14270 intptr_t length = DeoptTable::GetLength(table);
14367 Smi& offset = Smi::Handle(); 14271 Smi& offset = Smi::Handle();
14368 Smi& reason_and_flags = Smi::Handle(); 14272 Smi& reason_and_flags = Smi::Handle();
14369 TypedData& info = TypedData::Handle(); 14273 TypedData& info = TypedData::Handle();
14370 for (intptr_t i = 0; i < length; ++i) { 14274 for (intptr_t i = 0; i < length; ++i) {
14371 DeoptTable::GetEntry(table, i, &offset, &info, &reason_and_flags); 14275 DeoptTable::GetEntry(table, i, &offset, &info, &reason_and_flags);
14372 if (pc == (code_entry + offset.Value())) { 14276 if (pc == (code_entry + offset.Value())) {
14373 ASSERT(!info.IsNull()); 14277 ASSERT(!info.IsNull());
14374 *deopt_reason = DeoptTable::ReasonField::decode(reason_and_flags.Value()); 14278 *deopt_reason = DeoptTable::ReasonField::decode(reason_and_flags.Value());
14375 *deopt_flags = DeoptTable::FlagsField::decode(reason_and_flags.Value()); 14279 *deopt_flags = DeoptTable::FlagsField::decode(reason_and_flags.Value());
14376 return info.raw(); 14280 return info.raw();
14377 } 14281 }
14378 } 14282 }
14379 *deopt_reason = ICData::kDeoptUnknown; 14283 *deopt_reason = ICData::kDeoptUnknown;
14380 return TypedData::null(); 14284 return TypedData::null();
14285 #endif // defined(DART_PRECOMPILED_RUNTIME)
14381 } 14286 }
14382 14287
14383 14288
14384 intptr_t Code::BinarySearchInSCallTable(uword pc) const { 14289 intptr_t Code::BinarySearchInSCallTable(uword pc) const {
14385 #if defined(DART_PRECOMPILED_RUNTIME) 14290 #if defined(DART_PRECOMPILED_RUNTIME)
14386 UNREACHABLE(); 14291 UNREACHABLE();
14387 #else 14292 #else
14388 NoSafepointScope no_safepoint; 14293 NoSafepointScope no_safepoint;
14389 const Array& table = Array::Handle(raw_ptr()->static_calls_target_table_); 14294 const Array& table = Array::Handle(raw_ptr()->static_calls_target_table_);
14390 RawObject* key = reinterpret_cast<RawObject*>(Smi::New(pc - PayloadStart())); 14295 RawObject* key = reinterpret_cast<RawObject*>(Smi::New(pc - PayloadStart()));
(...skipping 9111 matching lines...) Expand 10 before | Expand all | Expand 10 after
23502 return UserTag::null(); 23407 return UserTag::null();
23503 } 23408 }
23504 23409
23505 23410
23506 const char* UserTag::ToCString() const { 23411 const char* UserTag::ToCString() const {
23507 const String& tag_label = String::Handle(label()); 23412 const String& tag_label = String::Handle(label());
23508 return tag_label.ToCString(); 23413 return tag_label.ToCString();
23509 } 23414 }
23510 23415
23511 } // namespace dart 23416 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/object.h ('k') | runtime/vm/precompiler.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698