Ignore:
Timestamp:
Jan 23, 2012, 1:08:34 PM (13 years ago)
Author:
[email protected]
Message:

Implement a JIT-code aware sampling profiler for JSC
https://bugs.webkit.org/show_bug.cgi?id=76855

Rubber stanmped by Geoff Garen.

Mechanical change - pass CodeBlock through to the executable allocator,
such that we will be able to map ranges of JIT code back to their owner.

  • assembler/ARMAssembler.cpp:

(JSC::ARMAssembler::executableCopy):

  • assembler/ARMAssembler.h:
  • assembler/AssemblerBuffer.h:

(JSC::AssemblerBuffer::executableCopy):

  • assembler/AssemblerBufferWithConstantPool.h:

(JSC::AssemblerBufferWithConstantPool::executableCopy):

  • assembler/LinkBuffer.h:

(JSC::LinkBuffer::LinkBuffer):
(JSC::LinkBuffer::linkCode):

  • assembler/MIPSAssembler.h:

(JSC::MIPSAssembler::executableCopy):

  • assembler/SH4Assembler.h:

(JSC::SH4Assembler::executableCopy):

  • assembler/X86Assembler.h:

(JSC::X86Assembler::executableCopy):
(JSC::X86Assembler::X86InstructionFormatter::executableCopy):

  • dfg/DFGJITCompiler.cpp:

(JSC::DFG::JITCompiler::compile):
(JSC::DFG::JITCompiler::compileFunction):

  • dfg/DFGOSRExitCompiler.cpp:
  • dfg/DFGRepatch.cpp:

(JSC::DFG::generateProtoChainAccessStub):
(JSC::DFG::tryCacheGetByID):
(JSC::DFG::tryBuildGetByIDList):
(JSC::DFG::tryCachePutByID):

  • dfg/DFGThunks.cpp:

(JSC::DFG::osrExitGenerationThunkGenerator):

  • jit/ExecutableAllocator.cpp:

(JSC::ExecutableAllocator::allocate):

  • jit/ExecutableAllocator.h:
  • jit/ExecutableAllocatorFixedVMPool.cpp:

(JSC::ExecutableAllocator::allocate):

  • jit/JIT.cpp:

(JSC::JIT::privateCompile):

  • jit/JITOpcodes.cpp:

(JSC::JIT::privateCompileCTIMachineTrampolines):

  • jit/JITOpcodes32_64.cpp:

(JSC::JIT::privateCompileCTIMachineTrampolines):
(JSC::JIT::privateCompileCTINativeCall):

  • jit/JITPropertyAccess.cpp:

(JSC::JIT::stringGetByValStubGenerator):
(JSC::JIT::privateCompilePutByIdTransition):
(JSC::JIT::privateCompilePatchGetArrayLength):
(JSC::JIT::privateCompileGetByIdProto):
(JSC::JIT::privateCompileGetByIdSelfList):
(JSC::JIT::privateCompileGetByIdProtoList):
(JSC::JIT::privateCompileGetByIdChainList):
(JSC::JIT::privateCompileGetByIdChain):

  • jit/JITPropertyAccess32_64.cpp:

(JSC::JIT::stringGetByValStubGenerator):
(JSC::JIT::privateCompilePutByIdTransition):
(JSC::JIT::privateCompilePatchGetArrayLength):
(JSC::JIT::privateCompileGetByIdProto):
(JSC::JIT::privateCompileGetByIdSelfList):
(JSC::JIT::privateCompileGetByIdProtoList):
(JSC::JIT::privateCompileGetByIdChainList):
(JSC::JIT::privateCompileGetByIdChain):

  • jit/JITStubs.cpp:
  • jit/SpecializedThunkJIT.h:

(JSC::SpecializedThunkJIT::finalize):

  • yarr/YarrJIT.cpp:

(JSC::Yarr::YarrGenerator::compile):

