mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			50 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			HTML
		
	
	
	
			
		
		
	
	
			50 lines
		
	
	
		
			5.8 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>Implementation Issues</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_cost_model.html" title="Empirical Cost Model" /><link rel="next" href="profile_mode_devel.html" title="Developer Information" /></head><body><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Implementation Issues</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="profile_mode_cost_model.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_devel.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.implementation"></a>Implementation Issues</h2></div></div></div><div class="section"><div class="titlepage"><div><div><h3 class="title"><a id="manual.ext.profile_mode.implementation.stack"></a>Stack Traces</h3></div></div></div><p>
 | ||
|   Accurate stack traces are needed during profiling since we group events by
 | ||
|   call context and dynamic instance.  Without accurate traces, diagnostics
 | ||
|   may be hard to interpret.  For instance, when giving advice to the user
 | ||
|   it is imperative to reference application code, not library code.
 | ||
|   </p><p>
 | ||
|   Currently we are using the libc <code class="code">backtrace</code> routine to get
 | ||
|   stack traces.
 | ||
|   <code class="code">_GLIBCXX_PROFILE_STACK_DEPTH</code> can be set
 | ||
|   to 0 if you are willing to give up call context information, or to a small
 | ||
|   positive value to reduce run time overhead.
 | ||
|   </p></div><div class="section"><div class="titlepage"><div><div><h3 class="title"><a id="manual.ext.profile_mode.implementation.symbols"></a>Symbolization of Instruction Addresses</h3></div></div></div><p>
 | ||
|   The profiling and analysis phases use only instruction addresses.
 | ||
|   An external utility such as addr2line is needed to postprocess the result.
 | ||
|   We do not plan to add symbolization support in the profile extension.
 | ||
|   This would require access to symbol tables, debug information tables,
 | ||
|   external programs or libraries and other system dependent information.
 | ||
|   </p></div><div class="section"><div class="titlepage"><div><div><h3 class="title"><a id="manual.ext.profile_mode.implementation.concurrency"></a>Concurrency</h3></div></div></div><p>
 | ||
|   Our current model is simplistic, but precise.
 | ||
|   We cannot afford to approximate because some of our diagnostics require
 | ||
|   precise matching of operations to container instance and call context.
 | ||
|   During profiling, we keep a single information table per diagnostic.
 | ||
|   There is a single lock per information table.
 | ||
|   </p></div><div class="section"><div class="titlepage"><div><div><h3 class="title"><a id="manual.ext.profile_mode.implementation.stdlib-in-proflib"></a>Using the Standard Library in the Instrumentation Implementation</h3></div></div></div><p>
 | ||
|   As much as we would like to avoid uses of libstdc++ within our
 | ||
|   instrumentation library, containers such as unordered_map are very
 | ||
|   appealing.  We plan to use them as long as they are named properly
 | ||
|   to avoid ambiguity.
 | ||
|   </p></div><div class="section"><div class="titlepage"><div><div><h3 class="title"><a id="manual.ext.profile_mode.implementation.malloc-hooks"></a>Malloc Hooks</h3></div></div></div><p>
 | ||
|   User applications/libraries can provide malloc hooks.
 | ||
|   When the implementation of the malloc hooks uses stdlibc++, there can
 | ||
|   be an infinite cycle between the profile mode instrumentation and the
 | ||
|   malloc hook code.
 | ||
|   </p><p>
 | ||
|   We protect against reentrance to the profile mode instrumentation code,
 | ||
|   which should avoid this problem in most cases.
 | ||
|   The protection mechanism is thread safe and exception safe.
 | ||
|   This mechanism does not prevent reentrance to the malloc hook itself,
 | ||
|   which could still result in deadlock, if, for instance, the malloc hook
 | ||
|   uses non-recursive locks.
 | ||
|   XXX: A definitive solution to this problem would be for the profile extension
 | ||
|   to use a custom allocator internally, and perhaps not to use libstdc++.
 | ||
|   </p></div><div class="section"><div class="titlepage"><div><div><h3 class="title"><a id="manual.ext.profile_mode.implementation.construction-destruction"></a>Construction and Destruction of Global Objects</h3></div></div></div><p>
 | ||
|   The profiling library state is initialized at the first call to a profiling
 | ||
|   method.  This allows us to record the construction of all global objects.
 | ||
|   However, we cannot do the same at destruction time.  The trace is written
 | ||
|   by a function registered by <code class="code">atexit</code>, thus invoked by
 | ||
|   <code class="code">exit</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_cost_model.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_devel.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Empirical Cost Model </td><td width="20%" align="center"><a accesskey="h" href="../index.html">Home</a></td><td width="40%" align="right" valign="top"> Developer Information</td></tr></table></div></body></html> |