mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			67 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			HTML
		
	
	
	
			
		
		
	
	
			67 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			HTML
		
	
	
	
| <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 | ||
| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>Developer Information</title><meta name="generator" content="DocBook XSL-NS Stylesheets V1.78.1" /><meta name="keywords" content="C++, library, profile" /><meta name="keywords" content="ISO C++, library" /><meta name="keywords" content="ISO C++, runtime, library" /><link rel="home" href="../index.html" title="The GNU C++ Library" /><link rel="up" href="profile_mode.html" title="Chapter 19. Profile Mode" /><link rel="prev" href="profile_mode_impl.html" title="Implementation Issues" /><link rel="next" href="profile_mode_diagnostics.html" title="Diagnostics" /></head><body><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Developer Information</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="profile_mode_impl.html">Prev</a> </td><th width="60%" align="center">Chapter 19. Profile Mode</th><td width="20%" align="right"> <a accesskey="n" href="profile_mode_diagnostics.html">Next</a></td></tr></table><hr /></div><div class="section"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="manual.ext.profile_mode.developer"></a>Developer Information</h2></div></div></div><div class="section"><div class="titlepage"><div><div><h3 class="title"><a id="manual.ext.profile_mode.developer.bigpic"></a>Big Picture</h3></div></div></div><p>The profile mode headers are included with
 | ||
|    <code class="code">-D_GLIBCXX_PROFILE</code> through preprocessor directives in
 | ||
|    <code class="code">include/std/*</code>.
 | ||
|   </p><p>Instrumented implementations are provided in
 | ||
|    <code class="code">include/profile/*</code>.  All instrumentation hooks are macros
 | ||
|    defined in <code class="code">include/profile/profiler.h</code>.
 | ||
|   </p><p>All the implementation of the instrumentation hooks is in
 | ||
|    <code class="code">include/profile/impl/*</code>.  Although all the code gets included,
 | ||
|    thus is publicly visible, only a small number of functions are called from
 | ||
|    outside this directory.  All calls to hook implementations must be
 | ||
|    done through macros defined in <code class="code">profiler.h</code>.  The macro
 | ||
|    must ensure (1) that the call is guarded against reentrance and
 | ||
|    (2) that the call can be turned off at compile time using a
 | ||
|    <code class="code">-D_GLIBCXX_PROFILE_...</code> compiler option.
 | ||
|   </p></div><div class="section"><div class="titlepage"><div><div><h3 class="title"><a id="manual.ext.profile_mode.developer.howto"></a>How To Add A Diagnostic</h3></div></div></div><p>Let's say the diagnostic name is "magic".
 | ||
|   </p><p>If you need to instrument a header not already under
 | ||
|    <code class="code">include/profile/*</code>, first edit the corresponding header
 | ||
|    under <code class="code">include/std/</code> and add a preprocessor directive such
 | ||
|    as the one in <code class="code">include/std/vector</code>:
 | ||
| </p><pre class="programlisting">
 | ||
| #ifdef _GLIBCXX_PROFILE
 | ||
| # include <profile/vector>
 | ||
| #endif
 | ||
| </pre><p>
 | ||
|   </p><p>If the file you need to instrument is not yet under
 | ||
|    <code class="code">include/profile/</code>, make a copy of the one in
 | ||
|    <code class="code">include/debug</code>, or the main implementation.
 | ||
|    You'll need to include the main implementation and inherit the classes
 | ||
|    you want to instrument.  Then define the methods you want to instrument,
 | ||
|    define the instrumentation hooks and add calls to them.
 | ||
|    Look at <code class="code">include/profile/vector</code> for an example.
 | ||
|   </p><p>Add macros for the instrumentation hooks in
 | ||
|    <code class="code">include/profile/impl/profiler.h</code>.
 | ||
|    Hook names must start with <code class="code">__profcxx_</code>.
 | ||
|    Make sure they transform
 | ||
|    in no code with <code class="code">-D_NO_GLBICXX_PROFILE_MAGIC</code>.
 | ||
|    Make sure all calls to any method in namespace <code class="code">__gnu_profile</code>
 | ||
|    is protected against reentrance using macro
 | ||
|    <code class="code">_GLIBCXX_PROFILE_REENTRANCE_GUARD</code>.
 | ||
|    All names of methods in namespace <code class="code">__gnu_profile</code> called from
 | ||
|    <code class="code">profiler.h</code> must start with <code class="code">__trace_magic_</code>.
 | ||
|   </p><p>Add the implementation of the diagnostic.
 | ||
|    </p><div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"><p>
 | ||
|       Create new file <code class="code">include/profile/impl/profiler_magic.h</code>.
 | ||
|      </p></li><li class="listitem"><p>
 | ||
|       Define class <code class="code">__magic_info: public __object_info_base</code>.
 | ||
|       This is the representation of a line in the object table.
 | ||
|       The <code class="code">__merge</code> method is used to aggregate information
 | ||
|       across all dynamic instances created at the same call context.
 | ||
|       The <code class="code">__magnitude</code> must return the estimation of the benefit
 | ||
|       as a number of small operations, e.g., number of words copied.
 | ||
|       The <code class="code">__write</code> method is used to produce the raw trace.
 | ||
|       The <code class="code">__advice</code> method is used to produce the advice string.
 | ||
|      </p></li><li class="listitem"><p>
 | ||
|       Define class <code class="code">__magic_stack_info: public __magic_info</code>.
 | ||
|       This defines the content of a line in the stack table.
 | ||
|      </p></li><li class="listitem"><p>
 | ||
|       Define class <code class="code">__trace_magic: public __trace_base<__magic_info,
 | ||
|       __magic_stack_info></code>.
 | ||
|       It defines the content of the trace associated with this diagnostic.
 | ||
|      </p></li></ul></div><p>
 | ||
|   </p><p>Add initialization and reporting calls in
 | ||
|    <code class="code">include/profile/impl/profiler_trace.h</code>.  Use
 | ||
|    <code class="code">__trace_vector_to_list</code> as an example.
 | ||
|   </p><p>Add documentation in file <code class="code">doc/xml/manual/profile_mode.xml</code>.
 | ||
|   </p></div></div><div class="navfooter"><hr /><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="profile_mode_impl.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="profile_mode.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="profile_mode_diagnostics.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Implementation Issues </td><td width="20%" align="center"><a accesskey="h" href="../index.html">Home</a></td><td width="40%" align="right" valign="top"> Diagnostics</td></tr></table></div></body></html> |