1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/js/src/assembler/jit/ExecutableAllocator.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,96 @@ 1.4 +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- 1.5 + * vim: set ts=8 sts=4 et sw=4 tw=99: 1.6 + * 1.7 + * Copyright (C) 2008 Apple Inc. All rights reserved. 1.8 + * 1.9 + * Redistribution and use in source and binary forms, with or without 1.10 + * modification, are permitted provided that the following conditions 1.11 + * are met: 1.12 + * 1. Redistributions of source code must retain the above copyright 1.13 + * notice, this list of conditions and the following disclaimer. 1.14 + * 2. Redistributions in binary form must reproduce the above copyright 1.15 + * notice, this list of conditions and the following disclaimer in the 1.16 + * documentation and/or other materials provided with the distribution. 1.17 + * 1.18 + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 1.19 + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1.20 + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 1.21 + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 1.22 + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 1.23 + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 1.24 + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 1.25 + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 1.26 + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 1.27 + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 1.28 + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 1.29 + */ 1.30 + 1.31 +#include "assembler/jit/ExecutableAllocator.h" 1.32 + 1.33 +#include "js/MemoryMetrics.h" 1.34 + 1.35 +#if ENABLE_ASSEMBLER 1.36 + 1.37 +namespace JSC { 1.38 + 1.39 +size_t ExecutableAllocator::pageSize = 0; 1.40 +size_t ExecutableAllocator::largeAllocSize = 0; 1.41 + 1.42 +ExecutablePool::~ExecutablePool() 1.43 +{ 1.44 + MOZ_ASSERT(m_ionCodeBytes == 0); 1.45 + MOZ_ASSERT(m_baselineCodeBytes == 0); 1.46 + MOZ_ASSERT(m_regexpCodeBytes == 0); 1.47 + MOZ_ASSERT(m_otherCodeBytes == 0); 1.48 + 1.49 + m_allocator->releasePoolPages(this); 1.50 +} 1.51 + 1.52 +void 1.53 +ExecutableAllocator::addSizeOfCode(JS::CodeSizes *sizes) const 1.54 +{ 1.55 + if (m_pools.initialized()) { 1.56 + for (ExecPoolHashSet::Range r = m_pools.all(); !r.empty(); r.popFront()) { 1.57 + ExecutablePool* pool = r.front(); 1.58 + sizes->ion += pool->m_ionCodeBytes; 1.59 + sizes->baseline += pool->m_baselineCodeBytes; 1.60 + sizes->regexp += pool->m_regexpCodeBytes; 1.61 + sizes->other += pool->m_otherCodeBytes; 1.62 + sizes->unused += pool->m_allocation.size - pool->m_ionCodeBytes 1.63 + - pool->m_baselineCodeBytes 1.64 + - pool->m_regexpCodeBytes 1.65 + - pool->m_otherCodeBytes; 1.66 + } 1.67 + } 1.68 +} 1.69 + 1.70 +void 1.71 +ExecutableAllocator::toggleAllCodeAsAccessible(bool accessible) 1.72 +{ 1.73 + if (!m_pools.initialized()) 1.74 + return; 1.75 + 1.76 + for (ExecPoolHashSet::Range r = m_pools.all(); !r.empty(); r.popFront()) { 1.77 + ExecutablePool* pool = r.front(); 1.78 + pool->toggleAllCodeAsAccessible(accessible); 1.79 + } 1.80 +} 1.81 + 1.82 +bool 1.83 +ExecutableAllocator::codeContains(char* address) 1.84 +{ 1.85 + if (!m_pools.initialized()) 1.86 + return false; 1.87 + 1.88 + for (ExecPoolHashSet::Range r = m_pools.all(); !r.empty(); r.popFront()) { 1.89 + ExecutablePool* pool = r.front(); 1.90 + if (pool->codeContains(address)) 1.91 + return true; 1.92 + } 1.93 + 1.94 + return false; 1.95 +} 1.96 + 1.97 +} 1.98 + 1.99 +#endif // HAVE(ASSEMBLER)