зеркало из https://github.com/mozilla/gecko-dev.git
314 строки
17 KiB
C++
314 строки
17 KiB
C++
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
|
* vim: set ts=8 sts=4 et sw=4 tw=99:
|
|
* 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 js_TrackedOptimizationInfo_h
|
|
#define js_TrackedOptimizationInfo_h
|
|
|
|
#include "mozilla/Maybe.h"
|
|
|
|
namespace JS {
|
|
|
|
#define TRACKED_STRATEGY_LIST(_) \
|
|
_(GetProp_ArgumentsLength) \
|
|
_(GetProp_ArgumentsCallee) \
|
|
_(GetProp_InferredConstant) \
|
|
_(GetProp_Constant) \
|
|
_(GetProp_NotDefined) \
|
|
_(GetProp_StaticName) \
|
|
_(GetProp_SimdGetter) \
|
|
_(GetProp_TypedObject) \
|
|
_(GetProp_DefiniteSlot) \
|
|
_(GetProp_Unboxed) \
|
|
_(GetProp_CommonGetter) \
|
|
_(GetProp_InlineAccess) \
|
|
_(GetProp_InlineProtoAccess) \
|
|
_(GetProp_Innerize) \
|
|
_(GetProp_InlineCache) \
|
|
_(GetProp_ModuleNamespace) \
|
|
\
|
|
_(SetProp_CommonSetter) \
|
|
_(SetProp_TypedObject) \
|
|
_(SetProp_DefiniteSlot) \
|
|
_(SetProp_Unboxed) \
|
|
_(SetProp_InlineAccess) \
|
|
_(SetProp_InlineCache) \
|
|
\
|
|
_(GetElem_TypedObject) \
|
|
_(GetElem_Dense) \
|
|
_(GetElem_TypedStatic) \
|
|
_(GetElem_TypedArray) \
|
|
_(GetElem_String) \
|
|
_(GetElem_Arguments) \
|
|
_(GetElem_ArgumentsInlinedConstant) \
|
|
_(GetElem_ArgumentsInlinedSwitch) \
|
|
_(GetElem_InlineCache) \
|
|
\
|
|
_(SetElem_TypedObject) \
|
|
_(SetElem_TypedStatic) \
|
|
_(SetElem_TypedArray) \
|
|
_(SetElem_Dense) \
|
|
_(SetElem_Arguments) \
|
|
_(SetElem_InlineCache) \
|
|
\
|
|
_(BinaryArith_Concat) \
|
|
_(BinaryArith_SpecializedTypes) \
|
|
_(BinaryArith_SpecializedOnBaselineTypes) \
|
|
_(BinaryArith_SharedCache) \
|
|
_(BinaryArith_Call) \
|
|
\
|
|
_(InlineCache_OptimizedStub) \
|
|
\
|
|
_(NewArray_TemplateObject) \
|
|
_(NewArray_SharedCache) \
|
|
_(NewArray_Call) \
|
|
\
|
|
_(NewObject_TemplateObject) \
|
|
_(NewObject_SharedCache) \
|
|
_(NewObject_Call) \
|
|
\
|
|
_(Compare_SpecializedTypes) \
|
|
_(Compare_Bitwise) \
|
|
_(Compare_SpecializedOnBaselineTypes) \
|
|
_(Compare_SharedCache) \
|
|
_(Compare_Call) \
|
|
\
|
|
_(Call_Inline)
|
|
|
|
|
|
// Ordering is important below. All outcomes before GenericSuccess will be
|
|
// considered failures, and all outcomes after GenericSuccess will be
|
|
// considered successes.
|
|
#define TRACKED_OUTCOME_LIST(_) \
|
|
_(GenericFailure) \
|
|
_(Disabled) \
|
|
_(NoTypeInfo) \
|
|
_(NoAnalysisInfo) \
|
|
_(NoShapeInfo) \
|
|
_(UnknownObject) \
|
|
_(UnknownProperties) \
|
|
_(Singleton) \
|
|
_(NotSingleton) \
|
|
_(NotFixedSlot) \
|
|
_(InconsistentFixedSlot) \
|
|
_(NotObject) \
|
|
_(NotStruct) \
|
|
_(NotUnboxed) \
|
|
_(NotUndefined) \
|
|
_(UnboxedConvertedToNative) \
|
|
_(StructNoField) \
|
|
_(InconsistentFieldType) \
|
|
_(InconsistentFieldOffset) \
|
|
_(NeedsTypeBarrier) \
|
|
_(InDictionaryMode) \
|
|
_(NoProtoFound) \
|
|
_(MultiProtoPaths) \
|
|
_(NonWritableProperty) \
|
|
_(ProtoIndexedProps) \
|
|
_(ArrayBadFlags) \
|
|
_(ArrayDoubleConversion) \
|
|
_(ArrayRange) \
|
|
_(ArraySeenNegativeIndex) \
|
|
_(TypedObjectHasDetachedBuffer) \
|
|
_(TypedObjectArrayRange) \
|
|
_(AccessNotDense) \
|
|
_(AccessNotSimdObject) \
|
|
_(AccessNotTypedObject) \
|
|
_(AccessNotTypedArray) \
|
|
_(AccessNotString) \
|
|
_(OperandNotString) \
|
|
_(OperandNotNumber) \
|
|
_(OperandNotStringOrNumber) \
|
|
_(OperandNotSimpleArith) \
|
|
_(OperandNotEasilyCoercibleToString) \
|
|
_(StaticTypedArrayUint32) \
|
|
_(StaticTypedArrayCantComputeMask) \
|
|
_(OutOfBounds) \
|
|
_(GetElemStringNotCached) \
|
|
_(NonNativeReceiver) \
|
|
_(IndexType) \
|
|
_(SetElemNonDenseNonTANotCached) \
|
|
_(NoSimdJitSupport) \
|
|
_(SimdTypeNotOptimized) \
|
|
_(UnknownSimdProperty) \
|
|
_(NotModuleNamespace) \
|
|
_(UnknownProperty) \
|
|
_(NoTemplateObject) \
|
|
_(TemplateObjectIsUnboxedWithoutInlineElements) \
|
|
_(TemplateObjectIsPlainObjectWithDynamicSlots) \
|
|
_(LengthTooBig) \
|
|
_(SpeculationOnInputTypesFailed) \
|
|
_(RelationalCompare) \
|
|
_(OperandTypeNotBitwiseComparable) \
|
|
_(OperandMaybeEmulatesUndefined) \
|
|
_(LoosyUndefinedNullCompare) \
|
|
_(LoosyInt32BooleanCompare) \
|
|
_(CallsValueOf) \
|
|
_(StrictCompare) \
|
|
_(InitHole) \
|
|
\
|
|
_(ICOptStub_GenericSuccess) \
|
|
\
|
|
_(ICGetPropStub_ReadSlot) \
|
|
_(ICGetPropStub_CallGetter) \
|
|
_(ICGetPropStub_ArrayLength) \
|
|
_(ICGetPropStub_UnboxedRead) \
|
|
_(ICGetPropStub_UnboxedReadExpando) \
|
|
_(ICGetPropStub_UnboxedArrayLength) \
|
|
_(ICGetPropStub_TypedArrayLength) \
|
|
_(ICGetPropStub_DOMProxyShadowed) \
|
|
_(ICGetPropStub_DOMProxyUnshadowed) \
|
|
_(ICGetPropStub_GenericProxy) \
|
|
_(ICGetPropStub_ArgumentsLength) \
|
|
\
|
|
_(ICSetPropStub_Slot) \
|
|
_(ICSetPropStub_GenericProxy) \
|
|
_(ICSetPropStub_DOMProxyShadowed) \
|
|
_(ICSetPropStub_DOMProxyUnshadowed) \
|
|
_(ICSetPropStub_CallSetter) \
|
|
_(ICSetPropStub_AddSlot) \
|
|
_(ICSetPropStub_SetUnboxed) \
|
|
\
|
|
_(ICGetElemStub_ReadSlot) \
|
|
_(ICGetElemStub_CallGetter) \
|
|
_(ICGetElemStub_ReadUnboxed) \
|
|
_(ICGetElemStub_Dense) \
|
|
_(ICGetElemStub_DenseHole) \
|
|
_(ICGetElemStub_TypedArray) \
|
|
_(ICGetElemStub_ArgsElementMapped) \
|
|
_(ICGetElemStub_ArgsElementUnmapped) \
|
|
\
|
|
_(ICSetElemStub_Dense) \
|
|
_(ICSetElemStub_TypedArray) \
|
|
\
|
|
_(ICNameStub_ReadSlot) \
|
|
_(ICNameStub_CallGetter) \
|
|
_(ICNameStub_TypeOfNoProperty) \
|
|
\
|
|
_(CantInlineGeneric) \
|
|
_(CantInlineNoTarget) \
|
|
_(CantInlineNotInterpreted) \
|
|
_(CantInlineNoBaseline) \
|
|
_(CantInlineLazy) \
|
|
_(CantInlineNotConstructor) \
|
|
_(CantInlineClassConstructor) \
|
|
_(CantInlineDisabledIon) \
|
|
_(CantInlineTooManyArgs) \
|
|
_(CantInlineNeedsArgsObj) \
|
|
_(CantInlineDebuggee) \
|
|
_(CantInlineExceededDepth) \
|
|
_(CantInlineExceededTotalBytecodeLength) \
|
|
_(CantInlineBigCaller) \
|
|
_(CantInlineBigCallee) \
|
|
_(CantInlineBigCalleeInlinedBytecodeLength) \
|
|
_(CantInlineNotHot) \
|
|
_(CantInlineNotInDispatch) \
|
|
_(CantInlineUnreachable) \
|
|
_(CantInlineNativeBadForm) \
|
|
_(CantInlineNativeBadType) \
|
|
_(CantInlineNativeNoTemplateObj) \
|
|
_(CantInlineBound) \
|
|
_(CantInlineNativeNoSpecialization) \
|
|
_(HasCommonInliningPath) \
|
|
\
|
|
_(GenericSuccess) \
|
|
_(Inlined) \
|
|
_(DOM) \
|
|
_(Monomorphic) \
|
|
_(Polymorphic)
|
|
|
|
#define TRACKED_TYPESITE_LIST(_) \
|
|
_(Receiver) \
|
|
_(Operand) \
|
|
_(Index) \
|
|
_(Value) \
|
|
_(Call_Target) \
|
|
_(Call_This) \
|
|
_(Call_Arg) \
|
|
_(Call_Return)
|
|
|
|
enum class TrackedStrategy : uint32_t {
|
|
#define STRATEGY_OP(name) name,
|
|
TRACKED_STRATEGY_LIST(STRATEGY_OP)
|
|
#undef STRATEGY_OPT
|
|
|
|
Count
|
|
};
|
|
|
|
enum class TrackedOutcome : uint32_t {
|
|
#define OUTCOME_OP(name) name,
|
|
TRACKED_OUTCOME_LIST(OUTCOME_OP)
|
|
#undef OUTCOME_OP
|
|
|
|
Count
|
|
};
|
|
|
|
enum class TrackedTypeSite : uint32_t {
|
|
#define TYPESITE_OP(name) name,
|
|
TRACKED_TYPESITE_LIST(TYPESITE_OP)
|
|
#undef TYPESITE_OP
|
|
|
|
Count
|
|
};
|
|
|
|
JS_PUBLIC_API(const char*)
|
|
TrackedStrategyString(TrackedStrategy strategy);
|
|
|
|
JS_PUBLIC_API(const char*)
|
|
TrackedOutcomeString(TrackedOutcome outcome);
|
|
|
|
JS_PUBLIC_API(const char*)
|
|
TrackedTypeSiteString(TrackedTypeSite site);
|
|
|
|
struct ForEachTrackedOptimizationAttemptOp
|
|
{
|
|
virtual void operator()(TrackedStrategy strategy, TrackedOutcome outcome) = 0;
|
|
};
|
|
|
|
struct ForEachTrackedOptimizationTypeInfoOp
|
|
{
|
|
// Called 0+ times per entry, once for each type in the type set that Ion
|
|
// saw during MIR construction. readType is always called _before_
|
|
// operator() on the same entry.
|
|
//
|
|
// The keyedBy parameter describes how the type is keyed:
|
|
// - "primitive" for primitive types
|
|
// - "constructor" for object types tied to a scripted constructor
|
|
// function.
|
|
// - "alloc site" for object types tied to an allocation site.
|
|
// - "prototype" for object types tied neither to a constructor nor
|
|
// to an allocation site, but to a prototype.
|
|
// - "singleton" for object types which only has a single value.
|
|
// - "function" for object types referring to scripted functions.
|
|
// - "native" for object types referring to native functions.
|
|
//
|
|
// The name parameter is the string representation of the type. If the
|
|
// type is keyed by "constructor", or if the type itself refers to a
|
|
// scripted function, the name is the function's displayAtom. If the type
|
|
// is keyed by "native", this is nullptr.
|
|
//
|
|
// The location parameter is the filename if the type is keyed by
|
|
// "constructor", "alloc site", or if the type itself refers to a scripted
|
|
// function. If the type is keyed by "native", it is the offset of the
|
|
// native function, suitable for use with addr2line on Linux or atos on OS
|
|
// X. Otherwise it is nullptr.
|
|
//
|
|
// The lineno parameter is the line number if the type is keyed by
|
|
// "constructor", "alloc site", or if the type itself refers to a scripted
|
|
// function. Otherwise it is Nothing().
|
|
//
|
|
// The location parameter is the only one that may need escaping if being
|
|
// quoted.
|
|
virtual void readType(const char* keyedBy, const char* name,
|
|
const char* location, const mozilla::Maybe<unsigned>& lineno) = 0;
|
|
|
|
// Called once per entry.
|
|
virtual void operator()(TrackedTypeSite site, const char* mirType) = 0;
|
|
};
|
|
|
|
} // namespace JS
|
|
|
|
#endif // js_TrackedOptimizationInfo_h
|