================================
Source Level Debugging with LLVM
================================

.. contents::
   :local:

Introduction
============

This document is the central repository for all information pertaining to debug
information in LLVM.  It describes the :ref:`actual format that the LLVM debug
information takes <format>`, which is useful for those interested in creating
front-ends or dealing directly with the information.  Further, this document
provides specific examples of what debug information for C/C++ looks like.

Philosophy behind LLVM debugging information
--------------------------------------------

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.
Several design aspects have shaped the solution that appears here.  The
important ones are:

* Debugging information should have very little impact on the rest of the
  compiler.  No transformations, analyses, or code generators should need to
  be modified because of debugging information.

* LLVM optimizations should interact in :ref:`well-defined and easily described
  ways <intro_debugopt>` with the debugging information.

* Because LLVM is designed to support arbitrary programming languages,
  LLVM-to-LLVM tools should not need to know anything about the semantics of
  the source-level-language.

* Source-level languages are often **widely** different from one another.
  LLVM should not put any restrictions of the flavor of the source-language,
  and the debugging information should work with any language.

* With code generator support, it should be possible to use an LLVM compiler
  to compile a program to native machine code and standard debugging
  formats.  This allows compatibility with traditional machine-code level
  debuggers, like GDB or DBX.

The approach used by the LLVM implementation is to use a small set of
:ref:`intrinsic functions <format_common_intrinsics>` to define a mapping
between LLVM program objects and the source-level objects.  The description of
the source-level program is maintained in LLVM metadata in an
:ref:`implementation-defined format <ccxx_frontend>` (the C/C++ front-end
currently uses working draft 7 of the `DWARF 3 standard
<http://www.eagercon.com/dwarf/dwarf3std.htm>`_).

When a program is being debugged, a debugger interacts with the user and turns
the stored debug information into source-language specific information.  As
such, a debugger must be aware of the source-language, and is thus tied to a
specific language or family of languages.

Debug information consumers
---------------------------

The role of debug information is to provide meta information normally stripped
away during the compilation process.  This meta information provides an LLVM
user a relationship between generated code and the original program source
code.

Currently, debug information is consumed by DwarfDebug to produce dwarf
information used by the gdb debugger.  Other targets could use the same
information to produce stabs or other debug forms.

It would also be reasonable to use debug information to feed profiling tools
for analysis of generated code, or, tools for reconstructing the original
source from generated code.

TODO - expound a bit more.

.. _intro_debugopt:

Debugging optimized code
------------------------

An extremely high priority of LLVM debugging information is to make it interact
well with optimizations and analysis.  In particular, the LLVM debug
information provides the following guarantees:

* LLVM debug information **always provides information to accurately read
  the source-level state of the program**, regardless of which LLVM
  optimizations have been run, and without any modification to the
  optimizations themselves.  However, some optimizations may impact the
  ability to modify the current state of the program with a debugger, such
  as setting program variables, or calling functions that have been
  deleted.

* 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.

* LLVM debug information does not prevent optimizations from
  happening (for example inlining, basic block reordering/merging/cleanup,
  tail duplication, etc).

* LLVM debug information is automatically optimized along with the rest of
  the program, using existing facilities.  For example, duplicate
  information is automatically merged by the linker, and unused information
  is automatically removed.

Basically, the debug information allows you to compile a program with
"``-O0 -g``" and get full debug information, allowing you to arbitrarily modify
the program as it executes from a debugger.  Compiling a program with
"``-O3 -g``" gives you full debug information that is always available and
accurate for reading (e.g., you get accurate stack traces despite tail call
elimination and inlining), but you might lose the ability to modify the program
and call functions where were optimized out of the program, or inlined away
completely.

:ref:`LLVM test suite <test-suite-quickstart>` provides a framework to test
optimizer's handling of debugging information.  It can be run like this:

.. code-block:: bash

  % cd llvm/projects/test-suite/MultiSource/Benchmarks  # or some other level
  % make TEST=dbgopt

This will test impact of debugging information on optimization passes.  If
debugging information influences optimization passes then it will be reported
as a failure.  See :doc:`TestingGuide` for more information on LLVM test
infrastructure and how to run various tests.

.. _format:

Debugging information format
============================

LLVM debugging information has been carefully designed to make it possible for
the optimizer to optimize the program and debugging information without
necessarily having to know anything about debugging information.  In
particular, the use of metadata avoids duplicated debugging information from
the beginning, and the global dead code elimination pass automatically deletes
debugging information for a function if it decides to delete the function.

To do this, most of the debugging information (descriptors for types,
variables, functions, source files, etc) is inserted by the language front-end
in the form of LLVM metadata.

Debug information is designed to be agnostic about the target debugger and
debugging information representation (e.g. DWARF/Stabs/etc).  It uses a generic
pass to decode the information that represents variables, types, functions,
namespaces, etc: this allows for arbitrary source-language semantics and
type-systems to be used, as long as there is a module written for the target
debugger to interpret the information.

To provide basic functionality, the LLVM debugger does have to make some
assumptions about the source-level language being debugged, though it keeps
these to a minimum.  The only common features that the LLVM debugger assumes
exist are :ref:`source files <format_files>`, and :ref:`program objects
<format_global_variables>`.  These abstract objects are used by a debugger to
form stack traces, show information about local variables, etc.

This section of the documentation first describes the representation aspects
common to any source-language.  :ref:`ccxx_frontend` describes the data layout
conventions used by the C and C++ front-ends.

Debug information descriptors
-----------------------------

In consideration of the complexity and volume of debug information, LLVM
provides a specification for well formed debug descriptors.

Consumers of LLVM debug information expect the descriptors for program objects
to start in a canonical format, but the descriptors can include additional
information appended at the end that is source-language specific.  All debugging
information objects start with a tag to indicate what type of object it is.
The source-language is allowed to define its own objects, by using unreserved
tag numbers.  We recommend using with tags in the range 0x1000 through 0x2000
(there is a defined ``enum DW_TAG_user_base = 0x1000``.)

The fields of debug descriptors used internally by LLVM are restricted to only
the simple data types ``i32``, ``i1``, ``float``, ``double``, ``mdstring`` and
``mdnode``.

.. code-block:: llvm

  !1 = metadata !{
    i32,   ;; A tag
    ...
  }

<a name="LLVMDebugVersion">The first field of a descriptor is always an
``i32`` containing a tag value identifying the content of the descriptor.
The remaining fields are specific to the descriptor.  The values 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.

The details of the various descriptors follow.

Compile unit descriptors
^^^^^^^^^^^^^^^^^^^^^^^^

.. code-block:: llvm

  !0 = metadata !{
    i32,       ;; Tag = 17 (DW_TAG_compile_unit)
    metadata,  ;; Source directory (including trailing slash) & file pair
    i32,       ;; DWARF language identifier (ex. DW_LANG_C89)
    metadata   ;; Producer (ex. "4.0.1 LLVM (LLVM research group)")
    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
    metadata   ;; List of imported entities
    metadata   ;; Split debug filename
  }

These descriptors contain a source language ID for the file (we use the DWARF
3.0 ID numbers, such as ``DW_LANG_C89``, ``DW_LANG_C_plus_plus``,
``DW_LANG_Cobol74``, etc), a reference to a metadata node containing a pair of
strings for the source file name and the working directory, as well as an
identifier string for the compiler that produced it.

Compile unit descriptors provide the root context for objects declared in a
specific compilation unit.  File descriptors are defined using this context.
These descriptors are collected by a named metadata ``!llvm.dbg.cu``.  They
keep track of subprograms, global variables, type information, and imported
entities (declarations and namespaces).

.. _format_files:

File descriptors
^^^^^^^^^^^^^^^^

.. code-block:: llvm

  !0 = metadata !{
    i32,      ;; Tag = 41 (DW_TAG_file_type)
    metadata, ;; Source directory (including trailing slash) & file pair
  }

These descriptors contain information for a file.  Global variables and top
level functions would be defined using this context.  File descriptors also
provide context for source line correspondence.

Each input file is encoded as a separate file descriptor in LLVM debugging
information output.

.. _format_global_variables:

Global variable descriptors
^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. code-block:: llvm

  !1 = metadata !{
    i32,      ;; Tag = 52 (DW_TAG_variable)
    i32,      ;; Unused field.
    metadata, ;; Reference to context descriptor
    metadata, ;; Name
    metadata, ;; Display name (fully qualified C++ name)
    metadata, ;; MIPS linkage name (for C++)
    metadata, ;; Reference to file where defined
    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)
    {}*,      ;; Reference to the global variable
    metadata, ;; The static member declaration, if any
  }

These descriptors provide debug information about global variables.  They
provide details such as name, type and where the variable is defined.  All
global variables are collected inside the named metadata ``!llvm.dbg.cu``.

.. _format_subprograms:

Subprogram descriptors
^^^^^^^^^^^^^^^^^^^^^^

.. code-block:: llvm

  !2 = metadata !{
    i32,      ;; Tag = 46 (DW_TAG_subprogram)
    metadata, ;; Source directory (including trailing slash) & file pair
    metadata, ;; Reference to context descriptor
    metadata, ;; Name
    metadata, ;; Display name (fully qualified C++ name)
    metadata, ;; MIPS linkage name (for C++)
    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
    metadata, ;; indicates which base type contains the vtable pointer for the
              ;; derived class
    i32,      ;; Flags - Artificial, Private, Protected, Explicit, Prototyped.
    i1,       ;; isOptimized
    {}*,      ;; Reference to the LLVM function
    metadata, ;; Lists function template parameters
    metadata, ;; Function declaration descriptor
    metadata, ;; List of function variables
    i32       ;; Line number where the scope of the subprogram begins
  }

These descriptors provide debug information about functions, methods and
subprograms.  They provide details such as name, return types and the source
location where the subprogram is defined.

Block descriptors
^^^^^^^^^^^^^^^^^

