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

Side by Side Diff: tools/tickprocessor.js

Issue 149513: TickProcessor: more accurate mapping of statically compiled code on Linux. (Closed)
Patch Set: Created 11 years, 5 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 | « tools/profile.js ('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 // 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 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
167 167
168 TickProcessor.prototype.processLogFile = function(fileName) { 168 TickProcessor.prototype.processLogFile = function(fileName) {
169 this.lastLogFileName_ = fileName; 169 this.lastLogFileName_ = fileName;
170 var contents = readFile(fileName); 170 var contents = readFile(fileName);
171 this.processLogChunk(contents); 171 this.processLogChunk(contents);
172 }; 172 };
173 173
174 174
175 TickProcessor.prototype.processSharedLibrary = function( 175 TickProcessor.prototype.processSharedLibrary = function(
176 name, startAddr, endAddr) { 176 name, startAddr, endAddr) {
177 var entry = this.profile_.addStaticCode(name, startAddr, endAddr); 177 var entry = this.profile_.addLibrary(name, startAddr, endAddr);
178 this.setCodeType(entry.getName(), 'SHARED_LIB'); 178 this.setCodeType(entry.getName(), 'SHARED_LIB');
179 179
180 var self = this; 180 var self = this;
181 var libFuncs = this.cppEntriesProvider_.parseVmSymbols( 181 var libFuncs = this.cppEntriesProvider_.parseVmSymbols(
182 name, startAddr, endAddr, function(fName, fStart, fEnd) { 182 name, startAddr, endAddr, function(fName, fStart, fEnd) {
183 self.profile_.addStaticCode(fName, fStart, fEnd); 183 self.profile_.addStaticCode(fName, fStart, fEnd);
184 self.setCodeType(fName, 'CPP'); 184 self.setCodeType(fName, 'CPP');
185 }); 185 });
186 }; 186 };
187 187
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after
373 function CppEntriesProvider() { 373 function CppEntriesProvider() {
374 }; 374 };
375 375
376 376
377 CppEntriesProvider.prototype.parseVmSymbols = function( 377 CppEntriesProvider.prototype.parseVmSymbols = function(
378 libName, libStart, libEnd, processorFunc) { 378 libName, libStart, libEnd, processorFunc) {
379 this.loadSymbols(libName); 379 this.loadSymbols(libName);
380 380
381 var prevEntry; 381 var prevEntry;
382 382
383 function addPrevEntry(end) { 383 function addEntry(funcInfo) {
384 // Several functions can be mapped onto the same address. To avoid 384 // Several functions can be mapped onto the same address. To avoid
385 // creating zero-sized entries, skip such duplicates. 385 // creating zero-sized entries, skip such duplicates.
386 // Also double-check that function belongs to the library address space. 386 // Also double-check that function belongs to the library address space.
387 if (prevEntry && prevEntry.start < end && 387 if (prevEntry && !('end' in prevEntry) &&
Kasper Lund 2009/07/14 07:52:57 The 'end' in prevEntry stuff looks a bit weird to
Mikhail Naganov 2009/07/14 09:45:47 You're right, zero is a forbidden value here. Chan
388 prevEntry.start >= libStart && end <= libEnd) { 388 prevEntry.start < funcInfo.start &&
389 processorFunc(prevEntry.name, prevEntry.start, end); 389 prevEntry.start >= libStart && funcInfo.start <= libEnd) {
390 processorFunc(prevEntry.name, prevEntry.start, funcInfo.start);
390 } 391 }
392 if ('end' in funcInfo &&
393 (!prevEntry || prevEntry.start != funcInfo.start) &&
394 funcInfo.start >= libStart && funcInfo.end <= libEnd) {
395 processorFunc(funcInfo.name, funcInfo.start, funcInfo.end);
396 }
397 prevEntry = funcInfo;
391 } 398 }
392 399
393 while (true) { 400 while (true) {
394 var funcInfo = this.parseNextLine(); 401 var funcInfo = this.parseNextLine();
395 if (funcInfo === null) { 402 if (funcInfo === null) {
396 continue; 403 continue;
397 } else if (funcInfo === false) { 404 } else if (funcInfo === false) {
398 break; 405 break;
399 } 406 }
400 if (funcInfo.start < libStart && funcInfo.start < libEnd - libStart) { 407 if (funcInfo.start < libStart && funcInfo.start < libEnd - libStart) {
401 funcInfo.start += libStart; 408 funcInfo.start += libStart;
402 } 409 }
403 addPrevEntry(funcInfo.start); 410 if ('size' in funcInfo) {
Kasper Lund 2009/07/14 07:52:57 Is this because you worry that size can be zero?
Mikhail Naganov 2009/07/14 09:45:47 Done.
404 prevEntry = funcInfo; 411 funcInfo.end = funcInfo.start + funcInfo.size;
412 }
413 addEntry(funcInfo);
405 } 414 }
406 addPrevEntry(libEnd); 415 addEntry({name: '', start: libEnd});
407 }; 416 };
408 417
409 418
410 CppEntriesProvider.prototype.loadSymbols = function(libName) { 419 CppEntriesProvider.prototype.loadSymbols = function(libName) {
411 }; 420 };
412 421
413 422
414 CppEntriesProvider.prototype.parseNextLine = function() { 423 CppEntriesProvider.prototype.parseNextLine = function() {
415 return false; 424 return false;
416 }; 425 };
417 426
418 427
419 function UnixCppEntriesProvider(nmExec) { 428 function UnixCppEntriesProvider(nmExec) {
420 this.symbols = []; 429 this.symbols = [];
421 this.parsePos = 0; 430 this.parsePos = 0;
422 this.nmExec = nmExec; 431 this.nmExec = nmExec;
423 }; 432 };
424 inherits(UnixCppEntriesProvider, CppEntriesProvider); 433 inherits(UnixCppEntriesProvider, CppEntriesProvider);
425 434
426 435
427 UnixCppEntriesProvider.FUNC_RE = /^([0-9a-fA-F]{8}) [tTwW] (.*)$/; 436 UnixCppEntriesProvider.FUNC_RE =
437 /^([0-9a-fA-F]{8}) ([0-9a-fA-F]{8} )?[tTwW] (.*)$/;
428 438
429 439
430 UnixCppEntriesProvider.prototype.loadSymbols = function(libName) { 440 UnixCppEntriesProvider.prototype.loadSymbols = function(libName) {
431 this.parsePos = 0; 441 this.parsePos = 0;
432 try { 442 try {
433 this.symbols = [ 443 this.symbols = [
434 os.system(this.nmExec, ['-C', '-n', libName], -1, -1), 444 os.system(this.nmExec, ['-C', '-n', '-S', libName], -1, -1),
435 os.system(this.nmExec, ['-C', '-n', '-D', libName], -1, -1) 445 os.system(this.nmExec, ['-C', '-n', '-S', '-D', libName], -1, -1)
436 ]; 446 ];
437 } catch (e) { 447 } catch (e) {
438 // If the library cannot be found on this system let's not panic. 448 // If the library cannot be found on this system let's not panic.
439 this.symbols = ['', '']; 449 this.symbols = ['', ''];
440 } 450 }
441 }; 451 };
442 452
443 453
444 UnixCppEntriesProvider.prototype.parseNextLine = function() { 454 UnixCppEntriesProvider.prototype.parseNextLine = function() {
445 if (this.symbols.length == 0) { 455 if (this.symbols.length == 0) {
446 return false; 456 return false;
447 } 457 }
448 var lineEndPos = this.symbols[0].indexOf('\n', this.parsePos); 458 var lineEndPos = this.symbols[0].indexOf('\n', this.parsePos);
449 if (lineEndPos == -1) { 459 if (lineEndPos == -1) {
450 this.symbols.shift(); 460 this.symbols.shift();
451 this.parsePos = 0; 461 this.parsePos = 0;
452 return this.parseNextLine(); 462 return this.parseNextLine();
453 } 463 }
454 464
455 var line = this.symbols[0].substring(this.parsePos, lineEndPos); 465 var line = this.symbols[0].substring(this.parsePos, lineEndPos);
456 this.parsePos = lineEndPos + 1; 466 this.parsePos = lineEndPos + 1;
457 var fields = line.match(UnixCppEntriesProvider.FUNC_RE); 467 var fields = line.match(UnixCppEntriesProvider.FUNC_RE);
458 return fields ? { name: fields[2], start: parseInt(fields[1], 16) } : null; 468 var funcInfo = null;
469 if (fields) {
470 funcInfo = { name: fields[3], start: parseInt(fields[1], 16) };
471 if (fields[2]) {
472 funcInfo.size = parseInt(fields[2], 16);
473 }
474 }
475 return funcInfo;
459 }; 476 };
460 477
461 478
462 function WindowsCppEntriesProvider() { 479 function WindowsCppEntriesProvider() {
463 this.symbols = ''; 480 this.symbols = '';
464 this.parsePos = 0; 481 this.parsePos = 0;
465 }; 482 };
466 inherits(WindowsCppEntriesProvider, CppEntriesProvider); 483 inherits(WindowsCppEntriesProvider, CppEntriesProvider);
467 484
468 485
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
613 if (arg !== synArg && dispatch === this.argsDispatch_[synArg]) { 630 if (arg !== synArg && dispatch === this.argsDispatch_[synArg]) {
614 synonims.push(synArg); 631 synonims.push(synArg);
615 delete this.argsDispatch_[synArg]; 632 delete this.argsDispatch_[synArg];
616 } 633 }
617 } 634 }
618 print(' ' + padRight(synonims.join(', '), 20) + dispatch[2]); 635 print(' ' + padRight(synonims.join(', '), 20) + dispatch[2]);
619 } 636 }
620 quit(2); 637 quit(2);
621 }; 638 };
622 639
OLDNEW
« no previous file with comments | « tools/profile.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698