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/Maybe.h" 11 12 #include "gc/Barrier.h" 13 #include "jit/CacheIR.h" 14 #include "jit/CacheIRCompiler.h" 15 16 namespace js { 17 namespace jit { 18 19 class ICCacheIRStub; 20 class ICFallbackStub; 21 22 ICCacheIRStub* AttachBaselineCacheIRStub(JSContext* cx, 23 const CacheIRWriter& writer, 24 CacheKind kind, JSScript* outerScript, 25 ICScript* icScript, 26 ICFallbackStub* stub, bool* attached); 27 28 // BaselineCacheIRCompiler compiles CacheIR to BaselineIC native code. 29 class MOZ_RAII BaselineCacheIRCompiler : public CacheIRCompiler { 30 bool makesGCCalls_; 31 32 void tailCallVMInternal(MacroAssembler& masm, TailCallVMFunctionId id); 33 34 template <typename Fn, Fn fn> 35 void tailCallVM(MacroAssembler& masm); 36 37 [[nodiscard]] bool emitStoreSlotShared(bool isFixed, ObjOperandId objId, 38 uint32_t offsetOffset, 39 ValOperandId rhsId); 40 [[nodiscard]] bool emitAddAndStoreSlotShared( 41 CacheOp op, ObjOperandId objId, uint32_t offsetOffset, ValOperandId rhsId, 42 uint32_t newShapeOffset, mozilla::Maybe<uint32_t> numNewSlotsOffset); 43 44 bool updateArgc(CallFlags flags, Register argcReg, Register scratch); 45 void loadStackObject(ArgumentKind kind, CallFlags flags, size_t stackPushed, 46 Register argcReg, Register dest); 47 void pushArguments(Register argcReg, Register calleeReg, Register scratch, 48 Register scratch2, CallFlags flags, bool isJitCall); 49 void pushStandardArguments(Register argcReg, Register scratch, 50 Register scratch2, bool isJitCall, 51 bool isConstructing); 52 void pushArrayArguments(Register argcReg, Register scratch, Register scratch2, 53 bool isJitCall, bool isConstructing); 54 void pushFunCallArguments(Register argcReg, Register calleeReg, 55 Register scratch, Register scratch2, 56 bool isJitCall); 57 void pushFunApplyArgsObj(Register argcReg, Register calleeReg, 58 Register scratch, Register scratch2, bool isJitCall); 59 void createThis(Register argcReg, Register calleeReg, Register scratch, 60 CallFlags flags); 61 template <typename T> 62 void storeThis(const T& newThis, Register argcReg, CallFlags flags); 63 void updateReturnValue(); 64 65 enum class NativeCallType { Native, ClassHook }; 66 bool emitCallNativeShared(NativeCallType callType, ObjOperandId calleeId, 67 Int32OperandId argcId, CallFlags flags, 68 mozilla::Maybe<bool> ignoresReturnValue, 69 mozilla::Maybe<uint32_t> targetOffset); 70 71 enum class StringCode { CodeUnit, CodePoint }; 72 bool emitStringFromCodeResult(Int32OperandId codeId, StringCode stringCode); 73 74 bool emitCallScriptedGetterShared(ValOperandId receiverId, 75 uint32_t getterOffset, bool sameRealm, 76 uint32_t nargsAndFlagsOffset, 77 mozilla::Maybe<uint32_t> icScriptOffset); 78 bool emitCallScriptedSetterShared(ObjOperandId receiverId, 79 uint32_t setterOffset, ValOperandId rhsId, 80 bool sameRealm, 81 uint32_t nargsAndFlagsOffset, 82 mozilla::Maybe<uint32_t> icScriptOffset); 83 84 public: 85 friend class AutoStubFrame; 86 87 BaselineCacheIRCompiler(JSContext* cx, const CacheIRWriter& writer, 88 uint32_t stubDataOffset); 89 90 [[nodiscard]] bool init(CacheKind kind); 91 92 template <typename Fn, Fn fn> 93 void callVM(MacroAssembler& masm); 94 95 JitCode* compile(); 96 97 bool makesGCCalls() const; 98 99 Address stubAddress(uint32_t offset) const; 100 101 private: 102 CACHE_IR_COMPILER_UNSHARED_GENERATED 103 }; 104 105 } // namespace jit 106 } // namespace js 107 108 #endif /* jit_BaselineCacheIRCompiler_h */ 109