Arquivos
hhvm/hphp/runtime/base/stats.h
T
Kyle Delong a8e3321fbd HPHP/XHP: 'mixed' type in attribute declarations
We'd like to start using ##mixed## instead of ##var## for attribute types to be consistent with Hack. As a followup to this (once released), we would codemod all ##var## to ##mixed##.
2013-07-18 17:28:37 -07:00

272 linhas
8.1 KiB
C++

/*
+----------------------------------------------------------------------+
| HipHop for PHP |
+----------------------------------------------------------------------+
| Copyright (c) 2010-2013 Facebook, Inc. (http://www.facebook.com) |
| Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) |
+----------------------------------------------------------------------+
| This source file is subject to version 2.00 of the Zend license, |
| that is bundled with this package in the file LICENSE, and is |
| available through the world-wide-web at the following url: |
| http://www.zend.com/license/2_00.txt. |
| If you did not receive a copy of the Zend license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
*/
#ifndef STATS_H_
#define STATS_H_
#include "hphp/runtime/vm/hhbc.h"
#include "hphp/util/asm-x64.h"
#include "hphp/util/trace.h"
namespace HPHP {
namespace Transl { class X64Assembler; }
namespace Stats {
#include "hphp/runtime/vm/stats-opcodeDef.h"
#define STATS \
STAT(Instr_TC) \
OPCODES \
STAT(TgtCache_SPropHit) \
STAT(TgtCache_SPropMiss) \
STAT(TgtCache_StaticHit) \
STAT(TgtCache_StaticMiss) \
STAT(TgtCache_ClsCnsHit) \
STAT(TgtCache_ClsCnsMiss) \
STAT(TgtCache_KnownClsHit) \
STAT(TgtCache_KnownClsMiss) \
STAT(TgtCache_FuncDHit) \
STAT(TgtCache_FuncDMiss) \
STAT(TgtCache_CtorDHit) \
STAT(TgtCache_CtorDMiss) \
STAT(TgtCache_CallHit) \
STAT(TgtCache_CallMiss) \
STAT(TgtCache_FixedCallHit) \
STAT(TgtCache_FixedCallMiss) \
STAT(TgtCache_MethodHit) \
STAT(TgtCache_MethodMiss) \
STAT(TgtCache_MethodFast) \
STAT(TgtCache_MethodBypass) \
STAT(TgtCache_GlobalHit) \
STAT(TgtCache_GlobalMiss) \
STAT(TgtCache_StaticMethodHit) \
STAT(TgtCache_StaticMethodMiss) \
STAT(TgtCache_StaticMethodBypass) \
STAT(TgtCache_StaticMethodFHit) \
STAT(TgtCache_StaticMethodFMiss) \
STAT(TgtCache_StaticMethodFBypass) \
STAT(TgtCache_StaticMethodFFill) \
STAT(TgtCache_ClassExistsHit) \
STAT(TgtCache_ClassExistsMiss) \
STAT(Tx64_FusedTypeCheck) \
STAT(Tx64_UnfusedTypeCheck) \
STAT(Tx64_VerifyParamTypeSlow) \
STAT(Tx64_VerifyParamTypeFast) \
STAT(Tx64_VerifyParamTypeBit) \
STAT(Tx64_VerifyParamTypeSlowShortcut) \
STAT(Tx64_VerifyParamTypePass) \
STAT(Tx64_VerifyParamTypeEqual) \
STAT(Tx64_InstanceOfDFused) \
STAT(Tx64_InstanceOfDBypass) \
STAT(Tx64_InstanceOfDInterface) \
STAT(Tx64_InstanceOfDSlow) \
STAT(Tx64_InstanceOfDFast) \
STAT(Tx64_InstanceOfDBit) \
STAT(Tx64_InstanceOfDEqual) \
STAT(Tx64_InstanceOfDFinalTrue) \
STAT(Tx64_InstanceOfDFinalFalse) \
STAT(Tx64_CGetMLEE) \
STAT(Tx64_CGetMGE) \
STAT(Tx64_CGetMArray) \
STAT(Tx64_CGetMGeneric) \
STAT(Tx64_MLitKey) \
STAT(Tx64_MRegKey) \
STAT(Tx64_MTVKey) \
STAT(Tx64_CnsFast) \
STAT(Tx64_CnsSlow) \
STAT(Tx64_ContCreateFast) \
STAT(Tx64_ContCreateSlow) \
STAT(Tx64_ContUnpackFast) \
STAT(Tx64_ContUnpackSlow) \
STAT(Tx64_ContPackFast) \
STAT(Tx64_ContPackSlow) \
STAT(Tx64_Spill) \
STAT(Tx64_SpillHome) \
STAT(Tx64_ClassExistsFast) \
STAT(Tx64_ClassExistsSlow) \
STAT(Tx64_StaticLocFast) \
STAT(Tx64_StaticLocSlow) \
STAT(Tx64_OneGuardShort) \
STAT(Tx64_OneGuardLong) \
STAT(Tx64_SideExit) \
STAT(Tx64_SideExitClean) \
STAT(Tx64_NewInstancePropCheck) \
STAT(Tx64_NewInstancePropInit) \
STAT(Tx64_NewInstanceSPropCheck) \
STAT(Tx64_NewInstanceSPropInit) \
STAT(Tx64_NewInstanceNoCtorFast) \
STAT(Tx64_NewInstanceNoCtor) \
STAT(Tx64_NewInstanceFast) \
STAT(Tx64_NewInstanceGeneric) \
STAT(Tx64_StringSwitchSlow) \
STAT(Tx64_StringSwitchFast) \
STAT(Tx64_StringSwitchHit) \
STAT(Tx64_StringSwitchChain) \
STAT(Tx64_StringSwitchFailFast) \
STAT(Tx64_StringSwitchFailSlow) \
/* Type prediction stats */ \
STAT(TypePred_Insert) \
STAT(TypePred_Evict) \
STAT(TypePred_Hit) \
STAT(TypePred_Miss) \
STAT(TypePred_MissTooFew) \
STAT(TypePred_MissTooWeak) \
/* Translation cache statistics */ \
STAT(TC_MissPMain) \
STAT(TC_MissWriteLease) \
STAT(TC_Hit) \
STAT(TC_Sync) \
STAT(TC_SyncUnwind) \
STAT(TC_TypePredHit) \
STAT(TC_TypePredMiss) \
STAT(TC_TypePredUnneeded) \
STAT(TC_TypePredOverridden) \
STAT(TC_CatchTrace) \
STAT(TC_CatchSideExit) \
STAT(TC_SetMStrGuess_Hit) \
STAT(TC_SetMStrGuess_Miss) \
/* Fixup */ \
STAT(Fixup_Find) \
STAT(Fixup_Probe) \
/* Execute pseudomain */ \
STAT(PseudoMain_Reentered) \
STAT(PseudoMain_Executed) \
STAT(PseudoMain_Skipped) \
STAT(PseudoMain_SkipDeep) \
STAT(PseudoMain_Guarded) \
STAT(Cont_CreateVerySlow) \
STAT(Cont_UnpackVerySlow) \
STAT(Cont_PackVerySlow) \
STAT(VMEnter) \
STAT(TraceletGuard_enter) \
STAT(TraceletGuard_branch) \
STAT(TraceletGuard_execute) \
/* Unit merging stats */ \
STAT(UnitMerge_hoistable) \
STAT(UnitMerge_hoistable_persistent) \
STAT(UnitMerge_hoistable_persistent_cache) \
STAT(UnitMerge_hoistable_persistent_parent) \
STAT(UnitMerge_hoistable_persistent_parent_cache) \
STAT(UnitMerge_mergeable) \
STAT(UnitMerge_mergeable_unique) \
STAT(UnitMerge_mergeable_unique_persistent) \
STAT(UnitMerge_mergeable_unique_persistent_cache) \
STAT(UnitMerge_mergeable_define) \
STAT(UnitMerge_mergeable_global) \
STAT(UnitMerge_mergeable_class) \
STAT(UnitMerge_mergeable_require) \
STAT(UnitMerge_redo_hoistable) \
/* property getter stats */ \
STAT(PropAsm_Generic) \
STAT(PropAsm_Specialized) \
STAT(PropAsm_GenFinal) \
/* astubs stats */ \
STAT(Astubs_New) \
STAT(Astubs_Reused) \
/* HphpArray */ \
STAT(HA_FindIntFast) \
STAT(HA_FindIntSlow) \
/* Switches */ \
STAT(Switch_Generic) \
STAT(Switch_Integer) \
STAT(Switch_String) \
enum StatCounter {
#define STAT(name) \
name,
STATS
#undef STAT
kNumStatCounters
};
#undef O
extern const char* g_counterNames[kNumStatCounters];
extern __thread uint64_t tl_counters[kNumStatCounters];
extern __thread uint64_t tl_helper_counters[];
extern const char* volatile helperNames[];
inline bool enabled() {
return Trace::moduleEnabled(Trace::stats, 1);
}
inline bool enabledAny() {
return enabled() || Trace::moduleEnabled(Trace::statgroups);
}
inline bool enableInstrCount() {
return Trace::moduleEnabled(Trace::stats, 2);
}
inline void inc(StatCounter stat, int n = 1) {
if (enabled()) {
tl_counters[stat] += n;
}
}
static_assert(static_cast<uint64_t>(OpLowInvalid) == 0,
"stats.h assumes OpLowInvalid == 0");
inline StatCounter opcodeToStatCounter(Op opc) {
return StatCounter(Instr_InterpBBLowInvalid +
STATS_PER_OPCODE * uint8_t(opc));
}
inline void incOp(Op opc) {
inc(opcodeToStatCounter(opc));
}
inline StatCounter opcodeToTranslStatCounter(Op opc) {
return StatCounter(Instr_TranslLowInvalid +
STATS_PER_OPCODE * uint8_t(opc));
}
inline StatCounter opcodeToIRPreStatCounter(Op opc) {
return StatCounter(Instr_TranslIRPreLowInvalid +
STATS_PER_OPCODE * uint8_t(opc));
}
inline StatCounter opcodeToIRPostStatCounter(Op opc) {
return StatCounter(Instr_TranslIRPostLowInvalid +
STATS_PER_OPCODE * uint8_t(opc));
}
// Both emitIncs use r10.
extern void emitInc(Transl::X64Assembler& a,
uint64_t* tl_table,
uint index,
int n = 1,
Transl::ConditionCode cc = Transl::CC_None,
bool force = false);
inline void emitInc(Transl::X64Assembler& a, StatCounter stat, int n = 1,
Transl::ConditionCode cc = Transl::CC_None,
bool force = false) {
emitInc(a, &tl_counters[0], stat, n, cc, force);
}
extern void emitIncTranslOp(Transl::X64Assembler& a, Op opc,
bool force = false);
extern void init();
extern void dump();
extern void clear();
void incStatGrouped(const StringData* cat, const StringData* name, int n = 1);
} }
#endif