/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- * vim: set ts=8 sts=2 et sw=2 tw=80: * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef jit_JitOptions_h #define jit_JitOptions_h #include "mozilla/Maybe.h" #include "jit/IonTypes.h" #include "js/TypeDecls.h" namespace js { namespace jit { // Possible register allocators which may be used. enum IonRegisterAllocator { RegisterAllocator_Backtracking, RegisterAllocator_Testbed, }; // Which register to use as base register to access stack slots: frame pointer, // stack pointer, or whichever is the default for this platform. See comment // for baseRegForLocals in JitOptions.cpp for more information. enum class BaseRegForAddress { Default, FP, SP }; enum class UseMonomorphicInlining : uint8_t { Default, Always, Never, }; static inline mozilla::Maybe LookupRegisterAllocator( const char* name) { if (!strcmp(name, "backtracking")) { return mozilla::Some(RegisterAllocator_Backtracking); } if (!strcmp(name, "testbed")) { return mozilla::Some(RegisterAllocator_Testbed); } return mozilla::Nothing(); } struct DefaultJitOptions { bool checkGraphConsistency; #ifdef CHECK_OSIPOINT_REGISTERS bool checkOsiPointRegisters; #endif bool checkRangeAnalysis; bool runExtraChecks; bool disableJitBackend; bool disableJitHints; bool disableAma; bool disableEaa; bool disableEdgeCaseAnalysis; bool disableGvn; bool disableInlining; bool disableLicm; bool disablePruning; bool disableInstructionReordering; bool disableIteratorIndices; bool disableMarkLoadsUsedAsPropertyKeys; bool disableRangeAnalysis; bool disableRecoverIns; bool disableScalarReplacement; bool disableCacheIR; bool disableSink; bool disableRedundantShapeGuards; bool disableRedundantGCBarriers; bool disableBailoutLoopCheck; #ifdef ENABLE_PORTABLE_BASELINE_INTERP bool portableBaselineInterpreter; #endif bool baselineInterpreter; bool baselineJit; bool ion; bool jitForTrustedPrincipals; bool nativeRegExp; bool forceInlineCaches; bool forceMegamorphicICs; bool fullDebugChecks; bool limitScriptSize; bool osr; bool wasmFoldOffsets; bool wasmDelayTier2; bool lessDebugCode; bool onlyInlineSelfHosted; bool enableICFramePointers; bool enableWasmJitExit; bool enableWasmJitEntry; bool enableWasmIonFastCalls; #ifdef WASM_CODEGEN_DEBUG bool enableWasmImportCallSpew; bool enableWasmFuncCallSpew; #endif bool emitInterpreterEntryTrampoline; uint32_t baselineInterpreterWarmUpThreshold; uint32_t baselineJitWarmUpThreshold; uint32_t trialInliningWarmUpThreshold; uint32_t trialInliningInitialWarmUpCount; UseMonomorphicInlining monomorphicInlining = UseMonomorphicInlining::Default; uint32_t normalIonWarmUpThreshold; uint32_t regexpWarmUpThreshold; #ifdef ENABLE_PORTABLE_BASELINE_INTERP uint32_t portableBaselineInterpreterWarmUpThreshold; #endif uint32_t exceptionBailoutThreshold; uint32_t frequentBailoutThreshold; uint32_t maxStackArgs; uint32_t osrPcMismatchesBeforeRecompile; uint32_t smallFunctionMaxBytecodeLength; uint32_t inliningEntryThreshold; uint32_t jumpThreshold; uint32_t branchPruningHitCountFactor; uint32_t branchPruningInstFactor; uint32_t branchPruningBlockSpanFactor; uint32_t branchPruningEffectfulInstFactor; uint32_t branchPruningThreshold; uint32_t ionMaxScriptSize; uint32_t ionMaxScriptSizeMainThread; uint32_t ionMaxLocalsAndArgs; uint32_t ionMaxLocalsAndArgsMainThread; uint32_t wasmBatchBaselineThreshold; uint32_t wasmBatchIonThreshold; mozilla::Maybe forcedRegisterAllocator; // Spectre mitigation flags. Each mitigation has its own flag in order to // measure the effectiveness of each mitigation with various proof of // concept. bool spectreIndexMasking; bool spectreObjectMitigations; bool spectreStringMitigations; bool spectreValueMasking; bool spectreJitToCxxCalls; bool writeProtectCode; bool supportsUnalignedAccesses; BaseRegForAddress baseRegForLocals; // Irregexp shim flags bool correctness_fuzzer_suppressions; bool enable_regexp_unaligned_accesses; bool js_regexp_modifiers; bool js_regexp_duplicate_named_groups; bool regexp_possessive_quantifier; bool regexp_optimization; bool regexp_peephole_optimization; bool regexp_tier_up; bool trace_regexp_assembler; bool trace_regexp_bytecodes; bool trace_regexp_parser; bool trace_regexp_peephole_optimization; DefaultJitOptions(); bool isSmallFunction(JSScript* script) const; #ifdef ENABLE_PORTABLE_BASELINE_INTERP void setEagerPortableBaselineInterpreter(); #endif void setEagerBaselineCompilation(); void setEagerIonCompilation(); void setNormalIonWarmUpThreshold(uint32_t warmUpThreshold); void resetNormalIonWarmUpThreshold(); void enableGvn(bool val); void setFastWarmUp(); void maybeSetWriteProtectCode(bool val); bool eagerIonCompilation() const { return normalIonWarmUpThreshold == 0; } }; extern DefaultJitOptions JitOptions; inline bool HasJitBackend() { #if defined(JS_CODEGEN_NONE) return false; #else return !JitOptions.disableJitBackend; #endif } inline bool IsBaselineInterpreterEnabled() { return HasJitBackend() && JitOptions.baselineInterpreter; } #ifdef ENABLE_PORTABLE_BASELINE_INTERP inline bool IsPortableBaselineInterpreterEnabled() { return JitOptions.portableBaselineInterpreter; } #else inline bool IsPortableBaselineInterpreterEnabled() { return false; } #endif inline bool TooManyActualArguments(size_t nargs) { return nargs > JitOptions.maxStackArgs; } } // namespace jit extern mozilla::Atomic fuzzingSafe; static inline bool IsFuzzing() { #ifdef FUZZING return true; #else return fuzzingSafe; #endif } } // namespace js #endif /* jit_JitOptions_h */