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

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

Issue 1318803002: Toward precompiled snapshots. (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/object.cc ('k') | runtime/vm/raw_object_snapshot.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_RAW_OBJECT_H_ 5 #ifndef VM_RAW_OBJECT_H_
6 #define VM_RAW_OBJECT_H_ 6 #define VM_RAW_OBJECT_H_
7 7
8 #include "platform/assert.h" 8 #include "platform/assert.h"
9 #include "vm/atomic.h" 9 #include "vm/atomic.h"
10 #include "vm/globals.h" 10 #include "vm/globals.h"
(...skipping 566 matching lines...) Expand 10 before | Expand all | Expand 10 after
577 friend class OneByteString; // StoreSmi 577 friend class OneByteString; // StoreSmi
578 friend class RawExternalTypedData; 578 friend class RawExternalTypedData;
579 friend class RawInstructions; 579 friend class RawInstructions;
580 friend class RawInstance; 580 friend class RawInstance;
581 friend class RawTypedData; 581 friend class RawTypedData;
582 friend class Scavenger; 582 friend class Scavenger;
583 friend class ScavengerVisitor; 583 friend class ScavengerVisitor;
584 friend class SizeExcludingClassVisitor; // GetClassId 584 friend class SizeExcludingClassVisitor; // GetClassId
585 friend class RetainingPathVisitor; // GetClassId 585 friend class RetainingPathVisitor; // GetClassId
586 friend class SkippedCodeFunctions; // StorePointer 586 friend class SkippedCodeFunctions; // StorePointer
587 friend class InstructionsReader; // tags_ check
587 friend class SnapshotReader; 588 friend class SnapshotReader;
588 friend class SnapshotWriter; 589 friend class SnapshotWriter;
589 friend class String; 590 friend class String;
590 friend class TypedData; 591 friend class TypedData;
591 friend class TypedDataView; 592 friend class TypedDataView;
592 friend class WeakProperty; // StorePointer 593 friend class WeakProperty; // StorePointer
593 friend class Instance; // StorePointer 594 friend class Instance; // StorePointer
594 595
595 DISALLOW_ALLOCATION(); 596 DISALLOW_ALLOCATION();
596 DISALLOW_IMPLICIT_CONSTRUCTORS(RawObject); 597 DISALLOW_IMPLICIT_CONSTRUCTORS(RawObject);
(...skipping 398 matching lines...) Expand 10 before | Expand all | Expand 10 after
995 // Else, owner_ is a regular Dart Function. 996 // Else, owner_ is a regular Dart Function.
996 RawObject* owner_; // Function, Null, or a Class. 997 RawObject* owner_; // Function, Null, or a Class.
997 RawExceptionHandlers* exception_handlers_; 998 RawExceptionHandlers* exception_handlers_;
998 RawPcDescriptors* pc_descriptors_; 999 RawPcDescriptors* pc_descriptors_;
999 RawArray* deopt_info_array_; 1000 RawArray* deopt_info_array_;
1000 RawArray* static_calls_target_table_; // (code-offset, function, code). 1001 RawArray* static_calls_target_table_; // (code-offset, function, code).
1001 RawArray* stackmaps_; 1002 RawArray* stackmaps_;
1002 RawLocalVarDescriptors* var_descriptors_; 1003 RawLocalVarDescriptors* var_descriptors_;
1003 RawArray* inlined_metadata_; 1004 RawArray* inlined_metadata_;
1004 RawArray* comments_; 1005 RawArray* comments_;
1005 // If return_address_info_ is a Smi, it is the offset to the prologue. 1006 // If return_address_metadata_ is a Smi, it is the offset to the prologue.
1006 // Else, return_address_info_ is null. 1007 // Else, return_address_metadata_ is null.
1007 RawObject* return_address_metadata_; 1008 RawObject* return_address_metadata_;
1008 RawObject** to() { 1009 RawObject** to() {
1009 return reinterpret_cast<RawObject**>(&ptr()->comments_); 1010 return reinterpret_cast<RawObject**>(&ptr()->return_address_metadata_);
1010 } 1011 }
1011 uword entry_point_; 1012 uword entry_point_;
1012 1013
1013 // Compilation timestamp. 1014 // Compilation timestamp.
1014 int64_t compile_timestamp_; 1015 int64_t compile_timestamp_;
1015 1016
1016 // state_bits_ is a bitfield with three fields: 1017 // state_bits_ is a bitfield with three fields:
1017 // The optimized bit, the alive bit, and a count of the number of pointer 1018 // The optimized bit, the alive bit, and a count of the number of pointer
1018 // offsets. 1019 // offsets.
1019 // Alive: If true, the embedded object pointers will be visited during GC. 1020 // Alive: If true, the embedded object pointers will be visited during GC.
(...skipping 26 matching lines...) Expand all
1046 RawObject* raw_obj_; 1047 RawObject* raw_obj_;
1047 uword raw_value_; 1048 uword raw_value_;
1048 }; 1049 };
1049 }; 1050 };
1050 Entry* data() { OPEN_ARRAY_START(Entry, Entry); } 1051 Entry* data() { OPEN_ARRAY_START(Entry, Entry); }
1051 Entry const* data() const { OPEN_ARRAY_START(Entry, Entry); } 1052 Entry const* data() const { OPEN_ARRAY_START(Entry, Entry); }
1052 1053
1053 Entry* first_entry() { return &ptr()->data()[0]; } 1054 Entry* first_entry() { return &ptr()->data()[0]; }
1054 1055
1055 friend class Object; 1056 friend class Object;
1057 friend class SnapshotReader;
1056 }; 1058 };
1057 1059
1058 1060
1059 class RawInstructions : public RawObject { 1061 class RawInstructions : public RawObject {
1060 RAW_HEAP_OBJECT_IMPLEMENTATION(Instructions); 1062 RAW_HEAP_OBJECT_IMPLEMENTATION(Instructions);
1061 1063
1062 RawObject** from() { 1064 RawObject** from() {
1063 return reinterpret_cast<RawObject**>(&ptr()->code_); 1065 return reinterpret_cast<RawObject**>(&ptr()->code_);
1064 } 1066 }
1065 RawCode* code_; 1067 RawCode* code_;
(...skipping 11 matching lines...) Expand all
1077 // is not allowed to create handles. 1079 // is not allowed to create handles.
1078 static bool ContainsPC(RawObject* raw_obj, uword pc); 1080 static bool ContainsPC(RawObject* raw_obj, uword pc);
1079 1081
1080 friend class RawCode; 1082 friend class RawCode;
1081 friend class RawFunction; 1083 friend class RawFunction;
1082 friend class Code; 1084 friend class Code;
1083 friend class StackFrame; 1085 friend class StackFrame;
1084 friend class MarkingVisitor; 1086 friend class MarkingVisitor;
1085 friend class SkippedCodeFunctions; 1087 friend class SkippedCodeFunctions;
1086 friend class Function; 1088 friend class Function;
1089 friend class InstructionsReader;
1087 }; 1090 };
1088 1091
1089 1092
1090 class RawPcDescriptors : public RawObject { 1093 class RawPcDescriptors : public RawObject {
1091 public: 1094 public:
1092 enum Kind { 1095 enum Kind {
1093 kDeopt = 1, // Deoptimization continuation point. 1096 kDeopt = 1, // Deoptimization continuation point.
1094 kIcCall = kDeopt << 1, // IC call. 1097 kIcCall = kDeopt << 1, // IC call.
1095 kUnoptStaticCall = kIcCall << 1, // Call to a known target via stub. 1098 kUnoptStaticCall = kIcCall << 1, // Call to a known target via stub.
1096 kRuntimeCall = kUnoptStaticCall << 1, // Runtime call. 1099 kRuntimeCall = kUnoptStaticCall << 1, // Runtime call.
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
1134 private: 1137 private:
1135 RAW_HEAP_OBJECT_IMPLEMENTATION(PcDescriptors); 1138 RAW_HEAP_OBJECT_IMPLEMENTATION(PcDescriptors);
1136 1139
1137 int32_t length_; // Number of descriptors. 1140 int32_t length_; // Number of descriptors.
1138 1141
1139 // Variable length data follows here. 1142 // Variable length data follows here.
1140 uint8_t* data() { OPEN_ARRAY_START(uint8_t, intptr_t); } 1143 uint8_t* data() { OPEN_ARRAY_START(uint8_t, intptr_t); }
1141 const uint8_t* data() const { OPEN_ARRAY_START(uint8_t, intptr_t); } 1144 const uint8_t* data() const { OPEN_ARRAY_START(uint8_t, intptr_t); }
1142 1145
1143 friend class Object; 1146 friend class Object;
1147 friend class SnapshotReader;
1144 }; 1148 };
1145 1149
1146 1150
1147 // Stackmap is an immutable representation of the layout of the stack at a 1151 // Stackmap is an immutable representation of the layout of the stack at a
1148 // PC. The stack map representation consists of a bit map which marks each 1152 // PC. The stack map representation consists of a bit map which marks each
1149 // live object index starting from the base of the frame. 1153 // live object index starting from the base of the frame.
1150 // 1154 //
1151 // The Stackmap also consists of a link to the code object corresponding to 1155 // The bit map representation is optimized for dense and small bit maps, without
1152 // the frame which the stack map is describing. The bit map representation 1156 // any upper bound.
1153 // is optimized for dense and small bit maps, without any upper bound.
1154 class RawStackmap : public RawObject { 1157 class RawStackmap : public RawObject {
1155 RAW_HEAP_OBJECT_IMPLEMENTATION(Stackmap); 1158 RAW_HEAP_OBJECT_IMPLEMENTATION(Stackmap);
1156 1159
1157 // Regarding changing this to a bitfield: ARM64 requires register_bit_count_ 1160 // Regarding changing this to a bitfield: ARM64 requires register_bit_count_
1158 // to be as large as 96, meaning 7 bits, leaving 25 bits for the length, or 1161 // to be as large as 96, meaning 7 bits, leaving 25 bits for the length, or
1159 // as large as ~33 million entries. If that is sufficient, then these two 1162 // as large as ~33 million entries. If that is sufficient, then these two
1160 // fields can be merged into a BitField. 1163 // fields can be merged into a BitField.
1161 int32_t length_; // Length of payload, in bits. 1164 int32_t length_; // Length of payload, in bits.
1162 int32_t register_bit_count_; // Live register bits, included in length_. 1165 int32_t register_bit_count_; // Live register bits, included in length_.
1163 1166
1164 // Offset from code entry point corresponding to this stack map 1167 // Offset from code entry point corresponding to this stack map
1165 // representation. 1168 // representation.
1166 uint32_t pc_offset_; 1169 uint32_t pc_offset_;
1167 1170
1168 // Variable length data follows here (bitmap of the stack layout). 1171 // Variable length data follows here (bitmap of the stack layout).
1169 uint8_t* data() { OPEN_ARRAY_START(uint8_t, uint8_t); } 1172 uint8_t* data() { OPEN_ARRAY_START(uint8_t, uint8_t); }
1170 const uint8_t* data() const { OPEN_ARRAY_START(uint8_t, uint8_t); } 1173 const uint8_t* data() const { OPEN_ARRAY_START(uint8_t, uint8_t); }
1174
1175 friend class SnapshotReader;
1171 }; 1176 };
1172 1177
1173 1178
1174 class RawLocalVarDescriptors : public RawObject { 1179 class RawLocalVarDescriptors : public RawObject {
1175 public: 1180 public:
1176 enum VarInfoKind { 1181 enum VarInfoKind {
1177 kStackVar = 1, 1182 kStackVar = 1,
1178 kContextVar, 1183 kContextVar,
1179 kContextLevel, 1184 kContextLevel,
1180 kSavedCurrentContext, 1185 kSavedCurrentContext,
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
1235 RawObject** to(intptr_t num_entries) { 1240 RawObject** to(intptr_t num_entries) {
1236 return reinterpret_cast<RawObject**>(nameAddrAt(num_entries - 1)); 1241 return reinterpret_cast<RawObject**>(nameAddrAt(num_entries - 1));
1237 } 1242 }
1238 1243
1239 // Variable info with [num_entries_] entries. 1244 // Variable info with [num_entries_] entries.
1240 VarInfo* data() { 1245 VarInfo* data() {
1241 return reinterpret_cast<VarInfo*>(nameAddrAt(ptr()->num_entries_)); 1246 return reinterpret_cast<VarInfo*>(nameAddrAt(ptr()->num_entries_));
1242 } 1247 }
1243 1248
1244 friend class Object; 1249 friend class Object;
1250 friend class SnapshotReader;
1245 }; 1251 };
1246 1252
1247 1253
1248 class RawExceptionHandlers : public RawObject { 1254 class RawExceptionHandlers : public RawObject {
1249 public: 1255 public:
1250 // The index into the ExceptionHandlers table corresponds to 1256 // The index into the ExceptionHandlers table corresponds to
1251 // the try_index of the handler. 1257 // the try_index of the handler.
1252 struct HandlerInfo { 1258 struct HandlerInfo {
1253 uint32_t handler_pc_offset; // PC offset value of handler. 1259 uint32_t handler_pc_offset; // PC offset value of handler.
1254 int16_t outer_try_index; // Try block index of enclosing try block. 1260 int16_t outer_try_index; // Try block index of enclosing try block.
1255 int8_t needs_stacktrace; // True if a stacktrace is needed. 1261 int8_t needs_stacktrace; // True if a stacktrace is needed.
1256 int8_t has_catch_all; // Catches all exceptions. 1262 int8_t has_catch_all; // Catches all exceptions.
1257 }; 1263 };
1258 1264
1259 private: 1265 private:
1260 RAW_HEAP_OBJECT_IMPLEMENTATION(ExceptionHandlers); 1266 RAW_HEAP_OBJECT_IMPLEMENTATION(ExceptionHandlers);
1261 1267
1262 // Number of exception handler entries. 1268 // Number of exception handler entries.
1263 int32_t num_entries_; 1269 int32_t num_entries_;
1264 1270
1265 // Array with [num_entries_] entries. Each entry is an array of all handled 1271 // Array with [num_entries_] entries. Each entry is an array of all handled
1266 // exception types. 1272 // exception types.
1267 RawArray* handled_types_data_; 1273 RawArray* handled_types_data_;
1268 1274
1269 // Exception handler info of length [num_entries_]. 1275 // Exception handler info of length [num_entries_].
1270 const HandlerInfo* data() const { OPEN_ARRAY_START(HandlerInfo, intptr_t); } 1276 const HandlerInfo* data() const { OPEN_ARRAY_START(HandlerInfo, intptr_t); }
1271 HandlerInfo* data() { OPEN_ARRAY_START(HandlerInfo, intptr_t); } 1277 HandlerInfo* data() { OPEN_ARRAY_START(HandlerInfo, intptr_t); }
1272 1278
1273 friend class Object; 1279 friend class Object;
1280 friend class SnapshotReader;
1274 }; 1281 };
1275 1282
1276 1283
1277 class RawContext : public RawObject { 1284 class RawContext : public RawObject {
1278 RAW_HEAP_OBJECT_IMPLEMENTATION(Context); 1285 RAW_HEAP_OBJECT_IMPLEMENTATION(Context);
1279 1286
1280 int32_t num_variables_; 1287 int32_t num_variables_;
1281 1288
1282 RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->parent_); } 1289 RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->parent_); }
1283 RawContext* parent_; 1290 RawContext* parent_;
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
1328 return &(reinterpret_cast<const VariableDesc*>(data())[index]); 1335 return &(reinterpret_cast<const VariableDesc*>(data())[index]);
1329 } 1336 }
1330 RawObject** to(intptr_t num_vars) { 1337 RawObject** to(intptr_t num_vars) {
1331 uword end = reinterpret_cast<uword>(ptr()->VariableDescAddr(num_vars)); 1338 uword end = reinterpret_cast<uword>(ptr()->VariableDescAddr(num_vars));
1332 // 'end' is the address just beyond the last descriptor, so step back. 1339 // 'end' is the address just beyond the last descriptor, so step back.
1333 return reinterpret_cast<RawObject**>(end - kWordSize); 1340 return reinterpret_cast<RawObject**>(end - kWordSize);
1334 } 1341 }
1335 1342
1336 friend class Object; 1343 friend class Object;
1337 friend class RawClosureData; 1344 friend class RawClosureData;
1345 friend class SnapshotReader;
1338 }; 1346 };
1339 1347
1340 1348
1341 class RawICData : public RawObject { 1349 class RawICData : public RawObject {
1342 RAW_HEAP_OBJECT_IMPLEMENTATION(ICData); 1350 RAW_HEAP_OBJECT_IMPLEMENTATION(ICData);
1343 1351
1344 RawObject** from() { 1352 RawObject** from() {
1345 return reinterpret_cast<RawObject**>(&ptr()->owner_); 1353 return reinterpret_cast<RawObject**>(&ptr()->owner_);
1346 } 1354 }
1347 RawFunction* owner_; // Parent/calling function of this IC. 1355 RawFunction* owner_; // Parent/calling function of this IC.
(...skipping 857 matching lines...) Expand 10 before | Expand all | Expand 10 after
2205 COMPILE_ASSERT(kExternalTypedDataInt8ArrayCid == 2213 COMPILE_ASSERT(kExternalTypedDataInt8ArrayCid ==
2206 kTypedDataInt8ArrayViewCid + 15); 2214 kTypedDataInt8ArrayViewCid + 15);
2207 COMPILE_ASSERT(kByteBufferCid == kExternalTypedDataInt8ArrayCid + 14); 2215 COMPILE_ASSERT(kByteBufferCid == kExternalTypedDataInt8ArrayCid + 14);
2208 COMPILE_ASSERT(kNullCid == kByteBufferCid + 1); 2216 COMPILE_ASSERT(kNullCid == kByteBufferCid + 1);
2209 return (kNullCid - kTypedDataInt8ArrayCid); 2217 return (kNullCid - kTypedDataInt8ArrayCid);
2210 } 2218 }
2211 2219
2212 } // namespace dart 2220 } // namespace dart
2213 2221
2214 #endif // VM_RAW_OBJECT_H_ 2222 #endif // VM_RAW_OBJECT_H_
OLDNEW
« no previous file with comments | « runtime/vm/object.cc ('k') | runtime/vm/raw_object_snapshot.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698