#### 12.7.7 `GIMPLE_DEBUG`

— GIMPLE function: gimple gimple_build_debug_bind (tree var, tree value, gimple stmt)

> Build a `GIMPLE_DEBUG` statement with `GIMPLE_DEBUG_BIND` of `subcode`. The effect of this statement is to tell debug information generation machinery that the value of user variable `var` is given by `value` at that point, and to remain with that value until `var` runs out of scope, a dynamically-subsequent debug bind statement overrides the binding, or conflicting values reach a control flow merge point. Even if components of the `value` expression change afterwards, the variable is supposed to retain the same value, though not necessarily the same location.

> It is expected that `var` be most often a tree for automatic user variables (`VAR_DECL` or `PARM_DECL`) that satisfy the requirements for gimple registers, but it may also be a tree for a scalarized component of a user variable (`ARRAY_REF`, `COMPONENT_REF`), or a debug temporary (`DEBUG_EXPR_DECL`).

> As for `value`, it can be an arbitrary tree expression, but it is recommended that it be in a suitable form for a gimple assignment `RHS`. It is not expected that user variables that could appear as `var` ever appear in `value`, because in the latter we'd have their `SSA_NAME`s instead, but even if they were not in SSA form, user variables appearing in `value` are to be regarded as part of the executable code space, whereas those in `var` are to be regarded as part of the source code space. There is no way to refer to the value bound to a user variable within a `value` expression.

> If `value` is `GIMPLE_DEBUG_BIND_NOVALUE`, debug information generation machinery is informed that the variable `var` is unbound, i.e., that its value is indeterminate, which sometimes means it is really unavailable, and other times that the compiler could not keep track of it.

> Block and location information for the newly-created stmt are taken from `stmt`, if given.

— GIMPLE function: tree gimple_debug_bind_get_var (gimple stmt)

> Return the user variable var that is bound at `stmt`.

— GIMPLE function: tree gimple_debug_bind_get_value (gimple stmt)

> Return the value expression that is bound to a user variable at `stmt`.

— GIMPLE function: tree * gimple_debug_bind_get_value_ptr (gimple stmt)

> Return a pointer to the value expression that is bound to a user variable at `stmt`.

— GIMPLE function: void gimple_debug_bind_set_var (gimple stmt, tree var)

> Modify the user variable bound at `stmt` to var.

— GIMPLE function: void gimple_debug_bind_set_value (gimple stmt, tree var)

> Modify the value bound to the user variable bound at `stmt` to value.

— GIMPLE function: void gimple_debug_bind_reset_value (gimple stmt)

> Modify the value bound to the user variable bound at `stmt` so that the variable becomes unbound.

— GIMPLE function: bool gimple_debug_bind_has_value_p (gimple stmt)

> Return `TRUE` if `stmt` binds a user variable to a value, and `FALSE` if it unbinds the variable.