Skip to content

Commit e8d1096

Browse files
committed
[JSC][uDFG] Introduce unlinked CallLinkInfo in DFG
https://bugs.webkit.org/show_bug.cgi?id=246056 <rdar://100788330> Reviewed by Justin Michaud. This patch introduces unlinked CallLinkInfo into DFG. We do the similar thing to unlinked StructureStubInfo introduction in DFG: Adding std::variant CompileTimeCallLinkInfo to handle unlinked and linked ones easily. We unify BaselineJIT's DataIC CallLinkInfo code generation code with this new style so that we simplify unlinked CallLinkInfo usage. The key part is that we no longer emit a pointers to CallLinkInfo in DFG if isUnlinked() (which is tested in JSC stress tests) is true. In that case, we keep UnlinkedCallLinkInfo information in DFG::JITCode. And when running it, we materialize DFG::JITData, which includes linked version of CallLinkInfo created from UnlinkedCallLinkInfo, so we share the unlinked DFG code while we have per CodeBlock's linked data in DFG::JITData, which is pinned in a certain callee-save register in DFG. * Source/JavaScriptCore/bytecode/AccessCase.cpp: (JSC::AccessCase::generateImpl): * Source/JavaScriptCore/bytecode/CallLinkInfo.cpp: (JSC::CallLinkInfo::emitFastPath): (JSC::CallLinkInfo::emitTailCallFastPath): (JSC::CallLinkInfo::emitSlowPath): (JSC::OptimizingCallLinkInfo::initializeFromDFGUnlinkedCallLinkInfo): * Source/JavaScriptCore/bytecode/CallLinkInfo.h: (JSC::UnlinkedCallLinkInfo::setCodeLocations): (JSC::BaselineUnlinkedCallLinkInfo::setUpCall): (JSC::BaselineUnlinkedCallLinkInfo::setFrameShuffleData): * Source/JavaScriptCore/bytecode/ProxyObjectAccessCase.cpp: (JSC::ProxyObjectAccessCase::emit): * Source/JavaScriptCore/dfg/DFGCommonData.h: (JSC::DFG::CommonData::addCallLinkInfo): Deleted. * Source/JavaScriptCore/dfg/DFGJITCode.cpp: (JSC::DFG::JITData::JITData): * Source/JavaScriptCore/dfg/DFGJITCode.h: (JSC::DFG::UnlinkedCallLinkInfo::setUpCall): (JSC::DFG::UnlinkedCallLinkInfo::setFrameShuffleData): (JSC::DFG::JITData::create): * Source/JavaScriptCore/dfg/DFGJITCompiler.cpp: (JSC::DFG::JITCompiler::link): (JSC::DFG::JITCompiler::addCallLinkInfo): * Source/JavaScriptCore/dfg/DFGJITCompiler.h: (JSC::DFG::JITCompiler::addJSCall): (JSC::DFG::JITCompiler::JSCallRecord::JSCallRecord): * Source/JavaScriptCore/dfg/DFGPlan.cpp: (JSC::DFG::Plan::finalizeJITData): * Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp: (JSC::DFG::SpeculativeJIT::emitCall): * Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp: (JSC::DFG::SpeculativeJIT::emitCall): * Source/JavaScriptCore/ftl/FTLLowerDFGToB3.cpp: (JSC::FTL::DFG::LowerDFGToB3::compileCompareStrictEq): * Source/JavaScriptCore/ftl/FTLState.cpp: (JSC::FTL::State::addCallLinkInfo): * Source/JavaScriptCore/ftl/FTLState.h: * Source/JavaScriptCore/jit/BaselineJITCode.h: * Source/JavaScriptCore/jit/JIT.cpp: (JSC::JIT::addUnlinkedCallLinkInfo): (JSC::JIT::link): * Source/JavaScriptCore/jit/JIT.h: * Source/JavaScriptCore/jit/JITCall.cpp: (JSC::JIT::compileCallDirectEval): (JSC::JIT::compileTailCall): (JSC::JIT::compileOpCall): (JSC::JIT::compileOpCallSlowCase): * Source/JavaScriptCore/wasm/js/WasmToJS.cpp: (JSC::Wasm::wasmToJS): Canonical link: https://commits.webkit.org/255183@main
1 parent 68d4735 commit e8d1096

20 files changed

Lines changed: 236 additions & 98 deletions