Location:
trunk/Source/JavaScriptCore/assembler
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/assembler/ARMAssembler.cpp

    r95901 r105636  
    345345}
    346346
    347 PassRefPtr<ExecutableMemoryHandle> ARMAssembler::executableCopy(JSGlobalData& globalData)
     347PassRefPtr<ExecutableMemoryHandle> ARMAssembler::executableCopy(JSGlobalData& globalData, void* ownerUID)
    348348{
    349349    // 64-bit alignment is required for next constant pool and JIT code as well
     
    352352        bkpt(0);
    353353
    354     RefPtr<ExecutableMemoryHandle> result = m_buffer.executableCopy(globalData);
     354    RefPtr<ExecutableMemoryHandle> result = m_buffer.executableCopy(globalData, ownerUID);
    355355    char* data = reinterpret_cast<char*>(result->start());
    356356
  • trunk/Source/JavaScriptCore/assembler/ARMAssembler.h

    r101473 r105636  
    680680        }
    681681
    682         PassRefPtr<ExecutableMemoryHandle> executableCopy(JSGlobalData&);
     682        PassRefPtr<ExecutableMemoryHandle> executableCopy(JSGlobalData&, void* ownerUID);
    683683
    684684#ifndef NDEBUG
  • trunk/Source/JavaScriptCore/assembler/AssemblerBuffer.h

    r99634 r105636  
    130130        }
    131131
    132         PassRefPtr<ExecutableMemoryHandle> executableCopy(JSGlobalData& globalData)
     132        PassRefPtr<ExecutableMemoryHandle> executableCopy(JSGlobalData& globalData, void* ownerUID)
    133133        {
    134134            if (!m_index)
    135135                return 0;
    136136
    137             RefPtr<ExecutableMemoryHandle> result = globalData.executableAllocator.allocate(globalData, m_index);
     137            RefPtr<ExecutableMemoryHandle> result = globalData.executableAllocator.allocate(globalData, m_index, ownerUID);
    138138
    139139            if (!result)
  • trunk/Source/JavaScriptCore/assembler/AssemblerBufferWithConstantPool.h

    r99382 r105636  
    196196    }
    197197
    198     PassRefPtr<ExecutableMemoryHandle> executableCopy(JSGlobalData& globalData)
     198    PassRefPtr<ExecutableMemoryHandle> executableCopy(JSGlobalData& globalData, void* ownerUID)
    199199    {
    200200        flushConstantPool(false);
    201         return AssemblerBuffer::executableCopy(globalData);
     201        return AssemblerBuffer::executableCopy(globalData, ownerUID);
    202202    }
    203203
  • trunk/Source/JavaScriptCore/assembler/LinkBuffer.h

    r99633 r105636  
    3131#define DUMP_LINK_STATISTICS 0
    3232#define DUMP_CODE 0
     33
     34#define GLOBAL_THUNK_ID reinterpret_cast<void*>(static_cast<intptr_t>(-1))
     35#define REGEXP_CODE_ID reinterpret_cast<void*>(static_cast<intptr_t>(-2))
    3336
    3437#include <MacroAssembler.h>
     
    7073
    7174public:
    72     LinkBuffer(JSGlobalData& globalData, MacroAssembler* masm)
     75    LinkBuffer(JSGlobalData& globalData, MacroAssembler* masm, void* ownerUID)
    7376        : m_size(0)
    7477        , m_code(0)
     
    7982#endif
    8083    {
    81         linkCode();
     84        linkCode(ownerUID);
    8285    }
    8386
     
    174177    }
    175178
    176     // Upon completion of all patching either 'finalizeCode()' or 'finalizeCodeAddendum()' should be called
    177     // once to complete generation of the code.  'finalizeCode()' is suited to situations
    178     // where the executable pool must also be retained, the lighter-weight 'finalizeCodeAddendum()' is
    179     // suited to adding to an existing allocation.
     179    // Upon completion of all patching 'finalizeCode()' should be called once to complete generation of the code.
    180180    CodeRef finalizeCode()
    181181    {
     
    211211    }
    212212   
    213     // Keep this private! - the underlying code should only be obtained externally via
    214     // finalizeCode() or finalizeCodeAddendum().
     213    // Keep this private! - the underlying code should only be obtained externally via finalizeCode().
    215214    void* code()
    216215    {
     
    218217    }
    219218
    220     void linkCode()
     219    void linkCode(void* ownerUID)
    221220    {
    222221        ASSERT(!m_code);
    223222#if !ENABLE(BRANCH_COMPACTION)
    224         m_executableMemory = m_assembler->m_assembler.executableCopy(*m_globalData);
     223        m_executableMemory = m_assembler->m_assembler.executableCopy(*m_globalData, ownerUID);
    225224        if (!m_executableMemory)
    226225            return;
     
    230229#else
    231230        size_t initialSize = m_assembler->m_assembler.codeSize();
    232         m_executableMemory = m_globalData->executableAllocator.allocate(*m_globalData, initialSize);
     231        m_executableMemory = m_globalData->executableAllocator.allocate(*m_globalData, initialSize, ownerUID);
    233232        if (!m_executableMemory)
    234233            return;
  • trunk/Source/JavaScriptCore/assembler/MIPSAssembler.h

    r101658 r105636  
    646646    }
    647647
    648     PassRefPtr<ExecutableMemoryHandle> executableCopy(JSGlobalData& globalData)
    649     {
    650         RefPtr<ExecutableMemoryHandle> result = m_buffer.executableCopy(globalData);
     648    PassRefPtr<ExecutableMemoryHandle> executableCopy(JSGlobalData& globalData, void* ownerUID)
     649    {
     650        RefPtr<ExecutableMemoryHandle> result = m_buffer.executableCopy(globalData, ownerUID);
    651651        if (!result)
    652652            return 0;
  • trunk/Source/JavaScriptCore/assembler/SH4Assembler.h

    r101980 r105636  
    15141514    }
    15151515
    1516     PassRefPtr<ExecutableMemoryHandle> executableCopy(JSGlobalData& globalData)
    1517     {
    1518         return m_buffer.executableCopy(globalData);
     1516    PassRefPtr<ExecutableMemoryHandle> executableCopy(JSGlobalData& globalData, void* ownerUID)
     1517    {
     1518        return m_buffer.executableCopy(globalData, ownerUID);
    15191519    }
    15201520
  • trunk/Source/JavaScriptCore/assembler/X86Assembler.h

    r103637 r105636  
    17831783    }
    17841784   
    1785     PassRefPtr<ExecutableMemoryHandle> executableCopy(JSGlobalData& globalData)
    1786     {
    1787         return m_formatter.executableCopy(globalData);
     1785    PassRefPtr<ExecutableMemoryHandle> executableCopy(JSGlobalData& globalData, void* ownerUID)
     1786    {
     1787        return m_formatter.executableCopy(globalData, ownerUID);
    17881788    }
    17891789
     
    21332133        void* data() const { return m_buffer.data(); }
    21342134
    2135         PassRefPtr<ExecutableMemoryHandle> executableCopy(JSGlobalData& globalData)
    2136         {
    2137             return m_buffer.executableCopy(globalData);
     2135        PassRefPtr<ExecutableMemoryHandle> executableCopy(JSGlobalData& globalData, void* ownerUID)
     2136        {
     2137            return m_buffer.executableCopy(globalData, ownerUID);
    21382138        }
    21392139
Note: See TracChangeset for help on using the changeset viewer.