================================
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 LLVM
debugging information is versioned, allowing backwards compatibility in the
case that the core structures need to change in some way.  Also, 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.  To
facilitate versioning of debug information, the tag is augmented with the
current debug version (``LLVMDebugVersion = 8 << 16`` or 0x80000 or
524288.)

The details of the various descriptors follow.

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

.. code-block:: llvm

  !0 = metadata !{
    i32,       ;; Tag = 17 + LLVMDebugVersion (DW_TAG_compile_unit)
    i32,       ;; Unused field.
    i32,       ;; DWARF language identifier (ex. DW_LANG_C89)
    metadata,  ;; Source file name
    metadata,  ;; Source file directory (includes trailing slash)
    metadata   ;; Producer (ex. "4.0.1 LLVM (LLVM research group)")
    i1,        ;; True if this is a main compile unit.
    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
  }

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), three strings describing the filename, working
directory of the compiler, and 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 and type information.

.. _format_files:

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

.. code-block:: llvm

  !0 = metadata !{
    i32,       ;; Tag = 41 + LLVMDebugVersion (DW_TAG_file_type)
    metadata,  ;; Source file name
    metadata,  ;; Source file directory (includes trailing slash)
    metadata   ;; Unused
  }

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 + LLVMDebugVersion (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
  }

