diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
commit | 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch) | |
tree | 46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/JavaScriptCore/jit/JITCode.cpp | |
parent | 32761a6cee1d0dee366b885b7b9c777e67885688 (diff) | |
download | WebKitGtk-tarball-master.tar.gz |
webkitgtk-2.16.5HEADwebkitgtk-2.16.5master
Diffstat (limited to 'Source/JavaScriptCore/jit/JITCode.cpp')
-rw-r--r-- | Source/JavaScriptCore/jit/JITCode.cpp | 172 |
1 files changed, 119 insertions, 53 deletions
diff --git a/Source/JavaScriptCore/jit/JITCode.cpp b/Source/JavaScriptCore/jit/JITCode.cpp index 213b7000c..0001d32f1 100644 --- a/Source/JavaScriptCore/jit/JITCode.cpp +++ b/Source/JavaScriptCore/jit/JITCode.cpp @@ -27,7 +27,8 @@ #include "JITCode.h" #include "LLIntThunks.h" -#include "Operations.h" +#include "JSCInlines.h" +#include "ProtoCallFrame.h" #include <wtf/PrintStream.h> namespace JSC { @@ -41,12 +42,44 @@ JITCode::~JITCode() { } -JSValue JITCode::execute(VM* vm, ProtoCallFrame* protoCallFrame, Register* topOfStack) +const char* JITCode::typeName(JITType jitType) { - ASSERT(!vm->topCallFrame || ((Register*)(vm->topCallFrame) >= topOfStack)); + switch (jitType) { + case None: + return "None"; + case HostCallThunk: + return "Host"; + case InterpreterThunk: + return "LLInt"; + case BaselineJIT: + return "Baseline"; + case DFGJIT: + return "DFG"; + case FTLJIT: + return "FTL"; + default: + CRASH(); + return ""; + } +} + +void JITCode::validateReferences(const TrackedReferences&) +{ +} + +JSValue JITCode::execute(VM* vm, ProtoCallFrame* protoCallFrame) +{ + auto scope = DECLARE_THROW_SCOPE(*vm); + void* entryAddress; + JSFunction* function = jsDynamicCast<JSFunction*>(*vm, protoCallFrame->callee()); - JSValue result = JSValue::decode(callToJavaScript(executableAddress(), &vm->topCallFrame, protoCallFrame, topOfStack)); - return vm->exception() ? jsNull() : result; + if (!function || !protoCallFrame->needArityCheck()) { + ASSERT(!protoCallFrame->needArityCheck()); + entryAddress = executableAddress(); + } else + entryAddress = addressForCall(MustCheckArity).executableAddress(); + JSValue result = JSValue::decode(vmEntryToJavaScript(entryAddress, vm, protoCallFrame)); + return scope.exception() ? jsNull() : result; } DFG::CommonData* JITCode::dfgCommon() @@ -73,52 +106,38 @@ FTL::ForOSREntryJITCode* JITCode::ftlForOSREntry() return 0; } -PassRefPtr<JITCode> JITCode::hostFunction(JITCode::CodeRef code) -{ - return adoptRef(new DirectJITCode(code, HostCallThunk)); -} - -DirectJITCode::DirectJITCode(JITType jitType) +JITCodeWithCodeRef::JITCodeWithCodeRef(JITType jitType) : JITCode(jitType) { } -DirectJITCode::DirectJITCode(const JITCode::CodeRef ref, JITType jitType) +JITCodeWithCodeRef::JITCodeWithCodeRef(CodeRef ref, JITType jitType) : JITCode(jitType) , m_ref(ref) { } -DirectJITCode::~DirectJITCode() -{ -} - -void DirectJITCode::initializeCodeRef(const JITCode::CodeRef ref) +JITCodeWithCodeRef::~JITCodeWithCodeRef() { - RELEASE_ASSERT(!m_ref); - m_ref = ref; + if ((Options::dumpDisassembly() || (isOptimizingJIT(jitType()) && Options::dumpDFGDisassembly())) + && m_ref.executableMemory()) + dataLog("Destroying JIT code at ", pointerDump(m_ref.executableMemory()), "\n"); } -JITCode::CodePtr DirectJITCode::addressForCall() -{ - RELEASE_ASSERT(m_ref); - return m_ref.code(); -} - -void* DirectJITCode::executableAddressAtOffset(size_t offset) +void* JITCodeWithCodeRef::executableAddressAtOffset(size_t offset) { RELEASE_ASSERT(m_ref); return reinterpret_cast<char*>(m_ref.code().executableAddress()) + offset; } -void* DirectJITCode::dataAddressAtOffset(size_t offset) +void* JITCodeWithCodeRef::dataAddressAtOffset(size_t offset) { RELEASE_ASSERT(m_ref); ASSERT(offset <= size()); // use <= instead of < because it is valid to ask for an address at the exclusive end of the code. return reinterpret_cast<char*>(m_ref.code().dataLocation()) + offset; } -unsigned DirectJITCode::offsetOf(void* pointerIntoCode) +unsigned JITCodeWithCodeRef::offsetOf(void* pointerIntoCode) { RELEASE_ASSERT(m_ref); intptr_t result = reinterpret_cast<intptr_t>(pointerIntoCode) - reinterpret_cast<intptr_t>(m_ref.code().executableAddress()); @@ -126,47 +145,94 @@ unsigned DirectJITCode::offsetOf(void* pointerIntoCode) return static_cast<unsigned>(result); } -size_t DirectJITCode::size() +size_t JITCodeWithCodeRef::size() { RELEASE_ASSERT(m_ref); return m_ref.size(); } -bool DirectJITCode::contains(void* address) +bool JITCodeWithCodeRef::contains(void* address) { RELEASE_ASSERT(m_ref); return m_ref.executableMemory()->contains(address); } +DirectJITCode::DirectJITCode(JITType jitType) + : JITCodeWithCodeRef(jitType) +{ +} + +DirectJITCode::DirectJITCode(JITCode::CodeRef ref, JITCode::CodePtr withArityCheck, JITType jitType) + : JITCodeWithCodeRef(ref, jitType) + , m_withArityCheck(withArityCheck) +{ +} + +DirectJITCode::~DirectJITCode() +{ +} + +void DirectJITCode::initializeCodeRef(JITCode::CodeRef ref, JITCode::CodePtr withArityCheck) +{ + RELEASE_ASSERT(!m_ref); + m_ref = ref; + m_withArityCheck = withArityCheck; +} + +JITCode::CodePtr DirectJITCode::addressForCall(ArityCheckMode arity) +{ + switch (arity) { + case ArityCheckNotRequired: + RELEASE_ASSERT(m_ref); + return m_ref.code(); + case MustCheckArity: + RELEASE_ASSERT(m_withArityCheck); + return m_withArityCheck; + } + RELEASE_ASSERT_NOT_REACHED(); + return CodePtr(); +} + +NativeJITCode::NativeJITCode(JITType jitType) + : JITCodeWithCodeRef(jitType) +{ +} + +NativeJITCode::NativeJITCode(CodeRef ref, JITType jitType) + : JITCodeWithCodeRef(ref, jitType) +{ +} + +NativeJITCode::~NativeJITCode() +{ +} + +void NativeJITCode::initializeCodeRef(CodeRef ref) +{ + ASSERT(!m_ref); + m_ref = ref; +} + +JITCode::CodePtr NativeJITCode::addressForCall(ArityCheckMode) +{ + RELEASE_ASSERT(!!m_ref); + return m_ref.code(); +} + +#if ENABLE(JIT) +RegisterSet JITCode::liveRegistersToPreserveAtExceptionHandlingCallSite(CodeBlock*, CallSiteIndex) +{ + return RegisterSet(); +} +#endif + } // namespace JSC namespace WTF { void printInternal(PrintStream& out, JSC::JITCode::JITType type) { - switch (type) { - case JSC::JITCode::None: - out.print("None"); - return; - case JSC::JITCode::HostCallThunk: - out.print("Host"); - return; - case JSC::JITCode::InterpreterThunk: - out.print("LLInt"); - return; - case JSC::JITCode::BaselineJIT: - out.print("Baseline"); - return; - case JSC::JITCode::DFGJIT: - out.print("DFG"); - return; - case JSC::JITCode::FTLJIT: - out.print("FTL"); - return; - default: - CRASH(); - return; - } + out.print(JSC::JITCode::typeName(type)); } } // namespace WTF |