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 */