‎Source/JavaScriptCore/bytecode/AccessCase.cpp‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2114,7 +2114,7 @@ void AccessCase::generateImpl(AccessGenerationState& state)
21142114
virtualRegisterForArgumentIncludingThis(1).offset() * sizeof(Register)));
21152115
}
21162116

2117-
auto slowCase = access.callLinkInfo()->emitFastPath(jit, loadedValueGPR, loadedValueGPR == GPRInfo::regT2 ? GPRInfo::regT0 : GPRInfo::regT2);
2117+
auto slowCase = CallLinkInfo::emitFastPath(jit, access.callLinkInfo(), loadedValueGPR, loadedValueGPR == GPRInfo::regT2 ? GPRInfo::regT0 : GPRInfo::regT2);
21182118
auto doneLocation = jit.label();
21192119

21202120
if (m_type == Getter)

‎Source/JavaScriptCore/bytecode/CallLinkInfo.cpp‎

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828

2929
#include "CCallHelpers.h"
3030
#include "CallFrameShuffleData.h"
31+
#include "DFGJITCode.h"
3132
#include "DisallowMacroScratchRegisterUsage.h"
3233
#include "FunctionCodeBlock.h"
3334
#include "JSCellInlines.h"
@@ -443,6 +444,31 @@ void CallLinkInfo::emitDataICSlowPath(VM&, CCallHelpers& jit, GPRReg callLinkInf
443444
jit.call(CCallHelpers::Address(GPRInfo::regT2, offsetOfSlowPathCallDestination()), JSEntryPtrTag);
444445
}
445446

447+
MacroAssembler::JumpList CallLinkInfo::emitFastPath(CCallHelpers& jit, CompileTimeCallLinkInfo callLinkInfo, GPRReg calleeGPR, GPRReg callLinkInfoGPR)
448+
{
449+
if (std::holds_alternative<OptimizingCallLinkInfo*>(callLinkInfo))
450+
return std::get<OptimizingCallLinkInfo*>(callLinkInfo)->emitFastPath(jit, calleeGPR, callLinkInfoGPR);
451+
452+
return CallLinkInfo::emitDataICFastPath(jit, calleeGPR, callLinkInfoGPR);
453+
}
454+
455+
MacroAssembler::JumpList CallLinkInfo::emitTailCallFastPath(CCallHelpers& jit, CompileTimeCallLinkInfo callLinkInfo, GPRReg calleeGPR, GPRReg callLinkInfoGPR, ScopedLambda<void()>&& prepareForTailCall)
456+
{
457+
if (std::holds_alternative<OptimizingCallLinkInfo*>(callLinkInfo))
458+
return std::get<OptimizingCallLinkInfo*>(callLinkInfo)->emitTailCallFastPath(jit, calleeGPR, callLinkInfoGPR, WTFMove(prepareForTailCall));
459+
460+
return CallLinkInfo::emitTailCallDataICFastPath(jit, calleeGPR, callLinkInfoGPR, WTFMove(prepareForTailCall));
461+
}
462+
463+
void CallLinkInfo::emitSlowPath(VM& vm, CCallHelpers& jit, CompileTimeCallLinkInfo callLinkInfo, GPRReg callLinkInfoGPR)
464+
{
465+
if (std::holds_alternative<OptimizingCallLinkInfo*>(callLinkInfo)) {
466+
std::get<OptimizingCallLinkInfo*>(callLinkInfo)->emitSlowPath(vm, jit);
467+
return;
468+
}
469+
emitDataICSlowPath(vm, jit, callLinkInfoGPR);
470+
}
471+
446472
CCallHelpers::JumpList OptimizingCallLinkInfo::emitFastPath(CCallHelpers& jit, GPRReg calleeGPR, GPRReg callLinkInfoGPR)
447473
{
448474
RELEASE_ASSERT(!isTailCall());
@@ -566,6 +592,20 @@ void OptimizingCallLinkInfo::setDirectCallTarget(CodeBlock* codeBlock, CodeLocat
566592
MacroAssembler::repatchPointer(u.codeIC.m_codeBlockLocation, codeBlock);
567593
}
568594

595+
#if ENABLE(DFG_JIT)
596+
void OptimizingCallLinkInfo::initializeFromDFGUnlinkedCallLinkInfo(VM& vm, const DFG::UnlinkedCallLinkInfo& unlinkedCallLinkInfo)
597+
{
598+
m_doneLocation = unlinkedCallLinkInfo.doneLocation;
599+
setSlowPathCallDestination(vm.getCTILinkCall().code());
600+
m_codeOrigin = unlinkedCallLinkInfo.codeOrigin;
601+
m_callType = unlinkedCallLinkInfo.callType;
602+
m_calleeGPR = unlinkedCallLinkInfo.calleeGPR;
603+
m_callLinkInfoGPR = unlinkedCallLinkInfo.callLinkInfoGPR;
604+
if (unlinkedCallLinkInfo.m_frameShuffleData)
605+
m_frameShuffleData = makeUnique<CallFrameShuffleData>(*unlinkedCallLinkInfo.m_frameShuffleData);
606+
}
607+
#endif
608+
569609
#endif
570610

571611
} // namespace JSC

