blob: 0c715d67d794a4980dd8c668cbe22e5082181f29 [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
// forward decls
class AsmJsJITInfo;
class JITTimeProfileInfo;
class FunctionJITRuntimeInfo;
class JITRecyclableObject;
class JITTimeFunctionBody
{
public:
JITTimeFunctionBody(FunctionBodyDataIDL * bodyData);
static void InitializeJITFunctionData(
__in ArenaAllocator * arena,
__in Js::FunctionBody * functionBody,
__out FunctionBodyDataIDL * jitBody);
intptr_t GetAddr() const;
uint GetFunctionNumber() const;
uint GetSourceContextId() const;
uint GetNestedCount() const;
uint GetScopeSlotArraySize() const;
uint GetParamScopeSlotArraySize() const;
uint GetByteCodeCount() const;
uint GetByteCodeInLoopCount() const;
uint GetNonLoadByteCodeCount() const;
uint GetLoopCount() const;
uint GetByteCodeLength() const;
uint GetInnerScopeCount() const;
uint GetInlineCacheCount() const;
uint GetRecursiveCallSiteCount() const;
uint GetForInLoopDepth() const;
Js::RegSlot GetLocalFrameDisplayReg() const;
Js::RegSlot GetLocalClosureReg() const;
Js::RegSlot GetEnvReg() const;
Js::RegSlot GetFirstTmpReg() const;
Js::RegSlot GetFirstInnerScopeReg() const;
Js::RegSlot GetVarCount() const;
Js::RegSlot GetConstCount() const;
Js::RegSlot GetLocalsCount() const;
Js::RegSlot GetTempCount() const;
Js::RegSlot GetFuncExprScopeReg() const;
Js::RegSlot GetThisRegForEventHandler() const;
Js::RegSlot GetFirstNonTempLocalIndex() const;
Js::RegSlot GetEndNonTempLocalIndex() const;
Js::RegSlot GetNonTempLocalVarCount() const;
Js::RegSlot GetRestParamRegSlot() const;
Js::RegSlot GetParamClosureReg() const;
Js::PropertyId GetPropertyIdFromCacheId(uint cacheId) const;
Js::PropertyId GetReferencedPropertyId(uint index) const;
uint16 GetEnvDepth() const;
uint16 GetArgUsedForBranch() const;
Js::ProfileId GetProfiledCallSiteCount() const;
Js::ArgSlot GetInParamsCount() const;
bool DoStackNestedFunc() const;
bool DoStackClosure() const;
bool DoBackendArgumentsOptimization() const;
bool IsLibraryCode() const;
bool HasTry() const;
bool HasThis() const;
bool HasFinally() const;
bool HasOrParentHasArguments() const;
bool IsGenerator() const;
bool IsCoroutine() const;
bool IsLambda() const;
bool IsAsmJsMode() const;
bool IsWasmFunction() const;
bool UsesWAsmJsFastVirtualBuffer() const;
bool IsStrictMode() const;
bool IsEval() const;
bool HasImplicitArgIns() const;
bool HasRestParameter() const;
bool HasScopeObject() const;
bool HasCachedScopePropIds() const;
bool HasInlineCachesOnFunctionObject() const;
bool DoInterruptProbe() const;
bool IsGlobalFunc() const;
void DisableInlineApply();
bool IsInlineApplyDisabled() const;
bool IsNonTempLocalVar(uint32 varIndex) const;
bool DoJITLoopBody() const;
bool IsInlineSpreadDisabled() const;
void DisableInlineSpread();
bool HasLoops() const;
bool HasNonBuiltInCallee() const;
bool HasNestedLoop() const;
bool UsesArgumentsObject() const;
bool IsParamAndBodyScopeMerged() const;
bool CanInlineRecursively(uint depth, bool tryAggressive = true) const;
bool NeedScopeObjectForArguments(bool hasNonSimpleParams) const;
bool GetDoScopeObjectCreation() const;
void EnsureConsistentConstCount() const;
bool HasComputedName() const;
bool HasHomeObj() const;
const byte * GetByteCodeBuffer() const;
StatementMapIDL * GetFullStatementMap() const;
uint GetFullStatementMapCount() const;
void * ReadFromAuxData(uint offset) const;
void * ReadFromAuxContextData(uint offset) const;
Js::FunctionInfoPtrPtr GetNestedFuncRef(uint index) const;
intptr_t GetConstantVar(Js::RegSlot location) const;
JITRecyclableObject * GetConstantContent(Js::RegSlot location) const;
template<class T>
T* GetConstAsT(Js::RegSlot location) const
{
Assert(m_bodyData.constTableContent != nullptr);
Assert(m_bodyData.constTableContent->content != nullptr);
Assert(location < GetConstCount());
Assert(location != 0);
auto obj = m_bodyData.constTableContent->content[location - Js::FunctionBody::FirstRegSlot];
Assert(obj);
obj->vtbl = VirtualTableInfo<T>::Address;
//Assert(T::Is(obj));
return (T*)obj;
}
template<>
Js::JavascriptNumber* GetConstAsT<Js::JavascriptNumber>(Js::RegSlot location) const
{
Assert(m_bodyData.constTableContent != nullptr);
Assert(m_bodyData.constTableContent->content != nullptr);
Assert(location < GetConstCount());
Assert(location != 0);
#if !FLOATVAR
auto obj = m_bodyData.constTableContent->content[location - Js::FunctionBody::FirstRegSlot];
if (!obj)
{
#endif
Js::JavascriptNumber* num = (Js::JavascriptNumber*)GetConstantVar(location);
Assert(Js::TaggedNumber::Is(num));
return num;
#if !FLOATVAR
}
Assert(obj);
obj->vtbl = VirtualTableInfo<Js::JavascriptNumber>::Address;
Assert(Js::JavascriptNumber::Is(obj));
return (Js::JavascriptNumber*)obj;
#endif
}
intptr_t GetInlineCache(uint index) const;
intptr_t GetIsInstInlineCache(uint index) const;
Js::TypeId GetConstantType(Js::RegSlot location) const;
void * GetConstTable() const;
intptr_t GetRootObject() const;
intptr_t GetLoopHeaderAddr(uint loopNum) const;
const JITLoopHeaderIDL * GetLoopHeaderData(uint loopNum) const;
intptr_t GetScriptIdAddr() const;
intptr_t GetProbeCountAddr() const;
intptr_t GetFlagsAddr() const;
intptr_t GetRegAllocLoadCountAddr() const;
intptr_t GetRegAllocStoreCountAddr() const;
intptr_t GetCallCountStatsAddr() const;
intptr_t GetFormalsPropIdArrayAddr() const;
intptr_t GetObjectLiteralTypeRef(uint index) const;
intptr_t GetLiteralRegexAddr(uint index) const;
uint GetNestedFuncIndexForSlotIdInCachedScope(uint index) const;
const AsmJsJITInfo * GetAsmJsInfo() const;
const JITTimeProfileInfo * GetReadOnlyProfileInfo() const;
JITTimeProfileInfo * GetProfileInfo() const;
bool HasProfileInfo() const;
bool IsRegSlotFormal(Js::RegSlot reg) const;
bool HasPropIdToFormalsMap() const;
Js::ProfileId GetCallApplyCallSiteIdForCallSiteId(Js::ProfileId callSiteId) const;
static bool LoopContains(const JITLoopHeaderIDL * loop1, const JITLoopHeaderIDL * loop2);
char16* GetDisplayName() const;
intptr_t GetAuxDataAddr(uint offset) const;
const Js::PropertyIdArray * ReadPropertyIdArrayFromAuxData(uint offset) const;
Js::PropertyIdArray * GetFormalsPropIdArray() const;
Js::EnumeratorCache * GetForInCache(uint profileId) const;
bool InitializeStatementMap(Js::SmallSpanSequence * statementMap, ArenaAllocator* alloc) const;
private:
Js::FunctionInfo::Attributes GetAttributes() const;
Js::FunctionBody::FunctionBodyFlags GetFlags() const;
FunctionBodyDataIDL m_bodyData;
};