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