| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568 |
- //-------------------------------------------------------------------------------------------------------
- // Copyright (C) Microsoft. All rights reserved.
- // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
- //-------------------------------------------------------------------------------------------------------
- #include "Backend.h"
- JITTimeProfileInfo::JITTimeProfileInfo(ProfileDataIDL * profileData) :
- m_profileData(*profileData)
- {
- CompileAssert(sizeof(JITTimeProfileInfo) == sizeof(ProfileDataIDL));
- }
- /* static */
- void
- JITTimeProfileInfo::InitializeJITProfileData(
- __in ArenaAllocator * alloc,
- __in Js::DynamicProfileInfo * profileInfo,
- __in Js::FunctionBody *functionBody,
- __out ProfileDataIDL * data,
- bool isForegroundJIT)
- {
- if (profileInfo == nullptr)
- {
- return;
- }
- CompileAssert(sizeof(LdElemIDL) == sizeof(Js::LdElemInfo));
- CompileAssert(sizeof(StElemIDL) == sizeof(Js::StElemInfo));
- data->profiledLdElemCount = functionBody->GetProfiledLdElemCount();
- data->profiledStElemCount = functionBody->GetProfiledStElemCount();
- if (JITManager::GetJITManager()->IsOOPJITEnabled() || isForegroundJIT)
- {
- data->ldElemData = (LdElemIDL*)profileInfo->GetLdElemInfo();
- data->stElemData = (StElemIDL*)profileInfo->GetStElemInfo();
- }
- else
- {
- // for in-proc background JIT we need to explicitly copy LdElem and StElem info
- data->ldElemData = AnewArray(alloc, LdElemIDL, data->profiledLdElemCount);
- memcpy_s(
- data->ldElemData,
- data->profiledLdElemCount * sizeof(LdElemIDL),
- profileInfo->GetLdElemInfo(),
- functionBody->GetProfiledLdElemCount() * sizeof(Js::LdElemInfo)
- );
- data->stElemData = AnewArray(alloc, StElemIDL, data->profiledStElemCount);
- memcpy_s(
- data->stElemData,
- data->profiledStElemCount * sizeof(StElemIDL),
- profileInfo->GetStElemInfo(),
- functionBody->GetProfiledStElemCount() * sizeof(Js::StElemInfo)
- );
- }
- CompileAssert(sizeof(ArrayCallSiteIDL) == sizeof(Js::ArrayCallSiteInfo));
- data->profiledArrayCallSiteCount = functionBody->GetProfiledArrayCallSiteCount();
- data->arrayCallSiteData = (ArrayCallSiteIDL*)profileInfo->GetArrayCallSiteInfo();
- data->arrayCallSiteDataAddr = (intptr_t)profileInfo->GetArrayCallSiteInfo();
- CompileAssert(sizeof(FldIDL) == sizeof(Js::FldInfo));
- data->inlineCacheCount = functionBody->GetProfiledFldCount();
- data->fldData = (FldIDL*)profileInfo->GetFldInfo();
- data->fldDataAddr = (intptr_t)profileInfo->GetFldInfo();
- CompileAssert(sizeof(ThisIDL) == sizeof(Js::ThisInfo));
- data->thisData = *reinterpret_cast<ThisIDL*>(&profileInfo->GetThisInfo());
- CompileAssert(sizeof(CallSiteIDL) == sizeof(Js::CallSiteInfo));
- data->profiledCallSiteCount = functionBody->GetProfiledCallSiteCount();
- data->callSiteData = reinterpret_cast<CallSiteIDL*>(profileInfo->GetCallSiteInfo());
- CompileAssert(sizeof(BVUnitIDL) == sizeof(BVUnit));
- data->loopFlags = (BVFixedIDL*)profileInfo->GetLoopFlags();
- CompileAssert(sizeof(ValueType) == sizeof(uint16));
- data->profiledSlotCount = functionBody->GetProfiledSlotCount();
- data->slotData = reinterpret_cast<uint16*>(profileInfo->GetSlotInfo());
- data->profiledReturnTypeCount = functionBody->GetProfiledReturnTypeCount();
- data->returnTypeData = reinterpret_cast<uint16*>(profileInfo->GetReturnTypeInfo());
- data->profiledDivOrRemCount = functionBody->GetProfiledDivOrRemCount();
- data->divideTypeInfo = reinterpret_cast<uint16*>(profileInfo->GetDivideTypeInfo());
- data->profiledSwitchCount = functionBody->GetProfiledSwitchCount();
- data->switchTypeInfo = reinterpret_cast<uint16*>(profileInfo->GetSwitchTypeInfo());
- data->profiledInParamsCount = functionBody->GetProfiledInParamsCount();
- data->parameterInfo = reinterpret_cast<uint16*>(profileInfo->GetParameterInfo());
- data->loopCount = functionBody->GetLoopCount();
- data->loopImplicitCallFlags = reinterpret_cast<byte*>(profileInfo->GetLoopImplicitCallFlags());
- data->implicitCallFlags = static_cast<byte>(profileInfo->GetImplicitCallFlags());
- data->flags = 0;
- data->flags |= profileInfo->IsAggressiveIntTypeSpecDisabled(false) ? Flags_disableAggressiveIntTypeSpec : 0;
- data->flags |= profileInfo->IsAggressiveIntTypeSpecDisabled(true) ? Flags_disableAggressiveIntTypeSpec_jitLoopBody : 0;
- data->flags |= profileInfo->IsAggressiveMulIntTypeSpecDisabled(false) ? Flags_disableAggressiveMulIntTypeSpec : 0;
- data->flags |= profileInfo->IsAggressiveMulIntTypeSpecDisabled(true) ? Flags_disableAggressiveMulIntTypeSpec_jitLoopBody : 0;
- data->flags |= profileInfo->IsDivIntTypeSpecDisabled(false) ? Flags_disableDivIntTypeSpec : 0;
- data->flags |= profileInfo->IsDivIntTypeSpecDisabled(true) ? Flags_disableDivIntTypeSpec_jitLoopBody : 0;
- data->flags |= profileInfo->IsLossyIntTypeSpecDisabled() ? Flags_disableLossyIntTypeSpec : 0;
- data->flags |= profileInfo->IsTrackCompoundedIntOverflowDisabled() ? Flags_disableTrackCompoundedIntOverflow : 0;
- data->flags |= profileInfo->IsFloatTypeSpecDisabled() ? Flags_disableFloatTypeSpec : 0;
- data->flags |= profileInfo->IsArrayCheckHoistDisabled(false) ? Flags_disableArrayCheckHoist : 0;
- data->flags |= profileInfo->IsArrayCheckHoistDisabled(true) ? Flags_disableArrayCheckHoist_jitLoopBody : 0;
- data->flags |= profileInfo->IsArrayMissingValueCheckHoistDisabled(false) ? Flags_disableArrayMissingValueCheckHoist : 0;
- data->flags |= profileInfo->IsArrayMissingValueCheckHoistDisabled(true) ? Flags_disableArrayMissingValueCheckHoist_jitLoopBody : 0;
- data->flags |= profileInfo->IsJsArraySegmentHoistDisabled(false) ? Flags_disableJsArraySegmentHoist : 0;
- data->flags |= profileInfo->IsJsArraySegmentHoistDisabled(true) ? Flags_disableJsArraySegmentHoist_jitLoopBody : 0;
- data->flags |= profileInfo->IsArrayLengthHoistDisabled(false) ? Flags_disableArrayLengthHoist : 0;
- data->flags |= profileInfo->IsArrayLengthHoistDisabled(true) ? Flags_disableArrayLengthHoist_jitLoopBody : 0;
- data->flags |= profileInfo->IsTypedArrayTypeSpecDisabled(false) ? Flags_disableTypedArrayTypeSpec : 0;
- data->flags |= profileInfo->IsTypedArrayTypeSpecDisabled(true) ? Flags_disableTypedArrayTypeSpec_jitLoopBody : 0;
- data->flags |= profileInfo->IsLdLenIntSpecDisabled() ? Flags_disableLdLenIntSpec : 0;
- data->flags |= profileInfo->IsBoundCheckHoistDisabled(false) ? Flags_disableBoundCheckHoist : 0;
- data->flags |= profileInfo->IsBoundCheckHoistDisabled(true) ? Flags_disableBoundCheckHoist_jitLoopBody : 0;
- data->flags |= profileInfo->IsLoopCountBasedBoundCheckHoistDisabled(false) ? Flags_disableLoopCountBasedBoundCheckHoist : 0;
- data->flags |= profileInfo->IsLoopCountBasedBoundCheckHoistDisabled(true) ? Flags_disableLoopCountBasedBoundCheckHoist_jitLoopBody : 0;
- data->flags |= profileInfo->IsFloorInliningDisabled() ? Flags_disableFloorInlining : 0;
- data->flags |= profileInfo->IsNoProfileBailoutsDisabled() ? Flags_disableNoProfileBailouts : 0;
- data->flags |= profileInfo->IsSwitchOptDisabled() ? Flags_disableSwitchOpt : 0;
- data->flags |= profileInfo->IsEquivalentObjTypeSpecDisabled() ? Flags_disableEquivalentObjTypeSpec : 0;
- data->flags |= profileInfo->IsObjTypeSpecDisabledInJitLoopBody() ? Flags_disableObjTypeSpec_jitLoopBody : 0;
- data->flags |= profileInfo->IsMemOpDisabled() ? Flags_disableMemOp : 0;
- data->flags |= profileInfo->IsCheckThisDisabled() ? Flags_disableCheckThis : 0;
- data->flags |= profileInfo->HasLdFldCallSiteInfo() ? Flags_hasLdFldCallSiteInfo : 0;
- data->flags |= profileInfo->IsStackArgOptDisabled() ? Flags_disableStackArgOpt : 0;
- data->flags |= profileInfo->IsLoopImplicitCallInfoDisabled() ? Flags_disableLoopImplicitCallInfo : 0;
- data->flags |= profileInfo->IsPowIntIntTypeSpecDisabled() ? Flags_disablePowIntIntTypeSpec : 0;
- data->flags |= profileInfo->IsTagCheckDisabled() ? Flags_disableTagCheck : 0;
- data->flags |= profileInfo->IsOptimizeTryFinallyDisabled() ? Flags_disableOptimizeTryFinally : 0;
- }
- const Js::LdElemInfo *
- JITTimeProfileInfo::GetLdElemInfo(Js::ProfileId ldElemId) const
- {
- return &(reinterpret_cast<Js::LdElemInfo*>(m_profileData.ldElemData)[ldElemId]);
- }
- const Js::StElemInfo *
- JITTimeProfileInfo::GetStElemInfo(Js::ProfileId stElemId) const
- {
- return &(reinterpret_cast<Js::StElemInfo*>(m_profileData.stElemData)[stElemId]);
- }
- Js::ArrayCallSiteInfo *
- JITTimeProfileInfo::GetArrayCallSiteInfo(Js::ProfileId index) const
- {
- Assert(index < GetProfiledArrayCallSiteCount());
- return &(reinterpret_cast<Js::ArrayCallSiteInfo*>(m_profileData.arrayCallSiteData)[index]);
- }
- intptr_t
- JITTimeProfileInfo::GetArrayCallSiteInfoAddr(Js::ProfileId index) const
- {
- Assert(index < GetProfiledArrayCallSiteCount());
- return m_profileData.arrayCallSiteDataAddr + index * sizeof(ArrayCallSiteIDL);
- }
- Js::FldInfo *
- JITTimeProfileInfo::GetFldInfo(uint fieldAccessId) const
- {
- Assert(fieldAccessId < GetProfiledFldCount());
- return &(reinterpret_cast<Js::FldInfo*>(m_profileData.fldData)[fieldAccessId]);
- }
- intptr_t
- JITTimeProfileInfo::GetFldInfoAddr(uint fieldAccessId) const
- {
- Assert(fieldAccessId < GetProfiledFldCount());
- return m_profileData.fldDataAddr + fieldAccessId * sizeof(Js::FldInfo);
- }
- ValueType
- JITTimeProfileInfo::GetSlotLoad(Js::ProfileId slotLoadId) const
- {
- Assert(slotLoadId < GetProfiledSlotCount());
- return reinterpret_cast<ValueType*>(m_profileData.slotData)[slotLoadId];
- }
- Js::ThisInfo
- JITTimeProfileInfo::GetThisInfo() const
- {
- return *reinterpret_cast<const Js::ThisInfo*>(&m_profileData.thisData);
- }
- ValueType
- JITTimeProfileInfo::GetReturnType(Js::OpCode opcode, Js::ProfileId callSiteId) const
- {
- if (opcode < Js::OpCode::ProfiledReturnTypeCallI || (opcode > Js::OpCode::ProfiledReturnTypeCallIFlags && opcode < Js::OpCode::ProfiledReturnTypeCallIExtended) || opcode > Js::OpCode::ProfiledReturnTypeCallIExtendedFlags)
- {
- Assert(Js::DynamicProfileInfo::IsProfiledCallOp(opcode));
- Assert(callSiteId < GetProfiledCallSiteCount());
- return GetCallSiteInfo()[callSiteId].returnType;
- }
- Assert(Js::DynamicProfileInfo::IsProfiledReturnTypeOp(opcode));
- Assert(callSiteId < GetProfiledReturnTypeCount());
- return reinterpret_cast<ValueType*>(m_profileData.returnTypeData)[callSiteId];
- }
- ValueType
- JITTimeProfileInfo::GetDivProfileInfo(Js::ProfileId divideId) const
- {
- Assert(divideId < GetProfiledDivOrRemCount());
- return reinterpret_cast<ValueType*>(m_profileData.divideTypeInfo)[divideId];
- }
- ValueType
- JITTimeProfileInfo::GetSwitchProfileInfo(Js::ProfileId switchId) const
- {
- Assert(switchId < GetProfiledSwitchCount());
- return reinterpret_cast<ValueType*>(m_profileData.switchTypeInfo)[switchId];
- }
- ValueType
- JITTimeProfileInfo::GetParameterInfo(Js::ArgSlot index) const
- {
- Assert(index < GetProfiledInParamsCount());
- return reinterpret_cast<ValueType*>(m_profileData.parameterInfo)[index];
- }
- Js::ImplicitCallFlags
- JITTimeProfileInfo::GetLoopImplicitCallFlags(uint loopNum) const
- {
- // TODO: michhol OOP JIT, investigate vaibility of reenabling this assert
- // Assert(Js::DynamicProfileInfo::EnableImplicitCallFlags(functionBody));
- Assert(loopNum < GetLoopCount());
- // Mask out the dispose implicit call. We would bailout on reentrant dispose,
- // but it shouldn't affect optimization.
- return (Js::ImplicitCallFlags)(m_profileData.loopImplicitCallFlags[loopNum] & Js::ImplicitCall_All);
- }
- Js::ImplicitCallFlags
- JITTimeProfileInfo::GetImplicitCallFlags() const
- {
- return static_cast<Js::ImplicitCallFlags>(m_profileData.implicitCallFlags);
- }
- Js::LoopFlags
- JITTimeProfileInfo::GetLoopFlags(uint loopNum) const
- {
- Assert(GetLoopFlags() != nullptr);
- return GetLoopFlags()->GetRange<Js::LoopFlags>(loopNum * Js::LoopFlags::COUNT, Js::LoopFlags::COUNT);
- }
- uint16
- JITTimeProfileInfo::GetConstantArgInfo(Js::ProfileId callSiteId) const
- {
- return GetCallSiteInfo()[callSiteId].isArgConstant;
- }
- bool
- JITTimeProfileInfo::IsModulusOpByPowerOf2(Js::ProfileId profileId) const
- {
- return GetDivProfileInfo(profileId).IsLikelyTaggedInt();
- }
- bool
- JITTimeProfileInfo::IsAggressiveIntTypeSpecDisabled(const bool isJitLoopBody) const
- {
- if (isJitLoopBody)
- {
- return TestFlag(Flags_disableAggressiveIntTypeSpec_jitLoopBody);
- }
- else
- {
- return TestFlag(Flags_disableAggressiveIntTypeSpec);
- }
- }
- bool
- JITTimeProfileInfo::IsSwitchOptDisabled() const
- {
- return TestFlag(Flags_disableSwitchOpt);
- }
- bool
- JITTimeProfileInfo::IsEquivalentObjTypeSpecDisabled() const
- {
- return TestFlag(Flags_disableEquivalentObjTypeSpec);
- }
- bool
- JITTimeProfileInfo::IsObjTypeSpecDisabledInJitLoopBody() const
- {
- return TestFlag(Flags_disableObjTypeSpec_jitLoopBody);
- }
- bool
- JITTimeProfileInfo::IsAggressiveMulIntTypeSpecDisabled(const bool isJitLoopBody) const
- {
- if (isJitLoopBody)
- {
- return TestFlag(Flags_disableAggressiveMulIntTypeSpec_jitLoopBody);
- }
- else
- {
- return TestFlag(Flags_disableAggressiveMulIntTypeSpec);
- }
- }
- bool
- JITTimeProfileInfo::IsDivIntTypeSpecDisabled(const bool isJitLoopBody) const
- {
- if (isJitLoopBody)
- {
- return TestFlag(Flags_disableDivIntTypeSpec_jitLoopBody);
- }
- else
- {
- return TestFlag(Flags_disableDivIntTypeSpec);
- }
- }
- bool
- JITTimeProfileInfo::IsLossyIntTypeSpecDisabled() const
- {
- return TestFlag(Flags_disableLossyIntTypeSpec);
- }
- bool
- JITTimeProfileInfo::IsMemOpDisabled() const
- {
- return TestFlag(Flags_disableMemOp);
- }
- bool
- JITTimeProfileInfo::IsTrackCompoundedIntOverflowDisabled() const
- {
- return TestFlag(Flags_disableTrackCompoundedIntOverflow);
- }
- bool
- JITTimeProfileInfo::IsFloatTypeSpecDisabled() const
- {
- return TestFlag(Flags_disableFloatTypeSpec);
- }
- bool
- JITTimeProfileInfo::IsCheckThisDisabled() const
- {
- return TestFlag(Flags_disableCheckThis);
- }
- bool
- JITTimeProfileInfo::IsArrayCheckHoistDisabled(const bool isJitLoopBody) const
- {
- if (isJitLoopBody)
- {
- return TestFlag(Flags_disableArrayCheckHoist_jitLoopBody);
- }
- else
- {
- return TestFlag(Flags_disableArrayCheckHoist);
- }
- }
- bool
- JITTimeProfileInfo::IsArrayMissingValueCheckHoistDisabled(const bool isJitLoopBody) const
- {
- if (isJitLoopBody)
- {
- return TestFlag(Flags_disableArrayMissingValueCheckHoist_jitLoopBody);
- }
- else
- {
- return TestFlag(Flags_disableArrayMissingValueCheckHoist);
- }
- }
- bool
- JITTimeProfileInfo::IsJsArraySegmentHoistDisabled(const bool isJitLoopBody) const
- {
- if (isJitLoopBody)
- {
- return TestFlag(Flags_disableJsArraySegmentHoist_jitLoopBody);
- }
- else
- {
- return TestFlag(Flags_disableJsArraySegmentHoist);
- }
- }
- bool
- JITTimeProfileInfo::IsArrayLengthHoistDisabled(const bool isJitLoopBody) const
- {
- if (isJitLoopBody)
- {
- return TestFlag(Flags_disableArrayLengthHoist_jitLoopBody);
- }
- else
- {
- return TestFlag(Flags_disableArrayLengthHoist);
- }
- }
- bool
- JITTimeProfileInfo::IsTypedArrayTypeSpecDisabled(const bool isJitLoopBody) const
- {
- if (isJitLoopBody)
- {
- return TestFlag(Flags_disableTypedArrayTypeSpec_jitLoopBody);
- }
- else
- {
- return TestFlag(Flags_disableTypedArrayTypeSpec);
- }
- }
- bool
- JITTimeProfileInfo::IsLdLenIntSpecDisabled() const
- {
- return TestFlag(Flags_disableLdLenIntSpec);
- }
- bool
- JITTimeProfileInfo::IsBoundCheckHoistDisabled(const bool isJitLoopBody) const
- {
- if (isJitLoopBody)
- {
- return TestFlag(Flags_disableBoundCheckHoist_jitLoopBody);
- }
- else
- {
- return TestFlag(Flags_disableBoundCheckHoist);
- }
- }
- bool
- JITTimeProfileInfo::IsLoopCountBasedBoundCheckHoistDisabled(const bool isJitLoopBody) const
- {
- if (isJitLoopBody)
- {
- return TestFlag(Flags_disableLoopCountBasedBoundCheckHoist_jitLoopBody);
- }
- else
- {
- return TestFlag(Flags_disableLoopCountBasedBoundCheckHoist);
- }
- }
- bool
- JITTimeProfileInfo::IsStackArgOptDisabled() const
- {
- return TestFlag(Flags_disableStackArgOpt);
- }
- bool
- JITTimeProfileInfo::IsLoopImplicitCallInfoDisabled() const
- {
- return TestFlag(Flags_disableLoopImplicitCallInfo);
- }
- bool
- JITTimeProfileInfo::IsPowIntIntTypeSpecDisabled() const
- {
- return TestFlag(Flags_disablePowIntIntTypeSpec);
- }
- bool
- JITTimeProfileInfo::IsFloorInliningDisabled() const
- {
- return TestFlag(Flags_disableFloorInlining);
- }
- bool
- JITTimeProfileInfo::IsNoProfileBailoutsDisabled() const
- {
- return TestFlag(Flags_disableNoProfileBailouts);
- }
- bool
- JITTimeProfileInfo::IsTagCheckDisabled() const
- {
- return TestFlag(Flags_disableTagCheck);
- }
- bool
- JITTimeProfileInfo::IsOptimizeTryFinallyDisabled() const
- {
- return TestFlag(Flags_disableOptimizeTryFinally);
- }
- bool
- JITTimeProfileInfo::HasLdFldCallSiteInfo() const
- {
- return TestFlag(Flags_hasLdFldCallSiteInfo);
- }
- Js::ProfileId
- JITTimeProfileInfo::GetProfiledArrayCallSiteCount() const
- {
- return static_cast<Js::ProfileId>(m_profileData.profiledArrayCallSiteCount);
- }
- Js::ProfileId
- JITTimeProfileInfo::GetProfiledCallSiteCount() const
- {
- return static_cast<Js::ProfileId>(m_profileData.profiledCallSiteCount);
- }
- Js::ProfileId
- JITTimeProfileInfo::GetProfiledReturnTypeCount() const
- {
- return static_cast<Js::ProfileId>(m_profileData.profiledReturnTypeCount);
- }
- Js::ProfileId
- JITTimeProfileInfo::GetProfiledDivOrRemCount() const
- {
- return static_cast<Js::ProfileId>(m_profileData.profiledDivOrRemCount);
- }
- Js::ProfileId
- JITTimeProfileInfo::GetProfiledSwitchCount() const
- {
- return static_cast<Js::ProfileId>(m_profileData.profiledSwitchCount);
- }
- Js::ProfileId
- JITTimeProfileInfo::GetProfiledSlotCount() const
- {
- return static_cast<Js::ProfileId>(m_profileData.profiledSlotCount);
- }
- Js::ArgSlot
- JITTimeProfileInfo::GetProfiledInParamsCount() const
- {
- return static_cast<Js::ArgSlot>(m_profileData.profiledInParamsCount);
- }
- uint
- JITTimeProfileInfo::GetProfiledFldCount() const
- {
- return m_profileData.inlineCacheCount;
- }
- uint
- JITTimeProfileInfo::GetLoopCount() const
- {
- return m_profileData.loopCount;
- }
- Js::CallSiteInfo *
- JITTimeProfileInfo::GetCallSiteInfo() const
- {
- return reinterpret_cast<Js::CallSiteInfo*>(m_profileData.callSiteData);
- }
- bool
- JITTimeProfileInfo::TestFlag(ProfileDataFlags flag) const
- {
- return (m_profileData.flags & flag) != 0;
- }
- BVFixed *
- JITTimeProfileInfo::GetLoopFlags() const
- {
- return (BVFixed*)m_profileData.loopFlags;
- }
|