Changeset 159136 in webkit
- Timestamp:
- Nov 12, 2013 12:35:34 PM (10 years ago)
- Location:
- trunk/Source
- Files:
-
- 4 added
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/CMakeLists.txt
r159031 r159136 47 47 bytecode/ArrayAllocationProfile.cpp 48 48 bytecode/ArrayProfile.cpp 49 bytecode/BytecodeBasicBlock.cpp 50 bytecode/BytecodeLivenessAnalysis.cpp 49 51 bytecode/CallLinkInfo.cpp 50 52 bytecode/CallLinkStatus.cpp -
trunk/Source/JavaScriptCore/ChangeLog
r159125 r159136 1 2013-08-02 Mark Hahnenberg <mhahnenberg@apple.com> 2 3 CodeBlocks should be able to determine bytecode liveness 4 https://bugs.webkit.org/show_bug.cgi?id=118546 5 6 Reviewed by Filip Pizlo. 7 8 This will simplify some things in the DFG related to OSR exits and determining 9 which bytecode variables are live at which points during execution. It will 10 also be useful for making our conservative GC scan more precise. Currently it 11 doesn't properly account for liveness while the DFG is running, so it will be 12 off by default behing a runtime Options flag. 13 14 * JavaScriptCore.xcodeproj/project.pbxproj: 15 * bytecode/BytecodeBasicBlock.cpp: Added. 16 (JSC::isBranch): Used to determine the end of basic blocks. 17 (JSC::isUnconditionalBranch): Used to determine when a branch at the end of a 18 basic block can't possibly fall through to the next basic block in program order. 19 (JSC::isTerminal): Also used to detect the end of a block. 20 (JSC::isThrow): 21 (JSC::isJumpTarget): Used to correctly separate basic blocks. Any jump destination 22 must be the head of its own basic block. 23 (JSC::linkBlocks): Links two blocks together in a bi-direcitonal fashion. 24 (JSC::computeBytecodeBasicBlocks): Creates a set of basic blocks given a particular 25 CodeBlock and links them together. 26 * bytecode/BytecodeBasicBlock.h: Added. 27 (JSC::BytecodeBasicBlock::isEntryBlock): Entry blocks are a special basic blocks 28 that indicate the beginning of the function. 29 (JSC::BytecodeBasicBlock::isExitBlock): Exit blocks are a special basic block that 30 all blocks that exit the function have as a successor. Entry and exit blocks allows 31 the various code paths to be more regular. 32 (JSC::BytecodeBasicBlock::leaderBytecodeOffset): The leader bytecode offset is the 33 bytecode offset of the first instruction in the block. 34 (JSC::BytecodeBasicBlock::totalBytecodeLength): The total length of all the bytecodes 35 in this block. 36 (JSC::BytecodeBasicBlock::bytecodeOffsets): The bytecode offsets in this particular 37 basic block. This Vector allows us to iterate over the bytecodes in reverse order 38 which wouldn't be possible normally since they are of variable size. 39 (JSC::BytecodeBasicBlock::addPredecessor): Links a block to a specified predecessor. 40 Only creates one direction of the link. 41 (JSC::BytecodeBasicBlock::addSuccessor): Same as addPredecessor, but for successors. 42 (JSC::BytecodeBasicBlock::predecessors): Getter for predecessors. 43 (JSC::BytecodeBasicBlock::successors): Getter for successors. 44 (JSC::BytecodeBasicBlock::in): Getter for the liveness info at the head of the block. 45 (JSC::BytecodeBasicBlock::out): Getter for the liveness info at the tail of the block. 46 (JSC::BytecodeBasicBlock::BytecodeBasicBlock): 47 (JSC::BytecodeBasicBlock::addBytecodeLength): When creating basic blocks we call 48 this function when we want to add the next bytecode in program order to this block. 49 * bytecode/BytecodeLivenessAnalysis.cpp: Added. 50 (JSC::BytecodeLivenessAnalysis::BytecodeLivenessAnalysis): 51 (JSC::numberOfCapturedVariables): Convenience wrapper. Returns the 52 number of captured variables for a particular CodeBlock, or 0 if 53 the CodeBlock has no SymbolTable. 54 (JSC::captureStart): Ditto, but for captureStart(). 55 (JSC::captureEnd): Ditto, but for captureEnd(). 56 (JSC::isValidRegisterForLiveness): Returns true if the liveness analysis should 57 track the liveness of a particular operand. We ignore constants, arguments, and 58 captured variables. We ignore arguments because they're live for the duration of 59 a function call. We ignore captured variables because we also treat them as live 60 for the duration of the function. This could probably be improved to be more precise, 61 but it didn't seem worth it for now. 62 (JSC::setForOperand): Convenience wrapper that sets the bit in the provided bit 63 vector for the provided operand. It handles skipping over captured variables. 64 (JSC::computeUsesForBytecodeOffset): Computes which operands are used by a particular bytecode. 65 (JSC::computeDefsForBytecodeOffset): Computes which operands are defined by a particular 66 bytecode. Typically this is just the left-most operand. 67 (JSC::findBasicBlockWithLeaderOffset): 68 (JSC::findBasicBlockForBytecodeOffset): Scans over basic blocks to find the block 69 which contains a particular bytecode offset. 70 (JSC::computeLocalLivenessForBytecodeOffset): Computes block-local liveness from the 71 bottom of the block until a specified bytecode offset is reached. 72 (JSC::computeLocalLivenessForBlock): Computes liveness for the entire block and 73 stores the resulting liveness at the head. 74 (JSC::BytecodeLivenessAnalysis::runLivenessFixpoint): Runs backward flow liveness 75 analysis to fixpoint. 76 (JSC::BytecodeLivenessAnalysis::getLivenessInfoForNonCapturedVarsAtBytecodeOffset): 77 Slow path to get liveness info for non-captured, non-argument variable. 78 (JSC::BytecodeLivenessAnalysis::operandIsLiveAtBytecodeOffset): 79 (JSC::BytecodeLivenessAnalysis::getLivenessInfoAtBytecodeOffset): Returns the liveness 80 info for both captured and non-captured vars at a particular bytecode offset. 81 (JSC::BytecodeLivenessAnalysis::dumpResults): Dumps the output of the liveness analysis. 82 Controlled by new flag in Options.h/.cpp. 83 (JSC::BytecodeLivenessAnalysis::compute): Creates bytecode basic blocks and runs 84 full liveness analysis. 85 * bytecode/BytecodeLivenessAnalysis.h: Added. 86 (JSC::BytecodeLivenessAnalysis::hasBeenComputed): 87 (JSC::BytecodeLivenessAnalysis::computeIfNecessary): 88 * bytecode/CodeBlock.cpp: 89 (JSC::CodeBlock::CodeBlock): 90 * bytecode/CodeBlock.h: 91 (JSC::CodeBlock::livenessAnalysis): 92 * bytecode/PreciseJumpTargets.cpp: Refactored to be able to get the jump targets for 93 a particular bytecode offset for use during bytecode basic block construction. 94 (JSC::getJumpTargetsForBytecodeOffset): 95 (JSC::computePreciseJumpTargets): 96 (JSC::findJumpTargetsForBytecodeOffset): 97 * bytecode/PreciseJumpTargets.h: 98 * runtime/Options.cpp: 99 (JSC::Options::initialize): 100 * runtime/Options.h: 101 1 102 2013-11-11 Andy Estes <aestes@apple.com> 2 103 -
trunk/Source/JavaScriptCore/GNUmakefile.list.am
r159031 r159136 101 101 Source/JavaScriptCore/bytecode/ArrayProfile.h \ 102 102 Source/JavaScriptCore/bytecode/ByValInfo.h \ 103 Source/JavaScriptCore/bytecode/BytecodeBasicBlock.cpp \ 104 Source/JavaScriptCore/bytecode/BytecodeBasicBlock.h \ 105 Source/JavaScriptCore/bytecode/BytecodeLivenessAnalysis.cpp \ 106 Source/JavaScriptCore/bytecode/BytecodeLivenessAnalysis.h \ 103 107 Source/JavaScriptCore/bytecode/BytecodeConventions.h \ 104 108 Source/JavaScriptCore/bytecode/CallLinkInfo.cpp \ -
trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj
r159031 r159136 297 297 <ClCompile Include="..\bytecode\ArrayAllocationProfile.cpp" /> 298 298 <ClCompile Include="..\bytecode\ArrayProfile.cpp" /> 299 <ClCompile Include="..\bytecode\BytecodeBasicBlock.cpp" /> 300 <ClCompile Include="..\bytecode\BytecodeLivenessAnalysis.cpp" /> 299 301 <ClCompile Include="..\bytecode\CallLinkInfo.cpp" /> 300 302 <ClCompile Include="..\bytecode\CallLinkStatus.cpp" /> … … 742 744 <ClInclude Include="..\bytecode\ArrayProfile.h" /> 743 745 <ClInclude Include="..\bytecode\ByValInfo.h" /> 746 <ClInclude Include="..\bytecode\BytecodeBasicBlock.h" /> 747 <ClInclude Include="..\bytecode\BytecodeLivenessAnalysis.h" /> 744 748 <ClInclude Include="..\bytecode\CallLinkInfo.h" /> 745 749 <ClInclude Include="..\bytecode\CallLinkStatus.h" /> -
trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters
r159031 r159136 109 109 <Filter>bytecode</Filter> 110 110 </ClCompile> 111 <ClCompile Include="..\bytecode\BytecodeBasicBlock.cpp"> 112 <Filter>bytecode</Filter> 113 </ClCompile> 114 <ClCompile Include="..\bytecode\BytecodeLivenessAnalysis.cpp"> 115 <Filter>bytecode</Filter> 116 </ClCompile> 111 117 <ClCompile Include="..\bytecode\CallLinkInfo.cpp"> 112 118 <Filter>bytecode</Filter> … … 1363 1369 </ClInclude> 1364 1370 <ClInclude Include="..\bytecode\ByValInfo.h"> 1371 <Filter>bytecode</Filter> 1372 </ClInclude> 1373 <ClInclude Include="..\bytecode\BytecodeBasicBlock.h"> 1374 <Filter>bytecode</Filter> 1375 </ClInclude> 1376 <ClInclude Include="..\bytecode\BytecodeLivenessAnalysis.h"> 1365 1377 <Filter>bytecode</Filter> 1366 1378 </ClInclude> -
trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj
r159031 r159136 1217 1217 C2F0F2D116BAEEE900187C19 /* StructureRareData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C2F0F2D016BAEEE900187C19 /* StructureRareData.cpp */; }; 1218 1218 C2FC9BD316644DFB00810D33 /* CopiedBlockInlines.h in Headers */ = {isa = PBXBuildFile; fileRef = C2FC9BD216644DFB00810D33 /* CopiedBlockInlines.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1219 C2FCAE1017A9C24E0034C735 /* BytecodeBasicBlock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C2FCAE0C17A9C24E0034C735 /* BytecodeBasicBlock.cpp */; }; 1220 C2FCAE1117A9C24E0034C735 /* BytecodeBasicBlock.h in Headers */ = {isa = PBXBuildFile; fileRef = C2FCAE0D17A9C24E0034C735 /* BytecodeBasicBlock.h */; }; 1221 C2FCAE1217A9C24E0034C735 /* BytecodeLivenessAnalysis.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C2FCAE0E17A9C24E0034C735 /* BytecodeLivenessAnalysis.cpp */; }; 1222 C2FCAE1317A9C24E0034C735 /* BytecodeLivenessAnalysis.h in Headers */ = {isa = PBXBuildFile; fileRef = C2FCAE0F17A9C24E0034C735 /* BytecodeLivenessAnalysis.h */; }; 1219 1223 C2FE18A416BAEC4000AF3061 /* StructureRareData.h in Headers */ = {isa = PBXBuildFile; fileRef = C2FE18A316BAEC4000AF3061 /* StructureRareData.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1220 1224 DDF7ABD411F60ED200108E36 /* GCActivityCallback.h in Headers */ = {isa = PBXBuildFile; fileRef = DDF7ABD211F60ED200108E36 /* GCActivityCallback.h */; settings = {ATTRIBUTES = (Private, ); }; }; … … 2503 2507 C2F0F2D016BAEEE900187C19 /* StructureRareData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StructureRareData.cpp; sourceTree = "<group>"; }; 2504 2508 C2FC9BD216644DFB00810D33 /* CopiedBlockInlines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CopiedBlockInlines.h; sourceTree = "<group>"; }; 2509 C2FCAE0C17A9C24E0034C735 /* BytecodeBasicBlock.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BytecodeBasicBlock.cpp; sourceTree = "<group>"; }; 2510 C2FCAE0D17A9C24E0034C735 /* BytecodeBasicBlock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BytecodeBasicBlock.h; sourceTree = "<group>"; }; 2511 C2FCAE0E17A9C24E0034C735 /* BytecodeLivenessAnalysis.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BytecodeLivenessAnalysis.cpp; sourceTree = "<group>"; }; 2512 C2FCAE0F17A9C24E0034C735 /* BytecodeLivenessAnalysis.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BytecodeLivenessAnalysis.h; sourceTree = "<group>"; }; 2505 2513 C2FE18A316BAEC4000AF3061 /* StructureRareData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StructureRareData.h; sourceTree = "<group>"; }; 2506 2514 D21202280AD4310C00ED79B6 /* DateConversion.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = DateConversion.cpp; sourceTree = "<group>"; }; … … 4024 4032 isa = PBXGroup; 4025 4033 children = ( 4034 C2FCAE0C17A9C24E0034C735 /* BytecodeBasicBlock.cpp */, 4035 C2FCAE0D17A9C24E0034C735 /* BytecodeBasicBlock.h */, 4036 C2FCAE0E17A9C24E0034C735 /* BytecodeLivenessAnalysis.cpp */, 4037 C2FCAE0F17A9C24E0034C735 /* BytecodeLivenessAnalysis.h */, 4026 4038 0F8335B41639C1E3001443B5 /* ArrayAllocationProfile.cpp */, 4027 4039 0F8335B51639C1E3001443B5 /* ArrayAllocationProfile.h */, … … 4162 4174 BC18C3E60E16F5CD00B34460 /* ArrayConstructor.h in Headers */, 4163 4175 0FB7F39515ED8E4600F167B2 /* ArrayConventions.h in Headers */, 4176 C2FCAE1117A9C24E0034C735 /* BytecodeBasicBlock.h in Headers */, 4164 4177 A7BDAEC717F4EA1400F6140C /* ArrayIteratorConstructor.h in Headers */, 4165 4178 A7BDAEC917F4EA1400F6140C /* ArrayIteratorPrototype.h in Headers */, … … 4752 4765 BC18C4660E16F5CD00B34460 /* StringConstructor.h in Headers */, 4753 4766 BC18C4680E16F5CD00B34460 /* StringObject.h in Headers */, 4767 C2FCAE1317A9C24E0034C735 /* BytecodeLivenessAnalysis.h in Headers */, 4754 4768 BC18C46A0E16F5CD00B34460 /* StringPrototype.h in Headers */, 4755 4769 142E313B134FF0A600AFADB5 /* Strong.h in Headers */, … … 5288 5302 147F39C5107EC37600427A48 /* DateInstance.cpp in Sources */, 5289 5303 147F39C6107EC37600427A48 /* DatePrototype.cpp in Sources */, 5304 C2FCAE1217A9C24E0034C735 /* BytecodeLivenessAnalysis.cpp in Sources */, 5290 5305 14280823107EC02C0013E7B2 /* Debugger.cpp in Sources */, 5291 5306 BC3135650F302FA3003DFD3A /* DebuggerActivation.cpp in Sources */, … … 5607 5622 0FF729B3166AD35C000F5BA3 /* ProfilerOrigin.cpp in Sources */, 5608 5623 0FF729B4166AD35C000F5BA3 /* ProfilerOriginStack.cpp in Sources */, 5624 C2FCAE1017A9C24E0034C735 /* BytecodeBasicBlock.cpp in Sources */, 5609 5625 0FB1058B1675483100F8AB6E /* ProfilerOSRExit.cpp in Sources */, 5610 5626 0FB1058D1675483700F8AB6E /* ProfilerOSRExitSite.cpp in Sources */, -
trunk/Source/JavaScriptCore/bytecode/CodeBlock.cpp
r159097 r159136 1573 1573 , m_reoptimizationRetryCounter(0) 1574 1574 , m_hash(other.m_hash) 1575 , m_livenessAnalysis(other.m_livenessAnalysis) 1575 1576 #if ENABLE(JIT) 1576 1577 , m_capabilityLevelState(DFG::CapabilityLevelNotSet) … … 1618 1619 , m_optimizationDelayCounter(0) 1619 1620 , m_reoptimizationRetryCounter(0) 1621 , m_livenessAnalysis(this) 1620 1622 #if ENABLE(JIT) 1621 1623 , m_capabilityLevelState(DFG::CapabilityLevelNotSet) … … 1920 1922 if (Options::dumpGeneratedBytecodes()) 1921 1923 dumpBytecode(); 1924 1922 1925 m_heap->m_codeBlocks.add(this); 1923 1926 m_heap->reportExtraMemoryCost(sizeof(CodeBlock) + m_instructions.size() * sizeof(Instruction)); -
trunk/Source/JavaScriptCore/bytecode/CodeBlock.h
r159097 r159136 34 34 #include "ByValInfo.h" 35 35 #include "BytecodeConventions.h" 36 #include "BytecodeLivenessAnalysis.h" 36 37 #include "CallLinkInfo.h" 37 38 #include "CallReturnOffsetToBytecodeOffset.h" … … 96 97 class CodeBlock : public ThreadSafeRefCounted<CodeBlock>, public UnconditionalFinalizer, public WeakReferenceHarvester { 97 98 WTF_MAKE_FAST_ALLOCATED; 99 friend class BytecodeLivenessAnalysis; 98 100 friend class JIT; 99 101 friend class LLIntOffsetsExtractor; … … 677 679 678 680 JSGlobalObject* globalObjectFor(CodeOrigin); 681 682 BytecodeLivenessAnalysis& livenessAnalysis() { return m_livenessAnalysis; } 679 683 680 684 // Jump Tables … … 1074 1078 mutable CodeBlockHash m_hash; 1075 1079 1080 BytecodeLivenessAnalysis m_livenessAnalysis; 1081 1076 1082 struct RareData { 1077 1083 WTF_MAKE_FAST_ALLOCATED; -
trunk/Source/JavaScriptCore/bytecode/PreciseJumpTargets.cpp
r153237 r159136 29 29 namespace JSC { 30 30 31 template <size_t vectorSize> 32 static void getJumpTargetsForBytecodeOffset(CodeBlock* codeBlock, Interpreter* interpreter, Instruction* instructionsBegin, unsigned bytecodeOffset, Vector<unsigned, vectorSize>& out) 33 { 34 OpcodeID opcodeID = interpreter->getOpcodeID(instructionsBegin[bytecodeOffset].u.opcode); 35 Instruction* current = instructionsBegin + bytecodeOffset; 36 switch (opcodeID) { 37 case op_jmp: 38 out.append(bytecodeOffset + current[1].u.operand); 39 break; 40 case op_jtrue: 41 case op_jfalse: 42 case op_jeq_null: 43 case op_jneq_null: 44 out.append(bytecodeOffset + current[2].u.operand); 45 break; 46 case op_jneq_ptr: 47 case op_jless: 48 case op_jlesseq: 49 case op_jgreater: 50 case op_jgreatereq: 51 case op_jnless: 52 case op_jnlesseq: 53 case op_jngreater: 54 case op_jngreatereq: 55 out.append(bytecodeOffset + current[3].u.operand); 56 break; 57 case op_switch_imm: 58 case op_switch_char: { 59 SimpleJumpTable& table = codeBlock->switchJumpTable(current[1].u.operand); 60 for (unsigned i = table.branchOffsets.size(); i--;) 61 out.append(bytecodeOffset + table.branchOffsets[i]); 62 out.append(bytecodeOffset + current[2].u.operand); 63 break; 64 } 65 case op_switch_string: { 66 StringJumpTable& table = codeBlock->stringSwitchJumpTable(current[1].u.operand); 67 StringJumpTable::StringOffsetTable::iterator iter = table.offsetTable.begin(); 68 StringJumpTable::StringOffsetTable::iterator end = table.offsetTable.end(); 69 for (; iter != end; ++iter) 70 out.append(bytecodeOffset + iter->value.branchOffset); 71 out.append(bytecodeOffset + current[2].u.operand); 72 break; 73 } 74 case op_get_pnames: 75 out.append(bytecodeOffset + current[5].u.operand); 76 break; 77 case op_next_pname: 78 out.append(bytecodeOffset + current[6].u.operand); 79 break; 80 case op_check_has_instance: 81 out.append(bytecodeOffset + current[4].u.operand); 82 break; 83 case op_loop_hint: 84 out.append(bytecodeOffset); 85 break; 86 default: 87 break; 88 } 89 } 90 31 91 void computePreciseJumpTargets(CodeBlock* codeBlock, Vector<unsigned, 32>& out) 32 92 { … … 46 106 for (unsigned bytecodeOffset = 0; bytecodeOffset < instructionCount;) { 47 107 OpcodeID opcodeID = interpreter->getOpcodeID(instructionsBegin[bytecodeOffset].u.opcode); 48 Instruction* current = instructionsBegin + bytecodeOffset; 49 switch (opcodeID) { 50 case op_jmp: 51 out.append(bytecodeOffset + current[1].u.operand); 52 break; 53 case op_jtrue: 54 case op_jfalse: 55 case op_jeq_null: 56 case op_jneq_null: 57 out.append(bytecodeOffset + current[2].u.operand); 58 break; 59 case op_jneq_ptr: 60 case op_jless: 61 case op_jlesseq: 62 case op_jgreater: 63 case op_jgreatereq: 64 case op_jnless: 65 case op_jnlesseq: 66 case op_jngreater: 67 case op_jngreatereq: 68 out.append(bytecodeOffset + current[3].u.operand); 69 break; 70 case op_switch_imm: 71 case op_switch_char: { 72 SimpleJumpTable& table = codeBlock->switchJumpTable(current[1].u.operand); 73 for (unsigned i = table.branchOffsets.size(); i--;) 74 out.append(bytecodeOffset + table.branchOffsets[i]); 75 out.append(bytecodeOffset + current[2].u.operand); 76 break; 77 } 78 case op_switch_string: { 79 StringJumpTable& table = codeBlock->stringSwitchJumpTable(current[1].u.operand); 80 StringJumpTable::StringOffsetTable::iterator iter = table.offsetTable.begin(); 81 StringJumpTable::StringOffsetTable::iterator end = table.offsetTable.end(); 82 for (; iter != end; ++iter) 83 out.append(bytecodeOffset + iter->value.branchOffset); 84 out.append(bytecodeOffset + current[2].u.operand); 85 break; 86 } 87 case op_get_pnames: 88 out.append(bytecodeOffset + current[5].u.operand); 89 break; 90 case op_next_pname: 91 out.append(bytecodeOffset + current[6].u.operand); 92 break; 93 case op_check_has_instance: 94 out.append(bytecodeOffset + current[4].u.operand); 95 break; 96 case op_loop_hint: 97 out.append(bytecodeOffset); 98 break; 99 default: 100 break; 101 } 108 getJumpTargetsForBytecodeOffset(codeBlock, interpreter, instructionsBegin, bytecodeOffset, out); 102 109 bytecodeOffset += opcodeLengths[opcodeID]; 103 110 } … … 119 126 } 120 127 128 void findJumpTargetsForBytecodeOffset(CodeBlock* codeBlock, unsigned bytecodeOffset, Vector<unsigned, 1>& out) 129 { 130 Interpreter* interpreter = codeBlock->vm()->interpreter; 131 Instruction* instructionsBegin = codeBlock->instructions().begin(); 132 getJumpTargetsForBytecodeOffset(codeBlock, interpreter, instructionsBegin, bytecodeOffset, out); 133 } 134 121 135 } // namespace JSC 122 136 -
trunk/Source/JavaScriptCore/bytecode/PreciseJumpTargets.h
r141931 r159136 32 32 33 33 void computePreciseJumpTargets(CodeBlock*, Vector<unsigned, 32>& out); 34 void findJumpTargetsForBytecodeOffset(CodeBlock*, unsigned bytecodeOffset, Vector<unsigned, 1>& out); 34 35 35 36 } // namespace JSC -
trunk/Source/JavaScriptCore/runtime/Options.cpp
r153175 r159136 213 213 useRegExpJIT() = false; 214 214 #endif 215 215 216 216 // Do range checks where needed and make corrections to the options: 217 217 ASSERT(thresholdForOptimizeAfterLongWarmUp() >= thresholdForOptimizeAfterWarmUp()); -
trunk/Source/JavaScriptCore/runtime/Options.h
r158535 r159136 100 100 \ 101 101 v(bool, dumpGeneratedBytecodes, false) \ 102 v(bool, dumpBytecodeLivenessResults, false) \ 102 103 \ 103 104 /* showDisassembly implies showDFGDisassembly. */ \ -
trunk/Source/WTF/wtf/FastBitVector.h
r156792 r159136 27 27 #define FastBitVector_h 28 28 29 #include <string.h> 29 30 #include <wtf/FastMalloc.h> 30 31 #include <wtf/StdLibExtras.h>
Note: See TracChangeset
for help on using the changeset viewer.