Commit c8166827 authored by Clemens Backes's avatar Clemens Backes Committed by Commit Bot

[wasm][profiler] Report source URL and position

So far we reported the script ID, but DevTools ignores that and uses the
source url instead. That url was just set to "wasm ", which the frontend
couldn't make any sense of.
This CL fixes this by passing the source URL to the code create event,
and also setting the position of the code inside the script (i.e.
wasm module).

R=thibaudm@chromium.org, petermarshall@chromium.org

Bug: chromium:1125986
Change-Id: Ic41dcd2768c60fd6748468d3a89fc4ffccb35932
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2581543
Commit-Queue: Clemens Backes <clemensb@chromium.org>
Reviewed-by: 's avatarThibaud Michaud <thibaudm@chromium.org>
Reviewed-by: 's avatarPeter Marshall <petermarshall@chromium.org>
Cr-Commit-Position: refs/heads/master@{#71695}
parent 543e3194
......@@ -84,7 +84,8 @@ class CodeEventListener {
Handle<Name> script_name, int line,
int column) = 0;
virtual void CodeCreateEvent(LogEventsAndTags tag, const wasm::WasmCode* code,
wasm::WasmName name, int script_id) = 0;
wasm::WasmName name, const char* source_url,
int code_offset, int script_id) = 0;
virtual void CallbackEvent(Handle<Name> name, Address entry_point) = 0;
virtual void GetterCallbackEvent(Handle<Name> name, Address entry_point) = 0;
......@@ -170,9 +171,11 @@ class CodeEventDispatcher : public CodeEventListener {
});
}
void CodeCreateEvent(LogEventsAndTags tag, const wasm::WasmCode* code,
wasm::WasmName name, int script_id) override {
wasm::WasmName name, const char* source_url,
int code_offset, int script_id) override {
DispatchEventToListeners([=](CodeEventListener* listener) {
listener->CodeCreateEvent(tag, code, name, script_id);
listener->CodeCreateEvent(tag, code, name, source_url, code_offset,
script_id);
});
}
void CallbackEvent(Handle<Name> name, Address entry_point) override {
......
......@@ -240,7 +240,8 @@ void CodeEventLogger::CodeCreateEvent(LogEventsAndTags tag,
void CodeEventLogger::CodeCreateEvent(LogEventsAndTags tag,
const wasm::WasmCode* code,
wasm::WasmName name,
int /* script_id */) {
const char* source_url,
int /*code_offset*/, int /*script_id*/) {
name_buffer_->Init(tag);
DCHECK(!name.empty());
name_buffer_->AppendBytes(name.begin(), name.length());
......@@ -464,10 +465,9 @@ void ExternalCodeEventListener::CodeCreateEvent(
code_event_handler_->Handle(reinterpret_cast<v8::CodeEvent*>(&code_event));
}
void ExternalCodeEventListener::CodeCreateEvent(LogEventsAndTags tag,
const wasm::WasmCode* code,
wasm::WasmName name,
int script_id) {
void ExternalCodeEventListener::CodeCreateEvent(
LogEventsAndTags tag, const wasm::WasmCode* code, wasm::WasmName name,
const char* source_url, int code_offset, int script_id) {
// TODO(mmarchini): handle later
}
......@@ -1362,7 +1362,8 @@ void Logger::CodeCreateEvent(LogEventsAndTags tag, Handle<AbstractCode> code,
}
void Logger::CodeCreateEvent(LogEventsAndTags tag, const wasm::WasmCode* code,
wasm::WasmName name, int /* script_id */) {
wasm::WasmName name, const char* /*source_url*/,
int /*code_offset*/, int /*script_id*/) {
if (!is_listening_to_code_events()) return;
if (!FLAG_log_code) return;
MSG_BUILDER();
......@@ -2194,8 +2195,8 @@ void ExistingCodeLogger::LogCompiledFunctions() {
const std::vector<Handle<WasmModuleObject>> wasm_module_objects =
EnumerateWasmModuleObjects(heap);
for (auto& module_object : wasm_module_objects) {
int script_id = module_object->script().id();
module_object->native_module()->LogWasmCodes(isolate_, script_id);
module_object->native_module()->LogWasmCodes(isolate_,
module_object->script());
}
}
......
......@@ -201,7 +201,8 @@ class Logger : public CodeEventListener {
Handle<SharedFunctionInfo> shared,
Handle<Name> script_name, int line, int column) override;
void CodeCreateEvent(LogEventsAndTags tag, const wasm::WasmCode* code,
wasm::WasmName name, int script_id) override;
wasm::WasmName name, const char* source_url,
int code_offset, int script_id) override;
void CallbackEvent(Handle<Name> name, Address entry_point) override;
void GetterCallbackEvent(Handle<Name> name, Address entry_point) override;
......@@ -403,7 +404,8 @@ class V8_EXPORT_PRIVATE CodeEventLogger : public CodeEventListener {
Handle<SharedFunctionInfo> shared,
Handle<Name> script_name, int line, int column) override;
void CodeCreateEvent(LogEventsAndTags tag, const wasm::WasmCode* code,
wasm::WasmName name, int script_id) override;
wasm::WasmName name, const char* source_url,
int code_offset, int script_id) override;
void RegExpCodeCreateEvent(Handle<AbstractCode> code,
Handle<String> source) override;
......@@ -462,7 +464,8 @@ class ExternalCodeEventListener : public CodeEventListener {
Handle<SharedFunctionInfo> shared, Handle<Name> source,
int line, int column) override;
void CodeCreateEvent(LogEventsAndTags tag, const wasm::WasmCode* code,
wasm::WasmName name, int script_id) override;
wasm::WasmName name, const char* source_url,
int code_offset, int script_id) override;
void RegExpCodeCreateEvent(Handle<AbstractCode> code,
Handle<String> source) override;
......
......@@ -71,7 +71,6 @@ void SourcePositionTable::print() const {
}
}
const char* const CodeEntry::kWasmResourceNamePrefix = "wasm ";
const char* const CodeEntry::kEmptyResourceName = "";
const char* const CodeEntry::kEmptyBailoutReason = "";
const char* const CodeEntry::kNoDeoptReason = "";
......
......@@ -141,7 +141,6 @@ class CodeEntry {
return TagField::decode(bit_field_);
}
static const char* const kWasmResourceNamePrefix;
V8_EXPORT_PRIVATE static const char* const kEmptyResourceName;
static const char* const kEmptyBailoutReason;
static const char* const kNoDeoptReason;
......
......@@ -193,15 +193,17 @@ void ProfilerListener::CodeCreateEvent(LogEventsAndTags tag,
void ProfilerListener::CodeCreateEvent(LogEventsAndTags tag,
const wasm::WasmCode* code,
wasm::WasmName name, int script_id) {
wasm::WasmName name,
const char* source_url, int code_offset,
int script_id) {
DCHECK_NOT_NULL(source_url);
CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION);
CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_;
rec->instruction_start = code->instruction_start();
rec->entry =
new CodeEntry(tag, GetName(name), CodeEntry::kWasmResourceNamePrefix,
CpuProfileNode::kNoLineNumberInfo,
CpuProfileNode::kNoColumnNumberInfo, nullptr, true);
rec->entry = new CodeEntry(tag, GetName(name), GetName(source_url), 1,
code_offset + 1, nullptr, true);
rec->entry->set_script_id(script_id);
rec->entry->set_position(code_offset);
rec->instruction_size = code->instructions().length();
DispatchCodeEvent(evt_rec);
}
......
......@@ -43,7 +43,8 @@ class V8_EXPORT_PRIVATE ProfilerListener : public CodeEventListener {
Handle<SharedFunctionInfo> shared,
Handle<Name> script_name, int line, int column) override;
void CodeCreateEvent(LogEventsAndTags tag, const wasm::WasmCode* code,
wasm::WasmName name, int script_id) override;
wasm::WasmName name, const char* source_url,
int code_offset, int script_id) override;
void CallbackEvent(Handle<Name> name, Address entry_point) override;
void GetterCallbackEvent(Handle<Name> name, Address entry_point) override;
......
......@@ -1623,7 +1623,8 @@ RUNTIME_FUNCTION(Runtime_EnableCodeLoggingForTesting) {
Handle<Name> script_name, int line, int column) final {
}
void CodeCreateEvent(LogEventsAndTags tag, const wasm::WasmCode* code,
wasm::WasmName name, int script_id) final {}
wasm::WasmName name, const char* source_url,
int code_offset, int script_id) final {}
void CallbackEvent(Handle<Name> name, Address entry_point) final {}
void GetterCallbackEvent(Handle<Name> name, Address entry_point) final {}
......
......@@ -1140,7 +1140,13 @@ bool CompileLazy(Isolate* isolate, Handle<WasmModuleObject> module_object,
DCHECK_EQ(func_index, code->index());
if (WasmCode::ShouldBeLogged(isolate)) {
code->LogCode(isolate, module_object->script().id());
DisallowGarbageCollection no_gc;
Object source_url_obj = module_object->script().source_url();
DCHECK(source_url_obj.IsString() || source_url_obj.IsUndefined());
std::unique_ptr<char[]> source_url =
source_url_obj.IsString() ? String::cast(source_url_obj).ToCString()
: nullptr;
code->LogCode(isolate, source_url.get(), module_object->script().id());
}
counters->wasm_lazily_compiled_functions()->Increment();
......@@ -1942,7 +1948,7 @@ void AsyncCompileJob::FinishCompile(bool is_after_cache_hit) {
// Finally, log all generated code (it does not matter if this happens
// repeatedly in case the script is shared).
native_module_->LogWasmCodes(isolate_, script->id());
native_module_->LogWasmCodes(isolate_, module_object_->script());
FinishModule();
}
......
......@@ -217,21 +217,20 @@ bool WasmCode::ShouldBeLogged(Isolate* isolate) {
isolate->is_profiling();
}
void WasmCode::LogCode(Isolate* isolate, int script_id) const {
void WasmCode::LogCode(Isolate* isolate, const char* source_url,
int script_id) const {
DCHECK(ShouldBeLogged(isolate));
if (IsAnonymous()) return;
ModuleWireBytes wire_bytes(native_module()->wire_bytes());
WireBytesRef name_ref =
native_module()->module()->lazily_generated_names.LookupFunctionName(
wire_bytes, index(),
VectorOf(native_module()->module()->export_table));
ModuleWireBytes wire_bytes(native_module_->wire_bytes());
const WasmModule* module = native_module_->module();
WireBytesRef name_ref = module->lazily_generated_names.LookupFunctionName(
wire_bytes, index(), VectorOf(module->export_table));
WasmName name = wire_bytes.GetNameOrNull(name_ref);
const WasmDebugSymbols& debug_symbols =
native_module()->module()->debug_symbols;
const WasmDebugSymbols& debug_symbols = module->debug_symbols;
auto load_wasm_source_map = isolate->wasm_load_source_map_callback();
auto source_map = native_module()->GetWasmSourceMap();
auto source_map = native_module_->GetWasmSourceMap();
if (!source_map && debug_symbols.type == WasmDebugSymbols::Type::SourceMap &&
!debug_symbols.external_url.is_empty() && load_wasm_source_map) {
WasmName external_url =
......@@ -241,7 +240,7 @@ void WasmCode::LogCode(Isolate* isolate, int script_id) const {
v8::Isolate* v8_isolate = reinterpret_cast<v8::Isolate*>(isolate);
Local<v8::String> source_map_str =
load_wasm_source_map(v8_isolate, external_url_string.c_str());
native_module()->SetWasmSourceMap(
native_module_->SetWasmSourceMap(
std::make_unique<WasmModuleSourceMap>(v8_isolate, source_map_str));
}
......@@ -251,7 +250,7 @@ void WasmCode::LogCode(Isolate* isolate, int script_id) const {
size_t prefix_len = name_buffer.size();
constexpr size_t kMaxSigLength = 128;
name_buffer.resize(prefix_len + kMaxSigLength);
const FunctionSig* sig = native_module()->module()->functions[index_].sig;
const FunctionSig* sig = module->functions[index_].sig;
size_t sig_length =
PrintSignature(VectorOf(&name_buffer[prefix_len], kMaxSigLength), sig);
name_buffer.resize(prefix_len + sig_length);
......@@ -268,8 +267,9 @@ void WasmCode::LogCode(Isolate* isolate, int script_id) const {
"wasm-function[%d]", index()));
name = VectorOf(name_buffer);
}
int code_offset = module->functions[index_].code.offset();
PROFILE(isolate, CodeCreateEvent(CodeEventListener::FUNCTION_TAG, this, name,
script_id));
source_url, code_offset, script_id));
if (!source_positions().empty()) {
LOG_CODE_EVENT(isolate, CodeLinePosInfoRecordEvent(instruction_start(),
......@@ -856,18 +856,25 @@ void NativeModule::ReserveCodeTableForTesting(uint32_t max_functions) {
code_space_data_[0].jump_table = main_jump_table_;
}
void NativeModule::LogWasmCodes(Isolate* isolate, int script_id) {
void NativeModule::LogWasmCodes(Isolate* isolate, Script script) {
DisallowGarbageCollection no_gc;
if (!WasmCode::ShouldBeLogged(isolate)) return;
TRACE_EVENT1("v8.wasm", "wasm.LogWasmCodes", "functions",
module_->num_declared_functions);
Object source_url_obj = script.source_url();
DCHECK(source_url_obj.IsString() || source_url_obj.IsUndefined());
std::unique_ptr<char[]> source_url =
source_url_obj.IsString() ? String::cast(source_url_obj).ToCString()
: nullptr;
// Log all owned code, not just the current entries in the code table. This
// will also include import wrappers.
WasmCodeRefScope code_ref_scope;
base::MutexGuard lock(&allocation_mutex_);
for (auto& owned_entry : owned_code_) {
owned_entry.second->LogCode(isolate, script_id);
owned_entry.second->LogCode(isolate, source_url.get(), script.id());
}
}
......
......@@ -199,7 +199,7 @@ class V8_EXPORT_PRIVATE WasmCode final {
Address current_pc = kNullAddress) const;
static bool ShouldBeLogged(Isolate* isolate);
void LogCode(Isolate* isolate, int script_id) const;
void LogCode(Isolate* isolate, const char* source_url, int script_id) const;
WasmCode(const WasmCode&) = delete;
WasmCode& operator=(const WasmCode&) = delete;
......@@ -571,7 +571,7 @@ class V8_EXPORT_PRIVATE NativeModule final {
// on the fly, and bypass the instance builder pipeline.
void ReserveCodeTableForTesting(uint32_t max_functions);
void LogWasmCodes(Isolate* isolate, int script_id);
void LogWasmCodes(Isolate*, Script);
CompilationState* compilation_state() { return compilation_state_.get(); }
......
......@@ -130,6 +130,14 @@ class WasmGCForegroundTask : public CancelableTask {
class WeakScriptHandle {
public:
explicit WeakScriptHandle(Handle<Script> script) : script_id_(script->id()) {
DCHECK(script->source_url().IsString() ||
script->source_url().IsUndefined());
if (script->source_url().IsString()) {
std::unique_ptr<char[]> source_url =
String::cast(script->source_url()).ToCString();
// Convert from {unique_ptr} to {shared_ptr}.
source_url_ = {source_url.release(), source_url.get_deleter()};
}
auto global_handle =
script->GetIsolate()->global_handles()->Create(*script);
location_ = std::make_unique<Address*>(global_handle.location());
......@@ -150,6 +158,8 @@ class WeakScriptHandle {
int script_id() const { return script_id_; }
const std::shared_ptr<const char>& source_url() const { return source_url_; }
private:
// Store the location in a unique_ptr so that its address stays the same even
// when this object is moved/copied.
......@@ -158,6 +168,13 @@ class WeakScriptHandle {
// Store the script ID independent of the weak handle, such that it's always
// available.
int script_id_;
// Similar for the source URL. We cannot dereference the Handle from arbitrary
// threads, but we need the URL available for code logging.
// The shared pointer is kept alive by unlogged code, even if this entry is
// collected in the meantime.
// TODO(chromium:1132260): Revisit this for huge URLs.
std::shared_ptr<const char> source_url_;
};
} // namespace
......@@ -357,9 +374,13 @@ struct WasmEngine::IsolateInfo {
// The currently scheduled LogCodesTask.
LogCodesTask* log_codes_task = nullptr;
// The vector of code objects and associated script IDs that still need to be
// logged in this isolate.
std::vector<std::pair<std::vector<WasmCode*>, int>> code_to_log;
// Maps script ID to vector of code objects that still need to be logged, and
// the respective source URL.
struct CodeToLogPerScript {
std::vector<WasmCode*> code;
std::shared_ptr<const char> source_url;
};
std::unordered_map<int, CodeToLogPerScript> code_to_log;
// The foreground task runner of the isolate (can be called from background).
std::shared_ptr<v8::TaskRunner> foreground_task_runner;
......@@ -508,9 +529,11 @@ MaybeHandle<WasmModuleObject> WasmEngine::SyncCompile(
}
#endif
Handle<Script> script = GetOrCreateScript(isolate, native_module);
constexpr Vector<const char> kNoSourceUrl;
Handle<Script> script =
GetOrCreateScript(isolate, native_module, kNoSourceUrl);
native_module->LogWasmCodes(isolate, script->id());
native_module->LogWasmCodes(isolate, *script);
// Create the compiled module object and populate with compiled functions
// and information needed at instantiation time. This object needs to be
......@@ -708,7 +731,7 @@ std::shared_ptr<NativeModule> WasmEngine::ExportNativeModule(
namespace {
Handle<Script> CreateWasmScript(Isolate* isolate,
std::shared_ptr<NativeModule> native_module,
Vector<const char> source_url = {}) {
Vector<const char> source_url) {
Handle<Script> script =
isolate->factory()->NewScript(isolate->factory()->empty_string());
script->set_compilation_state(Script::COMPILATION_STATE_COMPILED);
......@@ -969,8 +992,8 @@ void WasmEngine::RemoveIsolate(Isolate* isolate) {
if (RemoveIsolateFromCurrentGC(isolate)) PotentiallyFinishCurrentGC();
}
if (auto* task = info->log_codes_task) task->Cancel();
for (auto& pair : info->code_to_log) {
WasmCode::DecrementRefCount(VectorOf(pair.first));
for (auto& log_entry : info->code_to_log) {
WasmCode::DecrementRefCount(VectorOf(log_entry.second.code));
}
}
......@@ -992,25 +1015,21 @@ void WasmEngine::LogCode(Vector<WasmCode*> code_vec) {
if (info->code_to_log.empty()) {
isolate->stack_guard()->RequestLogWasmCode();
}
auto script_it = info->scripts.find(native_module);
if (script_it == info->scripts.end()) {
// Script does not yet exist, logging will happen later.
continue;
}
int script_id = script_it->second.script_id();
if (!info->code_to_log.empty() &&
info->code_to_log.back().second == script_id) {
info->code_to_log.back().first.insert(
info->code_to_log.back().first.end(), code_vec.begin(),
code_vec.end());
} else {
info->code_to_log.emplace_back(
std::vector<WasmCode*>{code_vec.begin(), code_vec.end()}, script_id);
}
for (WasmCode* code : code_vec) {
DCHECK_EQ(native_module, code->native_module());
code->IncRef();
}
auto script_it = info->scripts.find(native_module);
// If the script does not yet exist, logging will happen later. If the weak
// handle is cleared already, we also don't need to log any more.
if (script_it == info->scripts.end()) continue;
auto& log_entry = info->code_to_log[script_it->second.script_id()];
if (!log_entry.source_url) {
log_entry.source_url = script_it->second.source_url();
}
log_entry.code.insert(log_entry.code.end(), code_vec.begin(),
code_vec.end());
}
}
......@@ -1024,23 +1043,24 @@ void WasmEngine::EnableCodeLogging(Isolate* isolate) {
void WasmEngine::LogOutstandingCodesForIsolate(Isolate* isolate) {
// Under the mutex, get the vector of wasm code to log. Then log and decrement
// the ref count without holding the mutex.
std::vector<std::pair<std::vector<WasmCode*>, int>> code_to_log;
std::unordered_map<int, IsolateInfo::CodeToLogPerScript> code_to_log;
{
base::MutexGuard guard(&mutex_);
DCHECK_EQ(1, isolates_.count(isolate));
code_to_log.swap(isolates_[isolate]->code_to_log);
}
// If by now we should not log code any more, do not log it.
if (!WasmCode::ShouldBeLogged(isolate)) return;
// Check again whether we still need to log code.
bool should_log = WasmCode::ShouldBeLogged(isolate);
TRACE_EVENT1("v8.wasm", "wasm.LogCode", "codeObjects", code_to_log.size());
TRACE_EVENT0("v8.wasm", "wasm.LogCode");
for (auto& pair : code_to_log) {
int script_id = pair.second;
for (WasmCode* code : pair.first) {
code->LogCode(isolate, script_id);
for (WasmCode* code : pair.second.code) {
if (should_log) {
code->LogCode(isolate, pair.second.source_url.get(), pair.first);
}
}
WasmCode::DecrementRefCount(VectorOf(pair.first));
WasmCode::DecrementRefCount(VectorOf(pair.second.code));
}
}
......@@ -1146,19 +1166,24 @@ void WasmEngine::FreeNativeModule(NativeModule* native_module) {
// If there are {WasmCode} objects of the deleted {NativeModule}
// outstanding to be logged in this isolate, remove them. Decrementing the
// ref count is not needed, since the {NativeModule} dies anyway.
for (auto& pair : info->code_to_log) {
for (auto& log_entry : info->code_to_log) {
auto part_of_native_module = [native_module](WasmCode* code) {
return code->native_module() == native_module;
};
auto new_end = std::remove_if(pair.first.begin(), pair.first.end(),
part_of_native_module);
pair.first.erase(new_end, pair.first.end());
std::vector<WasmCode*>& code = log_entry.second.code;
auto new_end =
std::remove_if(code.begin(), code.end(), part_of_native_module);
code.erase(new_end, code.end());
}
// Now remove empty entries in {code_to_log}.
for (auto it = info->code_to_log.begin(), end = info->code_to_log.end();
it != end;) {
if (it->second.code.empty()) {
it = info->code_to_log.erase(it);
} else {
++it;
}
}
// Now remove empty vectors in {code_to_log}.
auto new_end =
std::remove_if(info->code_to_log.begin(), info->code_to_log.end(),
[](auto& pair) { return pair.first.empty(); });
info->code_to_log.erase(new_end, info->code_to_log.end());
}
// If there is a GC running which has references to code contained in the
// deleted {NativeModule}, remove those references.
......
......@@ -333,7 +333,7 @@ class V8_EXPORT_PRIVATE WasmEngine {
Handle<Script> GetOrCreateScript(Isolate*,
const std::shared_ptr<NativeModule>&,
Vector<const char> source_url = {});
Vector<const char> source_url);
// Returns a barrier allowing background compile operations if valid and
// preventing this object from being destroyed.
......
......@@ -843,7 +843,7 @@ MaybeHandle<WasmModuleObject> DeserializeNativeModule(
isolate->debug()->OnAfterCompile(script);
// Log the code within the generated module for profiling.
shared_native_module->LogWasmCodes(isolate, script->id());
shared_native_module->LogWasmCodes(isolate, *script);
return module_object;
}
......
......@@ -336,8 +336,9 @@ Handle<WasmInstanceObject> TestingModuleBuilder::InitInstanceObject() {
auto native_module = isolate_->wasm_engine()->NewNativeModule(
isolate_, enabled_features_, test_module_, code_size_estimate);
native_module->SetWireBytes(OwnedVector<const uint8_t>());
Handle<Script> script =
isolate_->wasm_engine()->GetOrCreateScript(isolate_, native_module);
constexpr Vector<const char> kNoSourceUrl{"", 0};
Handle<Script> script = isolate_->wasm_engine()->GetOrCreateScript(
isolate_, native_module, kNoSourceUrl);
Handle<WasmModuleObject> module_object =
WasmModuleObject::New(isolate_, std::move(native_module), script);
......@@ -558,8 +559,13 @@ void WasmFunctionCompiler::Build(const byte* start, const byte* end) {
WasmCode* code = native_module->PublishCode(
native_module->AddCompiledCode(std::move(result)));
DCHECK_NOT_NULL(code);
int script_id = builder_->instance_object()->module_object().script().id();
if (WasmCode::ShouldBeLogged(isolate())) code->LogCode(isolate(), script_id);
DisallowGarbageCollection no_gc;
Script script = builder_->instance_object()->module_object().script();
std::unique_ptr<char[]> source_url =
String::cast(script.source_url()).ToCString();
if (WasmCode::ShouldBeLogged(isolate())) {
code->LogCode(isolate(), source_url.get(), script.id());
}
}
WasmFunctionCompiler::WasmFunctionCompiler(Zone* zone, const FunctionSig* sig,
......
......@@ -5,25 +5,25 @@ Building wasm module with sentinel 1.
Running fib with increasing input until it shows up in the profile.
Found expected functions in profile.
Wasm script id is set.
Wasm position: wasm @-1:-1
Wasm position: wasm://wasm/6b211e7e@0:47
testEnableProfilerLate
Compiling wasm.
Building wasm module with sentinel 2.
Running fib with increasing input until it shows up in the profile.
Found expected functions in profile.
Wasm script id is set.
Wasm position: wasm @-1:-1
Wasm position: wasm://wasm/d6029ed6@0:47
testEnableProfilerAfterDebugger
Compiling wasm.
Building wasm module with sentinel 3.
Running fib with increasing input until it shows up in the profile.
Found expected functions in profile.
Wasm script id is set.
Wasm position: wasm @-1:-1
Wasm position: wasm://wasm/6df1c11a@0:47
testEnableProfilerBeforeDebugger
Compiling wasm.
Building wasm module with sentinel 4.
Running fib with increasing input until it shows up in the profile.
Found expected functions in profile.
Wasm script id is set.
Wasm position: wasm @-1:-1
Wasm position: wasm://wasm/07da49be@0:47
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