# Source Level Debugging with LLVM


## 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 on 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}`debug records <debug_records>` 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.

(intro_consumers)=

### 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, there are two backend consumers of debug info: DwarfDebug and
CodeViewDebug. DwarfDebug produces DWARF suitable for use with GDB, LLDB, and
other DWARF-based debuggers. {ref}`CodeViewDebug <codeview>` produces CodeView,
the Microsoft debug info format, which is usable with Microsoft debuggers such
as Visual Studio and WinDBG. LLVM's debug information format is mostly derived
from and inspired by DWARF, but it is feasible to translate into other target
debug info formats such as STABS.

SamplePGO (also known as [AutoFDO](https://gcc.gnu.org/wiki/AutoFDO))
is a variant of profile-guided optimizations which uses hardware sampling based
profilers to collect branch frequency data with low overhead in production
environments. It relies on debug information to associate profile information
with LLVM IR which is then used to guide optimization heuristics. Maintaining
deterministic and distinct source locations is necessary to maximize the
accuracy of mapping hardware sample counts to LLVM IR. For example, DWARF
[discriminators](https://wiki.dwarfstd.org/Path_Discriminators.md) allow
SamplePGO to distinguish between multiple paths of execution which map to the
same source line.

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.

(intro_debugopt)=

### Debug information and optimizations

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. {doc}`HowToUpdateDebugInfo` specifies how debug
  info should be updated in various kinds of code transformations to avoid
  breaking this guarantee, and how to preserve as much useful debug info as
  possible.  Note that 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 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 which were optimized out of the program, or inlined away
completely.

(variables_and_variable_fragments)=

## Variables and Variable Fragments

In this document "variable" refers generally to any source language object
which can have a value, including at least:

- Variables
- Constants
- Formal parameters

```{note}
There is no special provision for "true" constants in LLVM today, and
they are instead treated as local or global variables.
```
A variable is represented by a {ref}`local variable <dilocalvariable>` or
{ref}`global variable <diglobalvariable>` metadata node.

A "variable fragment" (or just "fragment") is a contiguous span of bits of a
variable.

A {ref}`debug record <debug_records>` which refers to a {ref}`diexpression`
ending with a `DW_OP_LLVM_fragment` operation describes a fragment of the
variable it refers to.

The operands of the `DW_OP_LLVM_fragment` operation encode the bit offset of
the fragment relative to the start of the variable, and the size of the
fragment in bits, respectively.

```{note}
The `DW_OP_LLVM_fragment` operation acts only to encode the fragment
information, and does not have an effect on the semantics of the expression.
```
(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 <difile>`, and {ref}`program objects
<diglobalvariable>`.  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 are {ref}`specialized metadata nodes
<specialized-metadata>`, first-class subclasses of `Metadata`.

There are two models for defining the values of source variables at different
states of the program and tracking these values through optimization and code
generation: {ref}`debug records <debug_records>`, the current default, and
{ref}`intrinsic function calls <format_common_intrinsics>`, which are
non-default but currently supported for backwards compatibility - though these
two models must never be mixed within an IR module. For an explanation of why
we changed to the new model, how it works, and guidance on how to update old
code or IR to use debug records, see the {doc}`RemoveDIs <RemoveDIsDebugInfo>`
document.

(debug_records)=

### Debug Records

Debug records define the value that a source variable has during execution of
the program; they appear interleaved with instructions, although they are not
instructions themselves and have no effect on the code generated by the
compiler.

LLVM uses several types of debug records to define source variables. The
common syntax for these records is:

```llvm
  #dbg_<kind>([<arg>, ]* <DILocation>)
; Using the intrinsic model, the above is equivalent to:
call void llvm.dbg.<kind>([metadata <arg>, ]*), !dbg <DILocation>
```
Debug records are always printed with an extra level of indentation compared
to instructions, and always have the prefix `#dbg_` and a list of
comma-separated arguments in parentheses, as with a `call`.

#### `#dbg_declare`

```llvm
#dbg_declare([Value|MDNode], DILocalVariable, DIExpression, DILocation)
```
This record provides information about a local element (e.g., variable). The
first argument is an SSA `ptr` value corresponding to a variable address, and
is typically a static `alloca` in the function entry block.  The second
argument is a {ref}`local variable <dilocalvariable>` containing a description
of the variable.  The third argument is a {ref}`complex expression
<diexpression>`. The fourth argument is a {ref}`source location <dilocation>`.
A `#dbg_declare` record describes the *address* of a source variable.

```llvm
%i.addr = alloca i32, align 4
  #dbg_declare(ptr %i.addr, !1, !DIExpression(), !2)
; ...
!1 = !DILocalVariable(name: "i", ...) ; int i
!2 = !DILocation(...)
; ...
%buffer = alloca [256 x i8], align 8
; The address of i is buffer+64.
  #dbg_declare(ptr %buffer, !3, !DIExpression(DW_OP_plus, 64), !4)
; ...
!3 = !DILocalVariable(name: "i", ...) ; int i
!4 = !DILocation(...)
```
A frontend should generate exactly one `#dbg_declare` record at the point
of declaration of a source variable. Optimization passes that fully promote the
variable from memory to SSA values will replace this record with possibly
multiple `#dbg_value` records. Passes that delete stores are effectively
partial promotion, and they will insert a mix of `#dbg_value` records to
track the source variable value when it is available. After optimization, there
may be multiple `#dbg_declare` records describing the program points where
the variables lives in memory. All calls for the same concrete source variable
must agree on the memory location.


#### `#dbg_value`

```llvm
#dbg_value([Value|DIArgList|MDNode], DILocalVariable, DIExpression, DILocation)
```
This record provides information when a user source variable is set to a new
value.  The first argument is the new value. The second argument is a
{ref}`local variable <dilocalvariable>` containing a description of the
variable.  The third argument is a {ref}`complex expression <diexpression>`.
The fourth argument is a {ref}`source location <dilocation>`.

A `#dbg_value` record describes the *value* of a source variable
directly, not its address.  Note that the value operand of this intrinsic may
be indirect (i.e, a pointer to the source variable), provided that interpreting
the complex expression derives the direct value.


#### `#dbg_declare_value`

```llvm
#dbg_declare_value([Value|MDNode], DILocalVariable, DIExpression, DILocation)
```
This record provides information about a local element (e.g., variable). The
first argument is used to compute the value of the variable throughout the
entire function.  The second argument is a
{ref}`local variable <dilocalvariable>` containing a description of the
variable. The third argument is a {ref}`complex expression <diexpression>`. The
foruth argument is a {ref}`source location <dilocation>`. A
`#dbg_declare_value` record describes describes the *value* of a source
variable directly, not its address. The difference between a `#dbg_value` and
a `#dbg_declare_value` is that, just like a `#dbg_declare`, a frontend
should generate exactly one `#dbg_declare_value` record. The idea is to have
`#dbg_declare` guarantees but be able to describe a value rather than the
address of a value.


#### `#dbg_assign`

```{toctree}
:hidden:

AssignmentTracking
```
```llvm
#dbg_assign( [Value|DIArgList|MDNode] Value,
             DILocalVariable Variable,
             DIExpression ValueExpression,
             DIAssignID ID,
             [Value|MDNode] Address,
             DIExpression AddressExpression,
             DILocation SourceLocation )
```
This record marks the position in IR where a source assignment occurred. It
encodes the value of the variable. It references the store, if any, that
performs the assignment, and the destination address.

The first three arguments are the same as for a `#dbg_value`. The fourth
argument is a `DIAssignID` used to reference a store. The fifth is the
destination of the store, the sixth is a {ref}`complex expression
<diexpression>` that modifies it, and the seventh is a {ref}`source location
<dilocation>`.

See {doc}`AssignmentTracking` for more info.

### Debugger intrinsic functions

```{warning}
These intrinsics are deprecated, please use {ref}`debug records
<debug_records>` instead. For more details see {doc}`RemoveDIs <RemoveDIsDebugInfo>`.
```
(format_common_intrinsics)=

In intrinsic-mode, LLVM uses several intrinsic functions (name prefixed with "`llvm.dbg`") to
track source local variables through optimization and code generation. These
intrinsic functions each correspond to one of the debug records above, with a
few syntactic differences: each argument to a debugger intrinsic must be wrapped
as metadata, meaning it must be prefixed with `metadata`, and the
`DILocation` argument in each record must be a metadata attachment to the
call instruction, meaning it appears after the argument list with the prefix
`!dbg`.

#### `llvm.dbg.declare`

```llvm
void @llvm.dbg.declare(metadata, metadata, metadata)
```
This intrinsic is equivalent to `#dbg_declare`:

```llvm
  #dbg_declare(i32* %i.addr, !1, !DIExpression(), !2)
call void @llvm.dbg.declare(metadata i32* %i.addr, metadata !1,
                            metadata !DIExpression()), !dbg !2
```
#### `llvm.dbg.value`

```llvm
void @llvm.dbg.value(metadata, metadata, metadata)
```
This intrinsic is equivalent to `#dbg_value`:

```llvm
  #dbg_value(i32 %i, !1, !DIExpression(), !2)
call void @llvm.dbg.value(metadata i32 %i, metadata !1,
                          metadata !DIExpression()), !dbg !2
```
#### `llvm.dbg.assign`

```llvm
void @llvm.dbg.assign(metadata, metadata, metadata, metadata, metadata, metadata)
```
This intrinsic is equivalent to `#dbg_assign`:

```llvm
  #dbg_assign(i32 %i, !1, !DIExpression(), !2,
              ptr %i.addr, !DIExpression(), !3)
call void @llvm.dbg.assign(
  metadata i32 %i, metadata !1, metadata !DIExpression(), metadata !2,
  metadata ptr %i.addr, metadata !DIExpression(), metadata !3), !dbg !3
```
(diexpression)=

### DIExpression

Debug expressions are represented as {ref}`specialized-metadata`.

Debug expressions are interpreted left-to-right: start by pushing the
value/address operand of the record onto a stack, then repeatedly push and
evaluate opcodes from the `DIExpression` until the final variable description
is produced.

The opcodes available in these expressions are described in
{ref}`dwarf-opcodes` and {ref}`internal-opcodes`.

DWARF specifies three kinds of simple location descriptions: register, memory,
and implicit location descriptions.  Note that a location description is
defined over certain ranges of a program, i.e the location of a variable may
change over the course of the program. Register and memory location
descriptions describe the *concrete location* of a source variable (in the
sense that a debugger might modify its value), whereas *implicit locations*
describe merely the actual *value* of a source variable which might not exist
in registers or in memory (see `DW_OP_stack_value`).

A `#dbg_declare` record describes an indirect value (the address) of a source
variable. The first operand of the record must be an address of some kind. A
`DIExpression` operand to the record refines this address to produce a
concrete location for the source variable.

A `#dbg_value` record describes the direct value of a source variable. The
first operand of the record may be a direct or indirect value. A
`DIExpression` operand to the record refines the first operand to produce a
direct value. For example, if the first operand is an indirect value, it may be
necessary to insert `DW_OP_deref` into the `DIExpression` in order to
produce a valid debug record.

```{note}
A `DIExpression` is interpreted in the same way regardless of which kind
of debug record it's attached to.

`DIExpression`s are always printed and parsed inline; they can never be
referenced by an ID (e.g. `!1`).
```
(dwarf-opcodes)=

#### DWARF Opcodes

When possible LLVM reuses DWARF opcodes and gives them identical semantics in
LLVM expressions as in DWARF expressions. The current supported opcode
vocabulary is limited, but includes at least:

- `DW_OP_deref` dereferences the top of the expression stack.
- `DW_OP_plus` pops the last two entries from the expression stack, adds
  them together and pushes the result to the expression stack.
- `DW_OP_minus` pops the last two entries from the expression stack, subtracts
  the last entry from the second last entry and appends the result to the
  expression stack.
- `DW_OP_plus_uconst, 93` adds `93` to the value on top of the stack.
- `DW_OP_swap` swaps top two stack entries.
- `DW_OP_xderef` provides extended dereference mechanism. The entry at the top
  of the stack is treated as an address. The second stack entry is treated as an
  address space identifier. The two entries are popped and then an
  implementation defined value is pushed on the stack.
- `DW_OP_stack_value` may appear at most once in an expression, and must be
  the last opcode if `DW_OP_LLVM_fragment` is not present, or the second last
  opcode if `DW_OP_LLVM_fragment` is present. It pops the top value of the
  expression stack and makes an implicit value location with that value.
- `DW_OP_breg` (or `DW_OP_bregx`) represents a content on the provided
  signed offset of the specified register. The opcode is only generated by the
  `AsmPrinter` pass to describe call site parameter value which requires an
  expression over two registers.
- `DW_OP_push_object_address` pushes the address of the object which can then
  serve as a descriptor in subsequent calculation. This opcode can be used to
  calculate bounds of a Fortran allocatable array which has array descriptors.
- `DW_OP_over` duplicates the entry currently second in the stack at the top
  of the stack. This opcode can be used to calculate bounds of a Fortran
  assumed rank array which has rank known at run time and current dimension
  number is implicitly first element of the stack.

(internal-opcodes)=

#### Internal Opcodes

Where the DWARF equivalent is not suitable, or no DWARF equivalent exists, LLVM
defines internal-only opcodes which have no direct analog in DWARF.

```{note}
Some opcodes do not influence the final DWARF expression directly, instead
encoding information logically belonging to the debug records which use
them.
```
- `DW_OP_LLVM_fragment, <offset>, <size>` may appear at most once in an
  expression, and must be the last opcode. It specifies the bit offset and bit
  size of the variable fragment being described by the record or intrinsic
  using the expression. Note that contrary to `DW_OP_bit_piece`, the offset
  is describing the location within the described source variable. At DWARF
  generation time all fragments for the same variable are collected together
  and DWARF `DW_OP_piece` and `DW_OP_bit_piece` opcodes are used to
  describe a composite with pieces corresponding to the fragments. (This does
  not affect the semantics of the expression containing it.)
- `DW_OP_LLVM_convert, 16, DW_ATE_signed` specifies a bit size and encoding
  (`16` and `DW_ATE_signed` here, respectively) to which the top of the
  expression stack is to be converted. Maps into a `DW_OP_convert` operation
  that references a base type constructed from the supplied values.
- `DW_OP_LLVM_tag_offset, tag_offset` specifies that a memory tag should be
  optionally applied to the pointer. The memory tag is derived from the given
  tag offset in an implementation-defined manner. (This does not affect the
  semantics of the expression containing it.)
- `DW_OP_LLVM_entry_value, N` evaluates a sub-expression as-if it were
  evaluated upon entry to the current call frame.

  The sub-expression replaces the operations which comprise it, i.e. all such
  operations are evaluated only in the frame entry context.

  The sub-expression begins with the operation which immediately precedes
  `DW_OP_LLVM_entry_value, N` in the `DIExpression`. If no such operation
  exists (i.e. the expression begins with `DW_OP_LLVM_entry_value, N`), the
  implicit operation which pushes the first debug argument of the containing
  marker/pseudo is used instead. The value `N` must always be at least `1`,
  as this first operation cannot be omitted and is counted in `N`.

  The rest of the sub-expression comprises the `(N - 1)` operations following
  `DW_OP_LLVM_entry_value, N` in the `DIExpression`.

  Due to framework limitations:

    - `N` must not be greater than `1`. In other words, `N` must equal
      `1`, and the sub-expression comprises only the operation immediately
      preceding `DW_OP_LLVM_entry_value, N`.
    - `DW_OP_LLVM_entry_value, N` must be either the first operation of a
      `DIExpression` or the second operation if the expression begins with
      `DW_OP_LLVM_arg, 0`.
    - The first operation must refer to a register value.

  Taken together, these limitations mean that `DW_OP_LLVM_entry_value` can
  only currently be used to push the value a single register had on entry to
  the current stack frame.

  For example, `!DIExpression(DW_OP_LLVM_arg, 0, DW_OP_LLVM_entry_value, 1,
  DW_OP_LLVM_arg, 1, DW_OP_plus, DW_OP_stack_value)` specifies an expression
  where the entry value of the first argument to the `DIExpression` is added
  to the non-entry value of the second argument, and the result is used as the
  value for an implicit value location.

  When targeting DWARF, a `DBG_VALUE(reg, ...,
  DIExpression(DW_OP_LLVM_entry_value, 1, ...)` is lowered to
  `DW_OP_entry_value [reg], ...`, which pushes the value `reg` had upon
  frame entry onto the DWARF expression stack.

  Because `DW_OP_LLVM_entry_value` is currently limited to registers, it is
  usually used in MIR, but it is also allowed in LLVM IR when targeting a
  {ref}`swiftasync <swiftasync>` argument. The operation is introduced by:

    - `LiveDebugValues` pass, which applies it to function parameters that
      are unmodified throughout the function. Support is limited to simple
      register location descriptions, or as indirect locations (e.g.,
      parameters passed-by-value to a callee via a pointer to a temporary copy
      made in the caller).
    - `AsmPrinter` pass when a call site parameter value
      (`DW_AT_call_site_parameter_value`) is represented as entry value of
      the parameter.
    - `CoroSplit` pass, which may move variables from `alloca`s into a
      coroutine frame. If the coroutine frame is a
      {ref}`swiftasync <swiftasync>` argument, the variable is described with
      an `DW_OP_LLVM_entry_value` operation.

- `DW_OP_LLVM_implicit_pointer` It specifies the dereferenced value. It can
  be used to represent pointer variables which are optimized out but the value
  it points to is known. This operator is required as it is different than
  DWARF operator `DW_OP_implicit_pointer` in representation and specification
  (number and types of operands) and later can not be used as multiple level.

  Examples using `DW_OP_LLVM_implicit_pointer`:

  ```text
  IR for "*ptr = 4;"
  --------------
    #dbg_value(i32 4, !17, !DIExpression(DW_OP_LLVM_implicit_pointer), !20)
  !17 = !DILocalVariable(name: "ptr", scope: !12, file: !3, line: 5,
                         type: !18)
  !18 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !19, size: 64)
  !19 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
  !20 = !DILocation(line: 10, scope: !12)

  IR for "**ptr = 4;"
  --------------
    #dbg_value(i32 4, !17,
      !DIExpression(DW_OP_LLVM_implicit_pointer, DW_OP_LLVM_implicit_pointer),
      !21)
  !17 = !DILocalVariable(name: "ptr", scope: !12, file: !3, line: 5,
                         type: !18)
  !18 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !19, size: 64)
  !19 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !20, size: 64)
  !20 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
  !21 = !DILocation(line: 10, scope: !12)
  ```
- `DW_OP_LLVM_arg, N` is used in debug intrinsics that refer to more than one
  value, such as one that calculates the sum of two registers. This is always
  used in combination with an ordered list of values, such that
  `DW_OP_LLVM_arg, N` refers to the `N` {sup}`th` element in that list.
  For example, `!DIExpression(DW_OP_LLVM_arg, 0, DW_OP_LLVM_arg, 1,
  DW_OP_minus, DW_OP_stack_value)` used with the list `(%reg1, %reg2)` would
  evaluate to an implicit value location that has the value of
  `%reg1 - reg2`. This list of values should be provided by the containing
  intrinsic/instruction.
- `DW_OP_LLVM_extract_bits_sext, 16, 8,` specifies the offset and size
  (`16` and `8` here, respectively) of bits that are to be extracted and
  sign-extended from the value at the top of the expression stack. If the top of
  the expression stack is a memory location then these bits are extracted from
  the value pointed to by that memory location. Maps into a `DW_OP_shl`
  followed by `DW_OP_shra`.
- `DW_OP_LLVM_extract_bits_zext` behaves similarly to
  `DW_OP_LLVM_extract_bits_sext`, but zero-extends instead of sign-extending.
  Maps into a `DW_OP_shl` followed by `DW_OP_shr`.

## 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:

```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:

```text
; Function Attrs: nounwind ssp uwtable
define void @foo() #0 !dbg !4 {
entry:
  %X = alloca i32, align 4
  %Y = alloca i32, align 4
  %Z = alloca i32, align 4
    #dbg_declare(ptr %X, !11, !DIExpression(), !13)
  store i32 21, i32* %X, align 4, !dbg !13
    #dbg_declare(ptr %Y, !14, !DIExpression(), !15)
  store i32 22, i32* %Y, align 4, !dbg !15
    #dbg_declare(ptr %Z, !16, !DIExpression(), !18)
  store i32 23, i32* %Z, align 4, !dbg !18
  %0 = load i32, i32* %X, align 4, !dbg !20
  store i32 %0, i32* %Z, align 4, !dbg !21
  %1 = load i32, i32* %Y, align 4, !dbg !22
  store i32 %1, i32* %X, align 4, !dbg !23
  ret void, !dbg !24
}

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

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

!0 = !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 3.7.0 (trunk 231150) (llvm/trunk 231154)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, retainedTypes: !2, subprograms: !3, globals: !2, imports: !2)
!1 = !DIFile(filename: "/dev/stdin", directory: "/Users/dexonsmith/data/llvm/debug-info")
!2 = !{}
!3 = !{!4}
!4 = distinct !DISubprogram(name: "foo", scope: !1, file: !1, line: 1, type: !5, isLocal: false, isDefinition: true, scopeLine: 1, isOptimized: false, retainedNodes: !2)
!5 = !DISubroutineType(types: !6)
!6 = !{null}
!7 = !{i32 2, !"Dwarf Version", i32 2}
!8 = !{i32 2, !"Debug Info Version", i32 3}
!9 = !{i32 1, !"PIC Level", i32 2}
!10 = !{!"clang version 3.7.0 (trunk 231150) (llvm/trunk 231154)"}
!11 = !DILocalVariable(name: "X", scope: !4, file: !1, line: 2, type: !12)
!12 = !DIBasicType(name: "int", size: 32, align: 32, encoding: DW_ATE_signed)
!13 = !DILocation(line: 2, column: 9, scope: !4)
!14 = !DILocalVariable(name: "Y", scope: !4, file: !1, line: 3, type: !12)
!15 = !DILocation(line: 3, column: 9, scope: !4)
!16 = !DILocalVariable(name: "Z", scope: !18, file: !1, line: 5, type: !12)
!17 = distinct !DILexicalBlock(scope: !4, file: !1, line: 4, column: 5)
!18 = !DILocation(line: 5, column: 11, scope: !17)
!29 = !DILocation(line: 6, column: 11, scope: !17)
!20 = !DILocation(line: 6, column: 9, scope: !17)
!21 = !DILocation(line: 8, column: 9, scope: !4)
!22 = !DILocation(line: 8, column: 7, scope: !4)
!23 = !DILocation(line: 9, column: 3, scope: !4)

```
This example illustrates a few important details about LLVM debugging
information.  In particular, it shows how the `#dbg_declare` record 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.

```llvm
#dbg_declare(ptr %X, !11, !DIExpression(), !13)
; [debug line = 2:9] [debug variable = X]
```
The first record `#dbg_declare` encodes debugging information for the
variable `X`.  The location `!13` at the end of the record provides
scope information for the variable `X`.

```text
!13 = !DILocation(line: 2, column: 9, scope: !4)
!4 = distinct !DISubprogram(name: "foo", scope: !1, file: !1, line: 1, type: !5,
                            isLocal: false, isDefinition: true, scopeLine: 1,
                            isOptimized: false, retainedNodes: !2)
```
Here `!13` is metadata providing {ref}`location information <dilocation>`.
In this example, scope is encoded by `!4`, a {ref}`subprogram descriptor
<disubprogram>`.  This way the location information parameter to the records
indicates that the variable `X` is declared at line number 2 at a function
level scope in function `foo`.

Now, let's take another example.

```llvm
#dbg_declare(ptr %Z, !16, !DIExpression(), !18)
; [debug line = 5:11] [debug variable = Z]
```
The third record `#dbg_declare` encodes debugging information for
variable `Z`.  The metadata `!18` at the end of the record provides
scope information for the variable `Z`.

```text
!17 = distinct !DILexicalBlock(scope: !4, file: !1, line: 4, column: 5)
!18 = !DILocation(line: 5, column: 11, scope: !17)
```
Here `!18` indicates that `Z` is declared at line number 5 and column
number 11 inside of lexical scope `!17`.  The lexical scope itself resides
inside of subprogram `!4` described above.

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

## Object lifetime in optimized code

In the example above, every variable assignment uniquely corresponds to a
memory store to the variable's position on the stack. However, in heavily
optimized code LLVM promotes most variables into SSA values, which can
eventually be placed in physical registers or memory locations. To track SSA
values through compilation, when objects are promoted to SSA values a
`#dbg_value` record is created for each assignment, recording the
variable's new location. Compared with the `#dbg_declare` record:

* A `#dbg_value` terminates the effects that any preceding records have on
  any common bits of a common variable.

  ```{note}
  The current implementation generally terminates the effect of every
  record in its entirety if any of its effects would be terminated, rather
  than carrying forward the effect of previous records for non-overlapping
  bits as it would be permitted to do by this definition. This is allowed
  just as dropping any debug information at any point in the compilation is
  allowed.

  One exception to this is {doc}`AssignmentTracking` where certain
  memory-based locations are carried forward partially in some situations.
  ```
* The `#dbg_value`'s position in the IR defines where in the instruction
  stream the variable's value changes.
* Operands can be constants, indicating the variable is assigned a
  constant value.

Care must be taken to update `#dbg_value` records when optimization
passes alter or move instructions and blocks -- the developer could observe such
changes reflected in the value of variables when debugging the program. For any
execution of the optimized program, the set of variable values presented to the
developer by the debugger should not show a state that would never have existed
in the execution of the unoptimized program, given the same input. Doing so
risks misleading the developer by reporting a state that does not exist,
damaging their understanding of the optimized program and undermining their
trust in the debugger.

Sometimes perfectly preserving variable locations is not possible, often when a
redundant calculation is optimized out. In such cases, a `#dbg_value`
with operand `poison` should be used, to terminate earlier variable locations
and let the debugger present `optimized out` to the developer. Withholding
these potentially stale variable values from the developer diminishes the
amount of available debug information, but increases the reliability of the
remaining information.

To illustrate some potential issues, consider the following example:

```llvm
define i32 @foo(i32 %bar, i1 %cond) {
entry:
    #dbg_value(i32 0, !1, !DIExpression(), !4)
  br i1 %cond, label %truebr, label %falsebr
truebr:
  %tval = add i32 %bar, 1
    #dbg_value(i32 %tval, !1, !DIExpression(), !4)
  %g1 = call i32 @gazonk()
  br label %exit
falsebr:
  %fval = add i32 %bar, 2
    #dbg_value(i32 %fval, !1, !DIExpression(), !4)
  %g2 = call i32 @gazonk()
  br label %exit
exit:
  %merge = phi [ %tval, %truebr ], [ %fval, %falsebr ]
  %g = phi [ %g1, %truebr ], [ %g2, %falsebr ]
    #dbg_value(i32 %merge, !1, !DIExpression(), !4)
    #dbg_value(i32 %g, !3, !DIExpression(), !4)
  %plusten = add i32 %merge, 10
  %toret = add i32 %plusten, %g
    #dbg_value(i32 %toret, !1, !DIExpression(), !4)
  ret i32 %toret
}
```
Containing two source-level variables in `!1` and `!3`. The function could,
perhaps, be optimized into the following code:

```llvm
define i32 @foo(i32 %bar, i1 %cond) {
entry:
  %g = call i32 @gazonk()
  %addoper = select i1 %cond, i32 11, i32 12
  %plusten = add i32 %bar, %addoper
  %toret = add i32 %plusten, %g
  ret i32 %toret
}
```
What `#dbg_value` records should be placed to represent the original variable
locations in this code? Unfortunately the second, third, and fourth
`#dbg_value`s for `!1` in the source function have had their operands
(`%tval`, `%fval`, `%merge`) optimized out. Assuming we cannot recover
them, we might consider this placement of `#dbg_value`s:

```llvm
define i32 @foo(i32 %bar, i1 %cond) {
entry:
    #dbg_value(i32 0, !1, !DIExpression(), !4)
  %g = call i32 @gazonk()
    #dbg_value(i32 %g, !3, !DIExpression(), !4)
  %addoper = select i1 %cond, i32 11, i32 12
  %plusten = add i32 %bar, %addoper
  %toret = add i32 %plusten, %g
    #dbg_value(i32 %toret, !1, !DIExpression(), !4)
  ret i32 %toret
}
```
However, this will cause `!3` to have the return value of `@gazonk()` at
the same time as `!1` has the constant value zero -- a pair of assignments
that never occurred in the unoptimized program. To avoid this, we must terminate
the range that `!1` has the constant value assignment by inserting an poison
`#dbg_value` before the `#dbg_value` for `!3`:

```llvm
define i32 @foo(i32 %bar, i1 %cond) {
entry:
    #dbg_value(i32 0, !1, !DIExpression(), !2)
  %g = call i32 @gazonk()
    #dbg_value(i32 poison, !1, !DIExpression(), !2)
    #dbg_value(i32 %g, !3, !DIExpression(), !2)
  %addoper = select i1 %cond, i32 11, i32 12
  %plusten = add i32 %bar, %addoper
  %toret = add i32 %plusten, %g
    #dbg_value(i32 %toret, !1, !DIExpression(), !2)
  ret i32 %toret
}
```
There are a few other `#dbg_value` configurations that mean it terminates
dominating location definitions without adding a new location. The complete
list is:

* Any location operand is `poison` (or `undef`).
* Any location operand is an empty metadata tuple (`!{}`) (which cannot
  occur in a `!DIArgList`).
* There are no location operands (empty `DIArgList`) and the `DIExpression`
  is empty.

This class of `#dbg_value` that kills variable locations is called a "kill
`#dbg_value`" or "kill location", and for legacy reasons the term "`undef
#dbg_value`" may be used in existing code. The `DbgVariableIntrinsic`
methods `isKillLocation` and `setKillLocation` should be used where
possible rather than inspecting location operands directly to check or set
whether a `#dbg_value` is a kill location.

In general, if any `#dbg_value` has its operand optimized out and cannot be
recovered, then a kill `#dbg_value` is necessary to terminate earlier
variable locations. Additional kill `#dbg_values` may be necessary when the
debugger can observe re-ordering of assignments.

## How variable location metadata is transformed during CodeGen

LLVM preserves debug information throughout mid-level and backend passes,
ultimately producing a mapping between source-level information and
instruction ranges. This
is relatively straightforward for line number information, as mapping
instructions to line numbers is a simple association. For variable locations
however the story is more complex. As each `#dbg_value` record
represents a source-level assignment of a value to a source variable, the
debug records effectively embed a small imperative program
within the LLVM IR. By the end of CodeGen, this becomes a mapping from each
variable to their machine locations over ranges of instructions.
From IR to object emission, the major transformations which affect variable
location fidelity are:

1. Instruction Selection
2. Register allocation
3. Block layout

each of which is discussed below. In addition, instruction scheduling can
significantly change the ordering of the program, and occurs in a number of
different passes.

Some variable locations are not transformed during CodeGen. Stack locations
specified by `#dbg_declare` are valid and unchanging for the entire duration
of the function, and are recorded in a simple `MachineFunction` table.
Location changes in the prologue and epilogue of a function are also ignored:
frame setup and destruction may take several instructions, require a
disproportionate amount of debugging information in the output binary to
describe, and should be stepped over by debuggers anyway.

### Variable locations in Instruction Selection and MIR

Instruction selection creates a MIR function from an IR function, and just as
it transforms `intermediate` instructions into machine instructions, so must
`intermediate` variable locations become machine variable locations. Within
IR, variable locations are always identified by a Value, but in MIR there can
be different types of variable locations. In addition, some IR locations become
unavailable, for example if the operation of multiple IR instructions are
combined into one machine instruction (such as multiply-and-accumulate) then
intermediate Values are lost. To track variable locations through instruction
selection, they are first separated into locations that do not depend on code
generation (constants, stack locations, allocated virtual registers) and those
that do. For those that do, debug metadata is attached to `SDNode`s in
`SelectionDAG`s. After instruction selection has occurred and a MIR function
is created, if the `SDNode` associated with debug metadata is allocated a
virtual register, that virtual register is used as the variable location. If
the `SDNode` is folded into a machine instruction or otherwise transformed
into a non-register, the variable location becomes unavailable.

Locations that are unavailable are treated as if they have been optimized out:
in IR the location would be assigned `undef` by a debug record, and in MIR
the equivalent location is used.

After MIR locations are assigned to each variable, machine pseudo-instructions
corresponding to each `#dbg_value` record are inserted. There are two
forms of this type of instruction.

The first form, `DBG_VALUE`, appears thus:

```text
DBG_VALUE %1, $noreg, !123, !DIExpression()
```
And has the following operands:
 * The first operand can record the variable location as a register,
   a frame index, an immediate, or the base address register if the original
   debug record referred to memory. `$noreg` indicates the variable
   location is undefined, equivalent to an `undef #dbg_value` operand.
 * The type of the second operand indicates whether the variable location is
   directly referred to by the `DBG_VALUE`, or whether it is indirect. The
   `$noreg` register signifies the former, an immediate operand (0) the
   latter.
 * Operand 3 is the Variable field of the original debug record.
 * Operand 4 is the Expression field of the original debug record.

The second form, `DBG_VALUE_LIST`, appears thus:

```text
DBG_VALUE_LIST !123, !DIExpression(DW_OP_LLVM_arg, 0, DW_OP_LLVM_arg, 1, DW_OP_plus), %1, %2
```
And has the following operands:
 * The first operand is the Variable field of the original debug record.
 * The second operand is the Expression field of the original debug record.
 * Any number of operands, from the 3rd onwards, record a sequence of variable
   location operands, which may take any of the same values as the first
   operand of the `DBG_VALUE` instruction above. These variable location
   operands are inserted into the final DWARF Expression in positions indicated
   by the `DW_OP_LLVM_arg` operator in the {ref}`diexpression`.

The position at which the `DBG_VALUE`s are inserted should correspond to the
positions of their matching `#dbg_value` records in the IR block.  As with
optimization, LLVM aims to preserve the order in which variable assignments
occurred in the source program. However, `SelectionDAG` performs some
instruction scheduling, which can reorder assignments (discussed below).
Function parameter locations are moved to the beginning of the function if
they're not already, to ensure they're immediately available on function entry.

To demonstrate variable locations during instruction selection, consider
the following example:

```llvm
define i32 @foo(i32* %addr) {
entry:
    #dbg_value(i32 0, !3, !DIExpression(), !5)
  br label %bb1, !dbg !5

bb1:                                              ; preds = %bb1, %entry
  %bar.0 = phi i32 [ 0, %entry ], [ %add, %bb1 ]
    #dbg_value(i32 %bar.0, !3, !DIExpression(), !5)
  %addr1 = getelementptr i32, i32 *%addr, i32 1, !dbg !5
    #dbg_value(i32 *%addr1, !3, !DIExpression(), !5)
  %loaded1 = load i32, i32* %addr1, !dbg !5
  %addr2 = getelementptr i32, i32 *%addr, i32 %bar.0, !dbg !5
    #dbg_value(i32 *%addr2, !3, !DIExpression(), !5)
  %loaded2 = load i32, i32* %addr2, !dbg !5
  %add = add i32 %bar.0, 1, !dbg !5
    #dbg_value(i32 %add, !3, !DIExpression(), !5)
  %added = add i32 %loaded1, %loaded2
  %cond = icmp ult i32 %added, %bar.0, !dbg !5
  br i1 %cond, label %bb1, label %bb2, !dbg !5

bb2:                                              ; preds = %bb1
  ret i32 0, !dbg !5
}
```
If one compiles this IR with `llc -o - -start-after=codegen-prepare -stop-after=expand-isel-pseudos -mtriple=x86_64--`, the following MIR is produced:

```text
bb.0.entry:
  successors: %bb.1(0x80000000)
  liveins: $rdi

  %2:gr64 = COPY $rdi
  %3:gr32 = MOV32r0 implicit-def dead $eflags
  DBG_VALUE 0, $noreg, !3, !DIExpression(), debug-location !5

bb.1.bb1:
  successors: %bb.1(0x7c000000), %bb.2(0x04000000)

  %0:gr32 = PHI %3, %bb.0, %1, %bb.1
  DBG_VALUE %0, $noreg, !3, !DIExpression(), debug-location !5
  DBG_VALUE %2, $noreg, !3, !DIExpression(DW_OP_plus_uconst, 4, DW_OP_stack_value), debug-location !5
  %4:gr32 = MOV32rm %2, 1, $noreg, 4, $noreg, debug-location !5 :: (load 4 from %ir.addr1)
  %5:gr64_nosp = MOVSX64rr32 %0, debug-location !5
  DBG_VALUE $noreg, $noreg, !3, !DIExpression(), debug-location !5
  %1:gr32 = INC32r %0, implicit-def dead $eflags, debug-location !5
  DBG_VALUE %1, $noreg, !3, !DIExpression(), debug-location !5
  %6:gr32 = ADD32rm %4, %2, 4, killed %5, 0, $noreg, implicit-def dead $eflags :: (load 4 from %ir.addr2)
  %7:gr32 = SUB32rr %6, %0, implicit-def $eflags, debug-location !5
  JB_1 %bb.1, implicit $eflags, debug-location !5
  JMP_1 %bb.2, debug-location !5

bb.2.bb2:
  %8:gr32 = MOV32r0 implicit-def dead $eflags
  $eax = COPY %8, debug-location !5
  RET 0, $eax, debug-location !5
```
Observe first that there is a `DBG_VALUE` instruction for every `#dbg_value`
record in the source IR, ensuring no source level assignments go missing.
Then consider the different ways in which variable locations have been recorded:

* For the first `#dbg_value` an immediate operand is used to record a zero value.
* The `#dbg_value` of the PHI instruction leads to a `DBG_VALUE` of virtual register
  `%0`.
* The first GEP has its effect folded into the first load instruction
  (as a 4-byte offset), but the variable location is salvaged by folding
  the GEPs effect into the `DIExpression`.
* The second GEP is also folded into the corresponding load. However, it is
  insufficiently simple to be salvaged, and is emitted as a `$noreg`
  `DBG_VALUE`, indicating that the variable takes on an undefined location.
* The final `#dbg_value` has its Value placed in virtual register `%1`.

### Instruction Scheduling

A number of passes can reschedule instructions, notably instruction selection
and the pre-and-post RA machine schedulers. Instruction scheduling can
significantly change the nature of the program -- in the (very unlikely) worst
case the instruction sequence could be completely reversed. In such
circumstances LLVM follows the principle applied to optimizations, that it is
better for the debugger not to display any state than a misleading state.
Thus, whenever instructions are advanced in order of execution, any
corresponding `DBG_VALUE` is kept in its original position, and if an instruction
is delayed then the variable is given an undefined location for the duration
of the delay. To illustrate, consider this pseudo-MIR:

```text
%1:gr32 = MOV32rm %0, 1, $noreg, 4, $noreg, debug-location !5 :: (load 4 from %ir.addr1)
DBG_VALUE %1, $noreg, !1, !2
%4:gr32 = ADD32rr %3, %2, implicit-def dead $eflags
DBG_VALUE %4, $noreg, !3, !4
%7:gr32 = SUB32rr %6, %5, implicit-def dead $eflags
DBG_VALUE %7, $noreg, !5, !6
```
Imagine that the `SUB32rr` were moved forward to give us the following MIR:

```text
%7:gr32 = SUB32rr %6, %5, implicit-def dead $eflags
%1:gr32 = MOV32rm %0, 1, $noreg, 4, $noreg, debug-location !5 :: (load 4 from %ir.addr1)
DBG_VALUE %1, $noreg, !1, !2
%4:gr32 = ADD32rr %3, %2, implicit-def dead $eflags
DBG_VALUE %4, $noreg, !3, !4
DBG_VALUE %7, $noreg, !5, !6
```
In this circumstance LLVM would leave the MIR as shown above. Were we to move
the `DBG_VALUE` of virtual register %7 upwards with the `SUB32rr`, we would re-order
assignments and introduce a new state of the program. Whereas with the solution
above, the debugger will see one fewer combination of variable values, because
`!3` and `!5` will change value at the same time. This is preferred over
misrepresenting the original program.

In comparison, if one sunk the `MOV32rm`, LLVM would produce the following:

```text
DBG_VALUE $noreg, $noreg, !1, !2
%4:gr32 = ADD32rr %3, %2, implicit-def dead $eflags
DBG_VALUE %4, $noreg, !3, !4
%7:gr32 = SUB32rr %6, %5, implicit-def dead $eflags
DBG_VALUE %7, $noreg, !5, !6
%1:gr32 = MOV32rm %0, 1, $noreg, 4, $noreg, debug-location !5 :: (load 4 from %ir.addr1)
DBG_VALUE %1, $noreg, !1, !2
```
Here, to avoid presenting a state in which the first assignment to `!1`
disappears, the `DBG_VALUE` at the top of the block assigns the variable the
undefined location, until its value is available at the end of the block where
an additional `DBG_VALUE` is added. Were any other `DBG_VALUE` for `!1` to occur
in the instructions that the `MOV32rm` was sunk past, the `DBG_VALUE` for `%1`
would be dropped and the debugger would never observe it in the variable. This
accurately reflects that the value is not available during the corresponding
portion of the original program.

### Variable locations during Register Allocation

To avoid debug instructions interfering with the register allocator, the
`LiveDebugVariables` pass extracts variable locations from a MIR function and
deletes the corresponding `DBG_VALUE` instructions. Some localized copy
propagation is performed within blocks. After register allocation, the
`VirtRegRewriter` pass re-inserts `DBG_VALUE` instructions in their
original positions, translating virtual register references into their physical
machine locations. To avoid encoding incorrect variable locations, in this pass
any `DBG_VALUE` of a virtual register that is not live, is replaced by the
undefined location. The `LiveDebugVariables` may insert redundant
`DBG_VALUE`s because of virtual register rewriting. These will be
subsequently removed by the `RemoveRedundantDebugValues` pass.

### `LiveDebugValues` expansion of variable locations

After all optimizations have run and shortly before emission, the
`LiveDebugValue`s pass runs to achieve two aims:

* To propagate the location of variables through copies and register spills,
* For every block, to record every valid variable location in that block.

After this pass the `DBG_VALUE` instruction changes meaning: rather than
corresponding to a source-level assignment where the variable may change value,
it asserts the location of a variable in a block, and loses effect outside the
block. Propagating variable locations through copies and spills is
straightforward: determining the variable location in every basic block
requires the consideration of control flow. Consider the following IR, which
presents several difficulties:

```text
define dso_local i32 @foo(i1 %cond, i32 %input) !dbg !12 {
entry:
  br i1 %cond, label %truebr, label %falsebr

bb1:
  %value = phi i32 [ %value1, %truebr ], [ %value2, %falsebr ]
  br label %exit, !dbg !26

truebr:
    #dbg_value(i32 %input, !30, !DIExpression(), !24)
    #dbg_value(i32 1, !23, !DIExpression(), !24)
  %value1 = add i32 %input, 1
  br label %bb1

falsebr:
    #dbg_value(i32 %input, !30, !DIExpression(), !24)
    #dbg_value(i32 2, !23, !DIExpression(), !24)
  %value2 = add i32 %input, 2
  br label %bb1

exit:
  ret i32 %value, !dbg !30
}
```
Here the difficulties are:

* The control flow is roughly the opposite of basic block order
* The value of the `!23` variable merges into `%bb1`, but there is no PHI
  node

As mentioned above, the `#dbg_value` records essentially form an
imperative program embedded in the IR, with each record defining a variable
location. This *could* be converted to an SSA form by `mem2reg`, in the same way
that it uses use-def chains to identify control flow merges and insert phi
nodes for IR Values. However, because debug variable locations are defined for
every machine instruction, in effect every IR instruction uses every variable
location, which would lead to a large number of debugging records being
generated.

Examining the example above, variable `!30` is assigned `%input` on both
conditional paths through the function, while `!23` is assigned differing
constant values on either path. Where control flow merges in `%bb1` we would
want `!30` to keep its location (`%input`), but `!23` to become undefined
as we cannot determine at runtime what value it should have in `%bb1` without
inserting a PHI node. `mem2reg` does not insert the PHI node to avoid changing
CodeGen when debugging is enabled, and does not insert the other `#dbg_values`
to avoid adding very large numbers of records.

Instead, `LiveDebugValue`s determines variable locations when control
flow merges. A dataflow analysis is used to propagate locations between blocks:
when control flow merges, if a variable has the same location in all
predecessors then that location is propagated into the successor. If the
predecessor locations disagree, the location becomes undefined.

Once `LiveDebugValue`s has run, every block should have all valid variable
locations described by `DBG_VALUE` instructions within the block. Very little
effort is then required by supporting classes (such as
`DbgEntityHistoryCalculator`) to build a map of each instruction to every
valid variable location, without the need to consider control flow. From
the example above, it is otherwise difficult to determine that the location
of variable `!30` should flow "up" into block `%bb1`, but that the location
of variable `!23` should not flow "down" into the `%exit` block.

(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](http://www.dwarfstd.org/)
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 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 a few C/C++ constructs and
the debug information that would best describe those constructs.  The
canonical references are the `DINode` classes defined in
`include/llvm/IR/DebugInfoMetadata.h` and the implementations of the
helper functions in `lib/IR/DIBuilder.cpp`.

### C/C++ source file information

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

```c++
if (DILocation *Loc = I->getDebugLoc()) { // Here I is an LLVM instruction
  unsigned Line = Loc->getLine();
  StringRef File = Loc->getFilename();
  StringRef Dir = Loc->getDirectory();
  bool ImplicitCode = Loc->isImplicitCode();
}
```
When the flag `ImplicitCode` is true then it means that the Instruction has been
added by the front-end but doesn't correspond to source code written by the user. For example

```c++
if (MyBoolean) {
  MyObject MO;
  ...
}
```
At the end of the scope the `MyObject`'s destructor is called but it isn't written
explicitly. This information is useful to avoid having counters on brackets when
making code coverage.

### C/C++ global variable information

Given an integer global variable declared as follows:

```c
_Alignas(8) int MyGlobal = 100;
```
a C/C++ front-end would generate the following descriptors:

```text
;;
;; Define the global itself.
;;
@MyGlobal = global i32 100, align 8, !dbg !0

;;
;; List of debug info of globals
;;
!llvm.dbg.cu = !{!1}

;; Some unrelated metadata.
!llvm.module.flags = !{!6, !7}
!llvm.ident = !{!8}

;; Define the global variable itself
!0 = distinct !DIGlobalVariable(name: "MyGlobal", scope: !1, file: !2, line: 1, type: !5, isLocal: false, isDefinition: true, align: 64)

;; Define the compile unit.
!1 = distinct !DICompileUnit(language: DW_LANG_C99, file: !2,
                             producer: "clang version 4.0.0",
                             isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug,
                             enums: !3, globals: !4)

;;
;; Define the file
;;
!2 = !DIFile(filename: "/dev/stdin",
             directory: "/Users/dexonsmith/data/llvm/debug-info")

;; An empty array.
!3 = !{}

;; The Array of Global Variables
!4 = !{!0}

;;
;; Define the type
;;
!5 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)

;; Dwarf version to output.
!6 = !{i32 2, !"Dwarf Version", i32 4}

;; Debug info schema version.
!7 = !{i32 2, !"Debug Info Version", i32 3}

;; Compiler identification
!8 = !{!"clang version 4.0.0"}

```
The align value in `DIGlobalVariable` description specifies variable alignment in
case it was forced by C11 `_Alignas()`, C++11 `alignas()` keywords or compiler
attribute `__attribute__((aligned ()))`. In other case (when this field is missing)
alignment is considered default. This is used when producing DWARF output
for `DW_AT_alignment` value.

### C/C++ function information

Given a function declared as follows:

```c
int main(int argc, char *argv[]) {
  return 0;
}
```
a C/C++ front-end would generate the following descriptors:

```text
;;
;; Define the anchor for subprograms.
;;
!4 = !DISubprogram(name: "main", scope: !1, file: !1, line: 1, type: !5,
                   isLocal: false, isDefinition: true, scopeLine: 1,
                   flags: DIFlagPrototyped, isOptimized: false,
                   retainedNodes: !2)

;;
;; Define the subprogram itself.
;;
define i32 @main(i32 %argc, i8** %argv) !dbg !4 {
...
}
```
## C++ specific debug information

### C++ special member functions information

DWARF v5 introduces attributes defined to enhance debugging information of C++ programs. LLVM can generate (or omit) these appropriate DWARF attributes. In C++ a special member function Ctors, Dtors, Copy/Move Ctors, assignment operators can be declared with C++11 keyword deleted. This is represented in LLVM using `spFlags` value `DISPFlagDeleted`.

Given a class declaration with copy constructor declared as deleted:

```c
class foo {
 public:
   foo(const foo&) = deleted;
};
```
A C++ frontend would generate the following:

```text
!17 = !DISubprogram(name: "foo", scope: !11, file: !1, line: 5, type: !18, scopeLine: 5, flags: DIFlagPublic | DIFlagPrototyped, spFlags: DISPFlagDeleted)
```
and this will produce an additional DWARF attribute as:

```text
DW_TAG_subprogram [7] *
  DW_AT_name [DW_FORM_strx1]    (indexed (00000006) string = "foo")
  DW_AT_decl_line [DW_FORM_data1]       (5)
  ...
  DW_AT_deleted [DW_FORM_flag_present]  (true)
```
## Fortran specific debug information

### Fortran function information

There are a few DWARF attributes defined to support client debugging of Fortran programs.  LLVM can generate (or omit) the appropriate DWARF attributes for the prefix-specs of ELEMENTAL, PURE, IMPURE, RECURSIVE, and NON_RECURSIVE.  This is done by using the `spFlags` values: `DISPFlagElemental`, `DISPFlagPure`, and `DISPFlagRecursive`.

```fortran
elemental function elem_func(a)
```
a Fortran front-end would generate the following descriptors:

```text
!11 = distinct !DISubprogram(name: "subroutine2", scope: !1, file: !1,
        line: 5, type: !8, scopeLine: 6,
        spFlags: DISPFlagDefinition | DISPFlagElemental, unit: !0,
        retainedNodes: !2)
```
and this will materialize an additional DWARF attribute as:

```text
DW_TAG_subprogram [3]
   DW_AT_low_pc [DW_FORM_addr]     (0x0000000000000010 ".text")
   DW_AT_high_pc [DW_FORM_data4]   (0x00000001)
   ...
   DW_AT_elemental [DW_FORM_flag_present]  (true)
```
There are a few DWARF tags defined to represent Fortran specific constructs i.e `DW_TAG_string_type` for representing Fortran character(n). In LLVM, this is represented as `DIStringType`.

```fortran
character(len=*), intent(in) :: string
```
a Fortran front-end would generate the following descriptors:

```text
!DILocalVariable(name: "string", arg: 1, scope: !10, file: !3, line: 4, type: !15)
!DIStringType(name: "character(*)!2", stringLength: !16, stringLengthExpression: !DIExpression(), size: 32)
```
A fortran deferred-length character can also contain the information of raw storage of the characters in addition to the length of the string. This information is encoded in the  stringLocationExpression field. Based on this information, `DW_AT_data_location` attribute is emitted in a `DW_TAG_string_type` debug info.

```llvm
!DIStringType(name: "character(*)!2", stringLengthExpression: !DIExpression(),
              stringLocationExpression: !DIExpression(DW_OP_push_object_address, DW_OP_deref),
              size: 32)
```

and this will materialize in DWARF tags as:

```text
DW_TAG_string_type
             DW_AT_name      ("character(*)!2")
             DW_AT_string_length     (0x00000064)
0x00000064:    DW_TAG_variable
               DW_AT_location      (DW_OP_fbreg +16)
               DW_AT_type  (0x00000083 "integer*8")
               DW_AT_data_location (DW_OP_push_object_address, DW_OP_deref)
               ...
               DW_AT_artificial    (true)
```
A Fortran front-end may need to generate a *trampoline* function to call a
function defined in a different compilation unit. In this case, the front-end
can emit the following descriptor for the trampoline function:

```text
!DISubprogram(name: "sub1_.t0p", linkageName: "sub1_.t0p", scope: !4, file: !4, type: !5, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition, unit: !7, retainedNodes: !24, targetFuncName: "sub1_")
```
The targetFuncName field is the name of the function that the trampoline
calls. This descriptor results in the following DWARF tag:

```text
DW_TAG_subprogram
  ...
  DW_AT_linkage_name	("sub1_.t0p")
  DW_AT_name	("sub1_.t0p")
  DW_AT_trampoline	("sub1_")
```
## 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 developers 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:

```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):

```text
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`.

```objc
@property (readonly, nonatomic) int pr;
```
```text
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.

```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:

```text
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_APPLE_PROPERTY_readonly           | 0x01  |
| DW_APPLE_PROPERTY_getter             | 0x02  |
| DW_APPLE_PROPERTY_assign             | 0x04  |
| DW_APPLE_PROPERTY_readwrite          | 0x08  |
| DW_APPLE_PROPERTY_retain             | 0x10  |
| DW_APPLE_PROPERTY_copy               | 0x20  |
| DW_APPLE_PROPERTY_nonatomic          | 0x40  |
| DW_APPLE_PROPERTY_setter             | 0x80  |
| DW_APPLE_PROPERTY_atomic             | 0x100 |
| DW_APPLE_PROPERTY_weak               | 0x200 |
| DW_APPLE_PROPERTY_strong             | 0x400 |
| DW_APPLE_PROPERTY_unsafe_unretained  | 0x800 |
| DW_APPLE_PROPERTY_nullability        | 0x1000|
| DW_APPLE_PROPERTY_null_resettable    | 0x2000|
| DW_APPLE_PROPERTY_class              | 0x4000|

### 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
use.

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:

```text
.------------.
|  HEADER    |
|------------|
|  BUCKETS   |
|------------|
|  DATA      |
`------------'
```
The BUCKETS are an array of offsets to DATA for each hash:

```text
.------------.
| 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.

```text
            .------------.
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-bit
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 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:

```text
.-------------.
|  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:

```text
.-------------------------.
|  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:

```text
            .------------.
            | 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 hash 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:

```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:

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

```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:

```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:

```text
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:

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

```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:

```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:

```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):

```text
.------------.
| 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:

```text
.------------.
| 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:

```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_immutable_type
* DW_TAG_file_type
* DW_TAG_namelist
* DW_TAG_packed_type
* DW_TAG_volatile_type
* DW_TAG_restrict_type
* DW_TAG_atomic_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:

```c
int main ()
{
  int *b = 0;
  return *b;
}
```
We get a few type DIEs:

```text
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

(llvm_language_dialect)=

##### LLVM Language Dialect

LLVM emits an optional `DW_AT_LLVM_language_dialect` attribute on
`DW_TAG_compile_unit` to identify an execution-model dialect of the
source-level language declared by `DW_AT_language` /
`DW_AT_LLVM_source_language_name`.

The attribute value is encoded as an unsigned integer from the
`DW_LLVM_LANG_DIALECT_*` enumeration:

* `DW_LLVM_LANG_DIALECT_simt` (`0x01`) -- single-instruction,
  multiple-thread execution model.
* `DW_LLVM_LANG_DIALECT_tile` (`0x02`) -- tile-based execution model.

To express "no dialect specified", the `dialect:` field on
{ref}`DICompileUnit <DICompileUnit>` is simply omitted; no
`DW_AT_LLVM_language_dialect` attribute is emitted in that case.

##### 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`"

(codeview)=

## CodeView Debug Info Format

LLVM supports emitting CodeView, the Microsoft debug info format, and this
section describes the design and implementation of that support.

### Format Background

CodeView as a format is clearly oriented around C++ debugging, and in C++, the
majority of debug information tends to be type information. Therefore, the
overriding design constraint of CodeView is the separation of type information
from other "symbol" information so that type information can be efficiently
merged across translation units. Both type information and symbol information is
generally stored as a sequence of records, where each record begins with a
16-bit record size and a 16-bit record kind.

Type information is usually stored in the `.debug$T` section of the object
file.  All other debug info, such as line info, string table, symbol info, and
inlinee info, is stored in one or more `.debug$S` sections. There may only be
one `.debug$T` section per object file, since all other debug info refers to
it. If a PDB (enabled by the `/Zi` MSVC option) was used during compilation,
the `.debug$T` section will contain only an `LF_TYPESERVER2` record pointing
to the PDB. When using PDBs, symbol information appears to remain in the object
file `.debug$S` sections.

Type records are referred to by their index, which is the number of records in
the stream before a given record plus `0x1000`. Many common basic types, such
as the basic integral types and unqualified pointers to them, are represented
using type indices less than `0x1000`. Such basic types are built in to
CodeView consumers and do not require type records.

Each type record may only contain type indices that are less than its own type
index. This ensures that the graph of type stream references is acyclic. While
the source-level type graph may contain cycles through pointer types (consider a
linked list struct), these cycles are removed from the type stream by always
referring to the forward declaration record of user-defined record types. Only
"symbol" records in the `.debug$S` streams may refer to complete,
non-forward-declaration type records.

### Working with CodeView

These are instructions for some common tasks for developers working to improve
LLVM's CodeView support. Most of them revolve around using the CodeView dumper
embedded in `llvm-readobj`.

* Testing MSVC's output:

  ```console
  $ cl -c -Z7 foo.cpp # Use /Z7 to keep types in the object file
  $ llvm-readobj --codeview foo.obj
  ```

* Getting LLVM IR debug info out of Clang:

  ```console
  $ clang -g -gcodeview --target=x86_64-windows-msvc foo.cpp -S -emit-llvm
  ```

  Use this to generate LLVM IR for LLVM test cases.

* Generate and dump CodeView from LLVM IR metadata:

  ```console
  $ llc foo.ll -filetype=obj -o foo.obj
  $ llvm-readobj --codeview foo.obj > foo.txt
  ```

  Use this pattern in lit test cases and FileCheck the output of llvm-readobj

Improving LLVM's CodeView support is a process of finding interesting type
records, constructing a C++ test case that makes MSVC emit those records,
dumping the records, understanding them, and then generating equivalent records
in LLVM's backend.