.. code-block:: llvm

  !3 = metadata !{
    i32,      ;; Tag = 11 (DW_TAG_lexical_block)
    metadata, ;; Source directory (including trailing slash) & file pair
    metadata, ;; Reference to context descriptor
    i32,      ;; Line number
    i32,      ;; Column number
    i32,      ;; DWARF path discriminator value
    i32       ;; Unique ID to identify blocks from a template function
  }

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.

.. code-block:: llvm

  !3 = metadata !{
    i32,      ;; Tag = 11 (DW_TAG_lexical_block)
    metadata, ;; Source directory (including trailing slash) & file pair
    metadata  ;; Reference to the scope we're annotating with a file change
  }

This descriptor provides a wrapper around a lexical scope to handle file
changes in the middle of a lexical block.

.. _format_basic_type:

Basic type descriptors
^^^^^^^^^^^^^^^^^^^^^^

.. code-block:: llvm

  !4 = metadata !{
    i32,      ;; Tag = 36 (DW_TAG_base_type)
    metadata, ;; Source directory (including trailing slash) & file pair (may be null)
    metadata, ;; Reference to context
    metadata, ;; Name (may be "" for anonymous types)
    i32,      ;; Line number where defined (may be 0)
    i64,      ;; Size in bits
    i64,      ;; Alignment in bits
    i64,      ;; Offset in bits
    i32,      ;; Flags
    i32       ;; DWARF type encoding
  }

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
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 :ref:`composite type
<format_composite_type>` (example to keep float doubles on 64 bit boundaries).
The offset is the bit offset if embedded in a :ref:`composite type
<format_composite_type>`.

The type encoding provides the details of the type.  The values are typically
one of the following:

.. code-block:: llvm

  DW_ATE_address       = 1
  DW_ATE_boolean       = 2
  DW_ATE_float         = 4
  DW_ATE_signed        = 5
  DW_ATE_signed_char   = 6
  DW_ATE_unsigned      = 7
  DW_ATE_unsigned_char = 8

.. _format_derived_type:

Derived type descriptors
^^^^^^^^^^^^^^^^^^^^^^^^

.. code-block:: llvm

  !5 = metadata !{
    i32,      ;; Tag (see below)
    metadata, ;; Source directory (including trailing slash) & file pair (may be null)
    metadata, ;; Reference to context
    metadata, ;; Name (may be "" for anonymous types)
    i32,      ;; Line number where defined (may be 0)
    i64,      ;; Size in bits
    i64,      ;; Alignment in bits
    i64,      ;; Offset in bits
    i32,      ;; Flags to encode attributes, e.g. private
    metadata, ;; Reference to type derived from
    metadata, ;; (optional) Name of the Objective C property associated with
              ;; Objective-C an ivar, or the type of which this
              ;; pointer-to-member is pointing to members of.
    metadata, ;; (optional) Name of the Objective C property getter selector.
    metadata, ;; (optional) Name of the Objective C property setter selector.
    i32       ;; (optional) Objective C property attributes.
  }

These descriptors are used to define types derived from other types.  The value
of the tag varies depending on the meaning.  The following are possible tag
values:

.. code-block:: llvm

  DW_TAG_formal_parameter   = 5
  DW_TAG_member             = 13
  DW_TAG_pointer_type       = 15
  DW_TAG_reference_type     = 16
  DW_TAG_typedef            = 22
  DW_TAG_ptr_to_member_type = 31
  DW_TAG_const_type         = 38
  DW_TAG_volatile_type      = 53
  DW_TAG_restrict_type      = 55

``DW_TAG_member`` is used to define a member of a :ref:`composite type
<format_composite_type>` or :ref:`subprogram <format_subprograms>`.  The type
of the member is the :ref:`derived type <format_derived_type>`.
``DW_TAG_formal_parameter`` is used to define a member which is a formal
argument of a subprogram.

``DW_TAG_typedef`` is used to provide a name for the derived type.

``DW_TAG_pointer_type``, ``DW_TAG_reference_type``, ``DW_TAG_const_type``,
``DW_TAG_volatile_type`` and ``DW_TAG_restrict_type`` are used to qualify the
:ref:`derived type <format_derived_type>`.

:ref:`Derived type <format_derived_type>` location can be 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 :ref:`composite type <format_composite_type>`  (example to keep
float doubles on 64 bit boundaries.) The offset is the bit offset if embedded
in a :ref:`composite type <format_composite_type>`.

Note that the ``void *`` type is expressed as a type derived from NULL.

.. _format_composite_type:

Composite type descriptors
^^^^^^^^^^^^^^^^^^^^^^^^^^

.. code-block:: llvm

  !6 = metadata !{
    i32,      ;; Tag (see below)
    metadata, ;; Source directory (including trailing slash) & file pair (may be null)
    metadata, ;; Reference to context
    metadata, ;; Name (may be "" for anonymous types)
    i32,      ;; Line number where defined (may be 0)
    i64,      ;; Size in bits
    i64,      ;; Alignment in bits
    i64,      ;; Offset in bits
    i32,      ;; Flags
    metadata, ;; Reference to type derived from
    metadata, ;; Reference to array of member descriptors
    i32,      ;; Runtime languages
    metadata, ;; Base type containing the vtable pointer for this type
    metadata, ;; Template parameters
    metadata  ;; A unique identifier for type uniquing purpose (may be null)
  }

These descriptors are used to define types that are composed of 0 or more
elements.  The value of the tag varies depending on the meaning.  The following
are possible tag values:

.. code-block:: llvm

  DW_TAG_array_type       = 1
  DW_TAG_enumeration_type = 4
  DW_TAG_structure_type   = 19
  DW_TAG_union_type       = 23
  DW_TAG_subroutine_type  = 21
  DW_TAG_inheritance      = 28

The vector flag indicates that an array type is a native packed vector.

The members of array types (tag = ``DW_TAG_array_type``) are
:ref:`subrange descriptors <format_subrange>`, each
representing the range of subscripts at that level of indexing.

The members of enumeration types (tag = ``DW_TAG_enumeration_type``) are
:ref:`enumerator descriptors <format_enumerator>`, each representing the
definition of enumeration value for the set.  All enumeration type descriptors
are collected inside the named metadata ``!llvm.dbg.cu``.

The members of structure (tag = ``DW_TAG_structure_type``) or union (tag =
``DW_TAG_union_type``) types are any one of the :ref:`basic
<format_basic_type>`, :ref:`derived <format_derived_type>` or :ref:`composite
<format_composite_type>` type descriptors, each representing a field member of
the structure or union.

For C++ classes (tag = ``DW_TAG_structure_type``), member descriptors provide
information about base classes, static members and member functions.  If a
member is a :ref:`derived type descriptor <format_derived_type>` and has a tag
of ``DW_TAG_inheritance``, then the type represents a base class.  If the member
of is a :ref:`global variable descriptor <format_global_variables>` then it
represents a static member.  And, if the member is a :ref:`subprogram
descriptor <format_subprograms>` then it represents a member function.  For
static members and member functions, ``getName()`` returns the members link or
the C++ mangled name.  ``getDisplayName()`` the simplied version of the name.

The first member of subroutine (tag = ``DW_TAG_subroutine_type``) type elements
is the return type for the subroutine.  The remaining elements are the formal
arguments to the subroutine.

:ref:`Composite type <format_composite_type>` location can be 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 :ref:`composite type <format_composite_type>` (as an example, to
keep float doubles on 64 bit boundaries).  The offset is the bit offset if
embedded in a :ref:`composite type <format_composite_type>`.

.. _format_subrange:

Subrange descriptors
^^^^^^^^^^^^^^^^^^^^

.. code-block:: llvm

  !42 = metadata !{
    i32,      ;; Tag = 33 (DW_TAG_subrange_type)
    i64,      ;; Low value
    i64       ;; High value
  }

These descriptors are used to define ranges of array subscripts for an array
:ref:`composite type <format_composite_type>`.  The low value defines the lower
bounds typically zero for C/C++.  The high value is the upper bounds.  Values
are 64 bit.  ``High - Low + 1`` is the size of the array.  If ``Low > High``
the array bounds are not included in generated debugging information.

.. _format_enumerator:

Enumerator descriptors
^^^^^^^^^^^^^^^^^^^^^^

.. code-block:: llvm

  !6 = metadata !{
    i32,      ;; Tag = 40 (DW_TAG_enumerator)
    metadata, ;; Name
    i64       ;; Value
  }

These descriptors are used to define members of an enumeration :ref:`composite
type <format_composite_type>`, it associates the name to the value.

Local variables
^^^^^^^^^^^^^^^

.. code-block:: llvm

  !7 = metadata !{
    i32,      ;; Tag (see below)
    metadata, ;; Context
    metadata, ;; Name
    metadata, ;; Reference to file where defined
    i32,      ;; 24 bit - Line number where defined
              ;; 8 bit - Argument number. 1 indicates 1st argument.
    metadata, ;; Reference to the type descriptor
    i32,      ;; flags
    metadata  ;; (optional) Reference to inline location
    metadata  ;; (optional) Reference to a complex expression (see below)
  }

These descriptors are used to define variables local to a sub program.  The
value of the tag depends on the usage of the variable:

.. code-block:: llvm

  DW_TAG_auto_variable   = 256
  DW_TAG_arg_variable    = 257

An auto variable is any variable declared in the body of the function.  An
argument variable is any variable that appears as a formal argument to the
function.

The context is either the subprogram or block where the variable is defined.
Name the source variable name.  Context and line indicate where the variable
was defined.  Type descriptor defines the declared type of the variable.

.. _format_common_intrinsics:

Debugger intrinsic functions
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

LLVM uses several intrinsic functions (name prefixed with "``llvm.dbg``") to
provide debug information at various points in generated code.

``llvm.dbg.declare``
^^^^^^^^^^^^^^^^^^^^

