Diff
Modified: trunk/Source/_javascript_Core/CMakeLists.txt (179911 => 179912)
--- trunk/Source/_javascript_Core/CMakeLists.txt 2015-02-11 02:39:31 UTC (rev 179911)
+++ trunk/Source/_javascript_Core/CMakeLists.txt 2015-02-11 02:41:20 UTC (rev 179912)
@@ -843,6 +843,7 @@
ftl/FTLJITCode.cpp
ftl/FTLJITFinalizer.cpp
ftl/FTLJSCall.cpp
+ ftl/FTLJSCallBase.cpp
ftl/FTLLink.cpp
ftl/FTLLocation.cpp
ftl/FTLLowerDFGToLLVM.cpp
Modified: trunk/Source/_javascript_Core/ChangeLog (179911 => 179912)
--- trunk/Source/_javascript_Core/ChangeLog 2015-02-11 02:39:31 UTC (rev 179911)
+++ trunk/Source/_javascript_Core/ChangeLog 2015-02-11 02:41:20 UTC (rev 179912)
@@ -1,5 +1,32 @@
2015-02-10 Filip Pizlo <fpi...@apple.com>
+ Split FTL::JSCall into the part that knows about call inline caching and the part that interacts with LLVM patchpoints
+ https://bugs.webkit.org/show_bug.cgi?id=141455
+
+ Reviewed by Mark Lam.
+
+ The newly introduced FTL::JSCallBase can be used to build other things, like the FTL portion
+ of https://bugs.webkit.org/show_bug.cgi?id=141332.
+
+ * CMakeLists.txt:
+ * _javascript_Core.vcxproj/_javascript_Core.vcxproj:
+ * _javascript_Core.xcodeproj/project.pbxproj:
+ * bytecode/CallLinkInfo.h:
+ (JSC::CallLinkInfo::specializationKindFor):
+ (JSC::CallLinkInfo::specializationKind):
+ * ftl/FTLJSCall.cpp:
+ (JSC::FTL::JSCall::JSCall):
+ (JSC::FTL::JSCall::emit): Deleted.
+ (JSC::FTL::JSCall::link): Deleted.
+ * ftl/FTLJSCall.h:
+ * ftl/FTLJSCallBase.cpp: Added.
+ (JSC::FTL::JSCallBase::JSCallBase):
+ (JSC::FTL::JSCallBase::emit):
+ (JSC::FTL::JSCallBase::link):
+ * ftl/FTLJSCallBase.h: Added.
+
+2015-02-10 Filip Pizlo <fpi...@apple.com>
+
Unreviewed, fix build.
* jit/CCallHelpers.h:
Modified: trunk/Source/_javascript_Core/_javascript_Core.vcxproj/_javascript_Core.vcxproj (179911 => 179912)
--- trunk/Source/_javascript_Core/_javascript_Core.vcxproj/_javascript_Core.vcxproj 2015-02-11 02:39:31 UTC (rev 179911)
+++ trunk/Source/_javascript_Core/_javascript_Core.vcxproj/_javascript_Core.vcxproj 2015-02-11 02:41:20 UTC (rev 179912)
@@ -510,6 +510,7 @@
<ClCompile Include="..\ftl\FTLJITCode.cpp" />
<ClCompile Include="..\ftl\FTLJITFinalizer.cpp" />
<ClCompile Include="..\ftl\FTLJSCall.cpp" />
+ <ClCompile Include="..\ftl\FTLJSCallBase.cpp" />
<ClCompile Include="..\ftl\FTLLink.cpp" />
<ClCompile Include="..\ftl\FTLLocation.cpp" />
<ClCompile Include="..\ftl\FTLLowerDFGToLLVM.cpp" />
@@ -1191,6 +1192,7 @@
<ClInclude Include="..\ftl\FTLJITCode.h" />
<ClInclude Include="..\ftl\FTLJITFinalizer.h" />
<ClInclude Include="..\ftl\FTLJSCall.h" />
+ <ClInclude Include="..\ftl\FTLJSCallBase.h" />
<ClInclude Include="..\ftl\FTLLink.h" />
<ClInclude Include="..\ftl\FTLLocation.h" />
<ClInclude Include="..\ftl\FTLLowerDFGToLLVM.h" />
Modified: trunk/Source/_javascript_Core/_javascript_Core.xcodeproj/project.pbxproj (179911 => 179912)
--- trunk/Source/_javascript_Core/_javascript_Core.xcodeproj/project.pbxproj 2015-02-11 02:39:31 UTC (rev 179911)
+++ trunk/Source/_javascript_Core/_javascript_Core.xcodeproj/project.pbxproj 2015-02-11 02:41:20 UTC (rev 179912)
@@ -562,6 +562,8 @@
0FCEFADC18064A1400472CE4 /* config_llvm.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FCEFADB18064A1400472CE4 /* config_llvm.h */; };
0FCEFADF180738C000472CE4 /* FTLLocation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0FCEFADD180738C000472CE4 /* FTLLocation.cpp */; };
0FCEFAE0180738C000472CE4 /* FTLLocation.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FCEFADE180738C000472CE4 /* FTLLocation.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ 0FD1202F1A8AED12000F5280 /* FTLJSCallBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0FD1202D1A8AED12000F5280 /* FTLJSCallBase.cpp */; };
+ 0FD120301A8AED12000F5280 /* FTLJSCallBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FD1202E1A8AED12000F5280 /* FTLJSCallBase.h */; settings = {ATTRIBUTES = (Private, ); }; };
0FD2C92416D01EE900C7803F /* StructureInlines.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FD2C92316D01EE900C7803F /* StructureInlines.h */; settings = {ATTRIBUTES = (Private, ); }; };
0FD3C82614115D4000FD81CB /* DFGDriver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0FD3C82014115CF800FD81CB /* DFGDriver.cpp */; };
0FD3C82814115D4F00FD81CB /* DFGDriver.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FD3C82214115D0E00FD81CB /* DFGDriver.h */; };
@@ -2243,6 +2245,8 @@
0FCEFADB18064A1400472CE4 /* config_llvm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = config_llvm.h; sourceTree = "<group>"; };
0FCEFADD180738C000472CE4 /* FTLLocation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = FTLLocation.cpp; path = ftl/FTLLocation.cpp; sourceTree = "<group>"; };
0FCEFADE180738C000472CE4 /* FTLLocation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FTLLocation.h; path = ftl/FTLLocation.h; sourceTree = "<group>"; };
+ 0FD1202D1A8AED12000F5280 /* FTLJSCallBase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = FTLJSCallBase.cpp; path = ftl/FTLJSCallBase.cpp; sourceTree = "<group>"; };
+ 0FD1202E1A8AED12000F5280 /* FTLJSCallBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FTLJSCallBase.h; path = ftl/FTLJSCallBase.h; sourceTree = "<group>"; };
0FD2C92316D01EE900C7803F /* StructureInlines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StructureInlines.h; sourceTree = "<group>"; };
0FD3C82014115CF800FD81CB /* DFGDriver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DFGDriver.cpp; path = dfg/DFGDriver.cpp; sourceTree = "<group>"; };
0FD3C82214115D0E00FD81CB /* DFGDriver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DFGDriver.h; path = dfg/DFGDriver.h; sourceTree = "<group>"; };
@@ -3600,6 +3604,8 @@
A78A977E179738D5009DF744 /* FTLJITFinalizer.h */,
0F6B1CB3185FC9E900845D97 /* FTLJSCall.cpp */,
0F6B1CB4185FC9E900845D97 /* FTLJSCall.h */,
+ 0FD1202D1A8AED12000F5280 /* FTLJSCallBase.cpp */,
+ 0FD1202E1A8AED12000F5280 /* FTLJSCallBase.h */,
0F8F2B93172E049E007DBDA5 /* FTLLink.cpp */,
0F8F2B94172E049E007DBDA5 /* FTLLink.h */,
0FCEFADD180738C000472CE4 /* FTLLocation.cpp */,
@@ -6129,6 +6135,7 @@
147B84630E6DE6B1004775A4 /* PutPropertySlot.h in Headers */,
2AAD964A18569417001F93BE /* RecursiveAllocationScope.h in Headers */,
0FF60AC216740F8300029779 /* ReduceWhitespace.h in Headers */,
+ 0FD120301A8AED12000F5280 /* FTLJSCallBase.h in Headers */,
0FA7A8EC18B413C80052371D /* Reg.h in Headers */,
BC18C45A0E16F5CD00B34460 /* RegExp.h in Headers */,
A1712B3F11C7B228007A5315 /* RegExpCache.h in Headers */,
@@ -7257,6 +7264,7 @@
A54CF2F9184EAEDA00237F19 /* ScriptObject.cpp in Sources */,
A54CF2F5184EAB2400237F19 /* ScriptValue.cpp in Sources */,
A7299DA517D12858005F5FF9 /* SetConstructor.cpp in Sources */,
+ 0FD1202F1A8AED12000F5280 /* FTLJSCallBase.cpp in Sources */,
A790DD6B182F499700588807 /* SetIteratorConstructor.cpp in Sources */,
A790DD6D182F499700588807 /* SetIteratorPrototype.cpp in Sources */,
A7299DA117D12848005F5FF9 /* SetPrototype.cpp in Sources */,
Modified: trunk/Source/_javascript_Core/bytecode/CallLinkInfo.h (179911 => 179912)
--- trunk/Source/_javascript_Core/bytecode/CallLinkInfo.h 2015-02-11 02:39:31 UTC (rev 179911)
+++ trunk/Source/_javascript_Core/bytecode/CallLinkInfo.h 2015-02-11 02:41:20 UTC (rev 179912)
@@ -55,7 +55,7 @@
ASSERT(opcodeID == op_call_varargs);
return CallVarargs;
}
-
+
CallLinkInfo()
: isFTL(false)
, hasSeenShouldRepatch(false)
@@ -71,10 +71,14 @@
remove();
}
- CodeSpecializationKind specializationKind() const
+ static CodeSpecializationKind specializationKindFor(CallType callType)
{
return specializationFromIsConstruct(callType == Construct || callType == ConstructVarargs);
}
+ CodeSpecializationKind specializationKind() const
+ {
+ return specializationKindFor(static_cast<CallType>(callType));
+ }
CodeLocationNearCall callReturnLocation;
CodeLocationDataLabelPtr hotPathBegin;
Modified: trunk/Source/_javascript_Core/ftl/FTLJSCall.cpp (179911 => 179912)
--- trunk/Source/_javascript_Core/ftl/FTLJSCall.cpp 2015-02-11 02:39:31 UTC (rev 179911)
+++ trunk/Source/_javascript_Core/ftl/FTLJSCall.cpp 2015-02-11 02:41:20 UTC (rev 179912)
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2013, 2014 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
@@ -33,59 +33,23 @@
namespace JSC { namespace FTL {
+using namespace DFG;
+
JSCall::JSCall()
: m_stackmapID(UINT_MAX)
- , m_node(nullptr)
- , m_callLinkInfo(nullptr)
, m_instructionOffset(UINT_MAX)
{
}
-JSCall::JSCall(unsigned stackmapID, DFG::Node* node)
- : m_stackmapID(stackmapID)
- , m_node(node)
- , m_callLinkInfo(nullptr)
+JSCall::JSCall(unsigned stackmapID, Node* node)
+ : JSCallBase(
+ node->op() == Construct ? CallLinkInfo::Construct : CallLinkInfo::Call,
+ node->origin.semantic)
+ , m_stackmapID(stackmapID)
, m_instructionOffset(0)
{
}
-void JSCall::emit(CCallHelpers& jit)
-{
- m_callLinkInfo = jit.codeBlock()->addCallLinkInfo();
-
- CCallHelpers::Jump slowPath = jit.branchPtrWithPatch(
- CCallHelpers::NotEqual, GPRInfo::regT0, m_targetToCheck,
- CCallHelpers::TrustedImmPtr(0));
-
- m_fastCall = jit.nearCall();
- CCallHelpers::Jump done = jit.jump();
-
- slowPath.link(&jit);
-
- jit.move(CCallHelpers::TrustedImmPtr(m_callLinkInfo), GPRInfo::regT2);
- m_slowCall = jit.nearCall();
-
- done.link(&jit);
-}
-
-void JSCall::link(VM& vm, LinkBuffer& linkBuffer)
-{
- ThunkGenerator generator = linkThunkGeneratorFor(
- m_node->op() == DFG::Construct ? CodeForConstruct : CodeForCall,
- MustPreserveRegisters);
-
- linkBuffer.link(
- m_slowCall, FunctionPtr(vm.getCTIStub(generator).code().executableAddress()));
-
- m_callLinkInfo->isFTL = true;
- m_callLinkInfo->callType = m_node->op() == DFG::Construct ? CallLinkInfo::Construct : CallLinkInfo::Call;
- m_callLinkInfo->codeOrigin = m_node->origin.semantic;
- m_callLinkInfo->callReturnLocation = linkBuffer.locationOfNearCall(m_slowCall);
- m_callLinkInfo->hotPathBegin = linkBuffer.locationOf(m_targetToCheck);
- m_callLinkInfo->hotPathOther = linkBuffer.locationOfNearCall(m_fastCall);
- m_callLinkInfo->calleeGPR = GPRInfo::regT0;
-}
-
} } // namespace JSC::FTL
#endif // ENABLE(FTL_JIT)
Modified: trunk/Source/_javascript_Core/ftl/FTLJSCall.h (179911 => 179912)
--- trunk/Source/_javascript_Core/ftl/FTLJSCall.h 2015-02-11 02:39:31 UTC (rev 179911)
+++ trunk/Source/_javascript_Core/ftl/FTLJSCall.h 2015-02-11 02:41:20 UTC (rev 179912)
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2013, 2014 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,28 +28,21 @@
#if ENABLE(FTL_JIT)
-#include "CCallHelpers.h"
-#include "CallLinkInfo.h"
-#include "CodeOrigin.h"
+#include "FTLJSCallBase.h"
namespace JSC {
-class LinkBuffer;
-
namespace DFG {
struct Node;
}
namespace FTL {
-class JSCall {
+class JSCall : public JSCallBase {
public:
JSCall();
JSCall(unsigned stackmapID, DFG::Node*);
- void emit(CCallHelpers&);
- void link(VM&, LinkBuffer&);
-
unsigned stackmapID() const { return m_stackmapID; }
bool operator<(const JSCall& other) const
@@ -59,11 +52,6 @@
private:
unsigned m_stackmapID;
- DFG::Node* m_node;
- CCallHelpers::DataLabelPtr m_targetToCheck;
- CCallHelpers::Call m_fastCall;
- CCallHelpers::Call m_slowCall;
- CallLinkInfo* m_callLinkInfo;
public:
uint32_t m_instructionOffset;
Added: trunk/Source/_javascript_Core/ftl/FTLJSCallBase.cpp (0 => 179912)
--- trunk/Source/_javascript_Core/ftl/FTLJSCallBase.cpp (rev 0)
+++ trunk/Source/_javascript_Core/ftl/FTLJSCallBase.cpp 2015-02-11 02:41:20 UTC (rev 179912)
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 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
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "FTLJSCallBase.h"
+
+#if ENABLE(FTL_JIT)
+
+#include "DFGNode.h"
+#include "LinkBuffer.h"
+
+namespace JSC { namespace FTL {
+
+JSCallBase::JSCallBase()
+ : m_type(CallLinkInfo::None)
+ , m_callLinkInfo(nullptr)
+{
+}
+
+JSCallBase::JSCallBase(CallLinkInfo::CallType type, CodeOrigin origin)
+ : m_type(type)
+ , m_origin(origin)
+ , m_callLinkInfo(nullptr)
+{
+}
+
+void JSCallBase::emit(CCallHelpers& jit)
+{
+ m_callLinkInfo = jit.codeBlock()->addCallLinkInfo();
+
+ CCallHelpers::Jump slowPath = jit.branchPtrWithPatch(
+ CCallHelpers::NotEqual, GPRInfo::regT0, m_targetToCheck,
+ CCallHelpers::TrustedImmPtr(0));
+
+ m_fastCall = jit.nearCall();
+ CCallHelpers::Jump done = jit.jump();
+
+ slowPath.link(&jit);
+
+ jit.move(CCallHelpers::TrustedImmPtr(m_callLinkInfo), GPRInfo::regT2);
+ m_slowCall = jit.nearCall();
+
+ done.link(&jit);
+}
+
+void JSCallBase::link(VM& vm, LinkBuffer& linkBuffer)
+{
+ ThunkGenerator generator = linkThunkGeneratorFor(
+ CallLinkInfo::specializationKindFor(m_type), MustPreserveRegisters);
+
+ linkBuffer.link(
+ m_slowCall, FunctionPtr(vm.getCTIStub(generator).code().executableAddress()));
+
+ m_callLinkInfo->isFTL = true;
+ m_callLinkInfo->callType = m_type;
+ m_callLinkInfo->codeOrigin = m_origin;
+ m_callLinkInfo->callReturnLocation = linkBuffer.locationOfNearCall(m_slowCall);
+ m_callLinkInfo->hotPathBegin = linkBuffer.locationOf(m_targetToCheck);
+ m_callLinkInfo->hotPathOther = linkBuffer.locationOfNearCall(m_fastCall);
+ m_callLinkInfo->calleeGPR = GPRInfo::regT0;
+}
+
+} } // namespace JSC::FTL
+
+#endif // ENABLE(FTL_JIT)
+
Added: trunk/Source/_javascript_Core/ftl/FTLJSCallBase.h (0 => 179912)
--- trunk/Source/_javascript_Core/ftl/FTLJSCallBase.h (rev 0)
+++ trunk/Source/_javascript_Core/ftl/FTLJSCallBase.h 2015-02-11 02:41:20 UTC (rev 179912)
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 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
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef FTLJSCallBase_h
+#define FTLJSCallBase_h
+
+#if ENABLE(FTL_JIT)
+
+#include "CCallHelpers.h"
+#include "CallLinkInfo.h"
+#include "CodeOrigin.h"
+
+namespace JSC {
+
+class LinkBuffer;
+
+namespace FTL {
+
+class JSCallBase {
+public:
+ JSCallBase();
+ JSCallBase(CallLinkInfo::CallType, CodeOrigin);
+
+ void emit(CCallHelpers&);
+ void link(VM&, LinkBuffer&);
+
+private:
+ CallLinkInfo::CallType m_type;
+ CodeOrigin m_origin;
+ CCallHelpers::DataLabelPtr m_targetToCheck;
+ CCallHelpers::Call m_fastCall;
+ CCallHelpers::Call m_slowCall;
+ CallLinkInfo* m_callLinkInfo;
+};
+
+} } // namespace JSC::FTL
+
+#endif // ENABLE(FTL_JIT)
+
+#endif // FTLJSCallBase_h
+