Ignore:
Timestamp:
Jun 13, 2012, 1:20:39 AM (13 years ago)
Author:
[email protected]
Message:

DFG should be able to set watchpoints on global variables
https://bugs.webkit.org/show_bug.cgi?id=88692

Source/JavaScriptCore:

Reviewed by Geoffrey Garen.

This implements global variable constant folding by allowing the optimizing
compiler to set a "watchpoint" on globals that it wishes to constant fold.
If the watchpoint fires, then an OSR exit is forced by overwriting the
machine code that the optimizing compiler generated with a jump.

As such, this patch is adding quite a bit of stuff:

  • Jump replacement on those hardware targets supported by the optimizing JIT. It is now possible to patch in a jump instruction over any recorded watchpoint label. The jump must be "local" in the sense that it must be within the range of the largest jump distance supported by a one instruction jump.


  • WatchpointSets and Watchpoints. A Watchpoint is a doubly-linked list node that records the location where a jump must be inserted and the destination to which it should jump. Watchpoints can be added to a WatchpointSet. The WatchpointSet can be fired all at once, which plants all jumps. WatchpointSet also remembers if it had ever been invalidated, which allows for monotonicity: we typically don't want to optimize using watchpoints on something for which watchpoints had previously fired. The act of notifying a WatchpointSet has a trivial fast path in case no Watchpoints are registered (one-byte load+branch).


  • SpeculativeJIT::speculationWatchpoint(). It's like speculationCheck(), except that you don't have to emit branches. But, you need to know what WatchpointSet to add the resulting Watchpoint to. Not everything that you could write a speculationCheck() for will have a WatchpointSet that would get notified if the condition you were speculating against became invalid.


  • SymbolTableEntry now has the ability to refer to a WatchpointSet. It can do so without incurring any space overhead for those entries that don't have WatchpointSets.


  • The bytecode generator infers all global function variables to be watchable, and makes all stores perform the WatchpointSet's write check, and marks all loads as being potentially watchable (i.e. you can compile them to a watchpoint and a constant).


Put together, this allows for fully sleazy inlining of calls to globally
declared functions. The inline prologue will no longer contain the load of
the function, or any checks of the function you're calling. I.e. it's
pretty much like the kind of inlining you would see in Java or C++.
Furthermore, the watchpointing functionality is built to be fairly general,
and should allow setting watchpoints on all sorts of interesting things
in the future.

