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

Side by Side Diff: tools/gen-postmortem-metadata.py

Issue 1437133006: postmortem: export private field offsets Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 1 month 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 | « src/isolate.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 2
3 # 3 #
4 # Copyright 2012 the V8 project authors. All rights reserved. 4 # Copyright 2012 the V8 project authors. All rights reserved.
5 # Redistribution and use in source and binary forms, with or without 5 # Redistribution and use in source and binary forms, with or without
6 # modification, are permitted provided that the following conditions are 6 # modification, are permitted provided that the following conditions are
7 # met: 7 # met:
8 # 8 #
9 # * Redistributions of source code must retain the above copyright 9 # * Redistributions of source code must retain the above copyright
10 # notice, this list of conditions and the following disclaimer. 10 # notice, this list of conditions and the following disclaimer.
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
174 174
175 { 'name': 'sharedfunctioninfo_start_position_mask', 175 { 'name': 'sharedfunctioninfo_start_position_mask',
176 'value': 'SharedFunctionInfo::kStartPositionMask' }, 176 'value': 'SharedFunctionInfo::kStartPositionMask' },
177 { 'name': 'sharedfunctioninfo_start_position_shift', 177 { 'name': 'sharedfunctioninfo_start_position_shift',
178 'value': 'SharedFunctionInfo::kStartPositionShift' }, 178 'value': 'SharedFunctionInfo::kStartPositionShift' },
179 179
180 { 'name': 'jsarray_buffer_was_neutered_mask', 180 { 'name': 'jsarray_buffer_was_neutered_mask',
181 'value': 'JSArrayBuffer::WasNeutered::kMask' }, 181 'value': 'JSArrayBuffer::WasNeutered::kMask' },
182 { 'name': 'jsarray_buffer_was_neutered_shift', 182 { 'name': 'jsarray_buffer_was_neutered_shift',
183 'value': 'JSArrayBuffer::WasNeutered::kShift' }, 183 'value': 'JSArrayBuffer::WasNeutered::kShift' },
184
185 { 'name': 'new_space',
186 'value': 'AllocationSpace::NEW_SPACE' },
187 { 'name': 'old_space',
188 'value': 'AllocationSpace::OLD_SPACE' },
189 { 'name': 'code_space',
190 'value': 'AllocationSpace::CODE_SPACE' },
191 { 'name': 'map_space',
192 'value': 'AllocationSpace::MAP_SPACE' },
193 { 'name': 'lo_space',
194 'value': 'AllocationSpace::LO_SPACE' },
195 { 'name': 'first_space',
196 'value': 'AllocationSpace::FIRST_SPACE' },
197 { 'name': 'last_space',
198 'value': 'AllocationSpace::LAST_SPACE' },
199 { 'name': 'first_paged_space',
200 'value': 'AllocationSpace::FIRST_PAGED_SPACE' },
201 { 'name': 'last_paged_space',
202 'value': 'AllocationSpace::LAST_PAGED_SPACE' },
184 ]; 203 ];
185 204
186 # 205 #
187 # The following useful fields are missing accessors, so we define fake ones. 206 # The following useful fields are missing accessors, so we define fake ones.
188 # 207 #
189 extras_accessors = [ 208 extras_accessors = [
190 'JSFunction, context, Context, kContextOffset', 209 'JSFunction, context, Context, kContextOffset',
191 'Context, closure_index, int, CLOSURE_INDEX', 210 'Context, closure_index, int, CLOSURE_INDEX',
192 'Context, global_object_index, int, GLOBAL_OBJECT_INDEX', 211 'Context, global_object_index, int, GLOBAL_OBJECT_INDEX',
193 'Context, previous_index, int, PREVIOUS_INDEX', 212 'Context, previous_index, int, PREVIOUS_INDEX',
(...skipping 22 matching lines...) Expand all
216 'ConsString, first, String, kFirstOffset', 235 'ConsString, first, String, kFirstOffset',
217 'ConsString, second, String, kSecondOffset', 236 'ConsString, second, String, kSecondOffset',
218 'ExternalString, resource, Object, kResourceOffset', 237 'ExternalString, resource, Object, kResourceOffset',
219 'SeqOneByteString, chars, char, kHeaderSize', 238 'SeqOneByteString, chars, char, kHeaderSize',
220 'SeqTwoByteString, chars, char, kHeaderSize', 239 'SeqTwoByteString, chars, char, kHeaderSize',
221 'SharedFunctionInfo, code, Code, kCodeOffset', 240 'SharedFunctionInfo, code, Code, kCodeOffset',
222 'SharedFunctionInfo, scope_info, ScopeInfo, kScopeInfoOffset', 241 'SharedFunctionInfo, scope_info, ScopeInfo, kScopeInfoOffset',
223 'SlicedString, parent, String, kParentOffset', 242 'SlicedString, parent, String, kParentOffset',
224 'Code, instruction_start, uintptr_t, kHeaderSize', 243 'Code, instruction_start, uintptr_t, kHeaderSize',
225 'Code, instruction_size, int, kInstructionSizeOffset', 244 'Code, instruction_size, int, kInstructionSizeOffset',
245 'Heap, root_count, int, kRootListLength',
226 ]; 246 ];
227 247
228 # 248 #
229 # The following is a whitelist of classes we expect to find when scanning the 249 # The following is a whitelist of classes we expect to find when scanning the
230 # source code. This list is not exhaustive, but it's still useful to identify 250 # source code. This list is not exhaustive, but it's still useful to identify
231 # when this script gets out of sync with the source. See load_objects(). 251 # when this script gets out of sync with the source. See load_objects().
232 # 252 #
233 expected_classes = [ 253 expected_classes = [
234 'ConsString', 'FixedArray', 'HeapNumber', 'JSArray', 'JSFunction', 254 'ConsString', 'FixedArray', 'HeapNumber', 'JSArray', 'JSFunction',
235 'JSObject', 'JSRegExp', 'JSValue', 'Map', 'Oddball', 'Script', 255 'JSObject', 'JSRegExp', 'JSValue', 'Map', 'Oddball', 'Script',
236 'SeqOneByteString', 'SharedFunctionInfo' 256 'SeqOneByteString', 'SharedFunctionInfo'
237 ]; 257 ];
238 258
239 259
260 private_fields = [
261 { 'class': 'Isolate', 'field': 'heap_' },
262
263 { 'class': 'Heap', 'field': 'amount_of_external_allocated_memory_' },
264 { 'class': 'Heap', 'field': 'roots_' },
265 { 'class': 'Heap', 'field': 'new_space_' },
266 { 'class': 'Heap', 'field': 'old_space_' },
267 { 'class': 'Heap', 'field': 'code_space_' },
268 { 'class': 'Heap', 'field': 'map_space_' },
269 { 'class': 'Heap', 'field': 'lo_space_' },
270
271 { 'class': 'NewSpace', 'field': 'heap_' },
272 { 'class': 'NewSpace', 'field': 'id_' },
273 { 'class': 'NewSpace', 'field': 'executable_' },
274 { 'class': 'NewSpace', 'field': 'to_space_' },
275 { 'class': 'NewSpace', 'field': 'from_space_' },
276 { 'class': 'NewSpace', 'field': 'pages_used_' },
277
278 { 'class': 'SemiSpace', 'field': 'heap_' },
279 { 'class': 'SemiSpace', 'field': 'id_' },
280 { 'class': 'SemiSpace', 'field': 'executable_' },
281 { 'class': 'SemiSpace', 'field': 'anchor_' },
282 { 'class': 'SemiSpace', 'field': 'current_page_' },
283 { 'class': 'SemiSpace', 'field': 'committed_' },
284
285 { 'class': 'OldSpace', 'field': 'heap_' },
286 { 'class': 'OldSpace', 'field': 'id_' },
287 { 'class': 'OldSpace', 'field': 'executable_' },
288 { 'class': 'OldSpace', 'field': 'anchor_' },
289
290 { 'class': 'MapSpace', 'field': 'heap_' },
291 { 'class': 'MapSpace', 'field': 'id_' },
292 { 'class': 'MapSpace', 'field': 'executable_' },
293 { 'class': 'MapSpace', 'field': 'anchor_' },
294
295 { 'class': 'LargeObjectSpace', 'field': 'heap_' },
296 { 'class': 'LargeObjectSpace', 'field': 'id_' },
297 { 'class': 'LargeObjectSpace', 'field': 'executable_' },
298 { 'class': 'LargeObjectSpace', 'field': 'size_' },
299 { 'class': 'LargeObjectSpace', 'field': 'objects_size_' },
300 { 'class': 'LargeObjectSpace', 'field': 'first_page_' },
301
302 { 'class': 'Page', 'field': 'size_' },
303 { 'class': 'Page', 'field': 'area_start_' },
304 { 'class': 'Page', 'field': 'area_end_' },
305 { 'class': 'Page', 'field': 'prev_chunk_' },
306 { 'class': 'Page', 'field': 'next_chunk_' },
307
308 { 'class': 'NewSpacePage', 'field': 'size_' },
309 { 'class': 'NewSpacePage', 'field': 'area_start_' },
310 { 'class': 'NewSpacePage', 'field': 'area_end_' },
311 { 'class': 'NewSpacePage', 'field': 'prev_chunk_' },
312 { 'class': 'NewSpacePage', 'field': 'next_chunk_' },
313
314 { 'class': 'LargePage', 'field': 'size_' },
315 { 'class': 'LargePage', 'field': 'area_start_' },
316 { 'class': 'LargePage', 'field': 'area_end_' },
317 { 'class': 'LargePage', 'field': 'prev_chunk_' },
318 { 'class': 'LargePage', 'field': 'next_chunk_' },
319 ];
320
240 # 321 #
241 # The following structures store high-level representations of the structures 322 # The following structures store high-level representations of the structures
242 # for which we're going to emit descriptive constants. 323 # for which we're going to emit descriptive constants.
243 # 324 #
244 types = {}; # set of all type names 325 types = {}; # set of all type names
245 typeclasses = {}; # maps type names to corresponding class names 326 typeclasses = {}; # maps type names to corresponding class names
246 klasses = {}; # known classes, including parents 327 klasses = {}; # known classes, including parents
247 fields = []; # field declarations 328 fields = []; # field declarations
248 329
249 header = ''' 330 header = '''
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after
531 # Fix up overzealous parses. This could be done inside the 612 # Fix up overzealous parses. This could be done inside the
532 # parsers but as there are several, it's easiest to do it here. 613 # parsers but as there are several, it's easiest to do it here.
533 ws = re.compile('\s+') 614 ws = re.compile('\s+')
534 for const in consts: 615 for const in consts:
535 name = ws.sub('', const['name']) 616 name = ws.sub('', const['name'])
536 value = ws.sub('', str(const['value'])) # Can be a number. 617 value = ws.sub('', str(const['value'])) # Can be a number.
537 out.write('int v8dbg_%s = %s;\n' % (name, value)) 618 out.write('int v8dbg_%s = %s;\n' % (name, value))
538 out.write('\n'); 619 out.write('\n');
539 620
540 # 621 #
622 # Emit private fields class and values
623 #
624 def emit_private_fields(out, fields, consts):
625 # Fix up overzealous parses. This could be done inside the
626 # parsers but as there are several, it's easiest to do it here.
627 ws = re.compile('\s+')
628 out.write('namespace v8 {\n');
629 out.write('namespace internal {\n\n');
630 out.write('class PostMortem {\n');
631 out.write(' public:\n');
632 for field in fields:
633 klass = ws.sub('', field['class'])
634 field = ws.sub('', field['field'])
635 out.write(' static const int k%s__%s = offsetof(%s, %s);\n' %
636 (klass, field, klass, field));
637 consts.append({
638 'name': 'field_%s__%s' % (klass, field),
639 'value': 'v8::internal::PostMortem::k%s__%s' %
640 (klass, field)
641 });
642 out.write('};\n');
643 out.write('} // namespace internal\n');
644 out.write('} // namespace v8\n\n');
645
646 #
541 # Emit the whole output file. 647 # Emit the whole output file.
542 # 648 #
543 def emit_config(): 649 def emit_config():
544 out = file(sys.argv[1], 'w'); 650 out = file(sys.argv[1], 'w');
545 651
546 out.write(header); 652 out.write(header);
547 653
548 out.write('/* miscellaneous constants */\n'); 654 out.write('/* miscellaneous constants */\n');
549 emit_set(out, consts_misc); 655 emit_set(out, consts_misc);
550 656
(...skipping 22 matching lines...) Expand all
573 consts.append({ 679 consts.append({
574 'name': 'parent_%s__%s' % (klassname, pklass), 680 'name': 'parent_%s__%s' % (klassname, pklass),
575 'value': 0 681 'value': 0
576 }); 682 });
577 683
578 emit_set(out, consts); 684 emit_set(out, consts);
579 685
580 out.write('/* field information */\n'); 686 out.write('/* field information */\n');
581 emit_set(out, fields); 687 emit_set(out, fields);
582 688
689 out.write('/* private fields */\n');
690 consts = []
691 emit_private_fields(out, private_fields, consts);
692
693 emit_set(out, consts);
694
583 out.write(footer); 695 out.write(footer);
584 696
585 if (len(sys.argv) < 4): 697 if (len(sys.argv) < 4):
586 print('usage: %s output.cc objects.h objects-inl.h' % sys.argv[0]); 698 print('usage: %s output.cc objects.h objects-inl.h' % sys.argv[0]);
587 sys.exit(2); 699 sys.exit(2);
588 700
589 load_objects(); 701 load_objects();
590 load_fields(); 702 load_fields();
591 emit_config(); 703 emit_config();
OLDNEW
« no previous file with comments | « src/isolate.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698