Commit 66ce6153 authored by Ben L. Titzer's avatar Ben L. Titzer Committed by Commit Bot

[wasm] Reduce usage of frame->wasm_instance()

As part of the effort to despecialize WASM code, convert many uses of
WasmInstanceObject which were simply indirecting through to either
the compiled module or the shared module data with helpers on
the respective Frame objects.

R=mstarzinger@chromium.org

Bug: 
Change-Id: I05bd1a18b1d81cceef8a80d9f6988e4f5d537e66
Reviewed-on: https://chromium-review.googlesource.com/876125
Commit-Queue: Ben Titzer <titzer@chromium.org>
Reviewed-by: 's avatarMichael Starzinger <mstarzinger@chromium.org>
Cr-Commit-Position: refs/heads/master@{#50798}
parent ecb3afca
......@@ -43,8 +43,9 @@ FrameInspector::FrameInspector(StandardFrame* frame, int inlined_frame_index,
js_frame, inlined_frame_index, isolate));
} else if (frame_->is_wasm_interpreter_entry()) {
wasm_interpreted_frame_ =
summary.AsWasm().wasm_instance()->debug_info()->GetInterpretedFrame(
frame_->fp(), inlined_frame_index);
WasmInterpreterEntryFrame::cast(frame_)
->debug_info()
->GetInterpretedFrame(frame_->fp(), inlined_frame_index);
DCHECK(wasm_interpreted_frame_);
}
}
......
......@@ -176,8 +176,7 @@ v8::debug::ScopeIterator::ScopeType DebugWasmScopeIterator::GetType() {
v8::Local<v8::Object> DebugWasmScopeIterator::GetObject() {
DCHECK(!Done());
Handle<WasmDebugInfo> debug_info(
WasmInterpreterEntryFrame::cast(frame_)->wasm_instance()->debug_info(),
isolate_);
WasmInterpreterEntryFrame::cast(frame_)->debug_info(), isolate_);
switch (type_) {
case debug::ScopeIterator::ScopeTypeGlobal:
return Utils::ToLocal(WasmDebugInfo::GetGlobalScopeObject(
......
......@@ -929,7 +929,7 @@ void Debug::PrepareStep(StepAction step_action) {
if (frame->is_wasm_compiled()) return;
WasmInterpreterEntryFrame* wasm_frame =
WasmInterpreterEntryFrame::cast(frame);
wasm_frame->wasm_instance()->debug_info()->PrepareStep(step_action);
wasm_frame->debug_info()->PrepareStep(step_action);
return;
}
......
......@@ -189,6 +189,20 @@ DISABLE_ASAN Address ReadMemoryAt(Address address) {
return Memory::Address_at(address);
}
WasmInstanceObject* LookupWasmInstanceObjectFromStandardFrame(
const StandardFrame* frame) {
// TODO(titzer): WASM instances cannot be found from the code in the future.
WasmInstanceObject* ret =
FLAG_wasm_jit_to_native
? WasmInstanceObject::GetOwningInstance(
frame->isolate()->wasm_engine()->code_manager()->LookupCode(
frame->pc()))
: WasmInstanceObject::GetOwningInstanceGC(frame->LookupCode());
// This is a live stack frame, there must be a live wasm instance available.
DCHECK_NOT_NULL(ret);
return ret;
}
} // namespace
SafeStackFrameIterator::SafeStackFrameIterator(
......@@ -1711,9 +1725,8 @@ void WasmCompiledFrame::Print(StringStream* accumulator, PrintMode mode,
.start()
: LookupCode()->instruction_start();
int pc = static_cast<int>(this->pc() - instruction_start);
WasmSharedModuleData* shared = wasm_instance()->compiled_module()->shared();
Vector<const uint8_t> raw_func_name =
shared->GetRawFunctionName(this->function_index());
shared()->GetRawFunctionName(this->function_index());
const int kMaxPrintedFunctionName = 64;
char func_name[kMaxPrintedFunctionName + 1];
int func_name_len = std::min(kMaxPrintedFunctionName, raw_func_name.length());
......@@ -1744,23 +1757,24 @@ WasmCodeWrapper WasmCompiledFrame::wasm_code() const {
}
WasmInstanceObject* WasmCompiledFrame::wasm_instance() const {
WasmInstanceObject* obj =
FLAG_wasm_jit_to_native
? WasmInstanceObject::GetOwningInstance(
isolate()->wasm_engine()->code_manager()->LookupCode(pc()))
: WasmInstanceObject::GetOwningInstanceGC(LookupCode());
// This is a live stack frame; it must have a live instance.
DCHECK_NOT_NULL(obj);
return obj;
return LookupWasmInstanceObjectFromStandardFrame(this);
}
WasmSharedModuleData* WasmCompiledFrame::shared() const {
return LookupWasmInstanceObjectFromStandardFrame(this)
->compiled_module()
->shared();
}
WasmCompiledModule* WasmCompiledFrame::compiled_module() const {
return LookupWasmInstanceObjectFromStandardFrame(this)->compiled_module();
}
uint32_t WasmCompiledFrame::function_index() const {
return FrameSummary::GetSingle(this).AsWasmCompiled().function_index();
}
Script* WasmCompiledFrame::script() const {
return wasm_instance()->compiled_module()->shared()->script();
}
Script* WasmCompiledFrame::script() const { return shared()->script(); }
int WasmCompiledFrame::position() const {
return FrameSummary::GetSingle(this).SourcePosition();
......@@ -1770,7 +1784,8 @@ void WasmCompiledFrame::Summarize(std::vector<FrameSummary>* functions) const {
DCHECK(functions->empty());
WasmCodeWrapper code = wasm_code();
int offset = static_cast<int>(pc() - code.instructions().start());
Handle<WasmInstanceObject> instance = code.wasm_instance();
Handle<WasmInstanceObject> instance(
LookupWasmInstanceObjectFromStandardFrame(this), isolate());
FrameSummary::WasmCompiledFrameSummary summary(
isolate(), instance, code, offset, at_to_number_conversion());
functions->push_back(summary);
......@@ -1841,7 +1856,8 @@ void WasmInterpreterEntryFrame::Print(StringStream* accumulator, PrintMode mode,
void WasmInterpreterEntryFrame::Summarize(
std::vector<FrameSummary>* functions) const {
Handle<WasmInstanceObject> instance(wasm_instance(), isolate());
Handle<WasmInstanceObject> instance(
LookupWasmInstanceObjectFromStandardFrame(this), isolate());
std::vector<std::pair<uint32_t, int>> interpreted_stack =
instance->debug_info()->GetInterpretedStack(fp());
......@@ -1860,27 +1876,33 @@ Code* WasmInterpreterEntryFrame::unchecked_code() const {
}
}
// TODO(titzer): deprecate this method.
WasmInstanceObject* WasmInterpreterEntryFrame::wasm_instance() const {
WasmInstanceObject* ret =
FLAG_wasm_jit_to_native
? WasmInstanceObject::GetOwningInstance(
isolate()->wasm_engine()->code_manager()->LookupCode(pc()))
: WasmInstanceObject::GetOwningInstanceGC(LookupCode());
// This is a live stack frame, there must be a live wasm instance available.
DCHECK_NOT_NULL(ret);
return ret;
return LookupWasmInstanceObjectFromStandardFrame(this);
}
WasmDebugInfo* WasmInterpreterEntryFrame::debug_info() const {
return LookupWasmInstanceObjectFromStandardFrame(this)->debug_info();
}
Script* WasmInterpreterEntryFrame::script() const {
return wasm_instance()->compiled_module()->shared()->script();
WasmSharedModuleData* WasmInterpreterEntryFrame::shared() const {
return LookupWasmInstanceObjectFromStandardFrame(this)
->compiled_module()
->shared();
}
WasmCompiledModule* WasmInterpreterEntryFrame::compiled_module() const {
return LookupWasmInstanceObjectFromStandardFrame(this)->compiled_module();
}
Script* WasmInterpreterEntryFrame::script() const { return shared()->script(); }
int WasmInterpreterEntryFrame::position() const {
return FrameSummary::GetBottom(this).AsWasmInterpreted().SourcePosition();
}
Object* WasmInterpreterEntryFrame::context() const {
return wasm_instance()->compiled_module()->native_context();
return compiled_module()->native_context();
}
Address WasmInterpreterEntryFrame::GetCallerStackPointer() const {
......
......@@ -30,6 +30,9 @@ class RootVisitor;
class StackFrameIteratorBase;
class ThreadLocalTop;
class WasmInstanceObject;
class WasmSharedModuleData;
class WasmDebugInfo;
class WasmCompiledModule;
class InnerPointerToCodeCache {
public:
......@@ -973,7 +976,7 @@ class WasmCompiledFrame final : public StandardFrame {
Code* unchecked_code() const override;
// Accessors.
WasmInstanceObject* wasm_instance() const;
WasmInstanceObject* wasm_instance() const; // TODO(titzer): deprecate.
WasmCodeWrapper wasm_code() const;
uint32_t function_index() const;
Script* script() const override;
......@@ -994,6 +997,8 @@ class WasmCompiledFrame final : public StandardFrame {
private:
friend class StackFrameIteratorBase;
WasmCompiledModule* compiled_module() const;
WasmSharedModuleData* shared() const;
};
class WasmInterpreterEntryFrame final : public StandardFrame {
......@@ -1013,7 +1018,9 @@ class WasmInterpreterEntryFrame final : public StandardFrame {
Code* unchecked_code() const override;
// Accessors.
WasmInstanceObject* wasm_instance() const;
WasmDebugInfo* debug_info() const;
WasmInstanceObject* wasm_instance() const; // TODO(titzer): deprecate.
Script* script() const override;
int position() const override;
Object* context() const override;
......@@ -1030,6 +1037,8 @@ class WasmInterpreterEntryFrame final : public StandardFrame {
private:
friend class StackFrameIteratorBase;
WasmCompiledModule* compiled_module() const;
WasmSharedModuleData* shared() const;
};
class WasmToJsFrame : public StubFrame {
......
......@@ -1425,7 +1425,7 @@ Object* Isolate::UnwindAndFindHandler() {
WasmInterpreterEntryFrame* interpreter_frame =
WasmInterpreterEntryFrame::cast(frame);
// TODO(wasm): Implement try-catch in the interpreter.
interpreter_frame->wasm_instance()->debug_info()->Unwind(frame->fp());
interpreter_frame->debug_info()->Unwind(frame->fp());
} break;
default:
......
......@@ -856,8 +856,7 @@ RUNTIME_FUNCTION(Runtime_GetAllScopesDetails) {
// local).
if (frame->is_wasm_interpreter_entry()) {
Handle<WasmDebugInfo> debug_info(
WasmInterpreterEntryFrame::cast(frame)->wasm_instance()->debug_info(),
isolate);
WasmInterpreterEntryFrame::cast(frame)->debug_info(), isolate);
return *WasmDebugInfo::GetScopeDetails(debug_info, frame->fp(),
inlined_frame_index);
}
......
......@@ -59,11 +59,5 @@ Vector<uint8_t> WasmCodeWrapper::instructions() const {
static_cast<size_t>(code->instruction_size())};
}
Handle<WasmInstanceObject> WasmCodeWrapper::wasm_instance() const {
return IsCodeObject()
? handle(WasmInstanceObject::GetOwningInstanceGC(*GetCode()))
: handle(WasmInstanceObject::GetOwningInstance(GetWasmCode()));
}
} // namespace internal
} // namespace v8
......@@ -30,8 +30,6 @@ class WasmCodeWrapper {
Vector<uint8_t> instructions() const;
Handle<WasmInstanceObject> wasm_instance() const;
#ifdef ENABLE_DISASSEMBLER
void Disassemble(const char* name, Isolate* isolate, std::ostream& os) const;
#endif
......
......@@ -438,7 +438,6 @@ class InterpreterHandle {
Handle<JSObject> GetLocalScopeObject(wasm::InterpretedFrame* frame,
Handle<WasmDebugInfo> debug_info) {
Isolate* isolate = debug_info->GetIsolate();
Handle<WasmInstanceObject> instance(debug_info->wasm_instance(), isolate);
Handle<JSObject> local_scope_object =
isolate_->factory()->NewJSObjectWithNullProto();
......@@ -497,8 +496,6 @@ class InterpreterHandle {
Handle<JSArray> GetScopeDetails(Address frame_pointer, int frame_index,
Handle<WasmDebugInfo> debug_info) {
auto frame = GetInterpretedFrame(frame_pointer, frame_index);
Isolate* isolate = debug_info->GetIsolate();
Handle<WasmInstanceObject> instance(debug_info->wasm_instance(), isolate);
Handle<FixedArray> global_scope =
isolate_->factory()->NewFixedArray(ScopeIterator::kScopeDetailsSize);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment