[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: Thibaud Michaud <thibaudm@chromium.org>
Reviewed-by: Peter Marshall <petermarshall@chromium.org>
Cr-Commit-Position: refs/heads/master@{#71695}
This commit is contained in:
Clemens Backes 2020-12-10 12:59:38 +01:00 committed by Commit Bot
parent 543e319456
commit c8166827b5
16 changed files with 144 additions and 91 deletions

View File

@ -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 {

View File

@ -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());
}
}

View File

@ -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;

View File

@ -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 = "";

View File

@ -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;

View File

@ -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);
}

View File

@ -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;

View File

@ -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 {}

View File

@ -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();
}

View File

@ -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());
}
}

View File

@ -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(); }

View File

@ -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.

View File

@ -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.

View File

@ -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;
}

View File

@ -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,

View File

@ -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