blob: 96ce58b8b93aa44b23ec09692da5b3a6127f1d7d [file] [log] [blame]
//-------------------------------------------------------------------------------------------------------
// Copyright (C) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
//-------------------------------------------------------------------------------------------------------
#pragma once
class JITTimeProfileInfo
{
public:
JITTimeProfileInfo(ProfileDataIDL * profileData);
static void InitializeJITProfileData(
__in ArenaAllocator * alloc,
__in Js::DynamicProfileInfo * profileInfo,
__in Js::FunctionBody *functionBody,
__out ProfileDataIDL * data,
bool isForegroundJIT);
const Js::LdLenInfo * GetLdLenInfo(Js::ProfileId ldLenId) const;
const Js::LdElemInfo * GetLdElemInfo(Js::ProfileId ldElemId) const;
const Js::StElemInfo * GetStElemInfo(Js::ProfileId stElemId) const;
Js::ArrayCallSiteInfo * GetArrayCallSiteInfo(Js::ProfileId index) const;
intptr_t GetArrayCallSiteInfoAddr(Js::ProfileId index) const;
Js::FldInfo * GetFldInfo(uint fieldAccessId) const;
intptr_t GetFldInfoAddr(uint fieldAccessId) const;
Js::ThisInfo GetThisInfo() const;
ValueType GetSlotLoad(Js::ProfileId slotLoadId) const;
ValueType GetReturnType(Js::OpCode opcode, Js::ProfileId callSiteId) const;
ValueType GetDivProfileInfo(Js::ProfileId divideId) const;
ValueType GetSwitchProfileInfo(Js::ProfileId switchId) const;
ValueType GetParameterInfo(Js::ArgSlot index) const;
Js::ImplicitCallFlags GetLoopImplicitCallFlags(uint loopNum) const;
Js::ImplicitCallFlags GetImplicitCallFlags() const;
Js::LoopFlags GetLoopFlags(uint loopNum) const;
bool CanInlineCallback(Js::ArgSlot argIndex, Js::ProfileId callSiteId) const;
uint GetLoopCount() const;
uint16 GetConstantArgInfo(Js::ProfileId callSiteId) const;
bool IsModulusOpByPowerOf2(Js::ProfileId profileId) const;
bool IsAggressiveIntTypeSpecDisabled(const bool isJitLoopBody) const;
bool IsSwitchOptDisabled() const;
bool IsEquivalentObjTypeSpecDisabled() const;
bool IsObjTypeSpecDisabledInJitLoopBody() const;
bool IsAggressiveMulIntTypeSpecDisabled(const bool isJitLoopBody) const;
bool IsDivIntTypeSpecDisabled(const bool isJitLoopBody) const;
bool IsLossyIntTypeSpecDisabled() const;
bool IsMemOpDisabled() const;
bool IsTrackCompoundedIntOverflowDisabled() const;
bool IsFloatTypeSpecDisabled() const;
bool IsCheckThisDisabled() const;
bool IsArrayCheckHoistDisabled(const bool isJitLoopBody) const;
bool IsArrayMissingValueCheckHoistDisabled(const bool isJitLoopBody) const;
bool IsJsArraySegmentHoistDisabled(const bool isJitLoopBody) const;
bool IsArrayLengthHoistDisabled(const bool isJitLoopBody) const;
bool IsTypedArrayTypeSpecDisabled(const bool isJitLoopBody) const;
bool IsLdLenIntSpecDisabled() const;
bool IsBoundCheckHoistDisabled(const bool isJitLoopBody) const;
bool IsLoopCountBasedBoundCheckHoistDisabled(const bool isJitLoopBody) const;
bool IsFloorInliningDisabled() const;
bool IsNoProfileBailoutsDisabled() const;
bool HasLdFldCallSiteInfo() const;
bool IsStackArgOptDisabled() const;
bool IsLoopImplicitCallInfoDisabled() const;
bool IsPowIntIntTypeSpecDisabled() const;
bool IsTagCheckDisabled() const;
bool IsOptimizeTryFinallyDisabled() const;
bool IsFieldPREDisabled() const;
private:
enum ProfileDataFlags : int64
{
Flags_None = 0,
Flags_disableAggressiveIntTypeSpec = 1,
Flags_disableAggressiveIntTypeSpec_jitLoopBody = 1 << 1,
Flags_disableAggressiveMulIntTypeSpec = 1 << 2,
Flags_disableAggressiveMulIntTypeSpec_jitLoopBody = 1 << 3,
Flags_disableDivIntTypeSpec = 1 << 4,
Flags_disableDivIntTypeSpec_jitLoopBody = 1 << 5,
Flags_disableLossyIntTypeSpec = 1 << 6,
Flags_disableTrackCompoundedIntOverflow = 1 << 7,
Flags_disableFloatTypeSpec = 1 << 8,
Flags_disableArrayCheckHoist = 1 << 9,
Flags_disableArrayCheckHoist_jitLoopBody = 1 << 10,
Flags_disableArrayMissingValueCheckHoist = 1 << 11,
Flags_disableArrayMissingValueCheckHoist_jitLoopBody = 1 << 12,
Flags_disableJsArraySegmentHoist = 1 << 13,
Flags_disableJsArraySegmentHoist_jitLoopBody = 1 << 14,
Flags_disableArrayLengthHoist = 1 << 15,
Flags_disableArrayLengthHoist_jitLoopBody = 1 << 16,
Flags_disableTypedArrayTypeSpec = 1 << 17,
Flags_disableTypedArrayTypeSpec_jitLoopBody = 1 << 18,
Flags_disableLdLenIntSpec = 1 << 19,
Flags_disableBoundCheckHoist = 1 << 20,
Flags_disableBoundCheckHoist_jitLoopBody = 1 << 21,
Flags_disableLoopCountBasedBoundCheckHoist = 1 << 22,
Flags_disableLoopCountBasedBoundCheckHoist_jitLoopBody = 1 << 23,
Flags_disableFloorInlining = 1 << 24,
Flags_disableNoProfileBailouts = 1 << 25,
Flags_disableSwitchOpt = 1 << 26,
Flags_disableEquivalentObjTypeSpec = 1 << 27,
Flags_disableObjTypeSpec_jitLoopBody = 1 << 28,
Flags_disableMemOp = 1 << 29,
Flags_disableCheckThis = 1 << 30,
Flags_hasLdFldCallSiteInfo = 1ll << 31,
Flags_disableStackArgOpt = 1ll << 32,
Flags_disableLoopImplicitCallInfo = 1ll << 33,
Flags_disablePowIntIntTypeSpec = 1ll << 34,
Flags_disableTagCheck = 1ll << 35,
Flags_disableOptimizeTryFinally = 1ll << 36,
Flags_disableFieldPRE = 1ll << 37
};
Js::ProfileId GetProfiledArrayCallSiteCount() const;
Js::ProfileId GetProfiledCallSiteCount() const;
Js::ProfileId GetProfiledReturnTypeCount() const;
Js::ProfileId GetProfiledDivOrRemCount() const;
Js::ProfileId GetProfiledSwitchCount() const;
Js::ProfileId GetProfiledSlotCount() const;
Js::ArgSlot GetProfiledInParamsCount() const;
uint GetProfiledFldCount() const;
BVFixed * GetLoopFlags() const;
bool TestFlag(ProfileDataFlags flag) const;
Js::CallSiteInfo * GetCallSiteInfo() const;
Js::CallbackInfo * GetCallbackInfo() const;
Js::CallbackInfo * FindCallbackInfo(Js::ProfileId callSiteId) const;
ProfileDataIDL m_profileData;
};