GNU Info

Info Node: (gcc-295.info)Profiling

(gcc-295.info)Profiling


Prev: Function Entry Up: Stack and Calling
Enter node , (file) or (file)node

Generating Code for Profiling
-----------------------------

   These macros will help you generate code for profiling.

`FUNCTION_PROFILER (FILE, LABELNO)'
     A C statement or compound statement to output to FILE some
     assembler code to call the profiling subroutine `mcount'.  Before
     calling, the assembler code must load the address of a counter
     variable into a register where `mcount' expects to find the
     address.  The name of this variable is `LP' followed by the number
     LABELNO, so you would generate the name using `LP%d' in a
     `fprintf'.

     The details of how the address should be passed to `mcount' are
     determined by your operating system environment, not by GNU CC.  To
     figure them out, compile a small program for profiling using the
     system's installed C compiler and look at the assembler code that
     results.

`NO_PROFILE_COUNTERS'
     Define this macro if the `mcount' subroutine on your system does
     not need a counter variable allocated for each function.  This is
     true for almost all modern implementations.  If you define this
     macro, you must not use the LABELNO argument to
     `FUNCTION_PROFILER'.

`PROFILE_BEFORE_PROLOGUE'
     Define this macro if the code for function profiling should come
     before the function prologue.  Normally, the profiling code comes
     after.

`FUNCTION_BLOCK_PROFILER (FILE, LABELNO)'
     A C statement or compound statement to output to FILE some
     assembler code to initialize basic-block profiling for the current
     object module.  The global compile flag `profile_block_flag'
     distinguishes two profile modes.

    `profile_block_flag != 2'
          Output code to call the subroutine `__bb_init_func' once per
          object module, passing it as its sole argument the address of
          a block allocated in the object module.

          The name of the block is a local symbol made with this
          statement:

               ASM_GENERATE_INTERNAL_LABEL (BUFFER, "LPBX", 0);

          Of course, since you are writing the definition of
          `ASM_GENERATE_INTERNAL_LABEL' as well as that of this macro,
          you can take a short cut in the definition of this macro and
          use the name that you know will result.

          The first word of this block is a flag which will be nonzero
          if the object module has already been initialized.  So test
          this word first, and do not call `__bb_init_func' if the flag
          is nonzero.  BLOCK_OR_LABEL contains a unique number which
          may be used to generate a label as a branch destination when
          `__bb_init_func' will not be called.

          Described in assembler language, the code to be output looks
          like:

                 cmp (LPBX0),0
                 bne local_label
                 parameter1 <- LPBX0
                 call __bb_init_func
               local_label:

    `profile_block_flag == 2'
          Output code to call the subroutine `__bb_init_trace_func' and
          pass two parameters to it.  The first parameter is the same as
          for `__bb_init_func'.  The second parameter is the number of
          the first basic block of the function as given by
          BLOCK_OR_LABEL.  Note that `__bb_init_trace_func' has to be
          called, even if the object module has been initialized
          already.

          Described in assembler language, the code to be output looks
          like:
               parameter1 <- LPBX0
               parameter2 <- BLOCK_OR_LABEL
               call __bb_init_trace_func

`BLOCK_PROFILER (FILE, BLOCKNO)'
     A C statement or compound statement to output to FILE some
     assembler code to increment the count associated with the basic
     block number BLOCKNO.  The global compile flag
     `profile_block_flag' distinguishes two profile modes.

    `profile_block_flag != 2'
          Output code to increment the counter directly.  Basic blocks
          are numbered separately from zero within each compilation.
          The count associated with block number BLOCKNO is at index
          BLOCKNO in a vector of words; the name of this array is a
          local symbol made with this statement:

               ASM_GENERATE_INTERNAL_LABEL (BUFFER, "LPBX", 2);

          Of course, since you are writing the definition of
          `ASM_GENERATE_INTERNAL_LABEL' as well as that of this macro,
          you can take a short cut in the definition of this macro and
          use the name that you know will result.

          Described in assembler language, the code to be output looks
          like:

               inc (LPBX2+4*BLOCKNO)

    `profile_block_flag == 2'
          Output code to initialize the global structure `__bb' and
          call the function `__bb_trace_func', which will increment the
          counter.

          `__bb' consists of two words.  In the first word, the current
          basic block number, as given by BLOCKNO, has to be stored.  In
          the second word, the address of a block allocated in the
          object module has to be stored.  The address is given by the
          label created with this statement:

               ASM_GENERATE_INTERNAL_LABEL (BUFFER, "LPBX", 0);

          Described in assembler language, the code to be output looks
          like:
               move BLOCKNO -> (__bb)
               move LPBX0 -> (__bb+4)
               call __bb_trace_func

`FUNCTION_BLOCK_PROFILER_EXIT (FILE)'
     A C statement or compound statement to output to FILE assembler
     code to call function `__bb_trace_ret'.  The assembler code should
     only be output if the global compile flag `profile_block_flag' ==
     2.  This macro has to be used at every place where code for
     returning from a function is generated (e.g. `FUNCTION_EPILOGUE').
     Although you have to write the definition of `FUNCTION_EPILOGUE'
     as well, you have to define this macro to tell the compiler, that
     the proper call to `__bb_trace_ret' is produced.

`MACHINE_STATE_SAVE (ID)'
     A C statement or compound statement to save all registers, which
     may be clobbered by a function call, including condition codes.
     The `asm' statement will be mostly likely needed to handle this
     task.  Local labels in the assembler code can be concatenated with
     the string ID, to obtain a unique lable name.

     Registers or condition codes clobbered by `FUNCTION_PROLOGUE' or
     `FUNCTION_EPILOGUE' must be saved in the macros
     `FUNCTION_BLOCK_PROFILER', `FUNCTION_BLOCK_PROFILER_EXIT' and
     `BLOCK_PROFILER' prior calling `__bb_init_trace_func',
     `__bb_trace_ret' and `__bb_trace_func' respectively.

`MACHINE_STATE_RESTORE (ID)'
     A C statement or compound statement to restore all registers,
     including condition codes, saved by `MACHINE_STATE_SAVE'.

     Registers or condition codes clobbered by `FUNCTION_PROLOGUE' or
     `FUNCTION_EPILOGUE' must be restored in the macros
     `FUNCTION_BLOCK_PROFILER', `FUNCTION_BLOCK_PROFILER_EXIT' and
     `BLOCK_PROFILER' after calling `__bb_init_trace_func',
     `__bb_trace_ret' and `__bb_trace_func' respectively.

`BLOCK_PROFILER_CODE'
     A C function or functions which are needed in the library to
     support block profiling.


automatically generated by info2www version 1.2.2.9