Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion deps/v8/include/v8-version.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
#define V8_MAJOR_VERSION 14
#define V8_MINOR_VERSION 2
#define V8_BUILD_NUMBER 231
#define V8_PATCH_LEVEL 9
#define V8_PATCH_LEVEL 14

// Use 1 for candidates and 0 otherwise.
// (Boolean macro values are not supported by all preprocessors.)
Expand Down
45 changes: 16 additions & 29 deletions deps/v8/src/builtins/loong64/builtins-loong64.cc
Original file line number Diff line number Diff line change
Expand Up @@ -3185,12 +3185,9 @@ void ReloadParentStack(MacroAssembler* masm, Register return_reg,
Register parent = tmp2;
__ Ld_d(parent, MemOperand(active_stack, wasm::kStackParentOffset));

// Update active stack.
__ StoreRootRelative(IsolateData::active_stack_offset(), parent);

// Switch stack!
SwitchStacks(masm, ExternalReference::wasm_return_stack(), active_stack,
nullptr, no_reg, {return_reg, return_value, context, parent});
SwitchStacks(masm, ExternalReference::wasm_return_stack(), parent, nullptr,
no_reg, {return_reg, return_value, context, parent});
LoadJumpBuffer(masm, parent, false, tmp3);
}

Expand Down Expand Up @@ -3425,22 +3422,18 @@ void Builtins::Generate_WasmSuspend(MacroAssembler* masm) {
ResetWasmJspiFrameStackSlots(masm);

Label resume;
DEFINE_REG(stack);
__ LoadRootRelative(stack, IsolateData::active_stack_offset());
DEFINE_REG(scratch);

// Update active stack.
DEFINE_REG(parent);
__ LoadProtectedPointerField(
parent, FieldMemOperand(suspender, WasmSuspenderObject::kParentOffset));
DEFINE_REG(target_stack);
__ LoadExternalPointerField(
target_stack, FieldMemOperand(parent, WasmSuspenderObject::kStackOffset),
kWasmStackMemoryTag);
__ StoreRootRelative(IsolateData::active_stack_offset(), target_stack);

SwitchStacks(masm, ExternalReference::wasm_suspend_stack(), stack, &resume,
no_reg, {target_stack, suspender, parent});
SwitchStacks(masm, ExternalReference::wasm_suspend_stack(), target_stack,
&resume, no_reg, {target_stack, suspender, parent});
__ StoreRootRelative(IsolateData::active_suspender_offset(), parent);
__ LoadTaggedField(
kReturnRegister0,
Expand Down Expand Up @@ -3512,11 +3505,8 @@ void Generate_WasmResumeHelper(MacroAssembler* masm, wasm::OnResume on_resume) {
target_stack,
FieldMemOperand(suspender, WasmSuspenderObject::kStackOffset),
kWasmStackMemoryTag);

__ StoreRootRelative(IsolateData::active_stack_offset(), target_stack);
SwitchStacks(masm, ExternalReference::wasm_resume_jspi_stack(), active_stack,
SwitchStacks(masm, ExternalReference::wasm_resume_jspi_stack(), target_stack,
&suspend, suspender, {target_stack});

regs.ResetExcept(target_stack);

// -------------------------------------------
Expand Down Expand Up @@ -3563,11 +3553,8 @@ void Builtins::Generate_WasmFXResume(MacroAssembler* masm) {
__ EnterFrame(StackFrame::WASM_STACK_EXIT);
Register target_stack = WasmFXResumeDescriptor::GetRegisterParameter(0);
Label suspend;
Register active_stack = a0;
__ LoadRootRelative(active_stack, IsolateData::active_stack_offset());
__ StoreRootRelative(IsolateData::active_stack_offset(), target_stack);
SwitchStacks(masm, ExternalReference::wasm_resume_wasmfx_stack(),
active_stack, &suspend, no_reg, {target_stack});
target_stack, &suspend, no_reg, {target_stack});
LoadJumpBuffer(masm, target_stack, true, a1);
__ Trap();
__ bind(&suspend);
Expand All @@ -3580,9 +3567,8 @@ void Builtins::Generate_WasmFXReturn(MacroAssembler* masm) {
__ LoadRootRelative(active_stack, IsolateData::active_stack_offset());
Register parent = a1;
__ Move(parent, MemOperand(active_stack, wasm::kStackParentOffset));
__ StoreRootRelative(IsolateData::active_stack_offset(), parent);
SwitchStacks(masm, ExternalReference::wasm_return_stack(), active_stack,
nullptr, no_reg, {parent});
SwitchStacks(masm, ExternalReference::wasm_return_stack(), parent, nullptr,
no_reg, {parent});
LoadJumpBuffer(masm, parent, true, a2);
__ Trap();
}
Expand All @@ -3599,14 +3585,15 @@ void SwitchToAllocatedStack(MacroAssembler* masm, RegisterAllocator& regs,
Label* suspend) {
ResetWasmJspiFrameStackSlots(masm);
DEFINE_SCOPED(scratch)
DEFINE_REG(parent_stack)
__ LoadRootRelative(parent_stack, IsolateData::active_stack_offset());
__ Ld_d(parent_stack, MemOperand(parent_stack, wasm::kStackParentOffset));

SwitchStacks(masm, ExternalReference::wasm_start_stack(), parent_stack,
suspend, no_reg, {wasm_instance, wrapper_buffer});
DEFINE_REG(stack)
__ LoadRootRelative(stack, IsolateData::active_suspender_offset());
__ LoadExternalPointerField(
stack, FieldMemOperand(stack, WasmSuspenderObject::kStackOffset),
kWasmStackMemoryTag);
SwitchStacks(masm, ExternalReference::wasm_start_stack(), stack, suspend,
no_reg, {wasm_instance, wrapper_buffer});

FREE_REG(parent_stack);
FREE_REG(stack);
// Save the old stack's fp in t0, and use it to access the parameters in
// the parent frame.
regs.Pinned(t1, &original_fp);
Expand Down
74 changes: 74 additions & 0 deletions deps/v8/src/codegen/loong64/macro-assembler-loong64.cc
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,58 @@ void MacroAssembler::PushStandardFrame(Register function_reg) {
Add_d(fp, sp, Operand(offset));
}

void MacroAssembler::PreCheckSkippedWriteBarrier(Register object,
Register value,
Register scratch, Label* ok) {
ASM_CODE_COMMENT(this);
DCHECK(!AreAliased(object, scratch));
DCHECK(!AreAliased(value, scratch));

// The most common case: Static write barrier elimination is allowed on the
// last young allocation.
{
UseScratchRegisterScope temps(this);
Register scratch1 = temps.Acquire();
Sub_d(scratch, object, kHeapObjectTag);
Ld_d(scratch1, MemOperand(kRootRegister,
IsolateData::last_young_allocation_offset()));
Branch(ok, Condition::kEqual, scratch, Operand(scratch1));
}

// Write barier can also be removed if value is in read-only space.
CheckPageFlag(value, MemoryChunk::kIsInReadOnlyHeapMask, ne, ok);

Label not_ok;

// Handle allocation folding, allow WB removal if:
// LAB start <= last_young_allocation_ < (object address+1) < LAB top
// Note that object has tag bit set, so object == object address+1.
{
UseScratchRegisterScope temps(this);
Register scratch1 = temps.Acquire();

// Check LAB start <= last_young_allocation_.
Ld_d(scratch, MemOperand(kRootRegister,
IsolateData::new_allocation_info_start_offset()));
Ld_d(scratch1, MemOperand(kRootRegister,
IsolateData::last_young_allocation_offset()));
Branch(&not_ok, Condition::kUnsignedGreaterThan, scratch,
Operand(scratch1));

// Check last_young_allocation_ < (object address+1).
Branch(&not_ok, Condition::kUnsignedGreaterThanEqual, scratch1,
Operand(object));

// Check (object address+1) < LAB top.
Ld_d(scratch, MemOperand(kRootRegister,
IsolateData::new_allocation_info_top_offset()));
Branch(ok, Condition::kUnsignedLessThan, object, Operand(scratch));
}

// Slow path: Potentially check more cases in C++.
bind(&not_ok);
}

// Clobbers object, dst, value, and ra, if (ra_status == kRAHasBeenSaved)
// The register 'object' contains a heap object pointer. The heap object
// tag is shifted away.
Expand Down Expand Up @@ -582,11 +634,33 @@ void MacroAssembler::CallVerifySkippedWriteBarrierStubSaveRegisters(
void MacroAssembler::CallVerifySkippedWriteBarrierStub(Register object,
Register value) {
ASM_CODE_COMMENT(this);
UseScratchRegisterScope temps(this);
Register scratch = temps.Acquire();
PrepareCallCFunction(2, scratch);
MovePair(kCArgRegs[0], object, kCArgRegs[1], value);
CallCFunction(ExternalReference::verify_skipped_write_barrier(), 2,
SetIsolateDataSlots::kNo);
}

void MacroAssembler::CallVerifySkippedIndirectWriteBarrierStubSaveRegisters(
Register object, Register value, SaveFPRegsMode fp_mode) {
ASM_CODE_COMMENT(this);
PushCallerSaved(fp_mode);
CallVerifySkippedIndirectWriteBarrierStub(object, value);
PopCallerSaved(fp_mode);
}

void MacroAssembler::CallVerifySkippedIndirectWriteBarrierStub(Register object,
Register value) {
ASM_CODE_COMMENT(this);
UseScratchRegisterScope temps(this);
Register scratch = temps.Acquire();
PrepareCallCFunction(2, scratch);
MovePair(kCArgRegs[0], object, kCArgRegs[1], value);
CallCFunction(ExternalReference::verify_skipped_indirect_write_barrier(), 2,
SetIsolateDataSlots::kNo);
}

void MacroAssembler::MoveObjectAndSlot(Register dst_object, Register dst_slot,
Register object, Operand offset) {
ASM_CODE_COMMENT(this);
Expand Down
8 changes: 8 additions & 0 deletions deps/v8/src/codegen/loong64/macro-assembler-loong64.h
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,9 @@ class V8_EXPORT_PRIVATE MacroAssembler : public MacroAssemblerBase {
void LoadRootRelative(Register destination, int32_t offset) final;
void StoreRootRelative(int32_t offset, Register value) final;

void PreCheckSkippedWriteBarrier(Register object, Register value,
Register scratch, Label* ok);

// Operand pointing to an external reference.
// May emit code to set up the scratch register. The operand is
// only guaranteed to be correct as long as the scratch register
Expand Down Expand Up @@ -360,6 +363,11 @@ class V8_EXPORT_PRIVATE MacroAssembler : public MacroAssemblerBase {
SaveFPRegsMode fp_mode);
void CallVerifySkippedWriteBarrierStub(Register object, Register value);

void CallVerifySkippedIndirectWriteBarrierStubSaveRegisters(
Register object, Register value, SaveFPRegsMode fp_mode);
void CallVerifySkippedIndirectWriteBarrierStub(Register object,
Register value);

// For a given |object| and |offset|:
// - Move |object| to |dst_object|.
// - Compute the address of the slot pointed to by |offset| in |object| and
Expand Down
4 changes: 4 additions & 0 deletions deps/v8/src/codegen/source-position-table.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ struct PositionTableEntry {
int code_offset;
bool is_statement;
bool is_breakable;

bool operator==(const PositionTableEntry&) const = default;
};

class V8_EXPORT_PRIVATE SourcePositionTableBuilder {
Expand Down Expand Up @@ -95,6 +97,8 @@ class V8_EXPORT_PRIVATE SourcePositionTableIterator {
PositionTableEntry position_;
IterationFilter iteration_filter_;
FunctionEntryFilter function_entry_filter_;

bool operator==(const IndexAndPositionState&) const = default;
};

// We expose three flavours of the iterator, depending on the argument passed
Expand Down
79 changes: 62 additions & 17 deletions deps/v8/src/compiler/backend/loong64/code-generator-loong64.cc
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@ class OutOfLineRecordWrite final : public OutOfLineCode {
#if V8_ENABLE_WEBASSEMBLY
stub_mode_(stub_mode),
#endif // V8_ENABLE_WEBASSEMBLY
must_save_lr_(!gen->frame_access_state()->has_frame()),
must_save_ra_(!gen->frame_access_state()->has_frame()),
zone_(gen->zone()),
indirect_pointer_tag_(indirect_pointer_tag) {
}
Expand All @@ -175,7 +175,7 @@ class OutOfLineRecordWrite final : public OutOfLineCode {
SaveFPRegsMode const save_fp_mode = frame()->DidAllocateDoubleRegisters()
? SaveFPRegsMode::kSave
: SaveFPRegsMode::kIgnore;
if (must_save_lr_) {
if (must_save_ra_) {
// We need to save and restore ra if the frame was elided.
__ Push(ra);
}
Expand All @@ -196,7 +196,7 @@ class OutOfLineRecordWrite final : public OutOfLineCode {
} else {
__ CallRecordWriteStubSaveRegisters(object_, offset_, save_fp_mode);
}
if (must_save_lr_) {
if (must_save_ra_) {
__ Pop(ra);
}
}
Expand All @@ -209,7 +209,7 @@ class OutOfLineRecordWrite final : public OutOfLineCode {
#if V8_ENABLE_WEBASSEMBLY
StubCallMode const stub_mode_;
#endif // V8_ENABLE_WEBASSEMBLY
bool must_save_lr_;
bool must_save_ra_;
Zone* zone_;
IndirectPointerTag indirect_pointer_tag_;
};
Expand Down Expand Up @@ -294,23 +294,62 @@ void RecordTrapInfoIfNeeded(Zone* zone, CodeGenerator* codegen,
class OutOfLineVerifySkippedWriteBarrier final : public OutOfLineCode {
public:
OutOfLineVerifySkippedWriteBarrier(CodeGenerator* gen, Register object,
Register value)
Register value, Register scratch)
: OutOfLineCode(gen),
object_(object),
value_(value),
scratch_(scratch),
must_save_ra_(!gen->frame_access_state()->has_frame()),
zone_(gen->zone()) {}

void Generate() final {
if (COMPRESS_POINTERS_BOOL) {
__ DecompressTagged(value_, value_);
}

if (must_save_ra_) {
// We need to save and restore ra if the frame was elided.
__ Push(ra);
}

__ PreCheckSkippedWriteBarrier(object_, value_, scratch_, exit());

SaveFPRegsMode const save_fp_mode = frame()->DidAllocateDoubleRegisters()
? SaveFPRegsMode::kSave
: SaveFPRegsMode::kIgnore;

__ CallVerifySkippedWriteBarrierStubSaveRegisters(object_, value_,
save_fp_mode);

if (must_save_ra_) {
__ Pop(ra);
}
}

private:
Register const object_;
Register const value_;
Register const scratch_;
const bool must_save_ra_;
Zone* zone_;
};

class OutOfLineVerifySkippedIndirectWriteBarrier final : public OutOfLineCode {
public:
OutOfLineVerifySkippedIndirectWriteBarrier(CodeGenerator* gen,
Register object, Register value)
: OutOfLineCode(gen),
object_(object),
value_(value),
zone_(gen->zone()) {}

void Generate() final {
SaveFPRegsMode const save_fp_mode = frame()->DidAllocateDoubleRegisters()
? SaveFPRegsMode::kSave
: SaveFPRegsMode::kIgnore;

__ CallVerifySkippedIndirectWriteBarrierStubSaveRegisters(object_, value_,
save_fp_mode);
}

private:
Expand Down Expand Up @@ -1025,12 +1064,12 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
Operand(kClearedWeakHeapObjectLower32));
}

if (v8_flags.verify_write_barriers) {
auto ool = zone()->New<OutOfLineVerifySkippedWriteBarrier>(this, object,
value);
__ JumpIfNotSmi(value, ool->entry());
__ bind(ool->exit());
}
DCHECK(v8_flags.verify_write_barriers);
Register scratch = i.TempRegister(0);
auto ool = zone()->New<OutOfLineVerifySkippedWriteBarrier>(
this, object, value, scratch);
__ JumpIfNotSmi(value, ool->entry());
__ bind(ool->exit());

MacroAssemblerBase::BlockTrampolinePoolScope block_trampoline_pool(
masm());
Expand Down Expand Up @@ -1085,12 +1124,12 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
Register temp = i.TempRegister(0);
__ Add_d(temp, object, offset);

if (v8_flags.verify_write_barriers) {
auto ool = zone()->New<OutOfLineVerifySkippedWriteBarrier>(this, object,
value);
__ JumpIfNotSmi(value, ool->entry());
__ bind(ool->exit());
}
DCHECK(v8_flags.verify_write_barriers);
Register scratch = i.TempRegister(1);
auto ool = zone()->New<OutOfLineVerifySkippedWriteBarrier>(
this, object, value, scratch);
__ JumpIfNotSmi(value, ool->entry());
__ bind(ool->exit());

MacroAssemblerBase::BlockTrampolinePoolScope block_trampoline_pool(
masm());
Expand Down Expand Up @@ -1150,6 +1189,12 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
DCHECK(IsValidIndirectPointerTag(tag));
#endif // DEBUG

DCHECK(v8_flags.verify_write_barriers);
auto ool = zone()->New<OutOfLineVerifySkippedIndirectWriteBarrier>(
this, object, value);
__ jmp(ool->entry());
__ bind(ool->exit());

MacroAssemblerBase::BlockTrampolinePoolScope block_trampoline_pool(
masm());
Operand offset(0);
Expand Down
Loading
Loading