static bool SendModuleToAttachedProfiler(JSContext *cx, AsmJSModule &module) { #if defined(MOZ_VTUNE) if (IsVTuneProfilingActive() && !SendFunctionsToVTune(cx, module)) return false; #endif #if defined(JS_ION_PERF) if (module.numExportedFunctions() > 0) { size_t firstEntryCode = (size_t) module.entryTrampoline(module.exportedFunction(0)); writePerfSpewerAsmJSEntriesAndExits(firstEntryCode, (size_t) module.globalData() - firstEntryCode); } if (!SendBlocksToPerf(cx, module)) return false; if (!SendFunctionsToPerf(cx, module)) return false; #endif return true; }
static bool ValidateGlobalVariable(JSContext* cx, const AsmJSModule& module, AsmJSModule::Global& global, HandleValue importVal) { void* datum = module.globalData() + global.varGlobalDataOffset(); switch (global.varInitKind()) { case AsmJSModule::Global::InitConstant: { Val v = global.varInitVal(); switch (v.type()) { case ValType::I32: *(int32_t*)datum = v.i32(); break; case ValType::I64: MOZ_CRASH("int64"); case ValType::F32: *(float*)datum = v.f32(); break; case ValType::F64: *(double*)datum = v.f64(); break; case ValType::I32x4: memcpy(datum, v.i32x4(), Simd128DataSize); break; case ValType::F32x4: memcpy(datum, v.f32x4(), Simd128DataSize); break; } break; } case AsmJSModule::Global::InitImport: { RootedPropertyName field(cx, global.varImportField()); RootedValue v(cx); if (!GetDataProperty(cx, importVal, field, &v)) return false; if (!v.isPrimitive() && !HasPureCoercion(cx, v)) return LinkFail(cx, "Imported values must be primitives"); switch (global.varInitImportType()) { case ValType::I32: if (!ToInt32(cx, v, (int32_t*)datum)) return false; break; case ValType::I64: MOZ_CRASH("int64"); case ValType::F32: if (!RoundFloat32(cx, v, (float*)datum)) return false; break; case ValType::F64: if (!ToNumber(cx, v, (double*)datum)) return false; break; case ValType::I32x4: { SimdConstant simdConstant; if (!ToSimdConstant<Int32x4>(cx, v, &simdConstant)) return false; memcpy(datum, simdConstant.asInt32x4(), Simd128DataSize); break; } case ValType::F32x4: { SimdConstant simdConstant; if (!ToSimdConstant<Float32x4>(cx, v, &simdConstant)) return false; memcpy(datum, simdConstant.asFloat32x4(), Simd128DataSize); break; } } break; } } return true; }