165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org// Copyright 2009 the V8 project authors. All rights reserved. 265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org// Redistribution and use in source and binary forms, with or without 365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org// modification, are permitted provided that the following conditions are 465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org// met: 565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org// 665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org// * Redistributions of source code must retain the above copyright 765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org// notice, this list of conditions and the following disclaimer. 865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org// * Redistributions in binary form must reproduce the above 965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org// copyright notice, this list of conditions and the following 1065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org// disclaimer in the documentation and/or other materials provided 1165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org// with the distribution. 1265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org// * Neither the name of Google Inc. nor the names of its 1365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org// contributors may be used to endorse or promote products derived 1465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org// from this software without specific prior written permission. 1565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org// 1665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 2865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 2965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org/** 3065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org * Constructs a mapper that maps addresses into code entries. 3165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org * 3265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org * @constructor 3365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org */ 34496c03a64f12710e837204e261ef155601247895sgjesse@chromium.orgfunction CodeMap() { 3565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org /** 3665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org * Dynamic code entries. Used for JIT compiled code. 3765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org */ 38496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org this.dynamics_ = new SplayTree(); 3965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 4065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org /** 419085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org * Name generator for entries having duplicate names. 4265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org */ 43496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org this.dynamicsNameGen_ = new CodeMap.NameGenerator(); 445ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org 4565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org /** 46e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org * Static code entries. Used for statically compiled code. 4765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org */ 48496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org this.statics_ = new SplayTree(); 4965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 5065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org /** 51e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org * Libraries entries. Used for the whole static code libraries. 52e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org */ 53496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org this.libraries_ = new SplayTree(); 54e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org 55e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org /** 5665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org * Map of memory pages occupied with static code. 5765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org */ 5865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org this.pages_ = []; 5965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org}; 6065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 6165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 6265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org/** 6365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org * The number of alignment bits in a page address. 6465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org */ 65496c03a64f12710e837204e261ef155601247895sgjesse@chromium.orgCodeMap.PAGE_ALIGNMENT = 12; 6665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 6765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 6865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org/** 6965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org * Page size in bytes. 7065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org */ 71496c03a64f12710e837204e261ef155601247895sgjesse@chromium.orgCodeMap.PAGE_SIZE = 72496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org 1 << CodeMap.PAGE_ALIGNMENT; 7365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 7465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 7565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org/** 7665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org * Adds a dynamic (i.e. moveable and discardable) code entry. 7765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org * 7865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org * @param {number} start The starting address. 79496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org * @param {CodeMap.CodeEntry} codeEntry Code entry object. 8065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org */ 81496c03a64f12710e837204e261ef155601247895sgjesse@chromium.orgCodeMap.prototype.addCode = function(start, codeEntry) { 8234e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org this.deleteAllCoveredNodes_(this.dynamics_, start, start + codeEntry.size); 8365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org this.dynamics_.insert(start, codeEntry); 8465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org}; 8565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 8665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 8765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org/** 8865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org * Moves a dynamic code entry. Throws an exception if there is no dynamic 8965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org * code entry with the specified starting address. 9065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org * 9165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org * @param {number} from The starting address of the entry being moved. 9265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org * @param {number} to The destination address. 9365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org */ 94496c03a64f12710e837204e261ef155601247895sgjesse@chromium.orgCodeMap.prototype.moveCode = function(from, to) { 9565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org var removedNode = this.dynamics_.remove(from); 9634e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org this.deleteAllCoveredNodes_(this.dynamics_, to, to + removedNode.value.size); 9765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org this.dynamics_.insert(to, removedNode.value); 9865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org}; 9965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 10065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 10165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org/** 10265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org * Discards a dynamic code entry. Throws an exception if there is no dynamic 1039085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org * code entry with the specified starting address. 10465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org * 10565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org * @param {number} start The starting address of the entry being deleted. 10665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org */ 107496c03a64f12710e837204e261ef155601247895sgjesse@chromium.orgCodeMap.prototype.deleteCode = function(start) { 10865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org var removedNode = this.dynamics_.remove(start); 10965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org}; 11065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 11165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 11265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org/** 113e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org * Adds a library entry. 114e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org * 115e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org * @param {number} start The starting address. 116496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org * @param {CodeMap.CodeEntry} codeEntry Code entry object. 117e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org */ 118496c03a64f12710e837204e261ef155601247895sgjesse@chromium.orgCodeMap.prototype.addLibrary = function( 119e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org start, codeEntry) { 120e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org this.markPages_(start, start + codeEntry.size); 121e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org this.libraries_.insert(start, codeEntry); 122e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org}; 123e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org 124e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org 125e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org/** 12665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org * Adds a static code entry. 12765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org * 12865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org * @param {number} start The starting address. 129496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org * @param {CodeMap.CodeEntry} codeEntry Code entry object. 13065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org */ 131496c03a64f12710e837204e261ef155601247895sgjesse@chromium.orgCodeMap.prototype.addStaticCode = function( 13265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org start, codeEntry) { 13365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org this.statics_.insert(start, codeEntry); 13465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org}; 13565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 13665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 13765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org/** 13865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org * @private 13965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org */ 140496c03a64f12710e837204e261ef155601247895sgjesse@chromium.orgCodeMap.prototype.markPages_ = function(start, end) { 14165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org for (var addr = start; addr <= end; 142496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org addr += CodeMap.PAGE_SIZE) { 143496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org this.pages_[addr >>> CodeMap.PAGE_ALIGNMENT] = 1; 14465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org } 14565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org}; 14665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 14765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 14865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org/** 14965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org * @private 15065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org */ 15134e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.orgCodeMap.prototype.deleteAllCoveredNodes_ = function(tree, start, end) { 15234e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org var to_delete = []; 15334e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org var addr = end - 1; 15434e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org while (addr >= start) { 15534e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org var node = tree.findGreatestLessThan(addr); 15634e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org if (!node) break; 15734e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org var start2 = node.key, end2 = start2 + node.value.size; 15834e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org if (start2 < end && start < end2) to_delete.push(start2); 15934e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org addr = start2 - 1; 16034e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org } 16134e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org for (var i = 0, l = to_delete.length; i < l; ++i) tree.remove(to_delete[i]); 16234e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org}; 16334e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org 16434e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org 16534e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org/** 16634e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org * @private 16734e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org */ 168496c03a64f12710e837204e261ef155601247895sgjesse@chromium.orgCodeMap.prototype.isAddressBelongsTo_ = function(addr, node) { 16965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org return addr >= node.key && addr < (node.key + node.value.size); 17065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org}; 17165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 17265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 17365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org/** 17465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org * @private 17565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org */ 176496c03a64f12710e837204e261ef155601247895sgjesse@chromium.orgCodeMap.prototype.findInTree_ = function(tree, addr) { 17765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org var node = tree.findGreatestLessThan(addr); 17865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org return node && this.isAddressBelongsTo_(addr, node) ? node.value : null; 17965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org}; 18065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 18165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 18265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org/** 18365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org * Finds a code entry that contains the specified address. Both static and 18465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org * dynamic code entries are considered. 18565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org * 18665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org * @param {number} addr Address. 18765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org */ 188496c03a64f12710e837204e261ef155601247895sgjesse@chromium.orgCodeMap.prototype.findEntry = function(addr) { 189496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org var pageAddr = addr >>> CodeMap.PAGE_ALIGNMENT; 19065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org if (pageAddr in this.pages_) { 191e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org // Static code entries can contain "holes" of unnamed code. 192e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org // In this case, the whole library is assigned to this address. 193e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org return this.findInTree_(this.statics_, addr) || 194e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org this.findInTree_(this.libraries_, addr); 19565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org } 19665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org var min = this.dynamics_.findMin(); 19765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org var max = this.dynamics_.findMax(); 19865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org if (max != null && addr < (max.key + max.value.size) && addr >= min.key) { 1999085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org var dynaEntry = this.findInTree_(this.dynamics_, addr); 2009085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org if (dynaEntry == null) return null; 2019085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // Dedupe entry name. 2029085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org if (!dynaEntry.nameUpdated_) { 2039085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org dynaEntry.name = this.dynamicsNameGen_.getName(dynaEntry.name); 2049085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org dynaEntry.nameUpdated_ = true; 2059085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org } 2069085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org return dynaEntry; 20765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org } 20865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org return null; 20965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org}; 21065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 21165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 21265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org/** 213b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org * Returns a dynamic code entry using its starting address. 214b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org * 215b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org * @param {number} addr Address. 216b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org */ 217496c03a64f12710e837204e261ef155601247895sgjesse@chromium.orgCodeMap.prototype.findDynamicEntryByStartAddress = 218b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org function(addr) { 219b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org var node = this.dynamics_.find(addr); 220b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org return node ? node.value : null; 221b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org}; 222b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 223b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 224b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org/** 225e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org * Returns an array of all dynamic code entries. 22665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org */ 227496c03a64f12710e837204e261ef155601247895sgjesse@chromium.orgCodeMap.prototype.getAllDynamicEntries = function() { 2289085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org return this.dynamics_.exportValues(); 22965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org}; 23065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 23165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 23265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org/** 233030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org * Returns an array of pairs of all dynamic code entries and their addresses. 234030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org */ 235030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.orgCodeMap.prototype.getAllDynamicEntriesWithAddresses = function() { 236030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org return this.dynamics_.exportKeysAndValues(); 237030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org}; 238030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org 239030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org 240030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org/** 24165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org * Returns an array of all static code entries. 24265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org */ 243496c03a64f12710e837204e261ef155601247895sgjesse@chromium.orgCodeMap.prototype.getAllStaticEntries = function() { 24465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org return this.statics_.exportValues(); 24565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org}; 24665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 24765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 24865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org/** 249e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org * Returns an array of all libraries entries. 250e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org */ 251496c03a64f12710e837204e261ef155601247895sgjesse@chromium.orgCodeMap.prototype.getAllLibrariesEntries = function() { 252e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org return this.libraries_.exportValues(); 253e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org}; 254e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org 255e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org 256e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org/** 25765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org * Creates a code entry object. 25865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org * 25965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org * @param {number} size Code entry size in bytes. 26065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org * @param {string} opt_name Code entry name. 26165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org * @constructor 26265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org */ 263496c03a64f12710e837204e261ef155601247895sgjesse@chromium.orgCodeMap.CodeEntry = function(size, opt_name) { 26465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org this.size = size; 26565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org this.name = opt_name || ''; 2669085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org this.nameUpdated_ = false; 26765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org}; 26865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 26965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 270496c03a64f12710e837204e261ef155601247895sgjesse@chromium.orgCodeMap.CodeEntry.prototype.getName = function() { 27165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org return this.name; 27265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org}; 27365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 2745ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org 275496c03a64f12710e837204e261ef155601247895sgjesse@chromium.orgCodeMap.CodeEntry.prototype.toString = function() { 27665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org return this.name + ': ' + this.size.toString(16); 27765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org}; 2785ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org 2795ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org 280496c03a64f12710e837204e261ef155601247895sgjesse@chromium.orgCodeMap.NameGenerator = function() { 281ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org this.knownNames_ = {}; 2825ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org}; 2835ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org 2845ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org 285496c03a64f12710e837204e261ef155601247895sgjesse@chromium.orgCodeMap.NameGenerator.prototype.getName = function(name) { 2865ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org if (!(name in this.knownNames_)) { 2875ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org this.knownNames_[name] = 0; 2885ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org return name; 2895ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org } 2905ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org var count = ++this.knownNames_[name]; 2915ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org return name + ' {' + count + '}'; 2925ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org}; 293