The sleazy inlining means that we will now sometimes inline in code paths
that have never executed. Previously, to inline we would have either had
to have executed the call (to read the call's inline cache) or have
executed the method check (to read the method check's inline cache). Now,
we might inline when the callee is a watched global variable. This
revealed some humorous bugs. First, constant folding disagreed with CFA
over what kinds of operations can clobber (example: code path A is dead
but stores a String into variable X, all other code paths store 0 into
X, and then you do CompareEq(X, 0) - CFA will say that this is a non-
clobbering constant, but constant folding thought it was clobbering
because it saw the String prediction). Second, inlining would crash if
the inline callee had not been compiled. This patch fixes both bugs,
since otherwise run-javascriptcore-tests would report regressions.

  • CMakeLists.txt:
  • GNUmakefile.list.am:
  • JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
  • JavaScriptCore.xcodeproj/project.pbxproj:
  • Target.pri:
  • assembler/ARMv7Assembler.h:

(ARMv7Assembler):
(JSC::ARMv7Assembler::ARMv7Assembler):
(JSC::ARMv7Assembler::labelForWatchpoint):
(JSC::ARMv7Assembler::label):
(JSC::ARMv7Assembler::replaceWithJump):
(JSC::ARMv7Assembler::maxJumpReplacementSize):

  • assembler/AbstractMacroAssembler.h:

(JSC):
(AbstractMacroAssembler):
(Label):
(JSC::AbstractMacroAssembler::watchpointLabel):

  • assembler/AssemblerBuffer.h:
  • assembler/MacroAssemblerARM.h:

(JSC::MacroAssemblerARM::replaceWithJump):
(MacroAssemblerARM):
(JSC::MacroAssemblerARM::maxJumpReplacementSize):

  • assembler/MacroAssemblerARMv7.h:

(MacroAssemblerARMv7):
(JSC::MacroAssemblerARMv7::replaceWithJump):
(JSC::MacroAssemblerARMv7::maxJumpReplacementSize):
(JSC::MacroAssemblerARMv7::branchTest8):
(JSC::MacroAssemblerARMv7::jump):
(JSC::MacroAssemblerARMv7::makeBranch):

  • assembler/MacroAssemblerMIPS.h:

(JSC::MacroAssemblerMIPS::replaceWithJump):
(MacroAssemblerMIPS):
(JSC::MacroAssemblerMIPS::maxJumpReplacementSize):

  • assembler/MacroAssemblerSH4.h:

(JSC::MacroAssemblerSH4::replaceWithJump):
(MacroAssemblerSH4):
(JSC::MacroAssemblerSH4::maxJumpReplacementSize):

  • assembler/MacroAssemblerX86.h:

(MacroAssemblerX86):
(JSC::MacroAssemblerX86::branchTest8):

  • assembler/MacroAssemblerX86Common.h:

(JSC::MacroAssemblerX86Common::replaceWithJump):
(MacroAssemblerX86Common):
(JSC::MacroAssemblerX86Common::maxJumpReplacementSize):

  • assembler/MacroAssemblerX86_64.h:

(MacroAssemblerX86_64):
(JSC::MacroAssemblerX86_64::branchTest8):

  • assembler/X86Assembler.h:

(JSC::X86Assembler::X86Assembler):
(X86Assembler):
(JSC::X86Assembler::cmpb_im):
(JSC::X86Assembler::testb_im):
(JSC::X86Assembler::labelForWatchpoint):
(JSC::X86Assembler::label):
(JSC::X86Assembler::replaceWithJump):
(JSC::X86Assembler::maxJumpReplacementSize):
(JSC::X86Assembler::X86InstructionFormatter::memoryModRM):

  • bytecode/CodeBlock.cpp:

(JSC::CodeBlock::dump):

  • bytecode/CodeBlock.h:

(JSC::CodeBlock::appendOSRExit):
(JSC::CodeBlock::appendSpeculationRecovery):
(CodeBlock):
(JSC::CodeBlock::appendWatchpoint):
(JSC::CodeBlock::numberOfWatchpoints):
(JSC::CodeBlock::watchpoint):
(DFGData):

  • bytecode/DFGExitProfile.h:

(JSC::DFG::exitKindToString):
(JSC::DFG::exitKindIsCountable):

  • bytecode/Instruction.h:

(Instruction):
(JSC::Instruction::Instruction):

  • bytecode/Opcode.h:

(JSC):
(JSC::padOpcodeName):

  • bytecode/Watchpoint.cpp: Added.

(JSC):
(JSC::Watchpoint::~Watchpoint):
(JSC::Watchpoint::correctLabels):
(JSC::Watchpoint::fire):
(JSC::WatchpointSet::WatchpointSet):
(JSC::WatchpointSet::~WatchpointSet):
(JSC::WatchpointSet::add):
(JSC::WatchpointSet::notifyWriteSlow):
(JSC::WatchpointSet::fireAllWatchpoints):

  • bytecode/Watchpoint.h: Added.

(JSC):
(Watchpoint):
(JSC::Watchpoint::Watchpoint):
(JSC::Watchpoint::setDestination):
(WatchpointSet):
(JSC::WatchpointSet::isStillValid):
(JSC::WatchpointSet::hasBeenInvalidated):
(JSC::WatchpointSet::startWatching):
(JSC::WatchpointSet::notifyWrite):
(JSC::WatchpointSet::addressOfIsWatched):

  • bytecompiler/BytecodeGenerator.cpp:

(JSC::ResolveResult::checkValidity):
(JSC::BytecodeGenerator::addGlobalVar):
(JSC::BytecodeGenerator::BytecodeGenerator):
(JSC::BytecodeGenerator::resolve):
(JSC::BytecodeGenerator::emitResolve):
(JSC::BytecodeGenerator::emitResolveWithBase):
(JSC::BytecodeGenerator::emitResolveWithThis):
(JSC::BytecodeGenerator::emitGetStaticVar):
(JSC::BytecodeGenerator::emitPutStaticVar):

  • bytecompiler/BytecodeGenerator.h:

(BytecodeGenerator):

  • bytecompiler/NodesCodegen.cpp:

(JSC::FunctionCallResolveNode::emitBytecode):
(JSC::PostfixResolveNode::emitBytecode):
(JSC::PrefixResolveNode::emitBytecode):
(JSC::ReadModifyResolveNode::emitBytecode):
(JSC::AssignResolveNode::emitBytecode):
(JSC::ConstDeclNode::emitCodeSingle):

  • dfg/DFGAbstractState.cpp:

(JSC::DFG::AbstractState::execute):
(JSC::DFG::AbstractState::clobberStructures):

  • dfg/DFGAbstractState.h:

(AbstractState):
(JSC::DFG::AbstractState::didClobber):

  • dfg/DFGByteCodeParser.cpp:

(JSC::DFG::ByteCodeParser::handleInlining):
(JSC::DFG::ByteCodeParser::parseBlock):

  • dfg/DFGCCallHelpers.h:

(CCallHelpers):
(JSC::DFG::CCallHelpers::setupArguments):

  • dfg/DFGCSEPhase.cpp:

(JSC::DFG::CSEPhase::globalVarWatchpointElimination):
(CSEPhase):
(JSC::DFG::CSEPhase::globalVarStoreElimination):
(JSC::DFG::CSEPhase::performNodeCSE):

  • dfg/DFGCapabilities.h:

(JSC::DFG::canCompileOpcode):

  • dfg/DFGConstantFoldingPhase.cpp:

(JSC::DFG::ConstantFoldingPhase::run):

  • dfg/DFGCorrectableJumpPoint.h:

(JSC::DFG::CorrectableJumpPoint::isSet):
(CorrectableJumpPoint):

  • dfg/DFGJITCompiler.cpp:

(JSC::DFG::JITCompiler::linkOSRExits):
(JSC::DFG::JITCompiler::link):

  • dfg/DFGNode.h:

(JSC::DFG::Node::hasIdentifierNumberForCheck):
(Node):
(JSC::DFG::Node::identifierNumberForCheck):
(JSC::DFG::Node::hasRegisterPointer):

  • dfg/DFGNodeType.h:

(DFG):

  • dfg/DFGOSRExit.cpp:

(JSC::DFG::OSRExit::OSRExit):

  • dfg/DFGOSRExit.h:

(OSRExit):

  • dfg/DFGOperations.cpp:
  • dfg/DFGOperations.h:
  • dfg/DFGPredictionPropagationPhase.cpp:

(JSC::DFG::PredictionPropagationPhase::propagate):

  • dfg/DFGSpeculativeJIT.h:

(JSC::DFG::SpeculativeJIT::callOperation):
(JSC::DFG::SpeculativeJIT::appendCall):
(SpeculativeJIT):
(JSC::DFG::SpeculativeJIT::speculationWatchpoint):

  • dfg/DFGSpeculativeJIT32_64.cpp:

(JSC::DFG::SpeculativeJIT::compile):

  • dfg/DFGSpeculativeJIT64.cpp:

(JSC::DFG::SpeculativeJIT::compile):

  • jit/JIT.cpp:

(JSC::JIT::privateCompileMainPass):
(JSC::JIT::privateCompileSlowCases):

  • jit/JIT.h:
  • jit/JITPropertyAccess.cpp:

(JSC::JIT::emit_op_put_global_var_check):
(JSC):
(JSC::JIT::emitSlow_op_put_global_var_check):

  • jit/JITPropertyAccess32_64.cpp:

(JSC::JIT::emit_op_put_global_var_check):
(JSC):
(JSC::JIT::emitSlow_op_put_global_var_check):

  • jit/JITStubs.cpp:

(JSC::JITThunks::JITThunks):
(JSC::DEFINE_STUB_FUNCTION):
(JSC):

  • jit/JITStubs.h:
  • llint/LLIntSlowPaths.cpp:

(JSC::LLInt::LLINT_SLOW_PATH_DECL):
(LLInt):

  • llint/LLIntSlowPaths.h:

(LLInt):

  • llint/LowLevelInterpreter32_64.asm:
  • llint/LowLevelInterpreter64.asm:
  • runtime/JSObject.cpp:

(JSC::JSObject::removeDirect):

  • runtime/JSObject.h:

(JSObject):

  • runtime/JSSymbolTableObject.h:

(JSC::symbolTableGet):
(JSC::symbolTablePut):
(JSC::symbolTablePutWithAttributes):

  • runtime/SymbolTable.cpp: Added.

(JSC):
(JSC::SymbolTableEntry::copySlow):
(JSC::SymbolTableEntry::freeFatEntrySlow):
(JSC::SymbolTableEntry::couldBeWatched):
(JSC::SymbolTableEntry::attemptToWatch):
(JSC::SymbolTableEntry::addressOfIsWatched):
(JSC::SymbolTableEntry::addWatchpoint):
(JSC::SymbolTableEntry::notifyWriteSlow):
(JSC::SymbolTableEntry::inflateSlow):

  • runtime/SymbolTable.h:

(JSC):
(SymbolTableEntry):
(Fast):
(JSC::SymbolTableEntry::Fast::Fast):
(JSC::SymbolTableEntry::Fast::isNull):
(JSC::SymbolTableEntry::Fast::getIndex):
(JSC::SymbolTableEntry::Fast::isReadOnly):
(JSC::SymbolTableEntry::Fast::getAttributes):
(JSC::SymbolTableEntry::Fast::isFat):
(JSC::SymbolTableEntry::SymbolTableEntry):
(JSC::SymbolTableEntry::~SymbolTableEntry):
(JSC::SymbolTableEntry::operator=):
(JSC::SymbolTableEntry::isNull):
(JSC::SymbolTableEntry::getIndex):
(JSC::SymbolTableEntry::getFast):
(JSC::SymbolTableEntry::getAttributes):
(JSC::SymbolTableEntry::isReadOnly):
(JSC::SymbolTableEntry::watchpointSet):
(JSC::SymbolTableEntry::notifyWrite):
(FatEntry):
(JSC::SymbolTableEntry::FatEntry::FatEntry):
(JSC::SymbolTableEntry::isFat):
(JSC::SymbolTableEntry::fatEntry):
(JSC::SymbolTableEntry::inflate):
(JSC::SymbolTableEntry::bits):
(JSC::SymbolTableEntry::freeFatEntry):
(JSC::SymbolTableEntry::pack):
(JSC::SymbolTableEntry::isValidIndex):

Source/WTF:

Reviewed by Geoffrey Garen.

Added ability to set the inline capacity of segmented vectors.

  • wtf/SegmentedVector.h:

(WTF):
(SegmentedVectorIterator):
(WTF::SegmentedVectorIterator::operator=):
(WTF::SegmentedVectorIterator::SegmentedVectorIterator):
(SegmentedVector):

LayoutTests:

Rubber stamped by Geoffrey Garen.

Added a test for watchpoints. Also updated the jsc-test-list to include the latest
tests.

  • fast/js/dfg-call-function-hit-watchpoint-expected.txt: Added.
  • fast/js/dfg-call-function-hit-watchpoint.html: Added.
  • fast/js/jsc-test-list:
  • fast/js/script-tests/dfg-call-function-hit-watchpoint.js: Added.

(foo):
(bar):
(.foo):

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r120159 r120172  
     12012-06-12  Filip Pizlo  <[email protected]>
     2
     3        DFG should be able to set watchpoints on global variables
     4        https://bugs.webkit.org/show_bug.cgi?id=88692
     5
     6        Reviewed by Geoffrey Garen.
     7       
     8        This implements global variable constant folding by allowing the optimizing
     9        compiler to set a "watchpoint" on globals that it wishes to constant fold.
     10        If the watchpoint fires, then an OSR exit is forced by overwriting the
     11        machine code that the optimizing compiler generated with a jump.
     12       
     13        As such, this patch is adding quite a bit of stuff:
     14       
     15        - Jump replacement on those hardware targets supported by the optimizing
     16          JIT. It is now possible to patch in a jump instruction over any recorded
     17          watchpoint label. The jump must be "local" in the sense that it must be
     18          within the range of the largest jump distance supported by a one
     19          instruction jump.
     20         
     21        - WatchpointSets and Watchpoints. A Watchpoint is a doubly-linked list node
     22          that records the location where a jump must be inserted and the
     23          destination to which it should jump. Watchpoints can be added to a
     24          WatchpointSet. The WatchpointSet can be fired all at once, which plants
     25          all jumps. WatchpointSet also remembers if it had ever been invalidated,
     26          which allows for monotonicity: we typically don't want to optimize using
     27          watchpoints on something for which watchpoints had previously fired. The
     28          act of notifying a WatchpointSet has a trivial fast path in case no
     29          Watchpoints are registered (one-byte load+branch).
     30       
     31        - SpeculativeJIT::speculationWatchpoint(). It's like speculationCheck(),
     32          except that you don't have to emit branches. But, you need to know what
     33          WatchpointSet to add the resulting Watchpoint to. Not everything that
     34          you could write a speculationCheck() for will have a WatchpointSet that
     35          would get notified if the condition you were speculating against became
     36          invalid.
     37         
     38        - SymbolTableEntry now has the ability to refer to a WatchpointSet. It can
     39          do so without incurring any space overhead for those entries that don't
     40          have WatchpointSets.
     41         
     42        - The bytecode generator infers all global function variables to be
     43          watchable, and makes all stores perform the WatchpointSet's write check,
     44          and marks all loads as being potentially watchable (i.e. you can compile
     45          them to a watchpoint and a constant).
     46       
     47        Put together, this allows for fully sleazy inlining of calls to globally
     48        declared functions. The inline prologue will no longer contain the load of
     49        the function, or any checks of the function you're calling. I.e. it's
     50        pretty much like the kind of inlining you would see in Java or C++.
     51        Furthermore, the watchpointing functionality is built to be fairly general,
     52        and should allow setting watchpoints on all sorts of interesting things
     53        in the future.
     54       
     55        The sleazy inlining means that we will now sometimes inline in code paths
     56        that have never executed. Previously, to inline we would have either had
     57        to have executed the call (to read the call's inline cache) or have
     58        executed the method check (to read the method check's inline cache). Now,
     59        we might inline when the callee is a watched global variable. This
     60        revealed some humorous bugs. First, constant folding disagreed with CFA
     61        over what kinds of operations can clobber (example: code path A is dead
     62        but stores a String into variable X, all other code paths store 0 into
     63        X, and then you do CompareEq(X, 0) - CFA will say that this is a non-
     64        clobbering constant, but constant folding thought it was clobbering
     65        because it saw the String prediction). Second, inlining would crash if
     66        the inline callee had not been compiled. This patch fixes both bugs,
     67        since otherwise run-javascriptcore-tests would report regressions.
     68
     69        * CMakeLists.txt:
     70        * GNUmakefile.list.am:
     71        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
     72        * JavaScriptCore.xcodeproj/project.pbxproj:
     73        * Target.pri:
     74        * assembler/ARMv7Assembler.h:
     75        (ARMv7Assembler):
     76        (JSC::ARMv7Assembler::ARMv7Assembler):
     77        (JSC::ARMv7Assembler::labelForWatchpoint):
     78        (JSC::ARMv7Assembler::label):
     79        (JSC::ARMv7Assembler::replaceWithJump):
     80        (JSC::ARMv7Assembler::maxJumpReplacementSize):
     81        * assembler/AbstractMacroAssembler.h:
     82        (JSC):
     83        (AbstractMacroAssembler):
     84        (Label):
     85        (JSC::AbstractMacroAssembler::watchpointLabel):
     86        * assembler/AssemblerBuffer.h:
     87        * assembler/MacroAssemblerARM.h:
     88        (JSC::MacroAssemblerARM::replaceWithJump):
     89        (MacroAssemblerARM):
     90        (JSC::MacroAssemblerARM::maxJumpReplacementSize):
     91        * assembler/MacroAssemblerARMv7.h:
     92        (MacroAssemblerARMv7):
     93        (JSC::MacroAssemblerARMv7::replaceWithJump):
     94        (JSC::MacroAssemblerARMv7::maxJumpReplacementSize):
     95        (JSC::MacroAssemblerARMv7::branchTest8):
     96        (JSC::MacroAssemblerARMv7::jump):
     97        (JSC::MacroAssemblerARMv7::makeBranch):
     98        * assembler/MacroAssemblerMIPS.h:
     99        (JSC::MacroAssemblerMIPS::replaceWithJump):
     100        (MacroAssemblerMIPS):
     101        (JSC::MacroAssemblerMIPS::maxJumpReplacementSize):
     102        * assembler/MacroAssemblerSH4.h:
     103        (JSC::MacroAssemblerSH4::replaceWithJump):
     104        (MacroAssemblerSH4):
     105        (JSC::MacroAssemblerSH4::maxJumpReplacementSize):
     106        * assembler/MacroAssemblerX86.h:
     107        (MacroAssemblerX86):
     108        (JSC::MacroAssemblerX86::branchTest8):
     109        * assembler/MacroAssemblerX86Common.h:
     110        (JSC::MacroAssemblerX86Common::replaceWithJump):
     111        (MacroAssemblerX86Common):
     112        (JSC::MacroAssemblerX86Common::maxJumpReplacementSize):
     113        * assembler/MacroAssemblerX86_64.h:
     114        (MacroAssemblerX86_64):
     115        (JSC::MacroAssemblerX86_64::branchTest8):
     116        * assembler/X86Assembler.h:
     117        (JSC::X86Assembler::X86Assembler):
     118        (X86Assembler):
     119        (JSC::X86Assembler::cmpb_im):
     120        (JSC::X86Assembler::testb_im):
     121        (JSC::X86Assembler::labelForWatchpoint):
     122        (JSC::X86Assembler::label):
     123        (JSC::X86Assembler::replaceWithJump):
     124        (JSC::X86Assembler::maxJumpReplacementSize):
     125        (JSC::X86Assembler::X86InstructionFormatter::memoryModRM):
     126        * bytecode/CodeBlock.cpp:
     127        (JSC::CodeBlock::dump):
     128        * bytecode/CodeBlock.h:
     129        (JSC::CodeBlock::appendOSRExit):
     130        (JSC::CodeBlock::appendSpeculationRecovery):
     131        (CodeBlock):
     132        (JSC::CodeBlock::appendWatchpoint):
     133        (JSC::CodeBlock::numberOfWatchpoints):
     134        (JSC::CodeBlock::watchpoint):
     135        (DFGData):
     136        * bytecode/DFGExitProfile.h:
     137        (JSC::DFG::exitKindToString):
     138        (JSC::DFG::exitKindIsCountable):
     139        * bytecode/Instruction.h:
     140        (Instruction):
     141        (JSC::Instruction::Instruction):
     142        * bytecode/Opcode.h:
     143        (JSC):
     144        (JSC::padOpcodeName):
     145        * bytecode/Watchpoint.cpp: Added.
     146        (JSC):
     147        (JSC::Watchpoint::~Watchpoint):
     148        (JSC::Watchpoint::correctLabels):
     149        (JSC::Watchpoint::fire):
     150        (JSC::WatchpointSet::WatchpointSet):
     151        (JSC::WatchpointSet::~WatchpointSet):
     152        (JSC::WatchpointSet::add):
     153        (JSC::WatchpointSet::notifyWriteSlow):
     154        (JSC::WatchpointSet::fireAllWatchpoints):
     155        * bytecode/Watchpoint.h: Added.
     156        (JSC):
     157        (Watchpoint):
     158        (JSC::Watchpoint::Watchpoint):
     159        (JSC::Watchpoint::setDestination):
     160        (WatchpointSet):
     161        (JSC::WatchpointSet::isStillValid):
     162        (JSC::WatchpointSet::hasBeenInvalidated):
     163        (JSC::WatchpointSet::startWatching):
     164        (JSC::WatchpointSet::notifyWrite):
     165        (JSC::WatchpointSet::addressOfIsWatched):
     166        * bytecompiler/BytecodeGenerator.cpp:
     167        (JSC::ResolveResult::checkValidity):
     168        (JSC::BytecodeGenerator::addGlobalVar):
     169        (JSC::BytecodeGenerator::BytecodeGenerator):
     170        (JSC::BytecodeGenerator::resolve):
     171        (JSC::BytecodeGenerator::emitResolve):
     172        (JSC::BytecodeGenerator::emitResolveWithBase):
     173        (JSC::BytecodeGenerator::emitResolveWithThis):
     174        (JSC::BytecodeGenerator::emitGetStaticVar):
     175        (JSC::BytecodeGenerator::emitPutStaticVar):
     176        * bytecompiler/BytecodeGenerator.h:
     177        (BytecodeGenerator):
     178        * bytecompiler/NodesCodegen.cpp:
     179        (JSC::FunctionCallResolveNode::emitBytecode):
     180        (JSC::PostfixResolveNode::emitBytecode):
     181        (JSC::PrefixResolveNode::emitBytecode):
     182        (JSC::ReadModifyResolveNode::emitBytecode):
     183        (JSC::AssignResolveNode::emitBytecode):
     184        (JSC::ConstDeclNode::emitCodeSingle):
     185        * dfg/DFGAbstractState.cpp:
     186        (JSC::DFG::AbstractState::execute):
     187        (JSC::DFG::AbstractState::clobberStructures):
     188        * dfg/DFGAbstractState.h:
     189        (AbstractState):
     190        (JSC::DFG::AbstractState::didClobber):
     191        * dfg/DFGByteCodeParser.cpp:
     192        (JSC::DFG::ByteCodeParser::handleInlining):
     193        (JSC::DFG::ByteCodeParser::parseBlock):
     194        * dfg/DFGCCallHelpers.h:
     195        (CCallHelpers):
     196        (JSC::DFG::CCallHelpers::setupArguments):
     197        * dfg/DFGCSEPhase.cpp:
     198        (JSC::DFG::CSEPhase::globalVarWatchpointElimination):
     199        (CSEPhase):
     200        (JSC::DFG::CSEPhase::globalVarStoreElimination):
     201        (JSC::DFG::CSEPhase::performNodeCSE):
     202        * dfg/DFGCapabilities.h:
     203        (JSC::DFG::canCompileOpcode):
     204        * dfg/DFGConstantFoldingPhase.cpp:
     205        (JSC::DFG::ConstantFoldingPhase::run):
     206        * dfg/DFGCorrectableJumpPoint.h:
     207        (JSC::DFG::CorrectableJumpPoint::isSet):
     208        (CorrectableJumpPoint):
     209        * dfg/DFGJITCompiler.cpp:
     210        (JSC::DFG::JITCompiler::linkOSRExits):
     211        (JSC::DFG::JITCompiler::link):
     212        * dfg/DFGNode.h:
     213        (JSC::DFG::Node::hasIdentifierNumberForCheck):
     214        (Node):
     215        (JSC::DFG::Node::identifierNumberForCheck):
     216        (JSC::DFG::Node::hasRegisterPointer):
     217        * dfg/DFGNodeType.h:
     218        (DFG):
     219        * dfg/DFGOSRExit.cpp:
     220        (JSC::DFG::OSRExit::OSRExit):
     221        * dfg/DFGOSRExit.h:
     222        (OSRExit):
     223        * dfg/DFGOperations.cpp:
     224        * dfg/DFGOperations.h:
     225        * dfg/DFGPredictionPropagationPhase.cpp:
     226        (JSC::DFG::PredictionPropagationPhase::propagate):
     227        * dfg/DFGSpeculativeJIT.h:
     228        (JSC::DFG::SpeculativeJIT::callOperation):
     229        (JSC::DFG::SpeculativeJIT::appendCall):
     230        (SpeculativeJIT):
     231        (JSC::DFG::SpeculativeJIT::speculationWatchpoint):
     232        * dfg/DFGSpeculativeJIT32_64.cpp:
     233        (JSC::DFG::SpeculativeJIT::compile):
     234        * dfg/DFGSpeculativeJIT64.cpp:
     235        (JSC::DFG::SpeculativeJIT::compile):
     236        * jit/JIT.cpp:
     237        (JSC::JIT::privateCompileMainPass):
     238        (JSC::JIT::privateCompileSlowCases):
     239        * jit/JIT.h:
     240        * jit/JITPropertyAccess.cpp:
     241        (JSC::JIT::emit_op_put_global_var_check):
     242        (JSC):
     243        (JSC::JIT::emitSlow_op_put_global_var_check):
     244        * jit/JITPropertyAccess32_64.cpp:
     245        (JSC::JIT::emit_op_put_global_var_check):
     246        (JSC):
     247        (JSC::JIT::emitSlow_op_put_global_var_check):
     248        * jit/JITStubs.cpp:
     249        (JSC::JITThunks::JITThunks):
     250        (JSC::DEFINE_STUB_FUNCTION):
     251        (JSC):
     252        * jit/JITStubs.h:
     253        * llint/LLIntSlowPaths.cpp:
     254        (JSC::LLInt::LLINT_SLOW_PATH_DECL):
     255        (LLInt):
     256        * llint/LLIntSlowPaths.h:
     257        (LLInt):
     258        * llint/LowLevelInterpreter32_64.asm:
     259        * llint/LowLevelInterpreter64.asm:
     260        * runtime/JSObject.cpp:
     261        (JSC::JSObject::removeDirect):
     262        * runtime/JSObject.h:
     263        (JSObject):
     264        * runtime/JSSymbolTableObject.h:
     265        (JSC::symbolTableGet):
     266        (JSC::symbolTablePut):
     267        (JSC::symbolTablePutWithAttributes):
     268        * runtime/SymbolTable.cpp: Added.
     269        (JSC):
     270        (JSC::SymbolTableEntry::copySlow):
     271        (JSC::SymbolTableEntry::freeFatEntrySlow):
     272        (JSC::SymbolTableEntry::couldBeWatched):
     273        (JSC::SymbolTableEntry::attemptToWatch):
     274        (JSC::SymbolTableEntry::addressOfIsWatched):
     275        (JSC::SymbolTableEntry::addWatchpoint):
     276        (JSC::SymbolTableEntry::notifyWriteSlow):
     277        (JSC::SymbolTableEntry::inflateSlow):
     278        * runtime/SymbolTable.h:
     279        (JSC):
     280        (SymbolTableEntry):
     281        (Fast):
     282        (JSC::SymbolTableEntry::Fast::Fast):
     283        (JSC::SymbolTableEntry::Fast::isNull):
     284        (JSC::SymbolTableEntry::Fast::getIndex):
     285        (JSC::SymbolTableEntry::Fast::isReadOnly):
     286        (JSC::SymbolTableEntry::Fast::getAttributes):
     287        (JSC::SymbolTableEntry::Fast::isFat):
     288        (JSC::SymbolTableEntry::SymbolTableEntry):
     289        (JSC::SymbolTableEntry::~SymbolTableEntry):
     290        (JSC::SymbolTableEntry::operator=):
     291        (JSC::SymbolTableEntry::isNull):
     292        (JSC::SymbolTableEntry::getIndex):
     293        (JSC::SymbolTableEntry::getFast):
     294        (JSC::SymbolTableEntry::getAttributes):
     295        (JSC::SymbolTableEntry::isReadOnly):
     296        (JSC::SymbolTableEntry::watchpointSet):
     297        (JSC::SymbolTableEntry::notifyWrite):
     298        (FatEntry):
     299        (JSC::SymbolTableEntry::FatEntry::FatEntry):
     300        (JSC::SymbolTableEntry::isFat):
     301        (JSC::SymbolTableEntry::fatEntry):
     302        (JSC::SymbolTableEntry::inflate):
     303        (JSC::SymbolTableEntry::bits):
     304        (JSC::SymbolTableEntry::freeFatEntry):
     305        (JSC::SymbolTableEntry::pack):
     306        (JSC::SymbolTableEntry::isValidIndex):
     307
    13082012-06-12  Filip Pizlo  <[email protected]>
    2309
Note: See TracChangeset for help on using the changeset viewer.