OLD | NEW |
1 // Copyright 2009 the V8 project authors. All rights reserved. | 1 // Copyright 2009 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 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
79 } | 79 } |
80 break; | 80 break; |
81 } | 81 } |
82 }; | 82 }; |
83 | 83 |
84 this.profile_ = new Profile(separateIc); | 84 this.profile_ = new Profile(separateIc); |
85 this.codeTypes_ = {}; | 85 this.codeTypes_ = {}; |
86 // Count each tick as a time unit. | 86 // Count each tick as a time unit. |
87 this.viewBuilder_ = new devtools.profiler.ViewBuilder(1); | 87 this.viewBuilder_ = new devtools.profiler.ViewBuilder(1); |
88 this.lastLogFileName_ = null; | 88 this.lastLogFileName_ = null; |
| 89 this.aliases_ = {}; |
89 }; | 90 }; |
90 | 91 |
91 | 92 |
92 TickProcessor.VmStates = { | 93 TickProcessor.VmStates = { |
93 JS: 0, | 94 JS: 0, |
94 GC: 1, | 95 GC: 1, |
95 COMPILER: 2, | 96 COMPILER: 2, |
96 OTHER: 3, | 97 OTHER: 3, |
97 EXTERNAL: 4 | 98 EXTERNAL: 4 |
98 }; | 99 }; |
(...skipping 10 matching lines...) Expand all Loading... |
109 TickProcessor.RecordsDispatch = { | 110 TickProcessor.RecordsDispatch = { |
110 'shared-library': { parsers: [null, parseInt, parseInt], | 111 'shared-library': { parsers: [null, parseInt, parseInt], |
111 processor: 'processSharedLibrary' }, | 112 processor: 'processSharedLibrary' }, |
112 'code-creation': { parsers: [null, parseInt, parseInt, null], | 113 'code-creation': { parsers: [null, parseInt, parseInt, null], |
113 processor: 'processCodeCreation' }, | 114 processor: 'processCodeCreation' }, |
114 'code-move': { parsers: [parseInt, parseInt], | 115 'code-move': { parsers: [parseInt, parseInt], |
115 processor: 'processCodeMove' }, | 116 processor: 'processCodeMove' }, |
116 'code-delete': { parsers: [parseInt], processor: 'processCodeDelete' }, | 117 'code-delete': { parsers: [parseInt], processor: 'processCodeDelete' }, |
117 'tick': { parsers: [parseInt, parseInt, parseInt, 'var-args'], | 118 'tick': { parsers: [parseInt, parseInt, parseInt, 'var-args'], |
118 processor: 'processTick' }, | 119 processor: 'processTick' }, |
| 120 'alias': { parsers: [null, null], processor: 'processAlias' }, |
119 'profiler': null, | 121 'profiler': null, |
120 // Obsolete row types. | 122 // Obsolete row types. |
121 'code-allocate': null, | 123 'code-allocate': null, |
122 'begin-code-region': null, | 124 'begin-code-region': null, |
123 'end-code-region': null | 125 'end-code-region': null |
124 }; | 126 }; |
125 | 127 |
126 | |
127 TickProcessor.CALL_PROFILE_CUTOFF_PCT = 2.0; | 128 TickProcessor.CALL_PROFILE_CUTOFF_PCT = 2.0; |
128 | 129 |
129 | 130 |
130 TickProcessor.prototype.setCodeType = function(name, type) { | 131 TickProcessor.prototype.setCodeType = function(name, type) { |
131 this.codeTypes_[name] = TickProcessor.CodeTypes[type]; | 132 this.codeTypes_[name] = TickProcessor.CodeTypes[type]; |
132 }; | 133 }; |
133 | 134 |
134 | 135 |
135 TickProcessor.prototype.isSharedLibrary = function(name) { | 136 TickProcessor.prototype.isSharedLibrary = function(name) { |
136 return this.codeTypes_[name] == TickProcessor.CodeTypes.SHARED_LIB; | 137 return this.codeTypes_[name] == TickProcessor.CodeTypes.SHARED_LIB; |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
211 | 212 |
212 var self = this; | 213 var self = this; |
213 var libFuncs = this.cppEntriesProvider_.parseVmSymbols( | 214 var libFuncs = this.cppEntriesProvider_.parseVmSymbols( |
214 name, startAddr, endAddr, function(fName, fStart, fEnd) { | 215 name, startAddr, endAddr, function(fName, fStart, fEnd) { |
215 self.profile_.addStaticCode(fName, fStart, fEnd); | 216 self.profile_.addStaticCode(fName, fStart, fEnd); |
216 self.setCodeType(fName, 'CPP'); | 217 self.setCodeType(fName, 'CPP'); |
217 }); | 218 }); |
218 }; | 219 }; |
219 | 220 |
220 | 221 |
| 222 TickProcessor.prototype.processAlias = function(symbol, expansion) { |
| 223 if (expansion in TickProcessor.RecordsDispatch) { |
| 224 TickProcessor.RecordsDispatch[symbol] = |
| 225 TickProcessor.RecordsDispatch[expansion]; |
| 226 } else { |
| 227 this.aliases_[symbol] = expansion; |
| 228 } |
| 229 }; |
| 230 |
| 231 |
221 TickProcessor.prototype.processCodeCreation = function( | 232 TickProcessor.prototype.processCodeCreation = function( |
222 type, start, size, name) { | 233 type, start, size, name) { |
| 234 if (type in this.aliases_) { |
| 235 type = this.aliases_[type]; |
| 236 } |
223 var entry = this.profile_.addCode(type, name, start, size); | 237 var entry = this.profile_.addCode(type, name, start, size); |
224 }; | 238 }; |
225 | 239 |
226 | 240 |
227 TickProcessor.prototype.processCodeMove = function(from, to) { | 241 TickProcessor.prototype.processCodeMove = function(from, to) { |
228 this.profile_.moveCode(from, to); | 242 this.profile_.moveCode(from, to); |
229 }; | 243 }; |
230 | 244 |
231 | 245 |
232 TickProcessor.prototype.processCodeDelete = function(start) { | 246 TickProcessor.prototype.processCodeDelete = function(start) { |
233 this.profile_.deleteCode(start); | 247 this.profile_.deleteCode(start); |
234 }; | 248 }; |
235 | 249 |
236 | 250 |
237 TickProcessor.prototype.includeTick = function(vmState) { | 251 TickProcessor.prototype.includeTick = function(vmState) { |
238 return this.stateFilter_ == null || this.stateFilter_ == vmState; | 252 return this.stateFilter_ == null || this.stateFilter_ == vmState; |
239 }; | 253 }; |
240 | 254 |
241 | 255 |
242 TickProcessor.prototype.processTick = function(pc, sp, vmState, stack) { | 256 TickProcessor.prototype.processTick = function(pc, sp, vmState, stack) { |
243 this.ticks_.total++; | 257 this.ticks_.total++; |
244 if (vmState == TickProcessor.VmStates.GC) this.ticks_.gc++; | 258 if (vmState == TickProcessor.VmStates.GC) this.ticks_.gc++; |
245 if (!this.includeTick(vmState)) { | 259 if (!this.includeTick(vmState)) { |
246 this.ticks_.excluded++; | 260 this.ticks_.excluded++; |
247 return; | 261 return; |
248 } | 262 } |
249 | 263 |
250 var fullStack = [pc]; | 264 var fullStack = [pc]; |
| 265 var prevFrame = pc; |
251 for (var i = 0, n = stack.length; i < n; ++i) { | 266 for (var i = 0, n = stack.length; i < n; ++i) { |
252 var frame = stack[i]; | 267 var frame = stack[i]; |
| 268 var firstChar = frame.charAt(0); |
253 // Leave only numbers starting with 0x. Filter possible 'overflow' string. | 269 // Leave only numbers starting with 0x. Filter possible 'overflow' string. |
254 if (frame.charAt(0) == '0') { | 270 if (firstChar == '0') { |
255 fullStack.push(parseInt(frame, 16)); | 271 fullStack.push(parseInt(frame, 16)); |
| 272 } else if (firstChar == '+' || firstChar == '-') { |
| 273 // An offset from the previous frame. |
| 274 prevFrame += parseInt(frame, 16); |
| 275 fullStack.push(prevFrame); |
256 } | 276 } |
257 } | 277 } |
258 this.profile_.recordTick(fullStack); | 278 this.profile_.recordTick(fullStack); |
259 }; | 279 }; |
260 | 280 |
261 | 281 |
262 TickProcessor.prototype.printStatistics = function() { | 282 TickProcessor.prototype.printStatistics = function() { |
263 print('Statistical profiling result from ' + this.lastLogFileName_ + | 283 print('Statistical profiling result from ' + this.lastLogFileName_ + |
264 ', (' + this.ticks_.total + | 284 ', (' + this.ticks_.total + |
265 ' ticks, ' + this.ticks_.unaccounted + ' unaccounted, ' + | 285 ' ticks, ' + this.ticks_.unaccounted + ' unaccounted, ' + |
(...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
633 | 653 |
634 var params = processArguments(arguments); | 654 var params = processArguments(arguments); |
635 var tickProcessor = new TickProcessor( | 655 var tickProcessor = new TickProcessor( |
636 params.platform == 'unix' ? new UnixCppEntriesProvider() : | 656 params.platform == 'unix' ? new UnixCppEntriesProvider() : |
637 new WindowsCppEntriesProvider(), | 657 new WindowsCppEntriesProvider(), |
638 params.separateIc, | 658 params.separateIc, |
639 params.ignoreUnknown, | 659 params.ignoreUnknown, |
640 params.stateFilter); | 660 params.stateFilter); |
641 tickProcessor.processLogFile(params.logFileName); | 661 tickProcessor.processLogFile(params.logFileName); |
642 tickProcessor.printStatistics(); | 662 tickProcessor.printStatistics(); |
OLD | NEW |