void generateICFastPath( State& state, CodeBlock* codeBlock, GeneratedFunction generatedFunction, StackMaps::RecordMap& recordMap, DescriptorType& ic, size_t sizeOfIC) { VM& vm = state.graph.m_vm; StackMaps::RecordMap::iterator iter = recordMap.find(ic.stackmapID()); if (iter == recordMap.end()) { // It was optimized out. return; } Vector<StackMaps::Record>& records = iter->value; RELEASE_ASSERT(records.size() == ic.m_generators.size()); for (unsigned i = records.size(); i--;) { StackMaps::Record& record = records[i]; auto generator = ic.m_generators[i]; CCallHelpers fastPathJIT(&vm, codeBlock); generator.generateFastPath(fastPathJIT); char* startOfIC = bitwise_cast<char*>(generatedFunction) + record.instructionOffset; LinkBuffer linkBuffer(vm, fastPathJIT, startOfIC, sizeOfIC); // Note: we could handle the !isValid() case. We just don't appear to have a // reason to do so, yet. RELEASE_ASSERT(linkBuffer.isValid()); MacroAssembler::AssemblerType_T::fillNops( startOfIC + linkBuffer.size(), sizeOfIC - linkBuffer.size()); state.finalizer->sideCodeLinkBuffer->link( ic.m_slowPathDone[i], CodeLocationLabel(startOfIC + sizeOfIC)); linkBuffer.link( generator.slowPathJump(), state.finalizer->sideCodeLinkBuffer->locationOf(generator.slowPathBegin())); generator.finalize(linkBuffer, *state.finalizer->sideCodeLinkBuffer); } }
void generateICFastPath( State& state, CodeBlock* codeBlock, GeneratedFunction generatedFunction, StackMaps::RecordMap& recordMap, DescriptorType& ic, size_t sizeOfIC) { VM& vm = state.graph.m_vm; StackMaps::RecordMap::iterator iter = recordMap.find(ic.stackmapID()); if (iter == recordMap.end()) { // It was optimized out. return; } Vector<StackMaps::Record>& records = iter->value; RELEASE_ASSERT(records.size() == ic.m_generators.size()); for (unsigned i = records.size(); i--;) { StackMaps::Record& record = records[i]; auto generator = ic.m_generators[i]; CCallHelpers fastPathJIT(&vm, codeBlock); generator.generateFastPath(fastPathJIT); char* startOfIC = bitwise_cast<char*>(generatedFunction) + record.instructionOffset; generateInlineIfPossibleOutOfLineIfNot(state, vm, codeBlock, fastPathJIT, startOfIC, sizeOfIC, "inline cache fast path", [&] (LinkBuffer& linkBuffer, CCallHelpers&, bool) { state.finalizer->sideCodeLinkBuffer->link(ic.m_slowPathDone[i], CodeLocationLabel(startOfIC + sizeOfIC)); linkBuffer.link(generator.slowPathJump(), state.finalizer->sideCodeLinkBuffer->locationOf(generator.slowPathBegin())); generator.finalize(linkBuffer, *state.finalizer->sideCodeLinkBuffer); }); } }