Index: tools/gen-postmortem-metadata.py |
diff --git a/tools/gen-postmortem-metadata.py b/tools/gen-postmortem-metadata.py |
index 032b713393b6609cf8323fae732c846d7178b35b..76c8ad8364cc81adcf94f9d6018c982462494137 100644 |
--- a/tools/gen-postmortem-metadata.py |
+++ b/tools/gen-postmortem-metadata.py |
@@ -181,6 +181,25 @@ consts_misc = [ |
'value': 'JSArrayBuffer::WasNeutered::kMask' }, |
{ 'name': 'jsarray_buffer_was_neutered_shift', |
'value': 'JSArrayBuffer::WasNeutered::kShift' }, |
+ |
+ { 'name': 'new_space', |
+ 'value': 'AllocationSpace::NEW_SPACE' }, |
+ { 'name': 'old_space', |
+ 'value': 'AllocationSpace::OLD_SPACE' }, |
+ { 'name': 'code_space', |
+ 'value': 'AllocationSpace::CODE_SPACE' }, |
+ { 'name': 'map_space', |
+ 'value': 'AllocationSpace::MAP_SPACE' }, |
+ { 'name': 'lo_space', |
+ 'value': 'AllocationSpace::LO_SPACE' }, |
+ { 'name': 'first_space', |
+ 'value': 'AllocationSpace::FIRST_SPACE' }, |
+ { 'name': 'last_space', |
+ 'value': 'AllocationSpace::LAST_SPACE' }, |
+ { 'name': 'first_paged_space', |
+ 'value': 'AllocationSpace::FIRST_PAGED_SPACE' }, |
+ { 'name': 'last_paged_space', |
+ 'value': 'AllocationSpace::LAST_PAGED_SPACE' }, |
]; |
# |
@@ -223,6 +242,7 @@ extras_accessors = [ |
'SlicedString, parent, String, kParentOffset', |
'Code, instruction_start, uintptr_t, kHeaderSize', |
'Code, instruction_size, int, kInstructionSizeOffset', |
+ 'Heap, root_count, int, kRootListLength', |
]; |
# |
@@ -237,6 +257,67 @@ expected_classes = [ |
]; |
+private_fields = [ |
+ { 'class': 'Isolate', 'field': 'heap_' }, |
+ |
+ { 'class': 'Heap', 'field': 'amount_of_external_allocated_memory_' }, |
+ { 'class': 'Heap', 'field': 'roots_' }, |
+ { 'class': 'Heap', 'field': 'new_space_' }, |
+ { 'class': 'Heap', 'field': 'old_space_' }, |
+ { 'class': 'Heap', 'field': 'code_space_' }, |
+ { 'class': 'Heap', 'field': 'map_space_' }, |
+ { 'class': 'Heap', 'field': 'lo_space_' }, |
+ |
+ { 'class': 'NewSpace', 'field': 'heap_' }, |
+ { 'class': 'NewSpace', 'field': 'id_' }, |
+ { 'class': 'NewSpace', 'field': 'executable_' }, |
+ { 'class': 'NewSpace', 'field': 'to_space_' }, |
+ { 'class': 'NewSpace', 'field': 'from_space_' }, |
+ { 'class': 'NewSpace', 'field': 'pages_used_' }, |
+ |
+ { 'class': 'SemiSpace', 'field': 'heap_' }, |
+ { 'class': 'SemiSpace', 'field': 'id_' }, |
+ { 'class': 'SemiSpace', 'field': 'executable_' }, |
+ { 'class': 'SemiSpace', 'field': 'anchor_' }, |
+ { 'class': 'SemiSpace', 'field': 'current_page_' }, |
+ { 'class': 'SemiSpace', 'field': 'committed_' }, |
+ |
+ { 'class': 'OldSpace', 'field': 'heap_' }, |
+ { 'class': 'OldSpace', 'field': 'id_' }, |
+ { 'class': 'OldSpace', 'field': 'executable_' }, |
+ { 'class': 'OldSpace', 'field': 'anchor_' }, |
+ |
+ { 'class': 'MapSpace', 'field': 'heap_' }, |
+ { 'class': 'MapSpace', 'field': 'id_' }, |
+ { 'class': 'MapSpace', 'field': 'executable_' }, |
+ { 'class': 'MapSpace', 'field': 'anchor_' }, |
+ |
+ { 'class': 'LargeObjectSpace', 'field': 'heap_' }, |
+ { 'class': 'LargeObjectSpace', 'field': 'id_' }, |
+ { 'class': 'LargeObjectSpace', 'field': 'executable_' }, |
+ { 'class': 'LargeObjectSpace', 'field': 'size_' }, |
+ { 'class': 'LargeObjectSpace', 'field': 'objects_size_' }, |
+ { 'class': 'LargeObjectSpace', 'field': 'first_page_' }, |
+ |
+ { 'class': 'Page', 'field': 'size_' }, |
+ { 'class': 'Page', 'field': 'area_start_' }, |
+ { 'class': 'Page', 'field': 'area_end_' }, |
+ { 'class': 'Page', 'field': 'prev_chunk_' }, |
+ { 'class': 'Page', 'field': 'next_chunk_' }, |
+ |
+ { 'class': 'NewSpacePage', 'field': 'size_' }, |
+ { 'class': 'NewSpacePage', 'field': 'area_start_' }, |
+ { 'class': 'NewSpacePage', 'field': 'area_end_' }, |
+ { 'class': 'NewSpacePage', 'field': 'prev_chunk_' }, |
+ { 'class': 'NewSpacePage', 'field': 'next_chunk_' }, |
+ |
+ { 'class': 'LargePage', 'field': 'size_' }, |
+ { 'class': 'LargePage', 'field': 'area_start_' }, |
+ { 'class': 'LargePage', 'field': 'area_end_' }, |
+ { 'class': 'LargePage', 'field': 'prev_chunk_' }, |
+ { 'class': 'LargePage', 'field': 'next_chunk_' }, |
+]; |
+ |
# |
# The following structures store high-level representations of the structures |
# for which we're going to emit descriptive constants. |
@@ -538,6 +619,31 @@ def emit_set(out, consts): |
out.write('\n'); |
# |
+# Emit private fields class and values |
+# |
+def emit_private_fields(out, fields, consts): |
+ # Fix up overzealous parses. This could be done inside the |
+ # parsers but as there are several, it's easiest to do it here. |
+ ws = re.compile('\s+') |
+ out.write('namespace v8 {\n'); |
+ out.write('namespace internal {\n\n'); |
+ out.write('class PostMortem {\n'); |
+ out.write(' public:\n'); |
+ for field in fields: |
+ klass = ws.sub('', field['class']) |
+ field = ws.sub('', field['field']) |
+ out.write(' static const int k%s__%s = offsetof(%s, %s);\n' % |
+ (klass, field, klass, field)); |
+ consts.append({ |
+ 'name': 'field_%s__%s' % (klass, field), |
+ 'value': 'v8::internal::PostMortem::k%s__%s' % |
+ (klass, field) |
+ }); |
+ out.write('};\n'); |
+ out.write('} // namespace internal\n'); |
+ out.write('} // namespace v8\n\n'); |
+ |
+# |
# Emit the whole output file. |
# |
def emit_config(): |
@@ -580,6 +686,12 @@ def emit_config(): |
out.write('/* field information */\n'); |
emit_set(out, fields); |
+ out.write('/* private fields */\n'); |
+ consts = [] |
+ emit_private_fields(out, private_fields, consts); |
+ |
+ emit_set(out, consts); |
+ |
out.write(footer); |
if (len(sys.argv) < 4): |