static bool SendFunctionsToPerf(JSContext *cx, AsmJSModule &module) { if (!PerfFuncEnabled()) return true; uintptr_t base = (uintptr_t) module.codeBase(); const char *filename = module.scriptSource()->filename(); for (unsigned i = 0; i < module.numProfiledFunctions(); i++) { const AsmJSModule::ProfiledFunction &func = module.profiledFunction(i); uintptr_t start = base + (unsigned long) func.pod.startCodeOffset; uintptr_t end = base + (unsigned long) func.pod.endCodeOffset; JS_ASSERT(end >= start); size_t size = end - start; JSAutoByteString bytes; const char *name = AtomToPrintableString(cx, func.name, &bytes); if (!name) return false; writePerfSpewerAsmJSFunctionMap(start, size, filename, func.pod.lineno, func.pod.columnIndex, name); } return true; }
static bool SendFunctionsToVTune(JSContext *cx, AsmJSModule &module) { uint8_t *base = module.codeBase(); for (unsigned i = 0; i < module.numProfiledFunctions(); i++) { const AsmJSModule::ProfiledFunction &func = module.profiledFunction(i); uint8_t *start = base + func.startCodeOffset; uint8_t *end = base + func.endCodeOffset; JS_ASSERT(end >= start); unsigned method_id = iJIT_GetNewMethodID(); if (method_id == 0) return false; JSAutoByteString bytes; const char *method_name = AtomToPrintableString(cx, func.name, &bytes); if (!method_name) return false; iJIT_Method_Load method; method.method_id = method_id; method.method_name = const_cast<char *>(method_name); method.method_load_address = (void *)start; method.method_size = unsigned(end - start); method.line_number_size = 0; method.line_number_table = nullptr; method.class_id = 0; method.class_file_name = nullptr; method.source_file_name = nullptr; iJIT_NotifyEvent(iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED, (void *)&method); } return true; }