<h2><a name="introduction">Introduction</a></h2>
<!-- *********************************************************************** -->
-<div class="doc_text">
+<div>
<p>This document is the central repository for all information pertaining to
debug information in LLVM. It describes the <a href="#format">actual format
Further, this document provides specific examples of what debug information
for C/C++ looks like.</p>
-</div>
-
<!-- ======================================================================= -->
<h3>
<a name="phil">Philosophy behind LLVM debugging information</a>
</h3>
-<div class="doc_text">
+<div>
<p>The idea of the LLVM debugging information is to capture how the important
pieces of the source-language's Abstract Syntax Tree map onto LLVM code.
<a name="consumers">Debug information consumers</a>
</h3>
-<div class="doc_text">
+<div>
<p>The role of debug information is to provide meta information normally
stripped away during the compilation process. This meta information provides
<a name="debugopt">Debugging optimized code</a>
</h3>
-<div class="doc_text">
+<div>
<p>An extremely high priority of LLVM debugging information is to make it
interact well with optimizations and analysis. In particular, the LLVM debug
as setting program variables, or calling functions that have been
deleted.</li>
- <li>LLVM optimizations gracefully interact with debugging information. If
- they are not aware of debug information, they are automatically disabled
- as necessary in the cases that would invalidate the debug info. This
- retains the LLVM features, making it easy to write new
- transformations.</li>
-
<li>As desired, LLVM optimizations can be upgraded to be aware of the LLVM
debugging information, allowing them to update the debugging information
as they perform aggressive optimizations. This means that, with effort,
the LLVM optimizers could optimize debug code just as well as non-debug
code.</li>
- <li>LLVM debug information does not prevent many important optimizations from
+ <li>LLVM debug information does not prevent optimizations from
happening (for example inlining, basic block reordering/merging/cleanup,
- tail duplication, etc), further reducing the amount of the compiler that
- eventually is "aware" of debugging information.</li>
+ tail duplication, etc).</li>
<li>LLVM debug information is automatically optimized along with the rest of
the program, using existing facilities. For example, duplicate
</div>
+</div>
+
<!-- *********************************************************************** -->
<h2>
<a name="format">Debugging information format</a>
</h2>
<!-- *********************************************************************** -->
-<div class="doc_text">
+<div>
<p>LLVM debugging information has been carefully designed to make it possible
for the optimizer to optimize the program and debugging information without
common to any source-language. The <a href="#ccxx_frontend">next section</a>
describes the data layout conventions used by the C and C++ front-ends.</p>
-</div>
-
<!-- ======================================================================= -->
<h3>
<a name="debug_info_descriptors">Debug information descriptors</a>
</h3>
-<div class="doc_text">
+<div>
<p>In consideration of the complexity and volume of debug information, LLVM
provides a specification for well formed debug descriptors. </p>
of tags are loosely bound to the tag values of DWARF information entries.
However, that does not restrict the use of the information supplied to DWARF
targets. To facilitate versioning of debug information, the tag is augmented
- with the current debug version (LLVMDebugVersion = 8 << 16 or 0x80000 or
- 524288.)</a></p>
+ with the current debug version (LLVMDebugVersion = 8 << 16 or
+ 0x80000 or 524288.)</a></p>
<p>The details of the various descriptors follow.</p>
-</div>
-
<!-- ======================================================================= -->
<h4>
<a name="format_compile_units">Compile unit descriptors</a>
</h4>
-<div class="doc_text">
+<div>
<div class="doc_code">
<pre>
i1, ;; True if this is optimized.
metadata, ;; Flags
i32 ;; Runtime version
+ metadata ;; List of enums types
+ metadata ;; List of retained types
+ metadata ;; List of subprograms
+ metadata ;; List of global variables
}
</pre>
</div>
that produced it.</p>
<p>Compile unit descriptors provide the root context for objects declared in a
- specific compilation unit. File descriptors are defined using this context.</p>
+ specific compilation unit. File descriptors are defined using this context.
+ These descriptors are collected by a named metadata
+ <tt>!llvm.dbg.cu</tt>. Compile unit descriptor keeps track of subprograms,
+ global variables and type information.
</div>
<a name="format_files">File descriptors</a>
</h4>
-<div class="doc_text">
+<div>
<div class="doc_code">
<pre>
;; (DW_TAG_file_type)
metadata, ;; Source file name
metadata, ;; Source file directory (includes trailing slash)
- metadata ;; Reference to compile unit where defined
+ metadata ;; Unused
}
</pre>
</div>
provide context for source line correspondence. </p>
<p>Each input file is encoded as a separate file descriptor in LLVM debugging
- information output. Each file descriptor would be defined using a
- compile unit. </p>
+ information output. </p>
</div>
<a name="format_global_variables">Global variable descriptors</a>
</h4>
-<div class="doc_text">
+<div>
<div class="doc_code">
<pre>
<a name="format_subprograms">Subprogram descriptors</a>
</h4>
-<div class="doc_text">
+<div>
<div class="doc_code">
<pre>
i32, ;; Line number where defined
metadata, ;; Reference to type descriptor
i1, ;; True if the global is local to compile unit (static)
- i1 ;; True if the global is defined in the compile unit (not extern)
- i32 ;; Virtuality, e.g. dwarf::DW_VIRTUALITY__virtual
- i32 ;; Index into a virtual function
+ i1, ;; True if the global is defined in the compile unit (not extern)
+ i32, ;; Virtuality, e.g. dwarf::DW_VIRTUALITY__virtual
+ i32, ;; Index into a virtual function
metadata, ;; indicates which base type contains the vtable pointer for the
;; derived class
- i1 ;; isArtificial
- i1 ;; isOptimized
- Function *;; Pointer to LLVM function
- metadata ;; Lists function template parameters
+ i1, ;; isArtificial
+ i1, ;; isOptimized
+ Function *,;; Pointer to LLVM function
+ metadata, ;; Lists function template parameters
+ metadata ;; Function declaration descriptor
+ metadata ;; List of function variables
}
</pre>
</div>
<a name="format_blocks">Block descriptors</a>
</h4>
-<div class="doc_text">
+<div>
<div class="doc_code">
<pre>
</pre>
</div>
-<p>These descriptors provide debug information about nested blocks within a
+<p>This descriptor provides debug information about nested blocks within a
subprogram. The line number and column numbers are used to dinstinguish
two lexical blocks at same depth. </p>
+<div class="doc_code">
+<pre>
+!3 = metadata !{
+ i32, ;; Tag = 11 + <a href="#LLVMDebugVersion">LLVMDebugVersion</a> (DW_TAG_lexical_block)
+ metadata ;; Reference to the scope we're annotating with a file change
+ metadata,;; Reference to the file the scope is enclosed in.
+}
+</pre>
+</div>
+
+<p>This descriptor provides a wrapper around a lexical scope to handle file
+ changes in the middle of a lexical block.</p>
+
</div>
<!-- ======================================================================= -->
<a name="format_basic_type">Basic type descriptors</a>
</h4>
-<div class="doc_text">
+<div>
<div class="doc_code">
<pre>
!4 = metadata !{
i32, ;; Tag = 36 + <a href="#LLVMDebugVersion">LLVMDebugVersion</a>
;; (DW_TAG_base_type)
- metadata, ;; Reference to context (typically a compile unit)
+ metadata, ;; Reference to context
metadata, ;; Name (may be "" for anonymous types)
metadata, ;; Reference to file where defined (may be NULL)
i32, ;; Line number where defined (may be 0)
<p>These descriptors define primitive types used in the code. Example int, bool
and float. The context provides the scope of the type, which is usually the
- top level. Since basic types are not usually user defined the compile unit
+ top level. Since basic types are not usually user defined the context
and line number can be left as NULL and 0. The size, alignment and offset
are expressed in bits and can be 64 bit values. The alignment is used to
round the offset when embedded in a
<a name="format_derived_type">Derived type descriptors</a>
</h4>
-<div class="doc_text">
+<div>
<div class="doc_code">
<pre>
the <a href="#format_derived_type">derived type</a>. </p>
<p><a href="#format_derived_type">Derived type</a> location can be determined
- from the compile unit and line number. The size, alignment and offset are
+ from the context and line number. The size, alignment and offset are
expressed in bits and can be 64 bit values. The alignment is used to round
the offset when embedded in a <a href="#format_composite_type">composite
type</a> (example to keep float doubles on 64 bit boundaries.) The offset is
<a name="format_composite_type">Composite type descriptors</a>
</h4>
-<div class="doc_text">
+<div>
<div class="doc_code">
<pre>
the formal arguments to the subroutine.</p>
<p><a href="#format_composite_type">Composite type</a> location can be
- determined from the compile unit and line number. The size, alignment and
+ determined from the context and line number. The size, alignment and
offset are expressed in bits and can be 64 bit values. The alignment is used
to round the offset when embedded in
a <a href="#format_composite_type">composite type</a> (as an example, to keep
<a name="format_subrange">Subrange descriptors</a>
</h4>
-<div class="doc_text">
+<div>
<div class="doc_code">
<pre>
<a name="format_enumeration">Enumerator descriptors</a>
</h4>
-<div class="doc_text">
+<div>
<div class="doc_code">
<pre>
<a name="format_variables">Local variables</a>
</h4>
-<div class="doc_text">
+<div>
<div class="doc_code">
<pre>
metadata, ;; Reference to file where defined
i32, ;; 24 bit - Line number where defined
;; 8 bit - Argument number. 1 indicates 1st argument.
- metadata ;; Type descriptor
+ metadata, ;; Type descriptor
+ i32, ;; flags
+ metadata ;; (optional) Reference to inline location
}
</pre>
</div>
has no source correspondent.</p>
<p>The context is either the subprogram or block where the variable is defined.
- Name the source variable name. Compile unit and line indicate where the
+ Name the source variable name. Context and line indicate where the
variable was defined. Type descriptor defines the declared type of the
variable.</p>
</div>
+</div>
+
<!-- ======================================================================= -->
<h3>
<a name="format_common_intrinsics">Debugger intrinsic functions</a>
</h3>
-<div class="doc_text">
+<div>
<p>LLVM uses several intrinsic functions (name prefixed with "llvm.dbg") to
provide debug information at various points in generated code.</p>
-</div>
-
<!-- ======================================================================= -->
<h4>
<a name="format_common_declare">llvm.dbg.declare</a>
</h4>
-<div class="doc_text">
+<div>
<pre>
void %<a href="#format_common_declare">llvm.dbg.declare</a>(metadata, metadata)
</pre>
<a name="format_common_value">llvm.dbg.value</a>
</h4>
-<div class="doc_text">
+<div>
<pre>
void %<a href="#format_common_value">llvm.dbg.value</a>(metadata, i64, metadata)
</pre>
user source variable. </p>
</div>
+</div>
+
<!-- ======================================================================= -->
<h3>
<a name="format_common_lifetime">Object lifetimes and scoping</a>
</h3>
-<div class="doc_text">
+<div>
<p>In many languages, the local variables in functions can have their lifetimes
or scopes limited to a subset of a function. In the C family of languages,
for example, variables are only live (readable and writable) within the
</div>
+</div>
+
<!-- *********************************************************************** -->
<h2>
<a name="ccxx_frontend">C/C++ front-end specific debug information</a>
</h2>
<!-- *********************************************************************** -->
-<div class="doc_text">
+<div>
<p>The C and C++ front-ends represent information about the program in a format
that is effectively identical
<p>The following sections provide examples of various C/C++ constructs and the
debug information that would best describe those constructs.</p>
-</div>
-
<!-- ======================================================================= -->
<h3>
<a name="ccxx_compile_units">C/C++ source file information</a>
</h3>
-<div class="doc_text">
+<div>
<p>Given the source files <tt>MySource.cpp</tt> and <tt>MyHeader.h</tt> located
in the directory <tt>/Users/mine/sources</tt>, the following code:</p>
<a name="ccxx_global_variable">C/C++ global variable information</a>
</h3>
-<div class="doc_text">
+<div>
<p>Given an integer global variable declared as follows:</p>
<a name="ccxx_subprogram">C/C++ function information</a>
</h3>
-<div class="doc_text">
+<div>
<p>Given a function declared as follows:</p>
<a name="ccxx_basic_types">C/C++ basic types</a>
</h3>
-<div class="doc_text">
+<div>
<p>The following are the basic type descriptors for C/C++ core types:</p>
-</div>
-
<!-- ======================================================================= -->
<h4>
<a name="ccxx_basic_type_bool">bool</a>
</h4>
-<div class="doc_text">
+<div>
<div class="doc_code">
<pre>
<a name="ccxx_basic_char">char</a>
</h4>
-<div class="doc_text">
+<div>
<div class="doc_code">
<pre>
<a name="ccxx_basic_unsigned_char">unsigned char</a>
</h4>
-<div class="doc_text">
+<div>
<div class="doc_code">
<pre>
<a name="ccxx_basic_short">short</a>
</h4>
-<div class="doc_text">
+<div>
<div class="doc_code">
<pre>
<a name="ccxx_basic_unsigned_short">unsigned short</a>
</h4>
-<div class="doc_text">
+<div>
<div class="doc_code">
<pre>
<a name="ccxx_basic_int">int</a>
</h4>
-<div class="doc_text">
+<div>
<div class="doc_code">
<pre>
<a name="ccxx_basic_unsigned_int">unsigned int</a>
</h4>
-<div class="doc_text">
+<div>
<div class="doc_code">
<pre>
<a name="ccxx_basic_long_long">long long</a>
</h4>
-<div class="doc_text">
+<div>
<div class="doc_code">
<pre>
<a name="ccxx_basic_unsigned_long_long">unsigned long long</a>
</h4>
-<div class="doc_text">
+<div>
<div class="doc_code">
<pre>
<a name="ccxx_basic_float">float</a>
</h4>
-<div class="doc_text">
+<div>
<div class="doc_code">
<pre>
<a name="ccxx_basic_double">double</a>
</h4>
-<div class="doc_text">
+<div>
<div class="doc_code">
<pre>
</div>
+</div>
+
<!-- ======================================================================= -->
<h3>
<a name="ccxx_derived_types">C/C++ derived types</a>
</h3>
-<div class="doc_text">
+<div>
<p>Given the following as an example of C/C++ derived type:</p>
<a name="ccxx_composite_types">C/C++ struct/union types</a>
</h3>
-<div class="doc_text">
+<div>
<p>Given the following as an example of C/C++ struct type:</p>
<a name="ccxx_enumeration_types">C/C++ enumeration types</a>
</h3>
-<div class="doc_text">
+<div>
<p>Given the following as an example of C/C++ enumeration type:</p>
</div>
+</div>
+
<!-- *********************************************************************** -->
<hr>