as: MSP430 Profiling Capability

 
 9.28.6 Profiling Capability
 ---------------------------
 
 It is a performance hit to use gcc's profiling approach for this tiny
 target.  Even more - jtag hardware facility does not perform any
 profiling functions.  However we've got gdb's built-in simulator where
 we can do anything.
 
    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.  Profile
 should take place at the present address.
 
    Pseudo operation format:
 
    '.profiler flags,function_to_profile [, cycle_corrector, extra]'
 
    where:
 
           'flags' is a combination of the following characters:
 
      '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
      't'
           extra parameter saved (a constant value like frame size)
 
 'function_to_profile'
      a function address
 'cycle_corrector'
      a value which should be added to the cycle counter, zero if
      omitted.
 'extra'
      any extra parameter, zero if omitted.
 
    For example:
      .global fxx
      .type fxx,@function
      fxx:
      .LFrameOffset_fxx=0x08
      .profiler "scdP", fxx     ; function entry.
      			  ; we also demand stack value to be saved
        push r11
        push r10
        push r9
        push r8
      .profiler "cdpt",fxx,0, .LFrameOffset_fxx  ; check stack value at this point
      					  ; (this is a prologue end)
      					  ; note, that spare var filled with
      					  ; the farme size
        mov r15,r8
      ...
      .profiler cdE,fxx         ; check stack
        pop r8
        pop r9
        pop r10
        pop r11
      .profiler xcde,fxx,3      ; exit adds 3 to the cycle counter
        ret                     ; cause 'ret' insn takes 3 cycles