From 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c Mon Sep 17 00:00:00 2001 From: Lorry Tar Creator Date: Tue, 27 Jun 2017 06:07:23 +0000 Subject: webkitgtk-2.16.5 --- Source/JavaScriptCore/ftl/FTLOSRExit.cpp | 83 ++++++++++++++++++++++++++------ 1 file changed, 68 insertions(+), 15 deletions(-) (limited to 'Source/JavaScriptCore/ftl/FTLOSRExit.cpp') diff --git a/Source/JavaScriptCore/ftl/FTLOSRExit.cpp b/Source/JavaScriptCore/ftl/FTLOSRExit.cpp index 00ea014cb..d7b7838d7 100644 --- a/Source/JavaScriptCore/ftl/FTLOSRExit.cpp +++ b/Source/JavaScriptCore/ftl/FTLOSRExit.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 Apple Inc. All rights reserved. + * Copyright (C) 2013, 2015 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -28,37 +28,90 @@ #if ENABLE(FTL_JIT) +#include "AirGenerationContext.h" +#include "B3StackmapGenerationParams.h" +#include "B3StackmapValue.h" #include "CodeBlock.h" #include "DFGBasicBlock.h" #include "DFGNode.h" #include "FTLExitArgument.h" -#include "FTLExitArgumentList.h" #include "FTLJITCode.h" -#include "Operations.h" +#include "FTLLocation.h" +#include "FTLState.h" +#include "JSCInlines.h" namespace JSC { namespace FTL { +using namespace B3; using namespace DFG; -OSRExit::OSRExit( - ExitKind exitKind, ValueFormat profileValueFormat, - MethodOfGettingAValueProfile valueProfile, CodeOrigin codeOrigin, - CodeOrigin originForProfile, unsigned numberOfArguments, - unsigned numberOfLocals) - : OSRExitBase(exitKind, codeOrigin, originForProfile) - , m_profileValueFormat(profileValueFormat) +OSRExitDescriptor::OSRExitDescriptor( + DataFormat profileDataFormat, MethodOfGettingAValueProfile valueProfile, + unsigned numberOfArguments, unsigned numberOfLocals) + : m_profileDataFormat(profileDataFormat) , m_valueProfile(valueProfile) - , m_patchableCodeOffset(0) , m_values(numberOfArguments, numberOfLocals) { } +void OSRExitDescriptor::validateReferences(const TrackedReferences& trackedReferences) +{ + for (unsigned i = m_values.size(); i--;) + m_values[i].validateReferences(trackedReferences); + + for (ExitTimeObjectMaterialization* materialization : m_materializations) + materialization->validateReferences(trackedReferences); +} + +RefPtr OSRExitDescriptor::emitOSRExit( + State& state, ExitKind exitKind, const NodeOrigin& nodeOrigin, CCallHelpers& jit, + const StackmapGenerationParams& params, unsigned offset) +{ + RefPtr handle = + prepareOSRExitHandle(state, exitKind, nodeOrigin, params, offset); + handle->emitExitThunk(state, jit); + return handle; +} + +RefPtr OSRExitDescriptor::emitOSRExitLater( + State& state, ExitKind exitKind, const NodeOrigin& nodeOrigin, + const StackmapGenerationParams& params, unsigned offset) +{ + RefPtr handle = + prepareOSRExitHandle(state, exitKind, nodeOrigin, params, offset); + params.addLatePath( + [handle, &state] (CCallHelpers& jit) { + handle->emitExitThunk(state, jit); + }); + return handle; +} + +RefPtr OSRExitDescriptor::prepareOSRExitHandle( + State& state, ExitKind exitKind, const NodeOrigin& nodeOrigin, + const StackmapGenerationParams& params, unsigned offset) +{ + unsigned index = state.jitCode->osrExit.size(); + OSRExit& exit = state.jitCode->osrExit.alloc( + this, exitKind, nodeOrigin.forExit, nodeOrigin.semantic, nodeOrigin.wasHoisted); + RefPtr handle = adoptRef(new OSRExitHandle(index, exit)); + for (unsigned i = offset; i < params.size(); ++i) + exit.m_valueReps.append(params[i]); + exit.m_valueReps.shrinkToFit(); + return handle; +} + +OSRExit::OSRExit( + OSRExitDescriptor* descriptor, ExitKind exitKind, CodeOrigin codeOrigin, + CodeOrigin codeOriginForExitProfile, bool wasHoisted) + : OSRExitBase(exitKind, codeOrigin, codeOriginForExitProfile, wasHoisted) + , m_descriptor(descriptor) +{ +} + CodeLocationJump OSRExit::codeLocationForRepatch(CodeBlock* ftlCodeBlock) const { - return CodeLocationJump( - reinterpret_cast( - ftlCodeBlock->jitCode()->ftl()->exitThunks().dataLocation()) + - m_patchableCodeOffset); + UNUSED_PARAM(ftlCodeBlock); + return m_patchableJump; } } } // namespace JSC::FTL -- cgit v1.2.1