.. code-block:: llvm

  void %llvm.dbg.declare(metadata, metadata)

This intrinsic provides information about a local element (e.g., variable).
The first argument is metadata holding the alloca for the variable.  The second
argument is metadata containing a description of the variable.

``llvm.dbg.value``
^^^^^^^^^^^^^^^^^^

.. code-block:: llvm

  void %llvm.dbg.value(metadata, i64, metadata)

This intrinsic provides information when a user source variable is set to a new
value.  The first argument is the new value (wrapped as metadata).  The second
argument is the offset in the user source variable where the new value is
written.  The third argument is metadata containing a description of the user
source variable.

Object lifetimes and scoping
============================

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 source
block that they are defined in.  In functional languages, values are only
readable after they have been defined.  Though this is a very obvious concept,
it is non-trivial to model in LLVM, because it has no notion of scoping in this
sense, and does not want to be tied to a language's scoping rules.

In order to handle this, the LLVM debug format uses the metadata attached to
llvm instructions to encode line number and scoping information.  Consider the
following C fragment, for example:

.. code-block:: c

  1.  void foo() {
  2.    int X = 21;
  3.    int Y = 22;
  4.    {
  5.      int Z = 23;
  6.      Z = X;
  7.    }
  8.    X = Y;
  9.  }

Compiled to LLVM, this function would be represented like this:

