This document describes how to use internal
profiler tool (iprof) for Jitrino.OPT
code generator.
It is able to instrument the code in such way that
per-method counters of _executed_ (not just compiled) instructions can be
dumped.
* put extra options: -Djit.arg.codegen.iprof=on
–XcleanupOnExit
* put iprof.cfg in the same dir where you are
starting DRLVM
iprof.cfg consists of a list of global parameters and a list of counters.
Available global parameters:
Config.PrintBBStats=false #(boolean)This parameter turns on statistics dumping for all
basic block of a method
Counters collect information about executed
instructions defined by filter.
Counter attributes:
1) Name. Identifies counter
2) Title. Title for dumped column,
optional
3) Filter. List of properties of
instructions to count
Examples:
###########[begin]Counter.CALL.Mnemonic=CALL
[end] [begin]Counter.AddCounter.Title=ADD_EAX_COUNTER
Counter.AddCounter.Mnemonic=ADD
Counter.AddCounter.Operand.0.RegName=EAX[end]###########
Name of a counter is defined by the first line in
a [begin]/[end] section starting with 'Counter.'.
Symbols between 'Counter.' and next ‘.‘ or ‘=‘ or ‘\n‘
are the name of the counter.
You should place filter parameters after the name
of a counter. It's possible to set properties of instruction (mnemonic, number
of operands), properites of particular operand (area
of placement, etc.) or
runtime information (whether call is helper, helper name, etc.) See the list of
filter parameters below
All of
instruction properties corresponds to names of entities of Jitrino
IA32 Code generator:
Mnemonic_CALL => CALL
OpndKind_Mem => Mem
All filter parameters can be considered as parts
of AND-expression. There is special filter attribute “IsOr”
provides OR-operation for ALL filter parameters:
Counter.Name0.IsOr=trueOperand attributes:
Operand.OpNum Operand number (can be *)
Operand.OpNum.OpndRole Operand role
Operand.OpNum.OpndKind Operand kind
Operand.OpNum.RegName Register name
Operand.OpNum.MemOpndKind Memory operand kind
Instruction
attributes:
Mnemonic Instruction mnemonicOperandNumber Number of operands
Runtime
information attributes:
RuntimeInfo.Kind Runtime information kind
RuntimeInfo.HelperID VM Helper identifier
RuntimeInfo.IntHelperName Internal helper name
Call instruction attributes (counter doesn't work
for other instructions):
isNative
isStatic
isSynchronized
isNoInlining
isInstance
isFinal
isVirtual
isAbstract
isClassInitializer
isInstanceInitializer
isStrict
isRequireSecObject
isInitLocals
isOverridden
Filter parameters of any counter can be reused and
extended by other counter:
[begin]Counter.CALL_Inst.Mnemonic=CALL
[end][begin]Counter.I_HELPER_CALL=CALL_Inst
Counter.I_HELPER_CALL.RuntimeInfo.Kind=InternalHelperAddress
[end]WARNING
"space"
characters should not be used outside comments
"iprof"
creates the file "iprof.stat" (on exit of
DRLVM session) in the same dir where you are starting DRLVM with "tabbed text" format editable
by spreadsheets.
Config.PrintBBStats=true
[begin]#for counting of all instructions you can specify any word as MnemonicCounter.Insts.Mnemonic=Any
[end] #hardcoded counters with only parameter "title"###############################################[begin]#Size of java bytecode of a methodCounter.ByteCodeSize
[end]#[begin]#Number of execution times of the hottest basic block of a methodCounter.MaxBBExec
[end][begin]##ID nuber of the hottest basic blockCounter.HottestBBNum
[end]#[begin]##Number of exception handlers of a methodCounter.ExcHandlersNum
[end]#[begin]#Number of calls of a methodCounter.MethodExec
Counter.MethodExec.Title=Number of calls of a method
[end]#[begin]#Basic block execution count Counter.BBExec
[end]################################################[begin]Counter.OpNum.OpndNumber=3
[end][begin]#count instructions with memory access in first five operandsCounter.MemOpnd.IsOR=true
Counter.MemOpnd.Operand.*.OpndKind=Mem
#Counter.MemOpnd.Operand.1.OpndKind=Mem[end][begin]Counter.UseOpnd.Operand.0.OpndRole=Use[end][begin]Counter.EAXOpnd.Operand.0.RegName=EAX[end][begin]Counter.HeapOpnd.Operand.0.MemOpndKind=Heap[end][begin]Counter.Method.isNative=true
Counter.Method.isStatic=true
Counter.Method.isSynchronized=true
Counter.Method.isNoInlining=true
Counter.Method.isInstance=true
Counter.Method.isFinal=true
Counter.Method.isVirtual=true
Counter.Method.isAbstract=true
Counter.Method.isClassInitializer=true
Counter.Method.isInstanceInitializer=true
Counter.Method.isStrict=true
Counter.Method.isRequireSecObject=true
Counter.Method.isInitLocals=true
Counter.Method.isOverridden=true
[end] [begin]Counter.CALL.Mnemonic=CALL
[end][begin]Counter.I_HELPER_CALL=CALL
Counter.I_HELPER_CALL.RuntimeInfo.Kind=InternalHelperAddress
[end][begin]Counter.HELPER_CALL=CALL
Counter.HELPER_CALL.RuntimeInfo.Kind=HelperAddress
Counter.HELPER_CALL.RuntimeInfo.HelperID=LdString
[end]