Skip to content

Commit 81700dd

Browse files
backesCommit bot
authored andcommitted
[wasm] Introduce WasmToInterpreterFrame
and rename WasmFrame to WasmCompiledFrame. The WasmToInterpreterFrames are not used yet; this will follow in a follow-up CL (see tracking bug for the overall picture). Those frames will represent frames for WASM_TO_INTERPRETER stubs, which call from wasm code to the wasm interpreter, implemented in C++. They will support the Summarize method to inspect the stack frames in the wasm interpreter. R=yangguo@chromium.org, titzer@chromium.org BUG=v8:5822 Review-Url: https://codereview.chromium.org/2623773004 Cr-Commit-Position: refs/heads/master@{#42213}
1 parent 7ef86f8 commit 81700dd

14 files changed

Lines changed: 188 additions & 58 deletions

src/arm64/macro-assembler-arm64.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2666,7 +2666,7 @@ void MacroAssembler::EnterFrame(StackFrame::Type type) {
26662666
// jssp[3] : fp
26672667
// jssp[1] : type
26682668
// jssp[0] : [code object]
2669-
} else if (type == StackFrame::WASM) {
2669+
} else if (type == StackFrame::WASM_COMPILED) {
26702670
DCHECK(csp.Is(StackPointer()));
26712671
Mov(type_reg, Smi::FromInt(type));
26722672
Push(xzr, lr);

src/compilation-info.cc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,11 +166,13 @@ StackFrame::Type CompilationInfo::GetOutputStackFrameType() const {
166166
#undef CASE_KIND
167167
return StackFrame::STUB;
168168
case Code::WASM_FUNCTION:
169-
return StackFrame::WASM;
169+
return StackFrame::WASM_COMPILED;
170170
case Code::JS_TO_WASM_FUNCTION:
171171
return StackFrame::JS_TO_WASM;
172172
case Code::WASM_TO_JS_FUNCTION:
173173
return StackFrame::WASM_TO_JS;
174+
case Code::WASM_INTERPRETER_ENTRY:
175+
return StackFrame::WASM_INTERPRETER_ENTRY;
174176
default:
175177
UNIMPLEMENTED();
176178
return StackFrame::NONE;

src/compiler/arm/code-generator-arm.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1713,7 +1713,7 @@ void CodeGenerator::AssembleArchTrap(Instruction* instr,
17131713
bool old_has_frame = __ has_frame();
17141714
if (frame_elided_) {
17151715
__ set_has_frame(true);
1716-
__ EnterFrame(StackFrame::WASM);
1716+
__ EnterFrame(StackFrame::WASM_COMPILED);
17171717
}
17181718
GenerateCallToTrap(trap_id);
17191719
if (frame_elided_) {

src/compiler/arm64/code-generator-arm64.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1717,7 +1717,7 @@ void CodeGenerator::AssembleArchTrap(Instruction* instr,
17171717
bool old_has_frame = __ has_frame();
17181718
if (frame_elided_) {
17191719
__ set_has_frame(true);
1720-
__ EnterFrame(StackFrame::WASM);
1720+
__ EnterFrame(StackFrame::WASM_COMPILED);
17211721
}
17221722
GenerateCallToTrap(trap_id);
17231723
if (frame_elided_) {

src/compiler/ia32/code-generator-ia32.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1693,7 +1693,7 @@ void CodeGenerator::AssembleArchTrap(Instruction* instr,
16931693
bool old_has_frame = __ has_frame();
16941694
if (frame_elided_) {
16951695
__ set_has_frame(true);
1696-
__ EnterFrame(StackFrame::WASM);
1696+
__ EnterFrame(StackFrame::WASM_COMPILED);
16971697
}
16981698
GenerateCallToTrap(trap_id);
16991699
if (frame_elided_) {

src/compiler/x64/code-generator-x64.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@ class WasmOutOfLineTrap final : public OutOfLineCode {
285285
gen_->AddProtectedInstruction(pc_, current_pc);
286286

287287
if (frame_elided_) {
288-
__ EnterFrame(StackFrame::WASM);
288+
__ EnterFrame(StackFrame::WASM_COMPILED);
289289
}
290290

291291
wasm::TrapReason trap_id = wasm::kTrapMemOutOfBounds;
@@ -2321,7 +2321,7 @@ void CodeGenerator::AssembleArchTrap(Instruction* instr,
23212321
bool old_has_frame = __ has_frame();
23222322
if (frame_elided_) {
23232323
__ set_has_frame(true);
2324-
__ EnterFrame(StackFrame::WASM);
2324+
__ EnterFrame(StackFrame::WASM_COMPILED);
23252325
}
23262326
GenerateCallToTrap(trap_id);
23272327
if (frame_elided_) {

src/debug/debug-frames.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,9 @@ class FrameInspector {
3333
return frame_->is_arguments_adaptor() ? ArgumentsAdaptorFrame::cast(frame_)
3434
: JavaScriptFrame::cast(frame_);
3535
}
36-
inline WasmFrame* wasm_frame() { return WasmFrame::cast(frame_); }
36+
inline WasmCompiledFrame* wasm_frame() {
37+
return WasmCompiledFrame::cast(frame_);
38+
}
3739

3840
JavaScriptFrame* GetArgumentsFrame() { return javascript_frame(); }
3941
void SetArgumentsFrame(StandardFrame* frame);

src/frames-inl.h

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,11 @@ inline ArgumentsAdaptorFrame::ArgumentsAdaptorFrame(
252252
inline BuiltinFrame::BuiltinFrame(StackFrameIteratorBase* iterator)
253253
: JavaScriptFrame(iterator) {}
254254

255-
inline WasmFrame::WasmFrame(StackFrameIteratorBase* iterator)
255+
inline WasmCompiledFrame::WasmCompiledFrame(StackFrameIteratorBase* iterator)
256+
: StandardFrame(iterator) {}
257+
258+
inline WasmInterpreterEntryFrame::WasmInterpreterEntryFrame(
259+
StackFrameIteratorBase* iterator)
256260
: StandardFrame(iterator) {}
257261

258262
inline WasmToJsFrame::WasmToJsFrame(StackFrameIteratorBase* iterator)
@@ -311,13 +315,11 @@ bool StackTraceFrameIterator::is_javascript() const {
311315
bool StackTraceFrameIterator::is_wasm() const { return frame()->is_wasm(); }
312316

313317
JavaScriptFrame* StackTraceFrameIterator::javascript_frame() const {
314-
DCHECK(is_javascript());
315-
return static_cast<JavaScriptFrame*>(frame());
318+
return JavaScriptFrame::cast(frame());
316319
}
317320

318-
WasmFrame* StackTraceFrameIterator::wasm_frame() const {
319-
DCHECK(is_wasm());
320-
return static_cast<WasmFrame*>(frame());
321+
WasmCompiledFrame* StackTraceFrameIterator::wasm_compiled_frame() const {
322+
return WasmCompiledFrame::cast(frame());
321323
}
322324

323325
inline StackFrame* SafeStackFrameIterator::frame() const {

src/frames.cc

Lines changed: 80 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -468,11 +468,13 @@ StackFrame::Type StackFrame::ComputeType(const StackFrameIteratorBase* iterator,
468468
case Code::OPTIMIZED_FUNCTION:
469469
return OPTIMIZED;
470470
case Code::WASM_FUNCTION:
471-
return WASM;
471+
return WASM_COMPILED;
472472
case Code::WASM_TO_JS_FUNCTION:
473473
return WASM_TO_JS;
474474
case Code::JS_TO_WASM_FUNCTION:
475475
return JS_TO_WASM;
476+
case Code::WASM_INTERPRETER_ENTRY:
477+
return WASM_INTERPRETER_ENTRY;
476478
default:
477479
// All other types should have an explicit marker
478480
break;
@@ -496,7 +498,7 @@ StackFrame::Type StackFrame::ComputeType(const StackFrameIteratorBase* iterator,
496498
case CONSTRUCT:
497499
case ARGUMENTS_ADAPTOR:
498500
case WASM_TO_JS:
499-
case WASM:
501+
case WASM_COMPILED:
500502
return candidate;
501503
case JS_TO_WASM:
502504
case JAVA_SCRIPT:
@@ -760,6 +762,12 @@ void StandardFrame::SetCallerFp(Address caller_fp) {
760762

761763
bool StandardFrame::IsConstructor() const { return false; }
762764

765+
void StandardFrame::Summarize(List<FrameSummary>* functions,
766+
FrameSummary::Mode mode) const {
767+
// This should only be called on frames which override this method.
768+
UNREACHABLE();
769+
}
770+
763771
void StandardFrame::IterateCompiledFrame(ObjectVisitor* v) const {
764772
// Make sure that we're not doing "safe" stack frame iteration. We cannot
765773
// possibly find pointers in optimized frames in that state.
@@ -791,7 +799,8 @@ void StandardFrame::IterateCompiledFrame(ObjectVisitor* v) const {
791799
case CONSTRUCT:
792800
case JS_TO_WASM:
793801
case WASM_TO_JS:
794-
case WASM:
802+
case WASM_COMPILED:
803+
case WASM_INTERPRETER_ENTRY:
795804
frame_header_size = TypedFrameConstants::kFixedFrameSizeFromFp;
796805
break;
797806
case JAVA_SCRIPT:
@@ -973,17 +982,17 @@ JSFunction* JavaScriptFrame::function() const {
973982

974983
Object* JavaScriptFrame::receiver() const { return GetParameter(-1); }
975984

976-
Script* JavaScriptFrame::script() const {
977-
return Script::cast(function()->shared()->script());
978-
}
979-
980985
Object* JavaScriptFrame::context() const {
981986
const int offset = StandardFrameConstants::kContextOffset;
982987
Object* maybe_result = Memory::Object_at(fp() + offset);
983988
DCHECK(!maybe_result->IsSmi());
984989
return maybe_result;
985990
}
986991

992+
Script* JavaScriptFrame::script() const {
993+
return Script::cast(function()->shared()->script());
994+
}
995+
987996
int JavaScriptFrame::LookupExceptionHandlerInTable(
988997
int* stack_depth, HandlerTable::CatchPrediction* prediction) {
989998
DCHECK_EQ(0, LookupCode()->handler_table()->length());
@@ -1134,7 +1143,7 @@ FrameSummary::FrameSummary(Object* receiver, JSFunction* function,
11341143
mode == kApproximateSummary);
11351144
}
11361145

1137-
FrameSummary FrameSummary::GetFirst(JavaScriptFrame* frame) {
1146+
FrameSummary FrameSummary::GetFirst(StandardFrame* frame) {
11381147
List<FrameSummary> frames(FLAG_max_inlining_levels + 1);
11391148
frame->Summarize(&frames);
11401149
return frames.first();
@@ -1522,8 +1531,8 @@ void StackFrame::PrintIndex(StringStream* accumulator,
15221531
accumulator->Add((mode == OVERVIEW) ? "%5d: " : "[%d]: ", index);
15231532
}
15241533

1525-
void WasmFrame::Print(StringStream* accumulator, PrintMode mode,
1526-
int index) const {
1534+
void WasmCompiledFrame::Print(StringStream* accumulator, PrintMode mode,
1535+
int index) const {
15271536
PrintIndex(accumulator, mode, index);
15281537
accumulator->Add("WASM [");
15291538
Script* script = this->script();
@@ -1543,35 +1552,36 @@ void WasmFrame::Print(StringStream* accumulator, PrintMode mode,
15431552
if (mode != OVERVIEW) accumulator->Add("\n");
15441553
}
15451554

1546-
Code* WasmFrame::unchecked_code() const {
1547-
return static_cast<Code*>(isolate()->FindCodeObject(pc()));
1555+
Code* WasmCompiledFrame::unchecked_code() const {
1556+
return isolate()->FindCodeObject(pc());
15481557
}
15491558

1550-
void WasmFrame::Iterate(ObjectVisitor* v) const { IterateCompiledFrame(v); }
1559+
void WasmCompiledFrame::Iterate(ObjectVisitor* v) const {
1560+
IterateCompiledFrame(v);
1561+
}
15511562

1552-
Address WasmFrame::GetCallerStackPointer() const {
1563+
Address WasmCompiledFrame::GetCallerStackPointer() const {
15531564
return fp() + ExitFrameConstants::kCallerSPOffset;
15541565
}
15551566

1556-
WasmInstanceObject* WasmFrame::wasm_instance() const {
1567+
WasmInstanceObject* WasmCompiledFrame::wasm_instance() const {
15571568
WasmInstanceObject* obj = wasm::GetOwningWasmInstance(LookupCode());
15581569
// This is a live stack frame; it must have a live instance.
15591570
DCHECK_NOT_NULL(obj);
15601571
return obj;
15611572
}
15621573

1563-
uint32_t WasmFrame::function_index() const {
1574+
uint32_t WasmCompiledFrame::function_index() const {
15641575
FixedArray* deopt_data = LookupCode()->deoptimization_data();
15651576
DCHECK(deopt_data->length() == 2);
15661577
return Smi::cast(deopt_data->get(1))->value();
15671578
}
15681579

1569-
Script* WasmFrame::script() const {
1570-
Handle<JSObject> instance(JSObject::cast(wasm_instance()), isolate());
1571-
return *wasm::GetScript(instance);
1580+
Script* WasmCompiledFrame::script() const {
1581+
return wasm_instance()->compiled_module()->script();
15721582
}
15731583

1574-
int WasmFrame::position() const {
1584+
int WasmCompiledFrame::position() const {
15751585
int position = StandardFrame::position();
15761586
if (wasm_instance()->compiled_module()->is_asm_js()) {
15771587
Handle<WasmCompiledModule> compiled_module(
@@ -1585,7 +1595,12 @@ int WasmFrame::position() const {
15851595
return position;
15861596
}
15871597

1588-
bool WasmFrame::at_to_number_conversion() const {
1598+
void WasmCompiledFrame::Summarize(List<FrameSummary>* functions,
1599+
FrameSummary::Mode mode) const {
1600+
// TODO(clemensh): Implement.
1601+
}
1602+
1603+
bool WasmCompiledFrame::at_to_number_conversion() const {
15891604
// Check whether our callee is a WASM_TO_JS frame, and this frame is at the
15901605
// ToNumber conversion call.
15911606
Address callee_pc = reinterpret_cast<Address>(this->callee_pc());
@@ -1598,7 +1613,7 @@ bool WasmFrame::at_to_number_conversion() const {
15981613
return !!pos;
15991614
}
16001615

1601-
int WasmFrame::LookupExceptionHandlerInTable(int* stack_slots) {
1616+
int WasmCompiledFrame::LookupExceptionHandlerInTable(int* stack_slots) {
16021617
DCHECK_NOT_NULL(stack_slots);
16031618
Code* code = LookupCode();
16041619
HandlerTable* table = HandlerTable::cast(code->handler_table());
@@ -1607,6 +1622,49 @@ int WasmFrame::LookupExceptionHandlerInTable(int* stack_slots) {
16071622
return table->LookupReturn(pc_offset);
16081623
}
16091624

1625+
void WasmInterpreterEntryFrame::Iterate(ObjectVisitor* v) const {
1626+
IterateCompiledFrame(v);
1627+
}
1628+
1629+
void WasmInterpreterEntryFrame::Print(StringStream* accumulator, PrintMode mode,
1630+
int index) const {
1631+
PrintIndex(accumulator, mode, index);
1632+
accumulator->Add("WASM TO INTERPRETER [");
1633+
Script* script = this->script();
1634+
accumulator->PrintName(script->name());
1635+
accumulator->Add("]");
1636+
if (mode != OVERVIEW) accumulator->Add("\n");
1637+
}
1638+
1639+
void WasmInterpreterEntryFrame::Summarize(List<FrameSummary>* functions,
1640+
FrameSummary::Mode mode) const {
1641+
// TODO(clemensh): Implement this.
1642+
}
1643+
1644+
Code* WasmInterpreterEntryFrame::unchecked_code() const {
1645+
return isolate()->FindCodeObject(pc());
1646+
}
1647+
1648+
WasmInstanceObject* WasmInterpreterEntryFrame::wasm_instance() const {
1649+
WasmInstanceObject* ret = wasm::GetOwningWasmInstance(LookupCode());
1650+
// This is a live stack frame, there must be a live wasm instance available.
1651+
DCHECK_NOT_NULL(ret);
1652+
return ret;
1653+
}
1654+
1655+
Script* WasmInterpreterEntryFrame::script() const {
1656+
return wasm_instance()->compiled_module()->script();
1657+
}
1658+
1659+
int WasmInterpreterEntryFrame::position() const {
1660+
// TODO(clemensh): Implement this.
1661+
return 0;
1662+
}
1663+
1664+
Address WasmInterpreterEntryFrame::GetCallerStackPointer() const {
1665+
return fp() + ExitFrameConstants::kCallerSPOffset;
1666+
}
1667+
16101668
namespace {
16111669

16121670

0 commit comments

Comments
 (0)