‎Source/JavaScriptCore/bytecode/CallLinkInfo.h‎

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,16 +37,23 @@
3737
#include <wtf/SentinelLinkedList.h>
3838

3939
namespace JSC {
40+
namespace DFG {
41+
struct UnlinkedCallLinkInfo;
42+
}
4043

4144
class CCallHelpers;
4245
class ExecutableBase;
4346
class FunctionCodeBlock;
4447
class JSFunction;
48+
class OptimizingCallLinkInfo;
4549
class PolymorphicCallStubRoutine;
4650
enum OpcodeID : unsigned;
4751

4852
struct CallFrameShuffleData;
4953
struct UnlinkedCallLinkInfo;
54+
struct BaselineUnlinkedCallLinkInfo;
55+
56+
using CompileTimeCallLinkInfo = std::variant<OptimizingCallLinkInfo*, BaselineUnlinkedCallLinkInfo*, DFG::UnlinkedCallLinkInfo*>;
5057

5158
class CallLinkInfo : public PackedRawSentinelNode<CallLinkInfo> {
5259
public:
@@ -179,10 +186,14 @@ class CallLinkInfo : public PackedRawSentinelNode<CallLinkInfo> {
179186
#if ENABLE(JIT)
180187
protected:
181188
static MacroAssembler::JumpList emitFastPathImpl(CallLinkInfo*, CCallHelpers&, GPRReg calleeGPR, GPRReg callLinkInfoGPR, UseDataIC, bool isTailCall, ScopedLambda<void()>&& prepareForTailCall) WARN_UNUSED_RETURN;
182-
public:
183189
static MacroAssembler::JumpList emitDataICFastPath(CCallHelpers&, GPRReg calleeGPR, GPRReg callLinkInfoGPR) WARN_UNUSED_RETURN;
184-
static MacroAssembler::JumpList emitTailCallDataICFastPath(CCallHelpers&, GPRReg calleeGPR, GPRReg callLinkInfoGPR, ScopedLambda<void()>&& prepareForTailCall) WARN_UNUSED_RETURN;
185190
static void emitDataICSlowPath(VM&, CCallHelpers&, GPRReg callLinkInfoGPR);
191+
static MacroAssembler::JumpList emitTailCallDataICFastPath(CCallHelpers&, GPRReg calleeGPR, GPRReg callLinkInfoGPR, ScopedLambda<void()>&& prepareForTailCall) WARN_UNUSED_RETURN;
192+
193+
public:
194+
static MacroAssembler::JumpList emitFastPath(CCallHelpers&, CompileTimeCallLinkInfo, GPRReg calleeGPR, GPRReg callLinkInfoGPR) WARN_UNUSED_RETURN;
195+
static MacroAssembler::JumpList emitTailCallFastPath(CCallHelpers&, CompileTimeCallLinkInfo, GPRReg calleeGPR, GPRReg callLinkInfoGPR, ScopedLambda<void()>&& prepareForTailCall) WARN_UNUSED_RETURN;
196+
static void emitSlowPath(VM&, CCallHelpers&, CompileTimeCallLinkInfo, GPRReg callLinkInfoGPR);
186197
#endif
187198

188199
void revertCallToStub();
@@ -442,8 +453,21 @@ inline CodeOrigin getCallLinkInfoCodeOrigin(CallLinkInfo& callLinkInfo)
442453
}
443454

444455
struct UnlinkedCallLinkInfo {
445-
BytecodeIndex bytecodeIndex; // Currently, only used by baseline, so this can trivially produce a CodeOrigin.
446456
CodeLocationLabel<JSInternalPtrTag> doneLocation;
457+
458+
void setCodeLocations(CodeLocationLabel<JSInternalPtrTag>, CodeLocationLabel<JSInternalPtrTag> doneLocation)
459+
{
460+
this->doneLocation = doneLocation;
461+
}
462+
};
463+
464+
struct BaselineUnlinkedCallLinkInfo : public UnlinkedCallLinkInfo {
465+
BytecodeIndex bytecodeIndex; // Currently, only used by baseline, so this can trivially produce a CodeOrigin.
466+
467+
#if ENABLE(JIT)
468+
void setUpCall(CallLinkInfo::CallType, GPRReg) { }
469+
#endif
470+
void setFrameShuffleData(const CallFrameShuffleData&) { }
447471
};
448472

449473
#if ENABLE(JIT)
@@ -452,6 +476,11 @@ class OptimizingCallLinkInfo final : public CallLinkInfo {
452476
public:
453477
friend class CallLinkInfo;
454478

479+
OptimizingCallLinkInfo()
480+
: CallLinkInfo(Type::Optimizing, { }, UseDataIC::Yes)
481+
{
482+
}
483+
455484
OptimizingCallLinkInfo(CodeOrigin codeOrigin, UseDataIC useDataIC)
456485
: CallLinkInfo(Type::Optimizing, codeOrigin, useDataIC)
457486
{
@@ -485,17 +514,19 @@ class OptimizingCallLinkInfo final : public CallLinkInfo {
485514
void setDirectCallTarget(CodeBlock*, CodeLocationLabel<JSEntryPtrTag>);
486515
void emitSlowPath(VM&, CCallHelpers&);
487516

488-
MacroAssembler::JumpList emitFastPath(CCallHelpers&, GPRReg calleeGPR, GPRReg callLinkInfoGPR) WARN_UNUSED_RETURN;
489-
MacroAssembler::JumpList emitTailCallFastPath(CCallHelpers&, GPRReg calleeGPR, GPRReg callLinkInfoGPR, ScopedLambda<void()>&& prepareForTailCall) WARN_UNUSED_RETURN;
490-
491517
void setFrameShuffleData(const CallFrameShuffleData&);
492518

493519
const CallFrameShuffleData* frameShuffleData()
494520
{
495521
return m_frameShuffleData.get();
496522
}
497523

524+
void initializeFromDFGUnlinkedCallLinkInfo(VM&, const DFG::UnlinkedCallLinkInfo&);
525+
498526
private:
527+
MacroAssembler::JumpList emitFastPath(CCallHelpers&, GPRReg calleeGPR, GPRReg callLinkInfoGPR) WARN_UNUSED_RETURN;
528+
MacroAssembler::JumpList emitTailCallFastPath(CCallHelpers&, GPRReg calleeGPR, GPRReg callLinkInfoGPR, ScopedLambda<void()>&& prepareForTailCall) WARN_UNUSED_RETURN;
529+
499530
CodeLocationNearCall<JSInternalPtrTag> m_callLocation;
500531
CodeLocationLabel<JSInternalPtrTag> m_slowPathStart;
501532
CodeLocationLabel<JSInternalPtrTag> m_fastPathStart;

‎Source/JavaScriptCore/bytecode/ProxyObjectAccessCase.cpp‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ void ProxyObjectAccessCase::emit(AccessGenerationState& state, MacroAssembler::J
136136
jit.move(CCallHelpers::TrustedImmPtr(globalObject->linkTimeConstant(LinkTimeConstant::performProxyObjectGet)), scratchGPR);
137137
jit.storeCell(scratchGPR, calleeFrame.withOffset(CallFrameSlot::callee * sizeof(Register)));
138138

139-
auto slowCase = callLinkInfo->emitFastPath(jit, scratchGPR, scratchGPR == GPRInfo::regT2 ? GPRInfo::regT0 : GPRInfo::regT2);
139+
auto slowCase = CallLinkInfo::emitFastPath(jit, callLinkInfo, scratchGPR, scratchGPR == GPRInfo::regT2 ? GPRInfo::regT0 : GPRInfo::regT2);
140140
auto doneLocation = jit.label();
141141

142142
jit.setupResults(valueRegs);

‎Source/JavaScriptCore/dfg/DFGCommonData.h‎

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -115,11 +115,6 @@ class CommonData : public MathICHolder {
115115

116116
void clearWatchpoints();
117117

118-
OptimizingCallLinkInfo* addCallLinkInfo(CodeOrigin codeOrigin, CallLinkInfo::UseDataIC useDataIC = CallLinkInfo::UseDataIC::No)
119-
{
120-
return m_callLinkInfos.add(codeOrigin, useDataIC);
121-
}
122-
123118
RefPtr<InlineCallFrameSet> inlineCallFrames;
124119
Ref<CodeOriginPool> codeOrigins;
125120

‎Source/JavaScriptCore/dfg/DFGJITCode.cpp‎

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,10 @@
3535

3636
namespace JSC { namespace DFG {
3737

38-
JITData::JITData(const JITCode& jitCode, ExitVector&& exits)
38+
JITData::JITData(VM& vm, const JITCode& jitCode, ExitVector&& exits)
3939
: Base(jitCode.m_linkerIR.size())
4040
, m_stubInfos(jitCode.m_unlinkedStubInfos.size())
41+
, m_callLinkInfos(jitCode.m_unlinkedCallLinkInfos.size())
4142
, m_exits(WTFMove(exits))
4243
{
4344
for (unsigned i = 0; i < jitCode.m_linkerIR.size(); ++i) {
@@ -51,6 +52,14 @@ JITData::JITData(const JITCode& jitCode, ExitVector&& exits)
5152
at(i) = &stubInfo;
5253
break;
5354
}
55+
case LinkerIR::Type::CallLinkInfo: {
56+
unsigned index = bitwise_cast<uintptr_t>(entry.pointer());
57+
const UnlinkedCallLinkInfo& unlinkedCallLinkInfo = jitCode.m_unlinkedCallLinkInfos[index];
58+
OptimizingCallLinkInfo& callLinkInfo = m_callLinkInfos[index];
59+
callLinkInfo.initializeFromDFGUnlinkedCallLinkInfo(vm, unlinkedCallLinkInfo);
60+
at(i) = &callLinkInfo;
61+
break;
62+
}
5463
default:
5564
at(i) = entry.pointer();
5665
break;

‎Source/JavaScriptCore/dfg/DFGJITCode.h‎

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,26 @@ struct UnlinkedStructureStubInfo : JSC::UnlinkedStructureStubInfo {
6969
bool hasConstantIdentifier { false };
7070
};
7171

72+
struct UnlinkedCallLinkInfo : JSC::UnlinkedCallLinkInfo {
73+
void setUpCall(CallLinkInfo::CallType callType, GPRReg calleeGPR)
74+
{
75+
this->callType = callType;
76+
this->calleeGPR = calleeGPR;
77+
}
78+
79+
void setFrameShuffleData(const CallFrameShuffleData& shuffleData)
80+
{
81+
m_frameShuffleData = makeUnique<CallFrameShuffleData>(shuffleData);
82+
m_frameShuffleData->shrinkToFit();
83+
}
84+
85+
CodeOrigin codeOrigin;
86+
CallLinkInfo::CallType callType { CallLinkInfo::CallType::None };
87+
GPRReg callLinkInfoGPR { InvalidGPRReg };
88+
GPRReg calleeGPR { InvalidGPRReg };
89+
std::unique_ptr<CallFrameShuffleData> m_frameShuffleData;
90+
};
91+
7292
class LinkerIR {
7393
WTF_MAKE_NONCOPYABLE(LinkerIR);
7494
public:
@@ -77,6 +97,7 @@ class LinkerIR {
7797
enum class Type : uint16_t {
7898
Invalid,
7999
StructureStubInfo,
100+
CallLinkInfo,
80101
CellPointer,
81102
NonCellPointer,
82103
};
@@ -133,7 +154,7 @@ class JITData final : public TrailingArray<JITData, void*> {
133154
static ptrdiff_t offsetOfExits() { return OBJECT_OFFSETOF(JITData, m_exits); }
134155
static ptrdiff_t offsetOfIsInvalidated() { return OBJECT_OFFSETOF(JITData, m_isInvalidated); }
135156

136-
static std::unique_ptr<JITData> create(const JITCode& jitCode, ExitVector&& exits);
157+
static std::unique_ptr<JITData> create(VM&, const JITCode&, ExitVector&& exits);
137158

138159
void setExitCode(unsigned exitIndex, MacroAssemblerCodeRef<OSRExitPtrTag> code)
139160
{
@@ -151,9 +172,10 @@ class JITData final : public TrailingArray<JITData, void*> {
151172
FixedVector<StructureStubInfo>& stubInfos() { return m_stubInfos; }
152173

153174
private:
154-
explicit JITData(const JITCode&, ExitVector&&);
175+
explicit JITData(VM&, const JITCode&, ExitVector&&);
155176

156177
FixedVector<StructureStubInfo> m_stubInfos;
178+
FixedVector<OptimizingCallLinkInfo> m_callLinkInfos;
157179
ExitVector m_exits;
158180
uint8_t m_isInvalidated { 0 };
159181
};
@@ -228,6 +250,7 @@ class JITCode final : public DirectJITCode {
228250
FixedVector<SimpleJumpTable> m_switchJumpTables;
229251
FixedVector<StringJumpTable> m_stringSwitchJumpTables;
230252
FixedVector<UnlinkedStructureStubInfo> m_unlinkedStubInfos;
253+
FixedVector<UnlinkedCallLinkInfo> m_unlinkedCallLinkInfos;
231254
DFG::VariableEventStream variableEventStream;
232255
DFG::MinifiedGraph minifiedDFG;
233256
LinkerIR m_linkerIR;
@@ -264,9 +287,9 @@ class JITCode final : public DirectJITCode {
264287
#endif // ENABLE(FTL_JIT)
265288
};
266289

267-
inline std::unique_ptr<JITData> JITData::create(const JITCode& jitCode, ExitVector&& exits)
290+
inline std::unique_ptr<JITData> JITData::create(VM& vm, const JITCode& jitCode, ExitVector&& exits)
268291
{
269-
return std::unique_ptr<JITData> { new (NotNull, fastMalloc(Base::allocationSize(jitCode.m_linkerIR.size()))) JITData(jitCode, WTFMove(exits)) };
292+
return std::unique_ptr<JITData> { new (NotNull, fastMalloc(Base::allocationSize(jitCode.m_linkerIR.size()))) JITData(vm, jitCode, WTFMove(exits)) };
270293
}
271294

272295
} } // namespace JSC::DFG

‎Source/JavaScriptCore/dfg/DFGJITCompiler.cpp‎

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -286,10 +286,11 @@ void JITCompiler::link(LinkBuffer& linkBuffer)
286286
}
287287

288288
for (auto& record : m_jsCalls) {
289-
auto& info = *record.info;
290-
info.setCodeLocations(
291-
linkBuffer.locationOf<JSInternalPtrTag>(record.slowPathStart),
292-
linkBuffer.locationOf<JSInternalPtrTag>(record.doneLocation));
289+
std::visit([&](auto* info) {
290+
info->setCodeLocations(
291+
linkBuffer.locationOf<JSInternalPtrTag>(record.slowPathStart),
292+
linkBuffer.locationOf<JSInternalPtrTag>(record.doneLocation));
293+
}, record.info);
293294
}
294295

295296
for (auto& record : m_jsDirectCalls) {
@@ -299,6 +300,14 @@ void JITCompiler::link(LinkBuffer& linkBuffer)
299300
CodeLocationLabel<JSInternalPtrTag>());
300301
}
301302

303+
if (m_graph.m_plan.isUnlinked()) {
304+
m_jitCode->m_unlinkedCallLinkInfos = FixedVector<UnlinkedCallLinkInfo>(m_unlinkedCallLinkInfos.size());
305+
if (m_jitCode->m_unlinkedCallLinkInfos.size())
306+
std::move(m_unlinkedCallLinkInfos.begin(), m_unlinkedCallLinkInfos.end(), m_jitCode->m_unlinkedCallLinkInfos.begin());
307+
ASSERT(m_jitCode->common.m_callLinkInfos.isEmpty());
308+
}
309+
310+
302311
if (!m_exceptionChecks.empty())
303312
linkBuffer.link(m_exceptionChecks, CodeLocationLabel(vm().getCTIStub(handleExceptionGenerator).retaggedCode<NoPtrTag>()));
304313
if (!m_exceptionChecksWithCallFrameRollback.empty())
@@ -800,6 +809,20 @@ std::tuple<CompileTimeStructureStubInfo, JITCompiler::LinkableConstant> JITCompi
800809
return std::tuple { stubInfo, LinkableConstant() };
801810
}
802811

812+
std::tuple<CompileTimeCallLinkInfo, JITCompiler::LinkableConstant> JITCompiler::addCallLinkInfo(CodeOrigin codeOrigin)
813+
{
814+
if (m_graph.m_plan.isUnlinked()) {
815+
void* unlinkedCallLinkInfoIndex = bitwise_cast<void*>(static_cast<uintptr_t>(m_unlinkedCallLinkInfos.size()));
816+
UnlinkedCallLinkInfo* callLinkInfo = &m_unlinkedCallLinkInfos.alloc();
817+
callLinkInfo->codeOrigin = codeOrigin;
818+
LinkerIR::Constant callLinkInfoIndex = addToConstantPool(LinkerIR::Type::CallLinkInfo, unlinkedCallLinkInfoIndex);
819+
return std::tuple { callLinkInfo, LinkableConstant(callLinkInfoIndex) };
820+
}
821+
auto* callLinkInfo = jitCode()->common.m_callLinkInfos.add(codeOrigin, CallLinkInfo::UseDataIC::No);
822+
return std::tuple { callLinkInfo, LinkableConstant::nonCellPointer(*this, callLinkInfo) };
823+
}
824+
825+
803826
} } // namespace JSC::DFG
804827

805828
#endif // ENABLE(DFG_JIT)

‎Source/JavaScriptCore/dfg/DFGJITCompiler.h‎

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ class JITCompiler : public CCallHelpers {
239239
m_privateBrandAccesses.append(InlineCacheWrapper<JITPrivateBrandAccessGenerator>(gen, slowPath));
240240
}
241241

242-
void addJSCall(Label slowPathStart, Label doneLocation, OptimizingCallLinkInfo* info)
242+
void addJSCall(Label slowPathStart, Label doneLocation, CompileTimeCallLinkInfo info)
243243
{
244244
m_jsCalls.append(JSCallRecord(slowPathStart, doneLocation, info));
245245
}
@@ -376,6 +376,7 @@ class JITCompiler : public CCallHelpers {
376376
}
377377

378378
std::tuple<CompileTimeStructureStubInfo, LinkableConstant> addStructureStubInfo();
379+
std::tuple<CompileTimeCallLinkInfo, LinkableConstant> addCallLinkInfo(CodeOrigin);
379380
LinkerIR::Constant addToConstantPool(LinkerIR::Type, void*);
380381

381382
private:
@@ -413,7 +414,7 @@ class JITCompiler : public CCallHelpers {
413414

414415

415416
struct JSCallRecord {
416-
JSCallRecord(Label slowPathStart, Label doneLocation, OptimizingCallLinkInfo* info)
417+
JSCallRecord(Label slowPathStart, Label doneLocation, CompileTimeCallLinkInfo info)
417418
: slowPathStart(slowPathStart)
418419
, doneLocation(doneLocation)
419420
, info(info)
@@ -422,7 +423,7 @@ class JITCompiler : public CCallHelpers {
422423

423424
Label slowPathStart;
424425
Label doneLocation;
425-
OptimizingCallLinkInfo* info;
426+
CompileTimeCallLinkInfo info;
426427
};
427428

428429
struct JSDirectCallRecord {
@@ -458,6 +459,7 @@ class JITCompiler : public CCallHelpers {
458459
Vector<LinkerIR::Value> m_constantPool;
459460
HashMap<LinkerIR::Value, LinkerIR::Constant, LinkerIR::ValueHash, LinkerIR::ValueTraits> m_constantPoolMap;
460461
SegmentedVector<DFG::UnlinkedStructureStubInfo> m_unlinkedStubInfos;
462+
SegmentedVector<DFG::UnlinkedCallLinkInfo> m_unlinkedCallLinkInfos;
461463

462464
struct ExceptionHandlingOSRExitInfo {
463465
OSRExitCompilationInfo& exitInfo;

‎Source/JavaScriptCore/dfg/DFGPlan.cpp‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -685,7 +685,7 @@ std::unique_ptr<JITData> Plan::finalizeJITData(const JITCode& jitCode)
685685
{
686686
auto osrExitThunk = m_vm->getCTIStub(osrExitGenerationThunkGenerator).retagged<OSRExitPtrTag>();
687687
auto exits = JITData::ExitVector::createWithSizeAndConstructorArguments(jitCode.m_osrExit.size(), osrExitThunk);
688-
auto jitData = JITData::create(jitCode, WTFMove(exits));
688+
auto jitData = JITData::create(*m_vm, jitCode, WTFMove(exits));
689689
return jitData;
690690
}
691691

0 commit comments

Comments
 (0)