This is a final stuff which I'm going to commit.
Any suggestion?
~d
===================================================
We define new section ".profiler" which holds all profiling information.
We define new pseudo operation .profiler which will instruct assembler to
add new profile entry to the object file.
Pseudo-op format:
.profiler flags,.Lprofile_address,symbol_to_profile [,cycle_corrector,extra]
where 'flags' is a combination of the following chars:
s - function entry
x - function exit
i - function is in init section
f - function is in fini section
l - library call
c - libc standard call
d - stack value demand
I - interrupt service routine
P - prologue start
p - prologue end
E - epilogue start
e - epilogue end
j - long jump/ sjlj unwind
a - an arbitrary code fragment
'""' optional: "sil" == sil
.Lprofile_address - an address at which profiling information should be
saved
symbol_to_profile - function address
cycle_corrector - a value which should be added to the cycle counter,
zero if omitted
extra - some extra parameter. TBD. zero if omitted
For example:
------------------------------
.global fxx
.type fxx,@function
fxx:
.LFrameOffset_xxx=0x08
.profiler "scdP", fxx, fxx ; function entry.
; we also demand stack value to be saved
push r11
push r10
push r9
push r8
.Lpstack_check1:
.profiler "cdp",.Lpstack_check1,fxx,0, .LFrameOffset_xxx
; demand stack value at this
point
; (this is a prologue end)
; note, that spare var filled
; with the farme size
mov r15,r8
....
.Lprof_exit0:
.profiler cdE,.Lprof_exit0,fxx
pop r8
pop r9
pop r10
pop r11
.Lprof_exit1:
.profiler xcde,.Lprof_exit1,fxx,3 ; exit adds 3 to the cycle counter
ret ; cause 'ret' insn takes 3 cycles
-------------------------------