Skip to content

Commit

Permalink
Use SystemV ABI for C++ entrypoints for JS LLInt
Browse files Browse the repository at this point in the history
https://bugs.webkit.org/show_bug.cgi?id=274064

Reviewed by Yusuke Suzuki.

Switched register mapping on Windows to match the other x86-64 platforms
Added SystemV ABI function annotation to C++ entrypoints for JS LLInt
Disabed WebAssembly LLInt, as it doesn't work without JIT anyway, so we
can review the necessary changes there in another pull request.

* Source/JavaScriptCore/assembler/MaxFrameExtentForSlowPathCall.h:
* Source/JavaScriptCore/assembler/X86_64Registers.h:
* Source/JavaScriptCore/heap/MachineStackMarker.cpp:
(JSC::osRedZoneAdjustment):
* Source/JavaScriptCore/interpreter/VMEntryRecord.h:
* Source/JavaScriptCore/jit/AssemblyHelpers.h:
(JSC::AssemblyHelpers::selectScratchGPR):
* Source/JavaScriptCore/jit/GPRInfo.h:
(JSC::GPRInfo::toRegister):
(JSC::GPRInfo::toArgumentRegister):
(JSC::GPRInfo::toIndex):
(JSC::PreferredArgumentImpl::preferredArgumentJSR):
* Source/JavaScriptCore/jit/RegisterSet.cpp:
(JSC::RegisterSetBuilder::vmCalleeSaveRegisters):
(JSC::RegisterSetBuilder::llintBaselineCalleeSaveRegisters):
(JSC::RegisterSetBuilder::dfgCalleeSaveRegisters):
* Source/JavaScriptCore/llint/LLIntData.cpp:
* Source/JavaScriptCore/llint/LLIntSlowPaths.cpp:
(JSC::LLInt::llint_trace_operand):
(JSC::LLInt::llint_trace_value):
(JSC::LLInt::llint_default_call):
(JSC::LLInt::llint_virtual_call):
(JSC::LLInt::llint_slow_path_checkpoint_osr_exit_from_inlined_call):
(JSC::LLInt::llint_slow_path_checkpoint_osr_exit):
(JSC::LLInt::llint_throw_stack_overflow_error):
(JSC::LLInt::llint_stack_check_at_vm_entry):
(JSC::LLInt::llint_check_vm_entry_permission):
(JSC::LLInt::llint_dump_value):
(JSC::LLInt::llint_crash):
* Source/JavaScriptCore/llint/LLIntSlowPaths.h:
* Source/JavaScriptCore/llint/LLIntThunks.h:
* Source/JavaScriptCore/llint/LowLevelInterpreter.asm:
* Source/JavaScriptCore/llint/LowLevelInterpreter64.asm:
* Source/JavaScriptCore/offlineasm/x86.rb:
* Source/JavaScriptCore/runtime/MachineContext.h:
(JSC::MachineContext::llintInstructionPointer):
* Source/JavaScriptCore/runtime/PutPropertySlot.h:
* Source/JavaScriptCore/runtime/VM.h:
* Source/WTF/wtf/CodePtr.h:
(WTF::CodePtr::CodePtr):
* Source/WTF/wtf/FunctionPtr.h:
* Source/WTF/wtf/PlatformCallingConventions.h:

Canonical link: https://commits.webkit.org/278967@main
  • Loading branch information