These descriptors provide debug information about globals 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 + LLVMDebugVersion (DW_TAG_subprogram)
    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)
    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 - Artifical, Private, Protected, Explicit, Prototyped.
    i1,       ;; isOptimized
    Function * , ;; Pointer to 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 + LLVMDebugVersion (DW_TAG_lexical_block)
    metadata,;; Reference to context descriptor
    i32,     ;; Line number
    i32,     ;; Column number
    metadata,;; Reference to source file
    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 + LLVMDebugVersion (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.
  }

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 + LLVMDebugVersion (DW_TAG_base_type)
    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)
    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, ;; 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)
    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, ;; 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)
    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
  }

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 + LLVMDebugVersion (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 + LLVMDebugVersion (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, ;; Type descriptor
    i32,      ;; flags
    metadata  ;; (optional) Reference to inline location
  }

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() nounwind ssp {
  entry:
    %X = alloca i32, align 4                        ; <i32*> [#uses=4]
    %Y = alloca i32, align 4                        ; <i32*> [#uses=4]
    %Z = alloca i32, align 4                        ; <i32*> [#uses=3]
    %0 = bitcast i32* %X to {}*                     ; <{}*> [#uses=1]
    call void @llvm.dbg.declare(metadata !{i32 * %X}, metadata !0), !dbg !7
    store i32 21, i32* %X, !dbg !8
    %1 = bitcast i32* %Y to {}*                     ; <{}*> [#uses=1]
    call void @llvm.dbg.declare(metadata !{i32 * %Y}, metadata !9), !dbg !10
    store i32 22, i32* %Y, !dbg !11
    %2 = bitcast i32* %Z to {}*                     ; <{}*> [#uses=1]
    call void @llvm.dbg.declare(metadata !{i32 * %Z}, metadata !12), !dbg !14
    store i32 23, i32* %Z, !dbg !15
    %tmp = load i32* %X, !dbg !16                   ; <i32> [#uses=1]
    %tmp1 = load i32* %Y, !dbg !16                  ; <i32> [#uses=1]
    %add = add nsw i32 %tmp, %tmp1, !dbg !16        ; <i32> [#uses=1]
    store i32 %add, i32* %Z, !dbg !16
    %tmp2 = load i32* %Y, !dbg !17                  ; <i32> [#uses=1]
    store i32 %tmp2, i32* %X, !dbg !17
    ret void, !dbg !18
  }

  declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone

  !0 = metadata !{i32 459008, metadata !1, metadata !"X",
                  metadata !3, i32 2, metadata !6}; [ DW_TAG_auto_variable ]
  !1 = metadata !{i32 458763, metadata !2}; [DW_TAG_lexical_block ]
  !2 = metadata !{i32 458798, i32 0, metadata !3, metadata !"foo", metadata !"foo",
                 metadata !"foo", metadata !3, i32 1, metadata !4,
                 i1 false, i1 true}; [DW_TAG_subprogram ]
  !3 = metadata !{i32 458769, i32 0, i32 12, metadata !"foo.c",
                  metadata !"/private/tmp", metadata !"clang 1.1", i1 true,
                  i1 false, metadata !"", i32 0}; [DW_TAG_compile_unit ]
  !4 = metadata !{i32 458773, metadata !3, metadata !"", null, i32 0, i64 0, i64 0,
                  i64 0, i32 0, null, metadata !5, i32 0}; [DW_TAG_subroutine_type ]
  !5 = metadata !{null}
  !6 = metadata !{i32 458788, metadata !3, metadata !"int", metadata !3, i32 0,
                  i64 32, i64 32, i64 0, i32 0, i32 5}; [DW_TAG_base_type ]
  !7 = metadata !{i32 2, i32 7, metadata !1, null}
  !8 = metadata !{i32 2, i32 3, metadata !1, null}
  !9 = metadata !{i32 459008, metadata !1, metadata !"Y", metadata !3, i32 3,
                  metadata !6}; [ DW_TAG_auto_variable ]
  !10 = metadata !{i32 3, i32 7, metadata !1, null}
  !11 = metadata !{i32 3, i32 3, metadata !1, null}
  !12 = metadata !{i32 459008, metadata !13, metadata !"Z", metadata !3, i32 5,
                   metadata !6}; [ DW_TAG_auto_variable ]
  !13 = metadata !{i32 458763, metadata !1}; [DW_TAG_lexical_block ]
  !14 = metadata !{i32 5, i32 9, metadata !13, null}
  !15 = metadata !{i32 5, i32 5, metadata !13, null}
  !16 = metadata !{i32 6, i32 5, metadata !13, null}
  !17 = metadata !{i32 8, i32 3, metadata !1, null}
  !18 = metadata !{i32 9, i32 1, metadata !2, 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, metadata !0), !dbg !7

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

.. code-block:: llvm

  !7 = metadata !{i32 2, i32 7, metadata !1, null}
  !1 = metadata !{i32 458763, metadata !2}; [DW_TAG_lexical_block ]
  !2 = metadata !{i32 458798, i32 0, metadata !3, metadata !"foo",
                  metadata !"foo", metadata !"foo", metadata !3, i32 1,
                  metadata !4, i1 false, i1 true}; [DW_TAG_subprogram ]

Here ``!7`` 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 ``!1``. ``!1``
represents a lexical block inside the scope ``!2``, where ``!2`` is 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, metadata !12), !dbg !14

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

.. code-block:: llvm

  !13 = metadata !{i32 458763, metadata !1}; [DW_TAG_lexical_block ]
  !14 = metadata !{i32 5, i32 9, metadata !13, null}

Here ``!14`` indicates that ``Z`` is declared at line number 5 and
column number 9 inside of lexical scope ``!13``.  The lexical scope itself
resides inside of lexical scope ``!1`` 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".
  ;;
  !2 = metadata !{
    i32 524305,    ;; Tag
    i32 0,         ;; Unused
    i32 4,         ;; Language Id
    metadata !"MySource.cpp",
    metadata !"/Users/mine/sources",
    metadata !"4.2.1 (Based on Apple Inc. build 5649) (LLVM build 00)",
    i1 true,       ;; Main Compile Unit
    i1 false,      ;; Optimized compile unit
    metadata !"",  ;; Compiler flags
    i32 0}         ;; Runtime version

  ;;
  ;; Define the file for the file "/Users/mine/sources/MySource.cpp".
  ;;
  !1 = metadata !{
    i32 524329,    ;; Tag
    metadata !"MySource.cpp",
    metadata !"/Users/mine/sources",
    metadata !2    ;; Compile unit
  }

  ;;
  ;; Define the file for the file "/Users/mine/sources/Myheader.h"
  ;;
  !3 = metadata !{
    i32 524329,    ;; Tag
    metadata !"Myheader.h"
    metadata !"/Users/mine/sources",
    metadata !2    ;; Compile unit
  }

  ...

``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
  } ; [ DW_TAG_compile_unit ]

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

  !4 = metadata !{
    metadata !5
  }

  ;;
  ;; Define the global variable itself.
  ;;
  !5 = 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
  } ; [ DW_TAG_variable ]

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

  ;;
  ;; Define the type
  ;;
  !7 = metadata !{
    i32 786468,                         ;; Tag
    null,                               ;; Unused
    metadata !"int",                    ;; Name
    null,                               ;; Unused
    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.  Note that the second field of the
  ;; anchor is 46, which is the same as the tag for subprograms
  ;; (46 = DW_TAG_subprogram.)
  ;;
  !6 = metadata !{
    i32 524334,        ;; Tag
    i32 0,             ;; Unused
    metadata !1,       ;; Context
    metadata !"main",  ;; Name
    metadata !"main",  ;; Display name
    metadata !"main",  ;; Linkage name
    metadata !1,       ;; File
    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
  }
  ;;
  ;; 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 524324,        ;; Tag
    metadata !1,       ;; Context
    metadata !"bool",  ;; Name
    metadata !1,       ;; File
    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 524324,        ;; Tag
    metadata !1,       ;; Context
    metadata !"char",  ;; Name
    metadata !1,       ;; File
    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 524324,        ;; Tag
    metadata !1,       ;; Context
    metadata !"unsigned char",
    metadata !1,       ;; File
    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 524324,        ;; Tag
    metadata !1,       ;; Context
    metadata !"short int",
    metadata !1,       ;; File
    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 524324,        ;; Tag
    metadata !1,       ;; Context
    metadata !"short unsigned int",
    metadata !1,       ;; File
    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 524324,        ;; Tag
    metadata !1,       ;; Context
    metadata !"int",   ;; Name
    metadata !1,       ;; File
    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 524324,        ;; Tag
    metadata !1,       ;; Context
    metadata !"unsigned int",
    metadata !1,       ;; File
    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 524324,        ;; Tag
    metadata !1,       ;; Context
    metadata !"long long int",
    metadata !1,       ;; File
    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 524324,        ;; Tag
    metadata !1,       ;; Context
    metadata !"long long unsigned int",
    metadata !1,       ;; File
    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 524324,        ;; Tag
    metadata !1,       ;; Context
    metadata !"float",
    metadata !1,       ;; File
    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 524324,        ;; Tag
    metadata !1,       ;; Context
    metadata !"double",;; Name
    metadata !1,       ;; File
    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 524310,          ;; Tag
    metadata !1,         ;; Context
    metadata !"IntPtr",  ;; Name
    metadata !3,         ;; File
    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 524303,          ;; Tag
    metadata !1,         ;; Context
    metadata !"",        ;; Name
    metadata !1,         ;; File
    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 524326,          ;; Tag
    metadata !1,         ;; Context
    metadata !"",        ;; Name
    metadata !1,         ;; File
    i32 0,               ;; Line number
    i64 32,              ;; Size in bits
    i64 32,              ;; Align in bits
    i64 0,               ;; Offset in bits
    i32 0,               ;; Flags
    metadata !6          ;; Derived From type
  }
  ;;
  ;; Define the int type.
  ;;
  !6 = metadata !{
    i32 524324,          ;; Tag
    metadata !1,         ;; Context
    metadata !"int",     ;; Name
    metadata !1,         ;; File
    i32 0,               ;; Line number
    i64 32,              ;; Size in bits
    i64 32,              ;; Align in bits
    i64 0,               ;; Offset in bits
    i32 0,               ;; Flags
    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 524324,        ;; Tag
    metadata !1,       ;; Context
    metadata !"unsigned int",
    metadata !1,       ;; File
    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 524307,        ;; Tag
    metadata !1,       ;; Context
    metadata !"Color", ;; Name
    metadata !1,       ;; Compile unit
    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
  }

  ;;
  ;; Define the Red field.
  ;;
  !4 = metadata !{
    i32 524301,        ;; Tag
    metadata !1,       ;; Context
    metadata !"Red",   ;; Name
    metadata !1,       ;; File
    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 524301,        ;; Tag
    metadata !1,       ;; Context
    metadata !"Green", ;; Name
    metadata !1,       ;; File
    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 524301,        ;; Tag
    metadata !1,       ;; Context
    metadata !"Blue",  ;; Name
    metadata !1,       ;; File
    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 524292,        ;; Tag
    metadata !1,       ;; Context
    metadata !"Trees", ;; Name
    metadata !1,       ;; File
    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 524328, metadata !"Spruce", i64 100}

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

  ;;
  ;; Define Maple enumerator.
  ;;
  !6 = metadata !{i32 524328, 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``"

