# Source Level Debugging with LLVM

```{contents}
:local:
```

## Introduction

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

### Philosophy behind LLVM debugging information

The idea of the LLVM debugging information is to capture how the important
pieces of the source-language's Abstract Syntax Tree map onto LLVM code.
Several design aspects have shaped the solution that appears here.  The
important ones are:

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

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

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

* Source-level languages are often **widely** different from one another.
  LLVM should not put any restrictions 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.
