OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
63 function parseState(s) { | 63 function parseState(s) { |
64 switch (s) { | 64 switch (s) { |
65 case "": return Profile.CodeState.COMPILED; | 65 case "": return Profile.CodeState.COMPILED; |
66 case "~": return Profile.CodeState.OPTIMIZABLE; | 66 case "~": return Profile.CodeState.OPTIMIZABLE; |
67 case "*": return Profile.CodeState.OPTIMIZED; | 67 case "*": return Profile.CodeState.OPTIMIZED; |
68 } | 68 } |
69 throw new Error("unknown code state: " + s); | 69 throw new Error("unknown code state: " + s); |
70 } | 70 } |
71 | 71 |
72 | 72 |
73 function SnapshotLogProcessor() { | |
74 LogReader.call(this, { | |
75 'code-creation': { | |
76 parsers: [null, parseInt, parseInt, parseInt, null, 'var-args'], | |
77 processor: this.processCodeCreation }, | |
78 'code-move': { parsers: [parseInt, parseInt], | |
79 processor: this.processCodeMove }, | |
80 'code-delete': { parsers: [parseInt], | |
81 processor: this.processCodeDelete }, | |
82 'function-creation': null, | |
83 'function-move': null, | |
84 'function-delete': null, | |
85 'sfi-move': null, | |
86 'snapshot-pos': { parsers: [parseInt, parseInt], | |
87 processor: this.processSnapshotPosition }}); | |
88 | |
89 V8Profile.prototype.handleUnknownCode = function(operation, addr) { | |
90 var op = Profile.Operation; | |
91 switch (operation) { | |
92 case op.MOVE: | |
93 print('Snapshot: Code move event for unknown code: 0x' + | |
94 addr.toString(16)); | |
95 break; | |
96 case op.DELETE: | |
97 print('Snapshot: Code delete event for unknown code: 0x' + | |
98 addr.toString(16)); | |
99 break; | |
100 } | |
101 }; | |
102 | |
103 this.profile_ = new V8Profile(); | |
104 this.serializedEntries_ = []; | |
105 } | |
106 inherits(SnapshotLogProcessor, LogReader); | |
107 | |
108 | |
109 SnapshotLogProcessor.prototype.processCodeCreation = function( | |
110 type, kind, start, size, name, maybe_func) { | |
111 if (maybe_func.length) { | |
112 var funcAddr = parseInt(maybe_func[0]); | |
113 var state = parseState(maybe_func[1]); | |
114 this.profile_.addFuncCode(type, name, start, size, funcAddr, state); | |
115 } else { | |
116 this.profile_.addCode(type, name, start, size); | |
117 } | |
118 }; | |
119 | |
120 | |
121 SnapshotLogProcessor.prototype.processCodeMove = function(from, to) { | |
122 this.profile_.moveCode(from, to); | |
123 }; | |
124 | |
125 | |
126 SnapshotLogProcessor.prototype.processCodeDelete = function(start) { | |
127 this.profile_.deleteCode(start); | |
128 }; | |
129 | |
130 | |
131 SnapshotLogProcessor.prototype.processSnapshotPosition = function(addr, pos) { | |
132 this.serializedEntries_[pos] = this.profile_.findEntry(addr); | |
133 }; | |
134 | |
135 | |
136 SnapshotLogProcessor.prototype.processLogFile = function(fileName) { | |
137 var contents = readFile(fileName); | |
138 this.processLogChunk(contents); | |
139 }; | |
140 | |
141 | |
142 SnapshotLogProcessor.prototype.getSerializedEntryName = function(pos) { | |
143 var entry = this.serializedEntries_[pos]; | |
144 return entry ? entry.getRawName() : null; | |
145 }; | |
146 | |
147 | |
148 function TickProcessor( | 73 function TickProcessor( |
149 cppEntriesProvider, | 74 cppEntriesProvider, |
150 separateIc, | 75 separateIc, |
151 callGraphSize, | 76 callGraphSize, |
152 ignoreUnknown, | 77 ignoreUnknown, |
153 stateFilter, | 78 stateFilter, |
154 snapshotLogProcessor, | |
155 distortion, | 79 distortion, |
156 range, | 80 range, |
157 sourceMap, | 81 sourceMap, |
158 timedRange, | 82 timedRange, |
159 pairwiseTimedRange, | 83 pairwiseTimedRange, |
160 onlySummary) { | 84 onlySummary) { |
161 LogReader.call(this, { | 85 LogReader.call(this, { |
162 'shared-library': { parsers: [null, parseInt, parseInt], | 86 'shared-library': { parsers: [null, parseInt, parseInt], |
163 processor: this.processSharedLibrary }, | 87 processor: this.processSharedLibrary }, |
164 'code-creation': { | 88 'code-creation': { |
165 parsers: [null, parseInt, parseInt, parseInt, null, 'var-args'], | 89 parsers: [null, parseInt, parseInt, parseInt, null, 'var-args'], |
166 processor: this.processCodeCreation }, | 90 processor: this.processCodeCreation }, |
167 'code-move': { parsers: [parseInt, parseInt], | 91 'code-move': { parsers: [parseInt, parseInt], |
168 processor: this.processCodeMove }, | 92 processor: this.processCodeMove }, |
169 'code-delete': { parsers: [parseInt], | 93 'code-delete': { parsers: [parseInt], |
170 processor: this.processCodeDelete }, | 94 processor: this.processCodeDelete }, |
171 'sfi-move': { parsers: [parseInt, parseInt], | 95 'sfi-move': { parsers: [parseInt, parseInt], |
172 processor: this.processFunctionMove }, | 96 processor: this.processFunctionMove }, |
173 'snapshot-pos': { parsers: [parseInt, parseInt], | |
174 processor: this.processSnapshotPosition }, | |
175 'tick': { | 97 'tick': { |
176 parsers: [parseInt, parseInt, parseInt, | 98 parsers: [parseInt, parseInt, parseInt, |
177 parseInt, parseInt, 'var-args'], | 99 parseInt, parseInt, 'var-args'], |
178 processor: this.processTick }, | 100 processor: this.processTick }, |
179 'heap-sample-begin': { parsers: [null, null, parseInt], | 101 'heap-sample-begin': { parsers: [null, null, parseInt], |
180 processor: this.processHeapSampleBegin }, | 102 processor: this.processHeapSampleBegin }, |
181 'heap-sample-end': { parsers: [null, null], | 103 'heap-sample-end': { parsers: [null, null], |
182 processor: this.processHeapSampleEnd }, | 104 processor: this.processHeapSampleEnd }, |
183 'timer-event-start' : { parsers: [null, null, null], | 105 'timer-event-start' : { parsers: [null, null, null], |
184 processor: this.advanceDistortion }, | 106 processor: this.advanceDistortion }, |
(...skipping 10 matching lines...) Expand all Loading... |
195 'code-allocate': null, | 117 'code-allocate': null, |
196 'begin-code-region': null, | 118 'begin-code-region': null, |
197 'end-code-region': null }, | 119 'end-code-region': null }, |
198 timedRange, | 120 timedRange, |
199 pairwiseTimedRange); | 121 pairwiseTimedRange); |
200 | 122 |
201 this.cppEntriesProvider_ = cppEntriesProvider; | 123 this.cppEntriesProvider_ = cppEntriesProvider; |
202 this.callGraphSize_ = callGraphSize; | 124 this.callGraphSize_ = callGraphSize; |
203 this.ignoreUnknown_ = ignoreUnknown; | 125 this.ignoreUnknown_ = ignoreUnknown; |
204 this.stateFilter_ = stateFilter; | 126 this.stateFilter_ = stateFilter; |
205 this.snapshotLogProcessor_ = snapshotLogProcessor; | |
206 this.sourceMap = sourceMap; | 127 this.sourceMap = sourceMap; |
207 this.deserializedEntriesNames_ = []; | 128 this.deserializedEntriesNames_ = []; |
208 var ticks = this.ticks_ = | 129 var ticks = this.ticks_ = |
209 { total: 0, unaccounted: 0, excluded: 0, gc: 0 }; | 130 { total: 0, unaccounted: 0, excluded: 0, gc: 0 }; |
210 | 131 |
211 distortion = parseInt(distortion); | 132 distortion = parseInt(distortion); |
212 // Convert picoseconds to nanoseconds. | 133 // Convert picoseconds to nanoseconds. |
213 this.distortion_per_entry = isNaN(distortion) ? 0 : (distortion / 1000); | 134 this.distortion_per_entry = isNaN(distortion) ? 0 : (distortion / 1000); |
214 this.distortion = 0; | 135 this.distortion = 0; |
215 var rangelimits = range ? range.split(",") : []; | 136 var rangelimits = range ? range.split(",") : []; |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
355 TickProcessor.prototype.processCodeDelete = function(start) { | 276 TickProcessor.prototype.processCodeDelete = function(start) { |
356 this.profile_.deleteCode(start); | 277 this.profile_.deleteCode(start); |
357 }; | 278 }; |
358 | 279 |
359 | 280 |
360 TickProcessor.prototype.processFunctionMove = function(from, to) { | 281 TickProcessor.prototype.processFunctionMove = function(from, to) { |
361 this.profile_.moveFunc(from, to); | 282 this.profile_.moveFunc(from, to); |
362 }; | 283 }; |
363 | 284 |
364 | 285 |
365 TickProcessor.prototype.processSnapshotPosition = function(addr, pos) { | |
366 if (this.snapshotLogProcessor_) { | |
367 this.deserializedEntriesNames_[addr] = | |
368 this.snapshotLogProcessor_.getSerializedEntryName(pos); | |
369 } | |
370 }; | |
371 | |
372 | |
373 TickProcessor.prototype.includeTick = function(vmState) { | 286 TickProcessor.prototype.includeTick = function(vmState) { |
374 return this.stateFilter_ == null || this.stateFilter_ == vmState; | 287 return this.stateFilter_ == null || this.stateFilter_ == vmState; |
375 }; | 288 }; |
376 | 289 |
377 TickProcessor.prototype.processTick = function(pc, | 290 TickProcessor.prototype.processTick = function(pc, |
378 ns_since_start, | 291 ns_since_start, |
379 is_external_callback, | 292 is_external_callback, |
380 tos_or_external_callback, | 293 tos_or_external_callback, |
381 vmState, | 294 vmState, |
382 stack) { | 295 stack) { |
(...skipping 490 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
873 '--unix': ['platform', 'unix', | 786 '--unix': ['platform', 'unix', |
874 'Specify that we are running on *nix platform'], | 787 'Specify that we are running on *nix platform'], |
875 '--windows': ['platform', 'windows', | 788 '--windows': ['platform', 'windows', |
876 'Specify that we are running on Windows platform'], | 789 'Specify that we are running on Windows platform'], |
877 '--mac': ['platform', 'mac', | 790 '--mac': ['platform', 'mac', |
878 'Specify that we are running on Mac OS X platform'], | 791 'Specify that we are running on Mac OS X platform'], |
879 '--nm': ['nm', 'nm', | 792 '--nm': ['nm', 'nm', |
880 'Specify the \'nm\' executable to use (e.g. --nm=/my_dir/nm)'], | 793 'Specify the \'nm\' executable to use (e.g. --nm=/my_dir/nm)'], |
881 '--target': ['targetRootFS', '', | 794 '--target': ['targetRootFS', '', |
882 'Specify the target root directory for cross environment'], | 795 'Specify the target root directory for cross environment'], |
883 '--snapshot-log': ['snapshotLogFileName', 'snapshot.log', | |
884 'Specify snapshot log file to use (e.g. --snapshot-log=snapshot.log)'], | |
885 '--range': ['range', 'auto,auto', | 796 '--range': ['range', 'auto,auto', |
886 'Specify the range limit as [start],[end]'], | 797 'Specify the range limit as [start],[end]'], |
887 '--distortion': ['distortion', 0, | 798 '--distortion': ['distortion', 0, |
888 'Specify the logging overhead in picoseconds'], | 799 'Specify the logging overhead in picoseconds'], |
889 '--source-map': ['sourceMap', null, | 800 '--source-map': ['sourceMap', null, |
890 'Specify the source map that should be used for output'], | 801 'Specify the source map that should be used for output'], |
891 '--timed-range': ['timedRange', true, | 802 '--timed-range': ['timedRange', true, |
892 'Ignore ticks before first and after last Date.now() call'], | 803 'Ignore ticks before first and after last Date.now() call'], |
893 '--pairwise-timed-range': ['pairwiseTimedRange', true, | 804 '--pairwise-timed-range': ['pairwiseTimedRange', true, |
894 'Ignore ticks outside pairs of Date.now() calls'], | 805 'Ignore ticks outside pairs of Date.now() calls'], |
895 '--only-summary': ['onlySummary', true, | 806 '--only-summary': ['onlySummary', true, |
896 'Print only tick summary, exclude other information'] | 807 'Print only tick summary, exclude other information'] |
897 }; | 808 }; |
898 this.argsDispatch_['--js'] = this.argsDispatch_['-j']; | 809 this.argsDispatch_['--js'] = this.argsDispatch_['-j']; |
899 this.argsDispatch_['--gc'] = this.argsDispatch_['-g']; | 810 this.argsDispatch_['--gc'] = this.argsDispatch_['-g']; |
900 this.argsDispatch_['--compiler'] = this.argsDispatch_['-c']; | 811 this.argsDispatch_['--compiler'] = this.argsDispatch_['-c']; |
901 this.argsDispatch_['--other'] = this.argsDispatch_['-o']; | 812 this.argsDispatch_['--other'] = this.argsDispatch_['-o']; |
902 this.argsDispatch_['--external'] = this.argsDispatch_['-e']; | 813 this.argsDispatch_['--external'] = this.argsDispatch_['-e']; |
903 this.argsDispatch_['--ptr'] = this.argsDispatch_['--pairwise-timed-range']; | 814 this.argsDispatch_['--ptr'] = this.argsDispatch_['--pairwise-timed-range']; |
904 }; | 815 }; |
905 | 816 |
906 | 817 |
907 ArgumentsProcessor.DEFAULTS = { | 818 ArgumentsProcessor.DEFAULTS = { |
908 logFileName: 'v8.log', | 819 logFileName: 'v8.log', |
909 snapshotLogFileName: null, | |
910 platform: 'unix', | 820 platform: 'unix', |
911 stateFilter: null, | 821 stateFilter: null, |
912 callGraphSize: 5, | 822 callGraphSize: 5, |
913 ignoreUnknown: false, | 823 ignoreUnknown: false, |
914 separateIc: false, | 824 separateIc: false, |
915 targetRootFS: '', | 825 targetRootFS: '', |
916 nm: 'nm', | 826 nm: 'nm', |
917 range: 'auto,auto', | 827 range: 'auto,auto', |
918 distortion: 0, | 828 distortion: 0, |
919 timedRange: false, | 829 timedRange: false, |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
971 for (var synArg in this.argsDispatch_) { | 881 for (var synArg in this.argsDispatch_) { |
972 if (arg !== synArg && dispatch === this.argsDispatch_[synArg]) { | 882 if (arg !== synArg && dispatch === this.argsDispatch_[synArg]) { |
973 synonyms.push(synArg); | 883 synonyms.push(synArg); |
974 delete this.argsDispatch_[synArg]; | 884 delete this.argsDispatch_[synArg]; |
975 } | 885 } |
976 } | 886 } |
977 print(' ' + padRight(synonyms.join(', '), 20) + " " + dispatch[2]); | 887 print(' ' + padRight(synonyms.join(', '), 20) + " " + dispatch[2]); |
978 } | 888 } |
979 quit(2); | 889 quit(2); |
980 }; | 890 }; |
OLD | NEW |