iangrunert authored and Constellation committed May 19, 2024
1 parent 26b41e6 commit 8f1711c
Show file tree
Hide file tree
Showing 20 changed files with 87 additions and 311 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -38,12 +38,8 @@ namespace JSC {
#if !ENABLE(ASSEMBLER)
static constexpr size_t maxFrameExtentForSlowPathCall = 0;

#elif CPU(X86_64) && OS(WINDOWS)
// 4 args in registers, but stack space needs to be allocated for all args.
static constexpr size_t maxFrameExtentForSlowPathCall = 64;

#elif CPU(X86_64)
// All args in registers.
// All args in registers. Windows also uses System V ABI.
static constexpr size_t maxFrameExtentForSlowPathCall = 0;

#elif CPU(X86)
Expand Down
24 changes: 0 additions & 24 deletions Source/JavaScriptCore/assembler/X86_64Registers.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,6 @@

#define RegisterNames X86Registers

#if !OS(WINDOWS)

#define FOR_EACH_GP_REGISTER(macro) \
macro(eax, "rax"_s, 0, 0) \
macro(ecx, "rcx"_s, 0, 0) \
Expand All @@ -53,28 +51,6 @@
macro(r14, "r14"_s, 0, 1) \
macro(r15, "r15"_s, 0, 1)

#else // OS(WINDOWS)

#define FOR_EACH_GP_REGISTER(macro) \
macro(eax, "rax"_s, 0, 0) \
macro(ecx, "rcx"_s, 0, 0) \
macro(edx, "rdx"_s, 0, 0) \
macro(ebx, "rbx"_s, 0, 1) \
macro(esp, "rsp"_s, 0, 0) \
macro(ebp, "rbp"_s, 0, 1) \
macro(esi, "rsi"_s, 0, 1) \
macro(edi, "rdi"_s, 0, 1) \
macro(r8, "r8"_s, 0, 0) \
macro(r9, "r9"_s, 0, 0) \
macro(r10, "r10"_s, 0, 0) \
macro(r11, "r11"_s, 0, 0) \
macro(r12, "r12"_s, 0, 1) \
macro(r13, "r13"_s, 0, 1) \
macro(r14, "r14"_s, 0, 1) \
macro(r15, "r15"_s, 0, 1)

#endif // !OS(WINDOWS)

#define FOR_EACH_FP_REGISTER(macro) \
macro(xmm0, "xmm0"_s, 0, 0) \
macro(xmm1, "xmm1"_s, 0, 0) \
Expand Down
2 changes: 0 additions & 2 deletions Source/JavaScriptCore/heap/MachineStackMarker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,15 +53,13 @@ void MachineThreads::gatherFromCurrentThread(ConservativeRoots& conservativeRoot
static inline int osRedZoneAdjustment()
{
int redZoneAdjustment = 0;
#if !OS(WINDOWS)
#if CPU(X86_64)
// See http://people.freebsd.org/~obrien/amd64-elf-abi.pdf Section 3.2.2.
redZoneAdjustment = -128;
#elif CPU(ARM64)
// See https://developer.apple.com/library/ios/documentation/Xcode/Conceptual/iPhoneOSABIReference/Articles/ARM64FunctionCallingConventions.html#//apple_ref/doc/uid/TP40013702-SW7
redZoneAdjustment = -128;
#endif
#endif // !OS(WINDOWS)
return redZoneAdjustment;
}

Expand Down
2 changes: 1 addition & 1 deletion Source/JavaScriptCore/interpreter/VMEntryRecord.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,6 @@ struct VMEntryRecord {
SUPPRESS_ASAN EntryFrame* unsafePrevTopEntryFrame() { return m_prevTopEntryFrame; }
};

extern "C" VMEntryRecord* vmEntryRecord(EntryFrame*);
extern "C" VMEntryRecord* SYSV_ABI vmEntryRecord(EntryFrame*);

} // namespace JSC
2 changes: 0 additions & 2 deletions Source/JavaScriptCore/jit/AssemblyHelpers.h
Original file line number Diff line number Diff line change
Expand Up @@ -1358,8 +1358,6 @@ class AssemblyHelpers : public MacroAssembler {
GPRInfo::regT13,
GPRInfo::regT14,
GPRInfo::regT15,
#elif CPU(X86_64) && OS(WINDOWS)
// No additional registers.
#elif CPU(X86_64)
GPRInfo::regT6,
GPRInfo::regT7,
Expand Down
58 changes: 2 additions & 56 deletions Source/JavaScriptCore/jit/GPRInfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -402,13 +402,8 @@ class GPRInfo {
#endif // CPU(X86)

#if CPU(X86_64)
#if !OS(WINDOWS)
#define NUMBER_OF_ARGUMENT_REGISTERS 6u
#define NUMBER_OF_CALLEE_SAVES_REGISTERS 5u
#else
#define NUMBER_OF_ARGUMENT_REGISTERS 4u
#define NUMBER_OF_CALLEE_SAVES_REGISTERS 7u
#endif

class GPRInfo {
public:
Expand All @@ -425,52 +420,29 @@ class GPRInfo {

// Temporary registers.
static constexpr GPRReg regT0 = X86Registers::eax;
#if !OS(WINDOWS)
static constexpr GPRReg regT1 = X86Registers::esi;
static constexpr GPRReg regT2 = X86Registers::edx;
static constexpr GPRReg regT3 = X86Registers::ecx;
static constexpr GPRReg regT4 = X86Registers::r8;
static constexpr GPRReg regT5 = X86Registers::r10;
static constexpr GPRReg regT6 = X86Registers::edi;
static constexpr GPRReg regT7 = X86Registers::r9;
#else
static constexpr GPRReg regT1 = X86Registers::edx;
static constexpr GPRReg regT2 = X86Registers::r8;
static constexpr GPRReg regT3 = X86Registers::r9;
static constexpr GPRReg regT4 = X86Registers::r10;
static constexpr GPRReg regT5 = X86Registers::ecx;
#endif

static constexpr GPRReg regCS0 = X86Registers::ebx;

#if !OS(WINDOWS)
static constexpr GPRReg regCS1 = X86Registers::r12; // metadataTable in LLInt/Baseline
static constexpr GPRReg regCS2 = X86Registers::r13; // jitDataRegister
static constexpr GPRReg regCS3 = X86Registers::r14; // numberTagRegister
static constexpr GPRReg regCS4 = X86Registers::r15; // notCellMaskRegister
#else
static constexpr GPRReg regCS1 = X86Registers::esi;
static constexpr GPRReg regCS2 = X86Registers::edi;
static constexpr GPRReg regCS3 = X86Registers::r12; // metadataTable in LLInt/Baseline
static constexpr GPRReg regCS4 = X86Registers::r13; // jitDataRegister
static constexpr GPRReg regCS5 = X86Registers::r14; // numberTagRegister
static constexpr GPRReg regCS6 = X86Registers::r15; // notCellMaskRegister
#endif

// These constants provide the names for the general purpose argument & return value registers.
#if !OS(WINDOWS)
static constexpr GPRReg argumentGPR0 = X86Registers::edi; // regT6
static constexpr GPRReg argumentGPR1 = X86Registers::esi; // regT1
static constexpr GPRReg argumentGPR2 = X86Registers::edx; // regT2
static constexpr GPRReg argumentGPR3 = X86Registers::ecx; // regT3
static constexpr GPRReg argumentGPR4 = X86Registers::r8; // regT4
static constexpr GPRReg argumentGPR5 = X86Registers::r9; // regT7
#else
static constexpr GPRReg argumentGPR0 = X86Registers::ecx; // regT5
static constexpr GPRReg argumentGPR1 = X86Registers::edx; // regT1
static constexpr GPRReg argumentGPR2 = X86Registers::r8; // regT2
static constexpr GPRReg argumentGPR3 = X86Registers::r9; // regT3
#endif

static constexpr GPRReg nonArgGPR0 = X86Registers::r10; // regT5 (regT4 on Windows)
static constexpr GPRReg nonArgGPR1 = X86Registers::eax; // regT0
static constexpr GPRReg returnValueGPR = X86Registers::eax; // regT0
Expand All @@ -482,19 +454,11 @@ class GPRInfo {
static constexpr GPRReg handlerGPR = GPRInfo::nonPreservedNonArgumentGPR1;

static constexpr GPRReg wasmScratchGPR0 = X86Registers::eax;
#if !OS(WINDOWS)
static constexpr GPRReg wasmScratchGPR1 = X86Registers::r10;
#else
static constexpr GPRReg wasmScratchCSR0 = regCS2;
#endif

static constexpr GPRReg wasmContextInstancePointer = regCS0;
#if !OS(WINDOWS)
static constexpr GPRReg wasmBaseMemoryPointer = regCS3;
static constexpr GPRReg wasmBoundsCheckingSizeRegister = regCS4;
#else
static constexpr GPRReg wasmBaseMemoryPointer = regCS5;
static constexpr GPRReg wasmBoundsCheckingSizeRegister = regCS6;
#endif

// FIXME: I believe that all uses of this are dead in the sense that it just causes the scratch
// register allocator to select a different register and potentially spill things. It would be better
Expand All @@ -504,34 +468,22 @@ class GPRInfo {
static constexpr GPRReg toRegister(unsigned index)
{
ASSERT_UNDER_CONSTEXPR_CONTEXT(index < numberOfRegisters);
#if !OS(WINDOWS)
constexpr GPRReg registerForIndex[numberOfRegisters] = { regT0, regT1, regT2, regT3, regT4, regT5, regT6, regT7, regCS0, regCS1 };
#else
constexpr GPRReg registerForIndex[numberOfRegisters] = { regT0, regT1, regT2, regT3, regT4, regT5, regCS0, regCS1, regCS2, regCS3 };
#endif
return registerForIndex[index];
}

static GPRReg toArgumentRegister(unsigned index)
{
ASSERT(index < numberOfArgumentRegisters);
#if !OS(WINDOWS)
static const GPRReg registerForIndex[numberOfArgumentRegisters] = { argumentGPR0, argumentGPR1, argumentGPR2, argumentGPR3, argumentGPR4, argumentGPR5 };
#else
static const GPRReg registerForIndex[numberOfArgumentRegisters] = { argumentGPR0, argumentGPR1, argumentGPR2, argumentGPR3 };
#endif
return registerForIndex[index];
}

static unsigned toIndex(GPRReg reg)
{
ASSERT(reg != InvalidGPRReg);
ASSERT(static_cast<int>(reg) < 16);
#if !OS(WINDOWS)
static const unsigned indexForRegister[16] = { 0, 3, 2, 8, InvalidIndex, InvalidIndex, 1, 6, 4, 7, 5, InvalidIndex, 9, InvalidIndex, InvalidIndex, InvalidIndex };
#else
static const unsigned indexForRegister[16] = { 0, 5, 1, 6, InvalidIndex, InvalidIndex, 7, 8, 2, 3, 4, InvalidIndex, 9, InvalidIndex, InvalidIndex, InvalidIndex };
#endif
return indexForRegister[reg];
}

Expand Down Expand Up @@ -1083,15 +1035,9 @@ class PreferredArgumentImpl {
preferredArgumentJSR()
{
#if USE(JSVALUE64)
#if !OS(WINDOWS)
return pickJSR<OperationType, ArgNum>(
GPRInfo::argumentGPR0, GPRInfo::argumentGPR1, GPRInfo::argumentGPR2,
GPRInfo::argumentGPR3, GPRInfo::argumentGPR4, GPRInfo::argumentGPR5);
#else
return pickJSR<OperationType, ArgNum>(
GPRInfo::argumentGPR0, GPRInfo::argumentGPR1, GPRInfo::argumentGPR2,
GPRInfo::argumentGPR3, GPRInfo::nonArgGPR0, GPRInfo::nonArgGPR1);
#endif
#elif USE(JSVALUE32_64)
#if CPU(ARM_THUMB2)
// Be careful about GPRInfo::regCS0. It is used as a metadataTable register.
Expand Down
25 changes: 0 additions & 25 deletions Source/JavaScriptCore/jit/RegisterSet.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -158,10 +158,6 @@ RegisterSet RegisterSetBuilder::vmCalleeSaveRegisters()
result.add(GPRInfo::regCS2, IgnoreVectors);
result.add(GPRInfo::regCS3, IgnoreVectors);
result.add(GPRInfo::regCS4, IgnoreVectors);
#if OS(WINDOWS)
result.add(GPRInfo::regCS5, IgnoreVectors);
result.add(GPRInfo::regCS6, IgnoreVectors);
#endif
#elif CPU(ARM64)
result.add(GPRInfo::regCS0, IgnoreVectors);
result.add(GPRInfo::regCS1, IgnoreVectors);
Expand Down Expand Up @@ -223,23 +219,13 @@ RegisterSet RegisterSetBuilder::llintBaselineCalleeSaveRegisters()
RegisterSet result;
#if CPU(X86)
#elif CPU(X86_64)
#if !OS(WINDOWS)
result.add(GPRInfo::regCS1, IgnoreVectors);
static_assert(GPRInfo::regCS2 == GPRInfo::jitDataRegister);
static_assert(GPRInfo::regCS3 == GPRInfo::numberTagRegister);
static_assert(GPRInfo::regCS4 == GPRInfo::notCellMaskRegister);
result.add(GPRInfo::regCS2, IgnoreVectors);
result.add(GPRInfo::regCS3, IgnoreVectors);
result.add(GPRInfo::regCS4, IgnoreVectors);
#else
result.add(GPRInfo::regCS3, IgnoreVectors);
static_assert(GPRInfo::regCS4 == GPRInfo::jitDataRegister);
static_assert(GPRInfo::regCS5 == GPRInfo::numberTagRegister);
static_assert(GPRInfo::regCS6 == GPRInfo::notCellMaskRegister);
result.add(GPRInfo::regCS4, IgnoreVectors);
result.add(GPRInfo::regCS5, IgnoreVectors);
result.add(GPRInfo::regCS6, IgnoreVectors);
#endif
#elif CPU(ARM_THUMB2)
result.add(GPRInfo::regCS0, IgnoreVectors);
result.add(GPRInfo::regCS1, IgnoreVectors);
Expand All @@ -264,23 +250,12 @@ RegisterSet RegisterSetBuilder::dfgCalleeSaveRegisters()
#elif CPU(X86_64)
result.add(GPRInfo::regCS0, IgnoreVectors);
result.add(GPRInfo::regCS1, IgnoreVectors);
#if !OS(WINDOWS)
static_assert(GPRInfo::regCS2 == GPRInfo::jitDataRegister);
static_assert(GPRInfo::regCS3 == GPRInfo::numberTagRegister);
static_assert(GPRInfo::regCS4 == GPRInfo::notCellMaskRegister);
result.add(GPRInfo::regCS2, IgnoreVectors);
result.add(GPRInfo::regCS3, IgnoreVectors);
result.add(GPRInfo::regCS4, IgnoreVectors);
#else
result.add(GPRInfo::regCS2, IgnoreVectors);
result.add(GPRInfo::regCS3, IgnoreVectors);
static_assert(GPRInfo::regCS4 == GPRInfo::jitDataRegister);
static_assert(GPRInfo::regCS5 == GPRInfo::numberTagRegister);
static_assert(GPRInfo::regCS6 == GPRInfo::notCellMaskRegister);
result.add(GPRInfo::regCS4, IgnoreVectors);
result.add(GPRInfo::regCS5, IgnoreVectors);
result.add(GPRInfo::regCS6, IgnoreVectors);
#endif
#elif CPU(ARM_THUMB2)
result.add(GPRInfo::regCS0, IgnoreVectors);
result.add(GPRInfo::regCS1, IgnoreVectors);
Expand Down
2 changes: 1 addition & 1 deletion Source/JavaScriptCore/llint/LLIntData.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ Opcode g_opcodeMapWide16[numOpcodeIDs + numWasmOpcodeIDs] = { };
Opcode g_opcodeMapWide32[numOpcodeIDs + numWasmOpcodeIDs] = { };

#if !ENABLE(C_LOOP)
extern "C" void llint_entry(void*, void*, void*);
extern "C" void SYSV_ABI llint_entry(void*, void*, void*);

#if ENABLE(WEBASSEMBLY)
extern "C" void wasm_entry(void*, void*, void*);
Expand Down
24 changes: 12 additions & 12 deletions Source/JavaScriptCore/llint/LLIntSlowPaths.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,7 @@ template<typename... Types> void slowPathLogF(const char*, const Types&...) { }

#endif // LLINT_TRACING

extern "C" UGPRPair llint_trace_operand(CallFrame* callFrame, const JSInstruction* pc, int fromWhere, int operand)
extern "C" UGPRPair SYSV_ABI llint_trace_operand(CallFrame* callFrame, const JSInstruction* pc, int fromWhere, int operand)
{
if (!Options::traceLLIntExecution())
LLINT_END_IMPL();
Expand All @@ -241,7 +241,7 @@ extern "C" UGPRPair llint_trace_operand(CallFrame* callFrame, const JSInstructio
LLINT_END();
}

extern "C" UGPRPair llint_trace_value(CallFrame* callFrame, const JSInstruction* pc, int fromWhere, VirtualRegister operand)
extern "C" UGPRPair SYSV_ABI llint_trace_value(CallFrame* callFrame, const JSInstruction* pc, int fromWhere, VirtualRegister operand)
{
if (!Options::traceLLIntExecution())
LLINT_END_IMPL();
Expand Down Expand Up @@ -599,7 +599,7 @@ LLINT_SLOW_PATH_DECL(stack_check)
LLINT_RETURN_TWO(pc, callFrame);
}

extern "C" UGPRPair llint_default_call(CallFrame* calleeFrame, CallLinkInfo* callLinkInfo)
extern "C" UGPRPair SYSV_ABI llint_default_call(CallFrame* calleeFrame, CallLinkInfo* callLinkInfo)
{
JSCell* owner = callLinkInfo->ownerForSlowPath(calleeFrame);
VM& vm = owner->vm();
Expand All @@ -614,7 +614,7 @@ extern "C" UGPRPair llint_default_call(CallFrame* calleeFrame, CallLinkInfo* cal
return encodeResult(callTarget, nullptr);
}

extern "C" UGPRPair llint_virtual_call(CallFrame* calleeFrame, CallLinkInfo* callLinkInfo)
extern "C" UGPRPair SYSV_ABI llint_virtual_call(CallFrame* calleeFrame, CallLinkInfo* callLinkInfo)
{
JSCell* owner = callLinkInfo->ownerForSlowPath(calleeFrame);
VM& vm = owner->vm();
Expand Down Expand Up @@ -2570,7 +2570,7 @@ static inline UGPRPair dispatchToNextInstructionDuringExit(ThrowScope& scope, Co
RELEASE_ASSERT_NOT_REACHED();
}

extern "C" UGPRPair llint_slow_path_checkpoint_osr_exit_from_inlined_call(CallFrame* callFrame, EncodedJSValue result)
extern "C" UGPRPair SYSV_ABI llint_slow_path_checkpoint_osr_exit_from_inlined_call(CallFrame* callFrame, EncodedJSValue result)
{
// Since all our calling checkpoints do right now is move result into our dest we can just do that here and return.
CodeBlock* codeBlock = callFrame->codeBlock();
Expand Down Expand Up @@ -2634,7 +2634,7 @@ extern "C" UGPRPair llint_slow_path_checkpoint_osr_exit_from_inlined_call(CallFr
return dispatchToNextInstructionDuringExit(scope, codeBlock, pc);
}

extern "C" UGPRPair llint_slow_path_checkpoint_osr_exit(CallFrame* callFrame, EncodedJSValue /* needed for cCall2 in CLoop */)
extern "C" UGPRPair SYSV_ABI llint_slow_path_checkpoint_osr_exit(CallFrame* callFrame, EncodedJSValue /* needed for cCall2 in CLoop */)
{
CodeBlock* codeBlock = callFrame->codeBlock();
VM& vm = codeBlock->vm();
Expand Down Expand Up @@ -2679,7 +2679,7 @@ extern "C" UGPRPair llint_slow_path_checkpoint_osr_exit(CallFrame* callFrame, En
return dispatchToNextInstructionDuringExit(scope, codeBlock, pc);
}

extern "C" UGPRPair llint_throw_stack_overflow_error(VM* vm, ProtoCallFrame* protoFrame)
extern "C" UGPRPair SYSV_ABI llint_throw_stack_overflow_error(VM* vm, ProtoCallFrame* protoFrame)
{
CallFrame* callFrame = vm->topCallFrame;
auto scope = DECLARE_THROW_SCOPE(*vm);
Expand All @@ -2693,7 +2693,7 @@ extern "C" UGPRPair llint_throw_stack_overflow_error(VM* vm, ProtoCallFrame* pro
}

#if ENABLE(C_LOOP)
extern "C" UGPRPair llint_stack_check_at_vm_entry(VM* vm, Register* newTopOfStack)
extern "C" UGPRPair SYSV_ABI llint_stack_check_at_vm_entry(VM* vm, Register* newTopOfStack)
{
bool success = vm->ensureStackCapacityFor(newTopOfStack);
return encodeResult(reinterpret_cast<void*>(success), 0);
Expand All @@ -2706,19 +2706,19 @@ extern "C" void llint_write_barrier_slow(CallFrame* callFrame, JSCell* cell)
vm.writeBarrier(cell);
}

extern "C" UGPRPair llint_check_vm_entry_permission(VM*, ProtoCallFrame*)
extern "C" UGPRPair SYSV_ABI llint_check_vm_entry_permission(VM*, ProtoCallFrame*)
{
Interpreter::checkVMEntryPermission();
return encodeResult(nullptr, nullptr);
}

extern "C" void llint_dump_value(EncodedJSValue value);
extern "C" void llint_dump_value(EncodedJSValue value)
extern "C" void SYSV_ABI llint_dump_value(EncodedJSValue value);
extern "C" void SYSV_ABI llint_dump_value(EncodedJSValue value)
{
dataLogLn(JSValue::decode(value));
}

extern "C" NO_RETURN_DUE_TO_CRASH void llint_crash()
extern "C" NO_RETURN_DUE_TO_CRASH void SYSV_ABI llint_crash()
{
CRASH();
}
Expand Down
Loading

0 comments on commit 8f1711c

Please sign in to comment.