.. code-block:: llvm

  define void @foo() #0 {
  entry:
   %X = alloca i32, align 4
    %Y = alloca i32, align 4
    %Z = alloca i32, align 4
    call void @llvm.dbg.declare(metadata !{i32* %X}, metadata !10), !dbg !12
      ; [debug line = 2:7] [debug variable = X]
    store i32 21, i32* %X, align 4, !dbg !12
    call void @llvm.dbg.declare(metadata !{i32* %Y}, metadata !13), !dbg !14
      ; [debug line = 3:7] [debug variable = Y]
    store i32 22, i32* %Y, align 4, !dbg !14
    call void @llvm.dbg.declare(metadata !{i32* %Z}, metadata !15), !dbg !17
      ; [debug line = 5:9] [debug variable = Z]
    store i32 23, i32* %Z, align 4, !dbg !17
    %0 = load i32* %X, align 4, !dbg !18
      [debug line = 6:5]
    store i32 %0, i32* %Z, align 4, !dbg !18
    %1 = load i32* %Y, align 4, !dbg !19
      [debug line = 8:3]
    store i32 %1, i32* %X, align 4, !dbg !19
    ret void, !dbg !20
  }

  ; Function Attrs: nounwind readnone
  declare void @llvm.dbg.declare(metadata, metadata) #1

  attributes #0 = { nounwind ssp uwtable "less-precise-fpmad"="false"
    "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf"
    "no-infs-fp-math"="false" "no-nans-fp-math"="false"
    "stack-protector-buffer-size"="8" "unsafe-fp-math"="false"
    "use-soft-float"="false" }
  attributes #1 = { nounwind readnone }

  !llvm.dbg.cu = !{!0}
  !llvm.module.flags = !{!8}
  !llvm.ident = !{!9}

  !0 = metadata !{i32 786449, metadata !1, i32 12,
                  metadata !"clang version 3.4 (trunk 193128) (llvm/trunk 193139)",
                  i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3,
                  metadata !2, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] \
                    [/private/tmp/foo.c] \
                    [DW_LANG_C99]
  !1 = metadata !{metadata !"t.c", metadata !"/private/tmp"}
  !2 = metadata !{i32 0}
  !3 = metadata !{metadata !4}
  !4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"foo",
                  metadata !"foo", metadata !"", i32 1, metadata !6,
                  i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 false,
                  void ()* @foo, null, null, metadata !2, i32 1}
                  ; [ DW_TAG_subprogram ] [line 1] [def] [foo]
  !5 = metadata !{i32 786473, metadata !1}  ; [ DW_TAG_file_type ] \
                    [/private/tmp/t.c]
  !6 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0,
                  i64 0, i32 0, null, metadata !7, i32 0, null, null, null}
                  ; [ DW_TAG_subroutine_type ] \
                    [line 0, size 0, align 0, offset 0] [from ]
  !7 = metadata !{null}
  !8 = metadata !{i32 2, metadata !"Dwarf Version", i32 2}
  !9 = metadata !{metadata !"clang version 3.4 (trunk 193128) (llvm/trunk 193139)"}
  !10 = metadata !{i32 786688, metadata !4, metadata !"X", metadata !5, i32 2,
                   metadata !11, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [X] \
                     [line 2]
  !11 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32,
                   i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] \
                     [line 0, size 32, align 32, offset 0, enc DW_ATE_signed]
  !12 = metadata !{i32 2, i32 0, metadata !4, null}
  !13 = metadata !{i32 786688, metadata !4, metadata !"Y", metadata !5, i32 3,
                   metadata !11, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [Y] \
                     [line 3]
  !14 = metadata !{i32 3, i32 0, metadata !4, null}
  !15 = metadata !{i32 786688, metadata !16, metadata !"Z", metadata !5, i32 5,
                   metadata !11, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [Z] \
                     [line 5]
  !16 = metadata !{i32 786443, metadata !1, metadata !4, i32 4, i32 0, i32 0,
                   i32 0} \
                   ; [ DW_TAG_lexical_block ] [/private/tmp/t.c]
  !17 = metadata !{i32 5, i32 0, metadata !16, null}
  !18 = metadata !{i32 6, i32 0, metadata !16, null}
  !19 = metadata !{i32 8, i32 0, metadata !4, null} ; [ DW_TAG_imported_declaration ]
  !20 = metadata !{i32 9, i32 0, metadata !4, null}

This example illustrates a few important details about LLVM debugging
information.  In particular, it shows how the ``llvm.dbg.declare`` intrinsic and
location information, which are attached to an instruction, are applied
together to allow a debugger to analyze the relationship between statements,
variable definitions, and the code used to implement the function.

.. code-block:: llvm

  call void @llvm.dbg.declare(metadata !{i32* %X}, metadata !10), !dbg !12
    ; [debug line = 2:7] [debug variable = X]

The first intrinsic ``%llvm.dbg.declare`` encodes debugging information for the
variable ``X``.  The metadata ``!dbg !12`` attached to the intrinsic provides
scope information for the variable ``X``.

.. code-block:: llvm

  !12 = metadata !{i32 2, i32 0, metadata !4, null}
  !4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"foo",
                  metadata !"foo", metadata !"", i32 1, metadata !6,
                  i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 false,
                  void ()* @foo, null, null, metadata !2, i32 1}
                    ; [ DW_TAG_subprogram ] [line 1] [def] [foo]

Here ``!12`` is metadata providing location information.  It has four fields:
line number, column number, scope, and original scope.  The original scope
represents inline location if this instruction is inlined inside a caller, and
is null otherwise.  In this example, scope is encoded by ``!4``, a
:ref:`subprogram descriptor <format_subprograms>`.  This way the location
information attached to the intrinsics indicates that the variable ``X`` is
declared at line number 2 at a function level scope in function ``foo``.

Now lets take another example.

.. code-block:: llvm

  call void @llvm.dbg.declare(metadata !{i32* %Z}, metadata !15), !dbg !17
    ; [debug line = 5:9] [debug variable = Z]

The third intrinsic ``%llvm.dbg.declare`` encodes debugging information for
variable ``Z``.  The metadata ``!dbg !17`` attached to the intrinsic provides
scope information for the variable ``Z``.

.. code-block:: llvm

  !16 = metadata !{i32 786443, metadata !1, metadata !4, i32 4, i32 0, i32 0,
                   i32 0}
                   ; [ DW_TAG_lexical_block ] [/private/tmp/t.c]
  !17 = metadata !{i32 5, i32 0, metadata !16, null}

Here ``!15`` indicates that ``Z`` is declared at line number 5 and
column number 0 inside of lexical scope ``!16``.  The lexical scope itself
resides inside of subprogram ``!4`` described above.

The scope information attached with each instruction provides a straightforward
way to find instructions covered by a scope.

.. _ccxx_frontend:

C/C++ front-end specific debug information
==========================================

The C and C++ front-ends represent information about the program in a format
that is effectively identical to `DWARF 3.0
<http://www.eagercon.com/dwarf/dwarf3std.htm>`_ in terms of information
content.  This allows code generators to trivially support native debuggers by
generating standard dwarf information, and contains enough information for
non-dwarf targets to translate it as needed.

This section describes the forms used to represent C and C++ programs.  Other
languages could pattern themselves after this (which itself is tuned to
representing programs in the same way that DWARF 3 does), or they could choose
to provide completely different forms if they don't fit into the DWARF model.
As support for debugging information gets added to the various LLVM
source-language front-ends, the information used should be documented here.

The following sections provide examples of various C/C++ constructs and the
debug information that would best describe those constructs.

C/C++ source file information
-----------------------------

Given the source files ``MySource.cpp`` and ``MyHeader.h`` located in the
directory ``/Users/mine/sources``, the following code:

.. code-block:: c

  #include "MyHeader.h"

  int main(int argc, char *argv[]) {
    return 0;
  }

a C/C++ front-end would generate the following descriptors:

.. code-block:: llvm

  ...
  ;;
  ;; Define the compile unit for the main source file "/Users/mine/sources/MySource.cpp".
  ;;
  !0 = metadata !{
    i32 786449,   ;; Tag
    metadata !1,  ;; File/directory name
    i32 4,        ;; Language Id
    metadata !"clang version 3.4 ",
    i1 false,     ;; Optimized compile unit
    metadata !"", ;; Compiler flags
    i32 0,        ;; Runtime version
    metadata !2,  ;; Enumeration types
    metadata !2,  ;; Retained types
    metadata !3,  ;; Subprograms
    metadata !2,  ;; Global variables
    metadata !2,  ;; Imported entities (declarations and namespaces)
    metadata !""  ;; Split debug filename
  }

  ;;
  ;; Define the file for the file "/Users/mine/sources/MySource.cpp".
  ;;
  !1 = metadata !{
    metadata !"MySource.cpp",
    metadata !"/Users/mine/sources"
  }
  !5 = metadata !{
    i32 786473, ;; Tag
    metadata !1
  }

  ;;
  ;; Define the file for the file "/Users/mine/sources/Myheader.h"
  ;;
  !14 = metadata !{
    i32 786473, ;; Tag
    metadata !15
  }
  !15 = metadata !{
    metadata !"./MyHeader.h",
    metadata !"/Users/mine/sources",
  }

  ...

``llvm::Instruction`` provides easy access to metadata attached with an
instruction.  One can extract line number information encoded in LLVM IR using
``Instruction::getMetadata()`` and ``DILocation::getLineNumber()``.

.. code-block:: c++

  if (MDNode *N = I->getMetadata("dbg")) {  // Here I is an LLVM instruction
    DILocation Loc(N);                      // DILocation is in DebugInfo.h
    unsigned Line = Loc.getLineNumber();
    StringRef File = Loc.getFilename();
    StringRef Dir = Loc.getDirectory();
  }

C/C++ global variable information
---------------------------------

Given an integer global variable declared as follows:

.. code-block:: c

  int MyGlobal = 100;

a C/C++ front-end would generate the following descriptors:

.. code-block:: llvm

  ;;
  ;; Define the global itself.
  ;;
  %MyGlobal = global int 100
  ...
  ;;
  ;; List of debug info of globals
  ;;
  !llvm.dbg.cu = !{!0}

  ;; Define the compile unit.
  !0 = metadata !{
    i32 786449,                       ;; Tag
    i32 0,                            ;; Context
    i32 4,                            ;; Language
    metadata !"foo.cpp",              ;; File
    metadata !"/Volumes/Data/tmp",    ;; Directory
    metadata !"clang version 3.1 ",   ;; Producer
    i1 true,                          ;; Deprecated field
    i1 false,                         ;; "isOptimized"?
    metadata !"",                     ;; Flags
    i32 0,                            ;; Runtime Version
    metadata !1,                      ;; Enum Types
    metadata !1,                      ;; Retained Types
    metadata !1,                      ;; Subprograms
    metadata !3,                      ;; Global Variables
    metadata !1,                      ;; Imported entities
    "",                               ;; Split debug filename
  } ; [ DW_TAG_compile_unit ]

  ;; The Array of Global Variables
  !3 = metadata !{
    metadata !4
  }

  ;;
  ;; Define the global variable itself.
  ;;
  !4 = metadata !{
    i32 786484,                        ;; Tag
    i32 0,                             ;; Unused
    null,                              ;; Unused
    metadata !"MyGlobal",              ;; Name
    metadata !"MyGlobal",              ;; Display Name
    metadata !"",                      ;; Linkage Name
    metadata !6,                       ;; File
    i32 1,                             ;; Line
    metadata !7,                       ;; Type
    i32 0,                             ;; IsLocalToUnit
    i32 1,                             ;; IsDefinition
    i32* @MyGlobal,                    ;; LLVM-IR Value
    null                               ;; Static member declaration
  } ; [ DW_TAG_variable ]

  ;;
  ;; Define the file
  ;;
  !5 = metadata !{
    metadata !"foo.cpp",               ;; File
    metadata !"/Volumes/Data/tmp",     ;; Directory
  }
  !6 = metadata !{
    i32 786473,                        ;; Tag
    metadata !5                        ;; Unused
  } ; [ DW_TAG_file_type ]

  ;;
  ;; Define the type
  ;;
  !7 = metadata !{
    i32 786468,                         ;; Tag
    null,                               ;; Unused
    null,                               ;; Unused
    metadata !"int",                    ;; Name
    i32 0,                              ;; Line
    i64 32,                             ;; Size in Bits
    i64 32,                             ;; Align in Bits
    i64 0,                              ;; Offset
    i32 0,                              ;; Flags
    i32 5                               ;; Encoding
  } ; [ DW_TAG_base_type ]

C/C++ function information
--------------------------

Given a function declared as follows:

.. code-block:: c

  int main(int argc, char *argv[]) {
    return 0;
  }

a C/C++ front-end would generate the following descriptors:

.. code-block:: llvm

  ;;
  ;; Define the anchor for subprograms.
  ;;
  !6 = metadata !{
    i32 786484,        ;; Tag
    metadata !1,       ;; File
    metadata !1,       ;; Context
    metadata !"main",  ;; Name
    metadata !"main",  ;; Display name
    metadata !"main",  ;; Linkage name
    i32 1,             ;; Line number
    metadata !4,       ;; Type
    i1 false,          ;; Is local
    i1 true,           ;; Is definition
    i32 0,             ;; Virtuality attribute, e.g. pure virtual function
    i32 0,             ;; Index into virtual table for C++ methods
    i32 0,             ;; Type that holds virtual table.
    i32 0,             ;; Flags
    i1 false,          ;; True if this function is optimized
    Function *,        ;; Pointer to llvm::Function
    null,              ;; Function template parameters
    null,              ;; List of function variables (emitted when optimizing)
    1                  ;; Line number of the opening '{' of the function
  }
  ;;
  ;; Define the subprogram itself.
  ;;
  define i32 @main(i32 %argc, i8** %argv) {
  ...
  }

C/C++ basic types
-----------------

The following are the basic type descriptors for C/C++ core types:

bool
^^^^

.. code-block:: llvm

  !2 = metadata !{
    i32 786468,        ;; Tag
    null,              ;; File
    null,              ;; Context
    metadata !"bool",  ;; Name
    i32 0,             ;; Line number
    i64 8,             ;; Size in Bits
    i64 8,             ;; Align in Bits
    i64 0,             ;; Offset in Bits
    i32 0,             ;; Flags
    i32 2              ;; Encoding
  }

char
^^^^

.. code-block:: llvm

  !2 = metadata !{
    i32 786468,        ;; Tag
    null,              ;; File
    null,              ;; Context
    metadata !"char",  ;; Name
    i32 0,             ;; Line number
    i64 8,             ;; Size in Bits
    i64 8,             ;; Align in Bits
    i64 0,             ;; Offset in Bits
    i32 0,             ;; Flags
    i32 6              ;; Encoding
  }

unsigned char
^^^^^^^^^^^^^

.. code-block:: llvm

  !2 = metadata !{
    i32 786468,        ;; Tag
    null,              ;; File
    null,              ;; Context
    metadata !"unsigned char",
    i32 0,             ;; Line number
    i64 8,             ;; Size in Bits
    i64 8,             ;; Align in Bits
    i64 0,             ;; Offset in Bits
    i32 0,             ;; Flags
    i32 8              ;; Encoding
  }

short
^^^^^

.. code-block:: llvm

  !2 = metadata !{
    i32 786468,        ;; Tag
    null,              ;; File
    null,              ;; Context
    metadata !"short int",
    i32 0,             ;; Line number
    i64 16,            ;; Size in Bits
    i64 16,            ;; Align in Bits
    i64 0,             ;; Offset in Bits
    i32 0,             ;; Flags
    i32 5              ;; Encoding
  }

unsigned short
^^^^^^^^^^^^^^

.. code-block:: llvm

  !2 = metadata !{
    i32 786468,        ;; Tag
    null,              ;; File
    null,              ;; Context
    metadata !"short unsigned int",
    i32 0,             ;; Line number
    i64 16,            ;; Size in Bits
    i64 16,            ;; Align in Bits
    i64 0,             ;; Offset in Bits
    i32 0,             ;; Flags
    i32 7              ;; Encoding
  }

int
^^^

.. code-block:: llvm

  !2 = metadata !{
    i32 786468,        ;; Tag
    null,              ;; File
    null,              ;; Context
    metadata !"int",   ;; Name
    i32 0,             ;; Line number
    i64 32,            ;; Size in Bits
    i64 32,            ;; Align in Bits
    i64 0,             ;; Offset in Bits
    i32 0,             ;; Flags
    i32 5              ;; Encoding
  }

unsigned int
^^^^^^^^^^^^

.. code-block:: llvm

  !2 = metadata !{
    i32 786468,        ;; Tag
    null,              ;; File
    null,              ;; Context
    metadata !"unsigned int",
    i32 0,             ;; Line number
    i64 32,            ;; Size in Bits
    i64 32,            ;; Align in Bits
    i64 0,             ;; Offset in Bits
    i32 0,             ;; Flags
    i32 7              ;; Encoding
  }

long long
^^^^^^^^^

.. code-block:: llvm

  !2 = metadata !{
    i32 786468,        ;; Tag
    null,              ;; File
    null,              ;; Context
    metadata !"long long int",
    i32 0,             ;; Line number
    i64 64,            ;; Size in Bits
    i64 64,            ;; Align in Bits
    i64 0,             ;; Offset in Bits
    i32 0,             ;; Flags
    i32 5              ;; Encoding
  }

unsigned long long
^^^^^^^^^^^^^^^^^^

.. code-block:: llvm

  !2 = metadata !{
    i32 786468,        ;; Tag
    null,              ;; File
    null,              ;; Context
    metadata !"long long unsigned int",
    i32 0,             ;; Line number
    i64 64,            ;; Size in Bits
    i64 64,            ;; Align in Bits
    i64 0,             ;; Offset in Bits
    i32 0,             ;; Flags
    i32 7              ;; Encoding
  }

float
^^^^^

.. code-block:: llvm

  !2 = metadata !{
    i32 786468,        ;; Tag
    null,              ;; File
    null,              ;; Context
    metadata !"float",
    i32 0,             ;; Line number
    i64 32,            ;; Size in Bits
    i64 32,            ;; Align in Bits
    i64 0,             ;; Offset in Bits
    i32 0,             ;; Flags
    i32 4              ;; Encoding
  }

double
^^^^^^

.. code-block:: llvm

  !2 = metadata !{
    i32 786468,        ;; Tag
    null,              ;; File
    null,              ;; Context
    metadata !"double",;; Name
    i32 0,             ;; Line number
    i64 64,            ;; Size in Bits
    i64 64,            ;; Align in Bits
    i64 0,             ;; Offset in Bits
    i32 0,             ;; Flags
    i32 4              ;; Encoding
  }

C/C++ derived types
-------------------

Given the following as an example of C/C++ derived type:

.. code-block:: c

  typedef const int *IntPtr;

a C/C++ front-end would generate the following descriptors:

.. code-block:: llvm

  ;;
  ;; Define the typedef "IntPtr".
  ;;
  !2 = metadata !{
    i32 786454,          ;; Tag
    metadata !3,         ;; File
    metadata !1,         ;; Context
    metadata !"IntPtr",  ;; Name
    i32 0,               ;; Line number
    i64 0,               ;; Size in bits
    i64 0,               ;; Align in bits
    i64 0,               ;; Offset in bits
    i32 0,               ;; Flags
    metadata !4          ;; Derived From type
  }
  ;;
  ;; Define the pointer type.
  ;;
  !4 = metadata !{
    i32 786447,          ;; Tag
    null,                ;; File
    null,                ;; Context
    metadata !"",        ;; Name
    i32 0,               ;; Line number
    i64 64,              ;; Size in bits
    i64 64,              ;; Align in bits
    i64 0,               ;; Offset in bits
    i32 0,               ;; Flags
    metadata !5          ;; Derived From type
  }
  ;;
  ;; Define the const type.
  ;;
  !5 = metadata !{
    i32 786470,          ;; Tag
    null,                ;; File
    null,                ;; Context
    metadata !"",        ;; Name
    i32 0,               ;; Line number
    i64 0,               ;; Size in bits
    i64 0,               ;; Align in bits
    i64 0,               ;; Offset in bits
    i32 0,               ;; Flags
    metadata !6          ;; Derived From type
  }
  ;;
  ;; Define the int type.
  ;;
  !6 = metadata !{
    i32 786468,          ;; Tag
    null,                ;; File
    null,                ;; Context
    metadata !"int",     ;; Name
    i32 0,               ;; Line number
    i64 32,              ;; Size in bits
    i64 32,              ;; Align in bits
    i64 0,               ;; Offset in bits
    i32 0,               ;; Flags
    i32 5                ;; Encoding
  }

C/C++ struct/union types
------------------------

Given the following as an example of C/C++ struct type:

.. code-block:: c

  struct Color {
    unsigned Red;
    unsigned Green;
    unsigned Blue;
  };

a C/C++ front-end would generate the following descriptors:

.. code-block:: llvm

  ;;
  ;; Define basic type for unsigned int.
  ;;
  !5 = metadata !{
    i32 786468,        ;; Tag
    null,              ;; File
    null,              ;; Context
    metadata !"unsigned int",
    i32 0,             ;; Line number
    i64 32,            ;; Size in Bits
    i64 32,            ;; Align in Bits
    i64 0,             ;; Offset in Bits
    i32 0,             ;; Flags
    i32 7              ;; Encoding
  }
  ;;
  ;; Define composite type for struct Color.
  ;;
  !2 = metadata !{
    i32 786451,        ;; Tag
    metadata !1,       ;; Compile unit
    null,              ;; Context
    metadata !"Color", ;; Name
    i32 1,             ;; Line number
    i64 96,            ;; Size in bits
    i64 32,            ;; Align in bits
    i64 0,             ;; Offset in bits
    i32 0,             ;; Flags
    null,              ;; Derived From
    metadata !3,       ;; Elements
    i32 0,             ;; Runtime Language
    null,              ;; Base type containing the vtable pointer for this type
    null               ;; Template parameters
  }

  ;;
  ;; Define the Red field.
  ;;
  !4 = metadata !{
    i32 786445,        ;; Tag
    metadata !1,       ;; File
    metadata !1,       ;; Context
    metadata !"Red",   ;; Name
    i32 2,             ;; Line number
    i64 32,            ;; Size in bits
    i64 32,            ;; Align in bits
    i64 0,             ;; Offset in bits
    i32 0,             ;; Flags
    metadata !5        ;; Derived From type
  }

  ;;
  ;; Define the Green field.
  ;;
  !6 = metadata !{
    i32 786445,        ;; Tag
    metadata !1,       ;; File
    metadata !1,       ;; Context
    metadata !"Green", ;; Name
    i32 3,             ;; Line number
    i64 32,            ;; Size in bits
    i64 32,            ;; Align in bits
    i64 32,             ;; Offset in bits
    i32 0,             ;; Flags
    metadata !5        ;; Derived From type
  }

  ;;
  ;; Define the Blue field.
  ;;
  !7 = metadata !{
    i32 786445,        ;; Tag
    metadata !1,       ;; File
    metadata !1,       ;; Context
    metadata !"Blue",  ;; Name
    i32 4,             ;; Line number
    i64 32,            ;; Size in bits
    i64 32,            ;; Align in bits
    i64 64,             ;; Offset in bits
    i32 0,             ;; Flags
    metadata !5        ;; Derived From type
  }

  ;;
  ;; Define the array of fields used by the composite type Color.
  ;;
  !3 = metadata !{metadata !4, metadata !6, metadata !7}

C/C++ enumeration types
-----------------------

Given the following as an example of C/C++ enumeration type:

.. code-block:: c

  enum Trees {
    Spruce = 100,
    Oak = 200,
    Maple = 300
  };

a C/C++ front-end would generate the following descriptors:

.. code-block:: llvm

  ;;
  ;; Define composite type for enum Trees
  ;;
  !2 = metadata !{
    i32 786436,        ;; Tag
    metadata !1,       ;; File
    metadata !1,       ;; Context
    metadata !"Trees", ;; Name
    i32 1,             ;; Line number
    i64 32,            ;; Size in bits
    i64 32,            ;; Align in bits
    i64 0,             ;; Offset in bits
    i32 0,             ;; Flags
    null,              ;; Derived From type
    metadata !3,       ;; Elements
    i32 0              ;; Runtime language
  }

  ;;
  ;; Define the array of enumerators used by composite type Trees.
  ;;
  !3 = metadata !{metadata !4, metadata !5, metadata !6}

  ;;
  ;; Define Spruce enumerator.
  ;;
  !4 = metadata !{i32 786472, metadata !"Spruce", i64 100}

  ;;
  ;; Define Oak enumerator.
  ;;
  !5 = metadata !{i32 786472, metadata !"Oak", i64 200}

  ;;
  ;; Define Maple enumerator.
  ;;
  !6 = metadata !{i32 786472, metadata !"Maple", i64 300}

Debugging information format
============================

Debugging Information Extension for Objective C Properties
----------------------------------------------------------

Introduction
^^^^^^^^^^^^

Objective C provides a simpler way to declare and define accessor methods using
declared properties.  The language provides features to declare a property and
to let compiler synthesize accessor methods.

The debugger lets developer inspect Objective C interfaces and their instance
variables and class variables.  However, the debugger does not know anything
about the properties defined in Objective C interfaces.  The debugger consumes
information generated by compiler in DWARF format.  The format does not support
encoding of Objective C properties.  This proposal describes DWARF extensions to
encode Objective C properties, which the debugger can use to let developers
inspect Objective C properties.

Proposal
^^^^^^^^

Objective C properties exist separately from class members.  A property can be
defined only by "setter" and "getter" selectors, and be calculated anew on each
access.  Or a property can just be a direct access to some declared ivar.
Finally it can have an ivar "automatically synthesized" for it by the compiler,
in which case the property can be referred to in user code directly using the
standard C dereference syntax as well as through the property "dot" syntax, but
there is no entry in the ``@interface`` declaration corresponding to this ivar.

To facilitate debugging, these properties we will add a new DWARF TAG into the
``DW_TAG_structure_type`` definition for the class to hold the description of a
given property, and a set of DWARF attributes that provide said description.
The property tag will also contain the name and declared type of the property.

If there is a related ivar, there will also be a DWARF property attribute placed
in the ``DW_TAG_member`` DIE for that ivar referring back to the property TAG
for that property.  And in the case where the compiler synthesizes the ivar
directly, the compiler is expected to generate a ``DW_TAG_member`` for that
ivar (with the ``DW_AT_artificial`` set to 1), whose name will be the name used
to access this ivar directly in code, and with the property attribute pointing
back to the property it is backing.

The following examples will serve as illustration for our discussion:

.. code-block:: objc

  @interface I1 {
    int n2;
  }

  @property int p1;
  @property int p2;
  @end

  @implementation I1
  @synthesize p1;
  @synthesize p2 = n2;
  @end

This produces the following DWARF (this is a "pseudo dwarfdump" output):

.. code-block:: none

  0x00000100:  TAG_structure_type [7] *
                 AT_APPLE_runtime_class( 0x10 )
                 AT_name( "I1" )
                 AT_decl_file( "Objc_Property.m" )
                 AT_decl_line( 3 )

  0x00000110    TAG_APPLE_property
                  AT_name ( "p1" )
                  AT_type ( {0x00000150} ( int ) )

  0x00000120:   TAG_APPLE_property
                  AT_name ( "p2" )
                  AT_type ( {0x00000150} ( int ) )

  0x00000130:   TAG_member [8]
                  AT_name( "_p1" )
                  AT_APPLE_property ( {0x00000110} "p1" )
                  AT_type( {0x00000150} ( int ) )
                  AT_artificial ( 0x1 )

  0x00000140:    TAG_member [8]
                   AT_name( "n2" )
                   AT_APPLE_property ( {0x00000120} "p2" )
                   AT_type( {0x00000150} ( int ) )

  0x00000150:  AT_type( ( int ) )

Note, the current convention is that the name of the ivar for an
auto-synthesized property is the name of the property from which it derives
with an underscore prepended, as is shown in the example.  But we actually
don't need to know this convention, since we are given the name of the ivar
directly.

Also, it is common practice in ObjC to have different property declarations in
the @interface and @implementation - e.g. to provide a read-only property in
the interface,and a read-write interface in the implementation.  In that case,
the compiler should emit whichever property declaration will be in force in the
current translation unit.

Developers can decorate a property with attributes which are encoded using
``DW_AT_APPLE_property_attribute``.

.. code-block:: objc

  @property (readonly, nonatomic) int pr;

.. code-block:: none

  TAG_APPLE_property [8]
    AT_name( "pr" )
    AT_type ( {0x00000147} (int) )
    AT_APPLE_property_attribute (DW_APPLE_PROPERTY_readonly, DW_APPLE_PROPERTY_nonatomic)

The setter and getter method names are attached to the property using
``DW_AT_APPLE_property_setter`` and ``DW_AT_APPLE_property_getter`` attributes.

.. code-block:: objc

  @interface I1
  @property (setter=myOwnP3Setter:) int p3;
  -(void)myOwnP3Setter:(int)a;
  @end

  @implementation I1
  @synthesize p3;
  -(void)myOwnP3Setter:(int)a{ }
  @end

The DWARF for this would be:

.. code-block:: none

  0x000003bd: TAG_structure_type [7] *
                AT_APPLE_runtime_class( 0x10 )
                AT_name( "I1" )
                AT_decl_file( "Objc_Property.m" )
                AT_decl_line( 3 )

  0x000003cd      TAG_APPLE_property
                    AT_name ( "p3" )
                    AT_APPLE_property_setter ( "myOwnP3Setter:" )
                    AT_type( {0x00000147} ( int ) )

  0x000003f3:     TAG_member [8]
                    AT_name( "_p3" )
                    AT_type ( {0x00000147} ( int ) )
                    AT_APPLE_property ( {0x000003cd} )
                    AT_artificial ( 0x1 )

New DWARF Tags
^^^^^^^^^^^^^^

+-----------------------+--------+
| TAG                   | Value  |
+=======================+========+
| DW_TAG_APPLE_property | 0x4200 |
+-----------------------+--------+

New DWARF Attributes
^^^^^^^^^^^^^^^^^^^^

+--------------------------------+--------+-----------+
| Attribute                      | Value  | Classes   |
+================================+========+===========+
| DW_AT_APPLE_property           | 0x3fed | Reference |
+--------------------------------+--------+-----------+
| DW_AT_APPLE_property_getter    | 0x3fe9 | String    |
+--------------------------------+--------+-----------+
| DW_AT_APPLE_property_setter    | 0x3fea | String    |
+--------------------------------+--------+-----------+
| DW_AT_APPLE_property_attribute | 0x3feb | Constant  |
+--------------------------------+--------+-----------+

New DWARF Constants
^^^^^^^^^^^^^^^^^^^

+--------------------------------+-------+
| Name                           | Value |
+================================+=======+
| DW_AT_APPLE_PROPERTY_readonly  | 0x1   |
+--------------------------------+-------+
| DW_AT_APPLE_PROPERTY_readwrite | 0x2   |
+--------------------------------+-------+
| DW_AT_APPLE_PROPERTY_assign    | 0x4   |
+--------------------------------+-------+
| DW_AT_APPLE_PROPERTY_retain    | 0x8   |
+--------------------------------+-------+
| DW_AT_APPLE_PROPERTY_copy      | 0x10  |
+--------------------------------+-------+
| DW_AT_APPLE_PROPERTY_nonatomic | 0x20  |
+--------------------------------+-------+

Name Accelerator Tables
-----------------------

Introduction
^^^^^^^^^^^^

The "``.debug_pubnames``" and "``.debug_pubtypes``" formats are not what a
debugger needs.  The "``pub``" in the section name indicates that the entries
in the table are publicly visible names only.  This means no static or hidden
functions show up in the "``.debug_pubnames``".  No static variables or private
class variables are in the "``.debug_pubtypes``".  Many compilers add different
things to these tables, so we can't rely upon the contents between gcc, icc, or
clang.

The typical query given by users tends not to match up with the contents of
these tables.  For example, the DWARF spec states that "In the case of the name
of a function member or static data member of a C++ structure, class or union,
the name presented in the "``.debug_pubnames``" section is not the simple name
given by the ``DW_AT_name attribute`` of the referenced debugging information
entry, but rather the fully qualified name of the data or function member."
So the only names in these tables for complex C++ entries is a fully
qualified name.  Debugger users tend not to enter their search strings as
"``a::b::c(int,const Foo&) const``", but rather as "``c``", "``b::c``" , or
"``a::b::c``".  So the name entered in the name table must be demangled in
order to chop it up appropriately and additional names must be manually entered
into the table to make it effective as a name lookup table for debuggers to
se.

All debuggers currently ignore the "``.debug_pubnames``" table as a result of
its inconsistent and useless public-only name content making it a waste of
space in the object file.  These tables, when they are written to disk, are not
sorted in any way, leaving every debugger to do its own parsing and sorting.
These tables also include an inlined copy of the string values in the table
itself making the tables much larger than they need to be on disk, especially
for large C++ programs.

Can't we just fix the sections by adding all of the names we need to this
table? No, because that is not what the tables are defined to contain and we
won't know the difference between the old bad tables and the new good tables.
At best we could make our own renamed sections that contain all of the data we
need.

These tables are also insufficient for what a debugger like LLDB needs.  LLDB
uses clang for its expression parsing where LLDB acts as a PCH.  LLDB is then
often asked to look for type "``foo``" or namespace "``bar``", or list items in
namespace "``baz``".  Namespaces are not included in the pubnames or pubtypes
tables.  Since clang asks a lot of questions when it is parsing an expression,
we need to be very fast when looking up names, as it happens a lot.  Having new
accelerator tables that are optimized for very quick lookups will benefit this
type of debugging experience greatly.

We would like to generate name lookup tables that can be mapped into memory
from disk, and used as is, with little or no up-front parsing.  We would also
be able to control the exact content of these different tables so they contain
exactly what we need.  The Name Accelerator Tables were designed to fix these
issues.  In order to solve these issues we need to:

* Have a format that can be mapped into memory from disk and used as is
* Lookups should be very fast
* Extensible table format so these tables can be made by many producers
* Contain all of the names needed for typical lookups out of the box
* Strict rules for the contents of tables

Table size is important and the accelerator table format should allow the reuse
of strings from common string tables so the strings for the names are not
duplicated.  We also want to make sure the table is ready to be used as-is by
simply mapping the table into memory with minimal header parsing.

The name lookups need to be fast and optimized for the kinds of lookups that
debuggers tend to do.  Optimally we would like to touch as few parts of the
mapped table as possible when doing a name lookup and be able to quickly find
the name entry we are looking for, or discover there are no matches.  In the
case of debuggers we optimized for lookups that fail most of the time.

Each table that is defined should have strict rules on exactly what is in the
accelerator tables and documented so clients can rely on the content.

Hash Tables
^^^^^^^^^^^

Standard Hash Tables
""""""""""""""""""""

Typical hash tables have a header, buckets, and each bucket points to the
bucket contents:

.. code-block:: none

  .------------.
  |  HEADER    |
  |------------|
  |  BUCKETS   |
  |------------|
  |  DATA      |
  `------------'

The BUCKETS are an array of offsets to DATA for each hash:

.. code-block:: none

  .------------.
  | 0x00001000 | BUCKETS[0]
  | 0x00002000 | BUCKETS[1]
  | 0x00002200 | BUCKETS[2]
  | 0x000034f0 | BUCKETS[3]
  |            | ...
  | 0xXXXXXXXX | BUCKETS[n_buckets]
  '------------'

So for ``bucket[3]`` in the example above, we have an offset into the table
0x000034f0 which points to a chain of entries for the bucket.  Each bucket must
contain a next pointer, full 32 bit hash value, the string itself, and the data
for the current string value.

.. code-block:: none

              .------------.
  0x000034f0: | 0x00003500 | next pointer
              | 0x12345678 | 32 bit hash
              | "erase"    | string value
              | data[n]    | HashData for this bucket
              |------------|
  0x00003500: | 0x00003550 | next pointer
              | 0x29273623 | 32 bit hash
              | "dump"     | string value
              | data[n]    | HashData for this bucket
              |------------|
  0x00003550: | 0x00000000 | next pointer
              | 0x82638293 | 32 bit hash
              | "main"     | string value
              | data[n]    | HashData for this bucket
              `------------'

The problem with this layout for debuggers is that we need to optimize for the
negative lookup case where the symbol we're searching for is not present.  So
if we were to lookup "``printf``" in the table above, we would make a 32 hash
for "``printf``", it might match ``bucket[3]``.  We would need to go to the
offset 0x000034f0 and start looking to see if our 32 bit hash matches.  To do
so, we need to read the next pointer, then read the hash, compare it, and skip
to the next bucket.  Each time we are skipping many bytes in memory and
touching new cache pages just to do the compare on the full 32 bit hash.  All
of these accesses then tell us that we didn't have a match.

Name Hash Tables
""""""""""""""""

To solve the issues mentioned above we have structured the hash tables a bit
differently: a header, buckets, an array of all unique 32 bit hash values,
followed by an array of hash value data offsets, one for each hash value, then
the data for all hash values:

.. code-block:: none

  .-------------.
  |  HEADER     |
  |-------------|
  |  BUCKETS    |
  |-------------|
  |  HASHES     |
  |-------------|
  |  OFFSETS    |
  |-------------|
  |  DATA       |
  `-------------'

The ``BUCKETS`` in the name tables are an index into the ``HASHES`` array.  By
making all of the full 32 bit hash values contiguous in memory, we allow
ourselves to efficiently check for a match while touching as little memory as
possible.  Most often checking the 32 bit hash values is as far as the lookup
goes.  If it does match, it usually is a match with no collisions.  So for a
table with "``n_buckets``" buckets, and "``n_hashes``" unique 32 bit hash
values, we can clarify the contents of the ``BUCKETS``, ``HASHES`` and
``OFFSETS`` as:

.. code-block:: none

  .-------------------------.
  |  HEADER.magic           | uint32_t
  |  HEADER.version         | uint16_t
  |  HEADER.hash_function   | uint16_t
  |  HEADER.bucket_count    | uint32_t
  |  HEADER.hashes_count    | uint32_t
  |  HEADER.header_data_len | uint32_t
  |  HEADER_DATA            | HeaderData
  |-------------------------|
  |  BUCKETS                | uint32_t[n_buckets] // 32 bit hash indexes
  |-------------------------|
  |  HASHES                 | uint32_t[n_hashes] // 32 bit hash values
  |-------------------------|
  |  OFFSETS                | uint32_t[n_hashes] // 32 bit offsets to hash value data
  |-------------------------|
  |  ALL HASH DATA          |
  `-------------------------'

So taking the exact same data from the standard hash example above we end up
with:

.. code-block:: none

              .------------.
              | HEADER     |
              |------------|
              |          0 | BUCKETS[0]
              |          2 | BUCKETS[1]
              |          5 | BUCKETS[2]
              |          6 | BUCKETS[3]
              |            | ...
              |        ... | BUCKETS[n_buckets]
              |------------|
              | 0x........ | HASHES[0]
              | 0x........ | HASHES[1]
              | 0x........ | HASHES[2]
              | 0x........ | HASHES[3]
              | 0x........ | HASHES[4]
              | 0x........ | HASHES[5]
              | 0x12345678 | HASHES[6]    hash for BUCKETS[3]
              | 0x29273623 | HASHES[7]    hash for BUCKETS[3]
              | 0x82638293 | HASHES[8]    hash for BUCKETS[3]
              | 0x........ | HASHES[9]
              | 0x........ | HASHES[10]
              | 0x........ | HASHES[11]
              | 0x........ | HASHES[12]
              | 0x........ | HASHES[13]
              | 0x........ | HASHES[n_hashes]
              |------------|
              | 0x........ | OFFSETS[0]
              | 0x........ | OFFSETS[1]
              | 0x........ | OFFSETS[2]
              | 0x........ | OFFSETS[3]
              | 0x........ | OFFSETS[4]
              | 0x........ | OFFSETS[5]
              | 0x000034f0 | OFFSETS[6]   offset for BUCKETS[3]
              | 0x00003500 | OFFSETS[7]   offset for BUCKETS[3]
              | 0x00003550 | OFFSETS[8]   offset for BUCKETS[3]
              | 0x........ | OFFSETS[9]
              | 0x........ | OFFSETS[10]
              | 0x........ | OFFSETS[11]
              | 0x........ | OFFSETS[12]
              | 0x........ | OFFSETS[13]
              | 0x........ | OFFSETS[n_hashes]
              |------------|
              |            |
              |            |
              |            |
              |            |
              |            |
              |------------|
  0x000034f0: | 0x00001203 | .debug_str ("erase")
              | 0x00000004 | A 32 bit array count - number of HashData with name "erase"
              | 0x........ | HashData[0]
              | 0x........ | HashData[1]
              | 0x........ | HashData[2]
              | 0x........ | HashData[3]
              | 0x00000000 | String offset into .debug_str (terminate data for hash)
              |------------|
  0x00003500: | 0x00001203 | String offset into .debug_str ("collision")
              | 0x00000002 | A 32 bit array count - number of HashData with name "collision"
              | 0x........ | HashData[0]
              | 0x........ | HashData[1]
              | 0x00001203 | String offset into .debug_str ("dump")
              | 0x00000003 | A 32 bit array count - number of HashData with name "dump"
              | 0x........ | HashData[0]
              | 0x........ | HashData[1]
              | 0x........ | HashData[2]
              | 0x00000000 | String offset into .debug_str (terminate data for hash)
              |------------|
  0x00003550: | 0x00001203 | String offset into .debug_str ("main")
              | 0x00000009 | A 32 bit array count - number of HashData with name "main"
              | 0x........ | HashData[0]
              | 0x........ | HashData[1]
              | 0x........ | HashData[2]
              | 0x........ | HashData[3]
              | 0x........ | HashData[4]
              | 0x........ | HashData[5]
              | 0x........ | HashData[6]
              | 0x........ | HashData[7]
              | 0x........ | HashData[8]
              | 0x00000000 | String offset into .debug_str (terminate data for hash)
              `------------'

So we still have all of the same data, we just organize it more efficiently for
debugger lookup.  If we repeat the same "``printf``" lookup from above, we
would hash "``printf``" and find it matches ``BUCKETS[3]`` by taking the 32 bit
hash value and modulo it by ``n_buckets``.  ``BUCKETS[3]`` contains "6" which
is the index into the ``HASHES`` table.  We would then compare any consecutive
32 bit hashes values in the ``HASHES`` array as long as the hashes would be in
``BUCKETS[3]``.  We do this by verifying that each subsequent hash value modulo
``n_buckets`` is still 3.  In the case of a failed lookup we would access the
memory for ``BUCKETS[3]``, and then compare a few consecutive 32 bit hashes
before we know that we have no match.  We don't end up marching through
multiple words of memory and we really keep the number of processor data cache
lines being accessed as small as possible.

The string hash that is used for these lookup tables is the Daniel J.
Bernstein hash which is also used in the ELF ``GNU_HASH`` sections.  It is a
very good hash for all kinds of names in programs with very few hash
collisions.

Empty buckets are designated by using an invalid hash index of ``UINT32_MAX``.

Details
^^^^^^^

These name hash tables are designed to be generic where specializations of the
table get to define additional data that goes into the header ("``HeaderData``"),
how the string value is stored ("``KeyType``") and the content of the data for each
hash value.

Header Layout
"""""""""""""

The header has a fixed part, and the specialized part.  The exact format of the
header is:

.. code-block:: c

  struct Header
  {
    uint32_t   magic;           // 'HASH' magic value to allow endian detection
    uint16_t   version;         // Version number
    uint16_t   hash_function;   // The hash function enumeration that was used
    uint32_t   bucket_count;    // The number of buckets in this hash table
    uint32_t   hashes_count;    // The total number of unique hash values and hash data offsets in this table
    uint32_t   header_data_len; // The bytes to skip to get to the hash indexes (buckets) for correct alignment
                                // Specifically the length of the following HeaderData field - this does not
                                // include the size of the preceding fields
    HeaderData header_data;     // Implementation specific header data
  };

The header starts with a 32 bit "``magic``" value which must be ``'HASH'``
encoded as an ASCII integer.  This allows the detection of the start of the
hash table and also allows the table's byte order to be determined so the table
can be correctly extracted.  The "``magic``" value is followed by a 16 bit
``version`` number which allows the table to be revised and modified in the
future.  The current version number is 1. ``hash_function`` is a ``uint16_t``
enumeration that specifies which hash function was used to produce this table.
The current values for the hash function enumerations include:

.. code-block:: c

  enum HashFunctionType
  {
    eHashFunctionDJB = 0u, // Daniel J Bernstein hash function
  };

``bucket_count`` is a 32 bit unsigned integer that represents how many buckets
are in the ``BUCKETS`` array.  ``hashes_count`` is the number of unique 32 bit
hash values that are in the ``HASHES`` array, and is the same number of offsets
are contained in the ``OFFSETS`` array.  ``header_data_len`` specifies the size
in bytes of the ``HeaderData`` that is filled in by specialized versions of
this table.

Fixed Lookup
""""""""""""

The header is followed by the buckets, hashes, offsets, and hash value data.

.. code-block:: c

  struct FixedTable
  {
    uint32_t buckets[Header.bucket_count];  // An array of hash indexes into the "hashes[]" array below
    uint32_t hashes [Header.hashes_count];  // Every unique 32 bit hash for the entire table is in this table
    uint32_t offsets[Header.hashes_count];  // An offset that corresponds to each item in the "hashes[]" array above
  };

``buckets`` is an array of 32 bit indexes into the ``hashes`` array.  The
``hashes`` array contains all of the 32 bit hash values for all names in the
hash table.  Each hash in the ``hashes`` table has an offset in the ``offsets``
array that points to the data for the hash value.

This table setup makes it very easy to repurpose these tables to contain
different data, while keeping the lookup mechanism the same for all tables.
This layout also makes it possible to save the table to disk and map it in
later and do very efficient name lookups with little or no parsing.

DWARF lookup tables can be implemented in a variety of ways and can store a lot
of information for each name.  We want to make the DWARF tables extensible and
able to store the data efficiently so we have used some of the DWARF features
that enable efficient data storage to define exactly what kind of data we store
for each name.

The ``HeaderData`` contains a definition of the contents of each HashData chunk.
We might want to store an offset to all of the debug information entries (DIEs)
for each name.  To keep things extensible, we create a list of items, or
Atoms, that are contained in the data for each name.  First comes the type of
the data in each atom:

.. code-block:: c

  enum AtomType
  {
    eAtomTypeNULL       = 0u,
    eAtomTypeDIEOffset  = 1u,   // DIE offset, check form for encoding
    eAtomTypeCUOffset   = 2u,   // DIE offset of the compiler unit header that contains the item in question
    eAtomTypeTag        = 3u,   // DW_TAG_xxx value, should be encoded as DW_FORM_data1 (if no tags exceed 255) or DW_FORM_data2
    eAtomTypeNameFlags  = 4u,   // Flags from enum NameFlags
    eAtomTypeTypeFlags  = 5u,   // Flags from enum TypeFlags
  };

The enumeration values and their meanings are:

.. code-block:: none

  eAtomTypeNULL       - a termination atom that specifies the end of the atom list
  eAtomTypeDIEOffset  - an offset into the .debug_info section for the DWARF DIE for this name
  eAtomTypeCUOffset   - an offset into the .debug_info section for the CU that contains the DIE
  eAtomTypeDIETag     - The DW_TAG_XXX enumeration value so you don't have to parse the DWARF to see what it is
  eAtomTypeNameFlags  - Flags for functions and global variables (isFunction, isInlined, isExternal...)
  eAtomTypeTypeFlags  - Flags for types (isCXXClass, isObjCClass, ...)

Then we allow each atom type to define the atom type and how the data for each
atom type data is encoded:

.. code-block:: c

  struct Atom
  {
    uint16_t type;  // AtomType enum value
    uint16_t form;  // DWARF DW_FORM_XXX defines
  };

The ``form`` type above is from the DWARF specification and defines the exact
encoding of the data for the Atom type.  See the DWARF specification for the
``DW_FORM_`` definitions.

.. code-block:: c

  struct HeaderData
  {
    uint32_t die_offset_base;
    uint32_t atom_count;
    Atoms    atoms[atom_count0];
  };

``HeaderData`` defines the base DIE offset that should be added to any atoms
that are encoded using the ``DW_FORM_ref1``, ``DW_FORM_ref2``,
``DW_FORM_ref4``, ``DW_FORM_ref8`` or ``DW_FORM_ref_udata``.  It also defines
what is contained in each ``HashData`` object -- ``Atom.form`` tells us how large
each field will be in the ``HashData`` and the ``Atom.type`` tells us how this data
should be interpreted.

For the current implementations of the "``.apple_names``" (all functions +
globals), the "``.apple_types``" (names of all types that are defined), and
the "``.apple_namespaces``" (all namespaces), we currently set the ``Atom``
array to be:

.. code-block:: c

  HeaderData.atom_count = 1;
  HeaderData.atoms[0].type = eAtomTypeDIEOffset;
  HeaderData.atoms[0].form = DW_FORM_data4;

This defines the contents to be the DIE offset (eAtomTypeDIEOffset) that is
encoded as a 32 bit value (DW_FORM_data4).  This allows a single name to have
multiple matching DIEs in a single file, which could come up with an inlined
function for instance.  Future tables could include more information about the
DIE such as flags indicating if the DIE is a function, method, block,
or inlined.

The KeyType for the DWARF table is a 32 bit string table offset into the
".debug_str" table.  The ".debug_str" is the string table for the DWARF which
may already contain copies of all of the strings.  This helps make sure, with
help from the compiler, that we reuse the strings between all of the DWARF
sections and keeps the hash table size down.  Another benefit to having the
compiler generate all strings as DW_FORM_strp in the debug info, is that
DWARF parsing can be made much faster.

After a lookup is made, we get an offset into the hash data.  The hash data
needs to be able to deal with 32 bit hash collisions, so the chunk of data
at the offset in the hash data consists of a triple:

.. code-block:: c

  uint32_t str_offset
  uint32_t hash_data_count
  HashData[hash_data_count]

If "str_offset" is zero, then the bucket contents are done. 99.9% of the
hash data chunks contain a single item (no 32 bit hash collision):

.. code-block:: none

  .------------.
  | 0x00001023 | uint32_t KeyType (.debug_str[0x0001023] => "main")
  | 0x00000004 | uint32_t HashData count
  | 0x........ | uint32_t HashData[0] DIE offset
  | 0x........ | uint32_t HashData[1] DIE offset
  | 0x........ | uint32_t HashData[2] DIE offset
  | 0x........ | uint32_t HashData[3] DIE offset
  | 0x00000000 | uint32_t KeyType (end of hash chain)
  `------------'

If there are collisions, you will have multiple valid string offsets:

.. code-block:: none

  .------------.
  | 0x00001023 | uint32_t KeyType (.debug_str[0x0001023] => "main")
  | 0x00000004 | uint32_t HashData count
  | 0x........ | uint32_t HashData[0] DIE offset
  | 0x........ | uint32_t HashData[1] DIE offset
  | 0x........ | uint32_t HashData[2] DIE offset
  | 0x........ | uint32_t HashData[3] DIE offset
  | 0x00002023 | uint32_t KeyType (.debug_str[0x0002023] => "print")
  | 0x00000002 | uint32_t HashData count
  | 0x........ | uint32_t HashData[0] DIE offset
  | 0x........ | uint32_t HashData[1] DIE offset
  | 0x00000000 | uint32_t KeyType (end of hash chain)
  `------------'

Current testing with real world C++ binaries has shown that there is around 1
32 bit hash collision per 100,000 name entries.

Contents
^^^^^^^^

As we said, we want to strictly define exactly what is included in the
different tables.  For DWARF, we have 3 tables: "``.apple_names``",
"``.apple_types``", and "``.apple_namespaces``".

"``.apple_names``" sections should contain an entry for each DWARF DIE whose
``DW_TAG`` is a ``DW_TAG_label``, ``DW_TAG_inlined_subroutine``, or
``DW_TAG_subprogram`` that has address attributes: ``DW_AT_low_pc``,
``DW_AT_high_pc``, ``DW_AT_ranges`` or ``DW_AT_entry_pc``.  It also contains
``DW_TAG_variable`` DIEs that have a ``DW_OP_addr`` in the location (global and
static variables).  All global and static variables should be included,
including those scoped within functions and classes.  For example using the
following code:

.. code-block:: c

  static int var = 0;

  void f ()
  {
    static int var = 0;
  }

Both of the static ``var`` variables would be included in the table.  All
functions should emit both their full names and their basenames.  For C or C++,
the full name is the mangled name (if available) which is usually in the
``DW_AT_MIPS_linkage_name`` attribute, and the ``DW_AT_name`` contains the
function basename.  If global or static variables have a mangled name in a
``DW_AT_MIPS_linkage_name`` attribute, this should be emitted along with the
simple name found in the ``DW_AT_name`` attribute.

"``.apple_types``" sections should contain an entry for each DWARF DIE whose
tag is one of:

* DW_TAG_array_type
* DW_TAG_class_type
* DW_TAG_enumeration_type
* DW_TAG_pointer_type
* DW_TAG_reference_type
* DW_TAG_string_type
* DW_TAG_structure_type
* DW_TAG_subroutine_type
* DW_TAG_typedef
* DW_TAG_union_type
* DW_TAG_ptr_to_member_type
* DW_TAG_set_type
* DW_TAG_subrange_type
* DW_TAG_base_type
* DW_TAG_const_type
* DW_TAG_constant
* DW_TAG_file_type
* DW_TAG_namelist
* DW_TAG_packed_type
* DW_TAG_volatile_type
* DW_TAG_restrict_type
* DW_TAG_interface_type
* DW_TAG_unspecified_type
* DW_TAG_shared_type

Only entries with a ``DW_AT_name`` attribute are included, and the entry must
not be a forward declaration (``DW_AT_declaration`` attribute with a non-zero
value).  For example, using the following code:

.. code-block:: c

  int main ()
  {
    int *b = 0;
    return *b;
  }

We get a few type DIEs:

.. code-block:: none

  0x00000067:     TAG_base_type [5]
                  AT_encoding( DW_ATE_signed )
                  AT_name( "int" )
                  AT_byte_size( 0x04 )

  0x0000006e:     TAG_pointer_type [6]
                  AT_type( {0x00000067} ( int ) )
                  AT_byte_size( 0x08 )

The DW_TAG_pointer_type is not included because it does not have a ``DW_AT_name``.

"``.apple_namespaces``" section should contain all ``DW_TAG_namespace`` DIEs.
If we run into a namespace that has no name this is an anonymous namespace, and
the name should be output as "``(anonymous namespace)``" (without the quotes).
Why?  This matches the output of the ``abi::cxa_demangle()`` that is in the
standard C++ library that demangles mangled names.


Language Extensions and File Format Changes
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Objective-C Extensions
""""""""""""""""""""""

"``.apple_objc``" section should contain all ``DW_TAG_subprogram`` DIEs for an
Objective-C class.  The name used in the hash table is the name of the
Objective-C class itself.  If the Objective-C class has a category, then an
entry is made for both the class name without the category, and for the class
name with the category.  So if we have a DIE at offset 0x1234 with a name of
method "``-[NSString(my_additions) stringWithSpecialString:]``", we would add
an entry for "``NSString``" that points to DIE 0x1234, and an entry for
"``NSString(my_additions)``" that points to 0x1234.  This allows us to quickly
track down all Objective-C methods for an Objective-C class when doing
expressions.  It is needed because of the dynamic nature of Objective-C where
anyone can add methods to a class.  The DWARF for Objective-C methods is also
emitted differently from C++ classes where the methods are not usually
contained in the class definition, they are scattered about across one or more
compile units.  Categories can also be defined in different shared libraries.
So we need to be able to quickly find all of the methods and class functions
given the Objective-C class name, or quickly find all methods and class
functions for a class + category name.  This table does not contain any
selector names, it just maps Objective-C class names (or class names +
category) to all of the methods and class functions.  The selectors are added
as function basenames in the "``.debug_names``" section.

In the "``.apple_names``" section for Objective-C functions, the full name is
the entire function name with the brackets ("``-[NSString
stringWithCString:]``") and the basename is the selector only
("``stringWithCString:``").

Mach-O Changes
""""""""""""""

The sections names for the apple hash tables are for non-mach-o files.  For
mach-o files, the sections should be contained in the ``__DWARF`` segment with
names as follows:

* "``.apple_names``" -> "``__apple_names``"
* "``.apple_types``" -> "``__apple_types``"
* "``.apple_namespaces``" -> "``__apple_namespac``" (16 character limit)
* "``.apple_objc``" -> "``__apple_objc``"

