Ignore:
Timestamp:
Jul 22, 2009, 3:17:10 PM (16 years ago)
Author:
[email protected]
Message:

2009-07-22 Gavin Barraclough <[email protected]>

Reviewed by Sam Weinig.

With ENABLE(ASSEMBLER_WX_EXCLUSIVE), only change permissions once per repatch event.
( https://bugs.webkit.org/show_bug.cgi?id=27564 )

Currently we change permissions forwards and backwards for each instruction modified,
instead we should only change permissions once per complete repatching event.

2.5% progression running with ENABLE(ASSEMBLER_WX_EXCLUSIVE) enabled,
which recoups 1/3 of the penalty of running with this mode enabled.

  • assembler/ARMAssembler.cpp: (JSC::ARMAssembler::linkBranch):
    • Replace usage of MakeWritable with cacheFlush.


  • assembler/ARMAssembler.h: (JSC::ARMAssembler::patchPointerInternal): (JSC::ARMAssembler::repatchLoadPtrToLEA):
    • Replace usage of MakeWritable with cacheFlush.
  • assembler/ARMv7Assembler.h: (JSC::ARMv7Assembler::relinkJump): (JSC::ARMv7Assembler::relinkCall): (JSC::ARMv7Assembler::repatchInt32): (JSC::ARMv7Assembler::repatchPointer): (JSC::ARMv7Assembler::repatchLoadPtrToLEA): (JSC::ARMv7Assembler::setInt32):
    • Replace usage of MakeWritable with cacheFlush.
  • assembler/LinkBuffer.h: (JSC::LinkBuffer::performFinalization):
    • Make explicit call to cacheFlush.
  • assembler/MacroAssemblerCodeRef.h: (JSC::MacroAssemblerCodeRef::MacroAssemblerCodeRef):
    • Make size always available.
  • assembler/RepatchBuffer.h: (JSC::RepatchBuffer::RepatchBuffer): (JSC::RepatchBuffer::~RepatchBuffer):
    • Add calls to MakeWritable & makeExecutable.
  • assembler/X86Assembler.h: (JSC::X86Assembler::relinkJump): (JSC::X86Assembler::relinkCall): (JSC::X86Assembler::repatchInt32): (JSC::X86Assembler::repatchPointer): (JSC::X86Assembler::repatchLoadPtrToLEA):
    • Remove usage of MakeWritable.
  • bytecode/CodeBlock.h: (JSC::CodeBlock::getJITCode):
    • Provide access to CodeBlock's JITCode.
  • jit/ExecutableAllocator.h: (JSC::ExecutableAllocator::makeExecutable): (JSC::ExecutableAllocator::cacheFlush):
    • Remove MakeWritable, make cacheFlush public.
  • jit/JIT.cpp: (JSC::ctiPatchNearCallByReturnAddress): (JSC::ctiPatchCallByReturnAddress): (JSC::JIT::privateCompile): (JSC::JIT::unlinkCall): (JSC::JIT::linkCall):
    • Add CodeBlock argument to RepatchBuffer.
  • jit/JIT.h:
    • Pass CodeBlock argument for use by RepatchBuffer.
  • jit/JITCode.h: (JSC::JITCode::start): (JSC::JITCode::size):
    • Provide access to code start & size.
  • jit/JITPropertyAccess.cpp: (JSC::JIT::privateCompilePutByIdTransition): (JSC::JIT::patchGetByIdSelf): (JSC::JIT::patchMethodCallProto): (JSC::JIT::patchPutByIdReplace): (JSC::JIT::privateCompilePatchGetArrayLength): (JSC::JIT::privateCompileGetByIdProto): (JSC::JIT::privateCompileGetByIdSelfList): (JSC::JIT::privateCompileGetByIdProtoList): (JSC::JIT::privateCompileGetByIdChainList): (JSC::JIT::privateCompileGetByIdChain):
    • Add CodeBlock argument to RepatchBuffer.
  • jit/JITStubs.cpp: (JSC::JITThunks::tryCachePutByID): (JSC::JITThunks::tryCacheGetByID): (JSC::JITStubs::DEFINE_STUB_FUNCTION):
    • Pass CodeBlock argument for use by RepatchBuffer.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/assembler/ARMv7Assembler.h

    r46202 r46247  
    15401540    static void relinkJump(void* from, void* to)
    15411541    {
    1542         ExecutableAllocator::MakeWritable unprotect(reinterpret_cast<uint16_t*>(from) - 2, 2 * sizeof(uint16_t));
    1543 
    15441542        ASSERT(!(reinterpret_cast<intptr_t>(from) & 1));
    15451543        ASSERT(!(reinterpret_cast<intptr_t>(to) & 1));
     
    15471545        intptr_t relative = reinterpret_cast<intptr_t>(to) - reinterpret_cast<intptr_t>(from);
    15481546        linkWithOffset(reinterpret_cast<uint16_t*>(from), relative);
     1547
     1548        ExecutableAllocator::cacheFlush(reinterpret_cast<uint16_t*>(from) - 2, 2 * sizeof(uint16_t));
    15491549    }
    15501550   
    15511551    static void relinkCall(void* from, void* to)
    15521552    {
    1553         ExecutableAllocator::MakeWritable unprotect(reinterpret_cast<uint16_t*>(from) - 5, 4 * sizeof(uint16_t));
    1554 
    15551553        ASSERT(!(reinterpret_cast<intptr_t>(from) & 1));
    15561554        ASSERT(reinterpret_cast<intptr_t>(to) & 1);
    15571555
    15581556        setPointer(reinterpret_cast<uint16_t*>(from) - 1, to);
     1557
     1558        ExecutableAllocator::cacheFlush(reinterpret_cast<uint16_t*>(from) - 5, 4 * sizeof(uint16_t));
    15591559    }
    15601560
    15611561    static void repatchInt32(void* where, int32_t value)
    15621562    {
    1563         ExecutableAllocator::MakeWritable unprotect(reinterpret_cast<uint16_t*>(where) - 4, 4 * sizeof(uint16_t));
    1564 
    15651563        ASSERT(!(reinterpret_cast<intptr_t>(where) & 1));
    15661564       
    15671565        setInt32(where, value);
     1566
     1567        ExecutableAllocator::cacheFlush(reinterpret_cast<uint16_t*>(where) - 4, 4 * sizeof(uint16_t));
    15681568    }
    15691569
    15701570    static void repatchPointer(void* where, void* value)
    15711571    {
    1572         ExecutableAllocator::MakeWritable unprotect(reinterpret_cast<uint16_t*>(where) - 4, 4 * sizeof(uint16_t));
    1573 
    15741572        ASSERT(!(reinterpret_cast<intptr_t>(where) & 1));
    15751573       
    15761574        setPointer(where, value);
     1575
     1576        ExecutableAllocator::cacheFlush(reinterpret_cast<uint16_t*>(where) - 4, 4 * sizeof(uint16_t));
    15771577    }
    15781578
     
    15841584        ASSERT((*loadOp & 0xfff0) == OP_LDR_reg_T2);
    15851585
    1586         ExecutableAllocator::MakeWritable unprotect(loadOp, sizeof(uint16_t));
    15871586        *loadOp = OP_ADD_reg_T3 | (*loadOp & 0xf);
     1587        ExecutableAllocator::cacheFlush(loadOp, sizeof(uint16_t));
    15881588    }
    15891589
     
    16161616        uint16_t* location = reinterpret_cast<uint16_t*>(code);
    16171617
    1618         ExecutableAllocator::MakeWritable unprotect(location - 4, 4 * sizeof(uint16_t));
    1619 
    16201618        uint16_t lo16 = value;
    16211619        uint16_t hi16 = value >> 16;
     
    16251623        spliceHi5(location - 2, hi16);
    16261624        spliceLo11(location - 1, hi16);
     1625
     1626        ExecutableAllocator::cacheFlush(location - 4, 4 * sizeof(uint16_t));
    16271627    }
    16281628
Note: See TracChangeset for help on using the changeset viewer.