diff options
| author | Leon Clarke <leonclarke@google.com> | 2010-01-27 15:57:47 +0000 |
|---|---|---|
| committer | Leon Clarke <leonclarke@google.com> | 2010-01-27 15:57:47 +0000 |
| commit | 888f6729be6a6f6fbe246cb5a9f122e2dbe455b7 (patch) | |
| tree | 16f9ce250ef5d36e49a0fb0018e979002ed5b4fb /tools | |
| parent | 1471e9f5b6f291eea8447f441527cd2a85074a33 (diff) | |
| download | android_external_v8-888f6729be6a6f6fbe246cb5a9f122e2dbe455b7.tar.gz android_external_v8-888f6729be6a6f6fbe246cb5a9f122e2dbe455b7.tar.bz2 android_external_v8-888f6729be6a6f6fbe246cb5a9f122e2dbe455b7.zip | |
Pull from svn bleeding_edge@3716
Diffstat (limited to 'tools')
| -rw-r--r-- | tools/codemap.js | 12 | ||||
| -rw-r--r-- | tools/gyp/v8.gyp | 10 | ||||
| -rw-r--r-- | tools/logreader.js | 5 | ||||
| -rw-r--r-- | tools/profile.js | 52 | ||||
| -rw-r--r-- | tools/tickprocessor.js | 45 | ||||
| -rw-r--r-- | tools/tickprocessor.py | 44 | ||||
| -rw-r--r-- | tools/utils.py | 4 | ||||
| -rw-r--r-- | tools/visual_studio/v8_base.vcproj | 24 | ||||
| -rw-r--r-- | tools/visual_studio/v8_base_arm.vcproj | 24 |
9 files changed, 181 insertions, 39 deletions
diff --git a/tools/codemap.js b/tools/codemap.js index af511f64..8eb2acbc 100644 --- a/tools/codemap.js +++ b/tools/codemap.js @@ -196,6 +196,18 @@ devtools.profiler.CodeMap.prototype.findEntry = function(addr) { /** + * Returns a dynamic code entry using its starting address. + * + * @param {number} addr Address. + */ +devtools.profiler.CodeMap.prototype.findDynamicEntryByStartAddress = + function(addr) { + var node = this.dynamics_.find(addr); + return node ? node.value : null; +}; + + +/** * Returns an array of all dynamic code entries. */ devtools.profiler.CodeMap.prototype.getAllDynamicEntries = function() { diff --git a/tools/gyp/v8.gyp b/tools/gyp/v8.gyp index 4368eb81..5c879b3e 100644 --- a/tools/gyp/v8.gyp +++ b/tools/gyp/v8.gyp @@ -267,8 +267,6 @@ '../../src/execution.h', '../../src/factory.cc', '../../src/factory.h', - '../../src/fast-codegen.cc', - '../../src/fast-codegen.h', '../../src/flag-definitions.h', '../../src/flags.cc', '../../src/flags.h', @@ -277,6 +275,8 @@ '../../src/frames-inl.h', '../../src/frames.cc', '../../src/frames.h', + '../../src/full-codegen.cc', + '../../src/full-codegen.h', '../../src/func-name-inferrer.cc', '../../src/func-name-inferrer.h', '../../src/global-handles.cc', @@ -408,9 +408,9 @@ '../../src/arm/cpu-arm.cc', '../../src/arm/debug-arm.cc', '../../src/arm/disasm-arm.cc', - '../../src/arm/fast-codegen-arm.cc', '../../src/arm/frames-arm.cc', '../../src/arm/frames-arm.h', + '../../src/arm/full-codegen-arm.cc', '../../src/arm/ic-arm.cc', '../../src/arm/jump-target-arm.cc', '../../src/arm/macro-assembler-arm.cc', @@ -446,9 +446,9 @@ '../../src/ia32/cpu-ia32.cc', '../../src/ia32/debug-ia32.cc', '../../src/ia32/disasm-ia32.cc', - '../../src/ia32/fast-codegen-ia32.cc', '../../src/ia32/frames-ia32.cc', '../../src/ia32/frames-ia32.h', + '../../src/ia32/full-codegen-ia32.cc', '../../src/ia32/ic-ia32.cc', '../../src/ia32/jump-target-ia32.cc', '../../src/ia32/macro-assembler-ia32.cc', @@ -475,9 +475,9 @@ '../../src/x64/cpu-x64.cc', '../../src/x64/debug-x64.cc', '../../src/x64/disasm-x64.cc', - '../../src/x64/fast-codegen-x64.cc', '../../src/x64/frames-x64.cc', '../../src/x64/frames-x64.h', + '../../src/x64/full-codegen-x64.cc', '../../src/x64/ic-x64.cc', '../../src/x64/jump-target-x64.cc', '../../src/x64/macro-assembler-x64.cc', diff --git a/tools/logreader.js b/tools/logreader.js index 88ab9077..20a1f544 100644 --- a/tools/logreader.js +++ b/tools/logreader.js @@ -139,11 +139,12 @@ devtools.profiler.LogReader.prototype.processLogChunk = function(chunk) { * Processes stack record. * * @param {number} pc Program counter. + * @param {number} func JS Function. * @param {Array.<string>} stack String representation of a stack. * @return {Array.<number>} Processed stack. */ -devtools.profiler.LogReader.prototype.processStack = function(pc, stack) { - var fullStack = [pc]; +devtools.profiler.LogReader.prototype.processStack = function(pc, func, stack) { + var fullStack = func ? [pc, func] : [pc]; var prevFrame = pc; for (var i = 0, n = stack.length; i < n; ++i) { var frame = stack[i]; diff --git a/tools/profile.js b/tools/profile.js index d41f5cd1..b2de6490 100644 --- a/tools/profile.js +++ b/tools/profile.js @@ -43,6 +43,11 @@ devtools.profiler.Profile = function() { this.bottomUpTree_ = new devtools.profiler.CallTree(); }; +/** + * Version of profiler log. + */ +devtools.profiler.Profile.VERSION = 2; + /** * Returns whether a function with the specified name must be skipped. @@ -134,6 +139,21 @@ devtools.profiler.Profile.prototype.addCode = function( /** + * Creates an alias entry for a code entry. + * + * @param {number} aliasAddr Alias address. + * @param {number} addr Code entry address. + */ +devtools.profiler.Profile.prototype.addCodeAlias = function( + aliasAddr, addr) { + var entry = this.codeMap_.findDynamicEntryByStartAddress(addr); + if (entry) { + this.codeMap_.addCode(aliasAddr, entry); + } +}; + + +/** * Reports about moving of a dynamic code entry. * * @param {number} from Current code entry address. @@ -163,6 +183,31 @@ devtools.profiler.Profile.prototype.deleteCode = function(start) { /** + * Reports about moving of a dynamic code entry. + * + * @param {number} from Current code entry address. + * @param {number} to New code entry address. + */ +devtools.profiler.Profile.prototype.safeMoveDynamicCode = function(from, to) { + if (this.codeMap_.findDynamicEntryByStartAddress(from)) { + this.codeMap_.moveCode(from, to); + } +}; + + +/** + * Reports about deletion of a dynamic code entry. + * + * @param {number} start Starting address. + */ +devtools.profiler.Profile.prototype.safeDeleteDynamicCode = function(start) { + if (this.codeMap_.findDynamicEntryByStartAddress(start)) { + this.codeMap_.deleteCode(start); + } +}; + + +/** * Retrieves a code entry by an address. * * @param {number} addr Entry address. @@ -362,6 +407,13 @@ devtools.profiler.Profile.DynamicCodeEntry.prototype.getRawName = function() { }; +devtools.profiler.Profile.DynamicCodeEntry.prototype.isJSFunction = function() { + return this.type == "Function" || + this.type == "LazyCompile" || + this.type == "Script"; +}; + + /** * Constructs a call graph. * diff --git a/tools/tickprocessor.js b/tools/tickprocessor.js index c566c22a..35422e2e 100644 --- a/tools/tickprocessor.js +++ b/tools/tickprocessor.js @@ -137,10 +137,19 @@ function TickProcessor( processor: this.processCodeMove, backrefs: true }, 'code-delete': { parsers: [this.createAddressParser('code')], processor: this.processCodeDelete, backrefs: true }, + 'function-creation': { parsers: [this.createAddressParser('code'), + this.createAddressParser('function-obj')], + processor: this.processFunctionCreation, backrefs: true }, + 'function-move': { parsers: [this.createAddressParser('code'), + this.createAddressParser('code-move-to')], + processor: this.processFunctionMove, backrefs: true }, + 'function-delete': { parsers: [this.createAddressParser('code')], + processor: this.processFunctionDelete, backrefs: true }, 'snapshot-pos': { parsers: [this.createAddressParser('code'), parseInt], processor: this.processSnapshotPosition, backrefs: true }, 'tick': { parsers: [this.createAddressParser('code'), - this.createAddressParser('stack'), parseInt, 'var-args'], + this.createAddressParser('stack'), + this.createAddressParser('func'), parseInt, 'var-args'], processor: this.processTick, backrefs: true }, 'heap-sample-begin': { parsers: [null, null, parseInt], processor: this.processHeapSampleBegin }, @@ -287,6 +296,22 @@ TickProcessor.prototype.processCodeDelete = function(start) { }; +TickProcessor.prototype.processFunctionCreation = function( + functionAddr, codeAddr) { + this.profile_.addCodeAlias(functionAddr, codeAddr); +}; + + +TickProcessor.prototype.processFunctionMove = function(from, to) { + this.profile_.safeMoveDynamicCode(from, to); +}; + + +TickProcessor.prototype.processFunctionDelete = function(start) { + this.profile_.safeDeleteDynamicCode(start); +}; + + TickProcessor.prototype.processSnapshotPosition = function(addr, pos) { if (this.snapshotLogProcessor_) { this.deserializedEntriesNames_[addr] = @@ -300,7 +325,7 @@ TickProcessor.prototype.includeTick = function(vmState) { }; -TickProcessor.prototype.processTick = function(pc, sp, vmState, stack) { +TickProcessor.prototype.processTick = function(pc, sp, func, vmState, stack) { this.ticks_.total++; if (vmState == TickProcessor.VmStates.GC) this.ticks_.gc++; if (!this.includeTick(vmState)) { @@ -308,7 +333,19 @@ TickProcessor.prototype.processTick = function(pc, sp, vmState, stack) { return; } - this.profile_.recordTick(this.processStack(pc, stack)); + if (func) { + var funcEntry = this.profile_.findEntry(func); + if (!funcEntry || !funcEntry.isJSFunction || !funcEntry.isJSFunction()) { + func = 0; + } else { + var currEntry = this.profile_.findEntry(pc); + if (!currEntry || !currEntry.isJSFunction || currEntry.isJSFunction()) { + func = 0; + } + } + } + + this.profile_.recordTick(this.processStack(pc, func, stack)); }; @@ -341,7 +378,7 @@ TickProcessor.prototype.processJSProducer = function(constructor, stack) { if (stack.length == 0) return; var first = stack.shift(); var processedStack = - this.profile_.resolveAndFilterFuncs_(this.processStack(first, stack)); + this.profile_.resolveAndFilterFuncs_(this.processStack(first, 0, stack)); processedStack.unshift(constructor); this.currentProducerProfile_.addPath(processedStack); }; diff --git a/tools/tickprocessor.py b/tools/tickprocessor.py index cc540d3d..c932e3fc 100644 --- a/tools/tickprocessor.py +++ b/tools/tickprocessor.py @@ -59,6 +59,8 @@ class CodeEntry(object): def IsICEntry(self): return False + def IsJSFunction(self): + return False class SharedLibraryEntry(CodeEntry): @@ -124,6 +126,8 @@ class JSCodeEntry(CodeEntry): return self.type in ('CallIC', 'LoadIC', 'StoreIC') or \ (self.type == 'Builtin' and self.builtin_ic_re.match(self.name)) + def IsJSFunction(self): + return self.type in ('Function', 'LazyCompile', 'Script') class CodeRegion(object): @@ -212,13 +216,19 @@ class TickProcessor(object): for row in logreader: row_num += 1 if row[0] == 'tick': - self.ProcessTick(int(row[1], 16), int(row[2], 16), int(row[3]), self.PreprocessStack(row[4:])) + self.ProcessTick(int(row[1], 16), int(row[2], 16), int(row[3], 16), int(row[4]), self.PreprocessStack(row[5:])) elif row[0] == 'code-creation': self.ProcessCodeCreation(row[1], int(row[2], 16), int(row[3]), row[4]) elif row[0] == 'code-move': self.ProcessCodeMove(int(row[1], 16), int(row[2], 16)) elif row[0] == 'code-delete': self.ProcessCodeDelete(int(row[1], 16)) + elif row[0] == 'function-creation': + self.ProcessFunctionCreation(int(row[1], 16), int(row[2], 16)) + elif row[0] == 'function-move': + self.ProcessFunctionMove(int(row[1], 16), int(row[2], 16)) + elif row[0] == 'function-delete': + self.ProcessFunctionDelete(int(row[1], 16)) elif row[0] == 'shared-library': self.AddSharedLibraryEntry(row[1], int(row[2], 16), int(row[3], 16)) self.ParseVMSymbols(row[1], int(row[2], 16), int(row[3], 16)) @@ -275,6 +285,27 @@ class TickProcessor(object): except splaytree.KeyNotFoundError: print('Code delete event for unknown code: 0x%x' % from_addr) + def ProcessFunctionCreation(self, func_addr, code_addr): + js_entry_node = self.js_entries.Find(code_addr) + if js_entry_node: + js_entry = js_entry_node.value + self.js_entries.Insert(func_addr, JSCodeEntry(func_addr, js_entry.name, js_entry.type, 1, None)) + + def ProcessFunctionMove(self, from_addr, to_addr): + try: + removed_node = self.js_entries.Remove(from_addr) + removed_node.value.SetStartAddress(to_addr); + self.js_entries.Insert(to_addr, removed_node.value) + except splaytree.KeyNotFoundError: + return + + def ProcessFunctionDelete(self, from_addr): + try: + removed_node = self.js_entries.Remove(from_addr) + self.deleted_code.append(removed_node.value) + except splaytree.KeyNotFoundError: + return + def ProcessBeginCodeRegion(self, id, assm, start, name): if not assm in self.pending_assemblers: self.pending_assemblers[assm] = Assembler() @@ -320,7 +351,7 @@ class TickProcessor(object): result.append(entry.ToString()) return result - def ProcessTick(self, pc, sp, state, stack): + def ProcessTick(self, pc, sp, func, state, stack): if state == VMStates['GC']: self.number_of_gc_ticks += 1 if not self.IncludeTick(pc, sp, state): @@ -337,11 +368,16 @@ class TickProcessor(object): if len(stack) > 0: caller_pc = stack.pop(0) self.total_number_of_ticks -= 1 - self.ProcessTick(caller_pc, sp, state, stack) + self.ProcessTick(caller_pc, sp, func, state, stack) else: self.unaccounted_number_of_ticks += 1 else: - entry.Tick(pc, self.ProcessStack(stack)) + processed_stack = self.ProcessStack(stack) + if not entry.IsSharedLibraryEntry() and not entry.IsJSFunction(): + func_entry_node = self.js_entries.Find(func) + if func_entry_node and func_entry_node.value.IsJSFunction(): + processed_stack.insert(0, func_entry_node.value.ToString()) + entry.Tick(pc, processed_stack) if self.call_graph_json: self.AddToPackedStacks(pc, stack) diff --git a/tools/utils.py b/tools/utils.py index 196bb055..435c12de 100644 --- a/tools/utils.py +++ b/tools/utils.py @@ -57,6 +57,8 @@ def GuessOS(): return 'freebsd' elif id == 'OpenBSD': return 'openbsd' + elif id == 'SunOS': + return 'solaris' else: return None @@ -67,6 +69,8 @@ def GuessArchitecture(): return 'arm' elif (not id) or (not re.match('(x|i[3-6])86', id) is None): return 'ia32' + elif id == 'i86pc': + return 'ia32' else: return None diff --git a/tools/visual_studio/v8_base.vcproj b/tools/visual_studio/v8_base.vcproj index 6b473597..f95f2279 100644 --- a/tools/visual_studio/v8_base.vcproj +++ b/tools/visual_studio/v8_base.vcproj @@ -388,18 +388,6 @@ RelativePath="..\..\src\factory.h" > </File> - <File - RelativePath="..\..\src\ia32\fast-codegen-ia32.cc" - > - </File> - <File - RelativePath="..\..\src\fast-codegen.cc" - > - </File> - <File - RelativePath="..\..\src\fast-codegen.h" - > - </File> <File RelativePath="..\..\src\flags.cc" > @@ -436,6 +424,18 @@ RelativePath="..\..\src\frames.h" > </File> + <File + RelativePath="..\..\src\ia32\full-codegen-ia32.cc" + > + </File> + <File + RelativePath="..\..\src\full-codegen.cc" + > + </File> + <File + RelativePath="..\..\src\full-codegen.h" + > + </File> <File RelativePath="..\..\src\func-name-inferrer.cc" > diff --git a/tools/visual_studio/v8_base_arm.vcproj b/tools/visual_studio/v8_base_arm.vcproj index afb4f74b..a8f17228 100644 --- a/tools/visual_studio/v8_base_arm.vcproj +++ b/tools/visual_studio/v8_base_arm.vcproj @@ -396,18 +396,6 @@ RelativePath="..\..\src\factory.h" > </File> - <File - RelativePath="..\..\src\arm\fast-codegen-arm.cc" - > - </File> - <File - RelativePath="..\..\src\fast-codegen.cc" - > - </File> - <File - RelativePath="..\..\src\fast-codegen.h" - > - </File> <File RelativePath="..\..\src\flags.cc" > @@ -444,6 +432,18 @@ RelativePath="..\..\src\frames.h" > </File> + <File + RelativePath="..\..\src\arm\full-codegen-arm.cc" + > + </File> + <File + RelativePath="..\..\src\full-codegen.cc" + > + </File> + <File + RelativePath="..\..\src\full-codegen.h" + > + </File> <File RelativePath="..\..\src\func-name-inferrer.cc" > |
