tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

BaselineCacheIRCompiler.h (7113B)


      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_BaselineCacheIRCompiler_h
      8 #define jit_BaselineCacheIRCompiler_h
      9 
     10 #include "mozilla/Attributes.h"
     11 #include "mozilla/Maybe.h"
     12 
     13 #include <stdint.h>
     14 
     15 #include "jstypes.h"
     16 
     17 #include "jit/CacheIR.h"
     18 #include "jit/CacheIRCompiler.h"
     19 #include "jit/CacheIROpsGenerated.h"
     20 #include "jit/CacheIRReader.h"
     21 
     22 struct JS_PUBLIC_API JSContext;
     23 
     24 class JSScript;
     25 
     26 namespace js {
     27 namespace jit {
     28 
     29 class CacheIRWriter;
     30 class ICFallbackStub;
     31 class ICScript;
     32 class JitCode;
     33 class Label;
     34 class MacroAssembler;
     35 
     36 struct Address;
     37 struct Register;
     38 
     39 enum class ICAttachResult { Attached, DuplicateStub, TooLarge, OOM };
     40 
     41 ICAttachResult AttachBaselineCacheIRStub(JSContext* cx,
     42                                         const CacheIRWriter& writer,
     43                                         CacheKind kind, JSScript* outerScript,
     44                                         ICScript* icScript,
     45                                         ICFallbackStub* stub,
     46                                         const char* name);
     47 
     48 // BaselineCacheIRCompiler compiles CacheIR to BaselineIC native code.
     49 class MOZ_RAII BaselineCacheIRCompiler : public CacheIRCompiler {
     50  bool makesGCCalls_;
     51  uint8_t localTracingSlots_ = 0;
     52  Register baselineFrameReg_ = FramePointer;
     53 
     54  // This register points to the baseline frame of the caller. It should only
     55  // be used before we enter a stub frame. This is normally the frame pointer
     56  // register, but with --enable-ic-frame-pointers we have to allocate a
     57  // separate register.
     58  inline Register baselineFrameReg() {
     59    MOZ_ASSERT(!enteredStubFrame_);
     60    return baselineFrameReg_;
     61  }
     62 
     63  [[nodiscard]] bool emitStoreSlotShared(bool isFixed, ObjOperandId objId,
     64                                         uint32_t offsetOffset,
     65                                         ValOperandId rhsId);
     66  [[nodiscard]] bool emitAddAndStoreSlotShared(
     67      CacheOp op, ObjOperandId objId, uint32_t offsetOffset, ValOperandId rhsId,
     68      uint32_t newShapeOffset, mozilla::Maybe<uint32_t> numNewSlotsOffset,
     69      bool preserveWrapper);
     70 
     71  bool updateArgc(CallFlags flags, Register argcReg, uint32_t argcFixed,
     72                  Register scratch);
     73  void loadStackObject(ArgumentKind kind, CallFlags flags, Register argcReg,
     74                       Register dest);
     75  void pushArguments(Register argcReg, Register calleeReg, Register scratch,
     76                     Register scratch2, CallFlags flags, uint32_t argcFixed,
     77                     bool isJitCall);
     78  void prepareForArguments(Register argcReg, Register calleeReg,
     79                           Register scratch, Register scratch2, CallFlags flags,
     80                           uint32_t argcFixed);
     81  void pushNewTarget();
     82  void pushStandardArguments(Register argcReg, Register scratch,
     83                             Register scratch2, uint32_t argcFixed,
     84                             bool isJitCall, bool isConstructing);
     85  void pushArrayArguments(Register argcReg, Register scratch, Register scratch2,
     86                          bool isJitCall, bool isConstructing);
     87  void pushFunCallArguments(Register argcReg, Register calleeReg,
     88                            Register scratch, Register scratch2,
     89                            uint32_t argcFixed, bool isJitCall);
     90  void pushFunApplyArgsObj(Register argcReg, Register calleeReg,
     91                           Register scratch, Register scratch2, bool isJitCall);
     92  void pushFunApplyNullUndefinedArguments(Register calleeReg, bool isJitCall);
     93  void pushBoundFunctionArguments(Register argcReg, Register calleeReg,
     94                                  Register scratch, Register scratch2,
     95                                  CallFlags flags, uint32_t numBoundArgs,
     96                                  bool isJitCall);
     97  void createThis(Register argcReg, Register calleeReg, Register scratch,
     98                  CallFlags flags, bool isBoundFunction);
     99  template <typename T>
    100  void storeThis(const T& newThis, Register argcReg, CallFlags flags);
    101  void updateReturnValue();
    102 
    103  enum class NativeCallType { Native, ClassHook };
    104  enum class ClearLocalAllocSite { No, Yes };
    105  bool emitCallNativeShared(
    106      NativeCallType callType, ObjOperandId calleeId, Int32OperandId argcId,
    107      CallFlags flags, uint32_t argcFixed,
    108      mozilla::Maybe<bool> ignoresReturnValue,
    109      mozilla::Maybe<uint32_t> targetOffset,
    110      ClearLocalAllocSite clearLocalAllocSite = ClearLocalAllocSite::No);
    111  void loadAllocSiteIntoContext(uint32_t siteOffset);
    112 
    113  enum class StringCode { CodeUnit, CodePoint };
    114  bool emitStringFromCodeResult(Int32OperandId codeId, StringCode stringCode);
    115 
    116  enum class StringCharOutOfBounds { Failure, EmptyString, UndefinedValue };
    117  bool emitLoadStringCharResult(StringOperandId strId, Int32OperandId indexId,
    118                                StringCharOutOfBounds outOfBounds);
    119 
    120  void emitAtomizeString(Register str, Register temp, Label* failure);
    121 
    122  bool emitCallScriptedGetterShared(ValOperandId receiverId,
    123                                    ObjOperandId calleeId, bool sameRealm,
    124                                    uint32_t nargsAndFlagsOffset,
    125                                    mozilla::Maybe<uint32_t> icScriptOffset);
    126  bool emitCallScriptedSetterShared(ObjOperandId receiverId,
    127                                    ObjOperandId calleeId, ValOperandId rhsId,
    128                                    bool sameRealm,
    129                                    uint32_t nargsAndFlagsOffset,
    130                                    mozilla::Maybe<uint32_t> icScriptOffset);
    131  bool emitCallScriptedFunctionShared(ObjOperandId calleeId,
    132                                      Int32OperandId argcId, CallFlags flags,
    133                                      uint32_t argcFixed,
    134                                      mozilla::Maybe<uint32_t> icScriptOffset);
    135 
    136  template <typename IdType>
    137  bool emitCallScriptedProxyGetShared(ValOperandId targetId,
    138                                      ObjOperandId receiverId,
    139                                      ObjOperandId handlerId,
    140                                      ObjOperandId trapId, IdType id,
    141                                      uint32_t nargsAndFlags);
    142 
    143  BaselineICPerfSpewer perfSpewer_;
    144 
    145 public:
    146  BaselineICPerfSpewer& perfSpewer() { return perfSpewer_; }
    147 
    148  friend class AutoStubFrame;
    149 
    150  BaselineCacheIRCompiler(JSContext* cx, TempAllocator& alloc,
    151                          const CacheIRWriter& writer, uint32_t stubDataOffset);
    152 
    153  [[nodiscard]] bool init(CacheKind kind);
    154 
    155  template <typename Fn, Fn fn>
    156  void callVM(MacroAssembler& masm);
    157 
    158  JitCode* compile();
    159 
    160  bool makesGCCalls() const;
    161  bool localTracingSlots() const { return localTracingSlots_; }
    162 
    163  Address stubAddress(uint32_t offset) const;
    164 
    165 private:
    166  CACHE_IR_COMPILER_UNSHARED_GENERATED
    167 };
    168 
    169 }  // namespace jit
    170 }  // namespace js
    171 
    172 #endif /* jit_BaselineCacheIRCompiler_h */