1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- 2 * vim: set ts=8 sts=2 et sw=2 tw=80: 3 * This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #ifndef jit_WarpOracle_h 8 #define jit_WarpOracle_h 9 10 #include "jit/JitAllocPolicy.h" 11 #include "jit/JitContext.h" 12 #include "jit/WarpSnapshot.h" 13 14 namespace js { 15 namespace jit { 16 17 class MIRGenerator; 18 19 // WarpOracle creates a WarpSnapshot data structure that's used by WarpBuilder 20 // to generate the MIR graph off-thread. 21 class MOZ_STACK_CLASS WarpOracle { 22 JSContext* cx_; 23 MIRGenerator& mirGen_; 24 TempAllocator& alloc_; 25 HandleScript outerScript_; 26 WarpBailoutInfo bailoutInfo_; 27 WarpScriptSnapshotList scriptSnapshots_; 28 29 // List of nursery objects to copy to the snapshot. See WarpObjectField. 30 // The HashMap is used to de-duplicate the Vector. It maps each object to the 31 // corresponding nursery index (index into the Vector). 32 // Note: this stores raw object pointers because WarpOracle can't GC. 33 Vector<JSObject*, 8, SystemAllocPolicy> nurseryObjects_; 34 using NurseryObjectsMap = 35 HashMap<JSObject*, uint32_t, DefaultHasher<JSObject*>, SystemAllocPolicy>; 36 NurseryObjectsMap nurseryObjectsMap_; 37 38 public: 39 WarpOracle(JSContext* cx, MIRGenerator& mirGen, HandleScript outerScript); ~WarpOracle()40 ~WarpOracle() { scriptSnapshots_.clear(); } 41 mirGen()42 MIRGenerator& mirGen() { return mirGen_; } bailoutInfo()43 WarpBailoutInfo& bailoutInfo() { return bailoutInfo_; } 44 45 [[nodiscard]] bool registerNurseryObject(JSObject* obj, 46 uint32_t* nurseryIndex); 47 48 AbortReasonOr<WarpSnapshot*> createSnapshot(); 49 50 mozilla::GenericErrorResult<AbortReason> abort(HandleScript script, 51 AbortReason r); 52 mozilla::GenericErrorResult<AbortReason> abort(HandleScript script, 53 AbortReason r, 54 const char* message, ...); 55 void addScriptSnapshot(WarpScriptSnapshot* scriptSnapshot); 56 }; 57 58 } // namespace jit 59 } // namespace js 60 61 #endif /* jit_WarpOracle_h */ 62