Issue 190809.1: Standardize DW_AT_GNU_bias

Author: Tom Tromey
Champion: Brock Wyma
Date submitted: 2019-08-09
Date revised: 2022-07-05
Date closed: 2022-06-27
Type: Enhancement
Status: Accepted with modifications
DWARF Version: 6
Section 5.13, pg 129

In Ada, a scalar can be given a biased representation in some cases.
For example, a scalar with a range of -7..-4 could be stored using 2 bits 
with a bias of -7.

GCC implements the DW_AT_GNU_bias extension to handle this case.
See https://gcc.gnu.org/wiki/DW_AT_GNU_bias

I think it would be good to standardize this.

PROPOSED CHANGES
----------------

Section "2.2 Attribute Types" in table "Table 2.2: Attribute names":
Add the following row to the table:
  --------------- -----------------------------------------------------------
  Attribute       Identifies or Specifies
  --------------- -----------------------------------------------------------
  DW_AT_bias      Deviation from the base type encoding.

Section "5.1.1.1 Simple Encodings"
At the end of the section (following line 23), add:
  For a data type with simple encodings, the type may have a DW_AT_bias attribute
  whose value is an integer constant which is added to the encoded value to
  determine the value of an object of the type in the source program.
  If the DW_AT_bias is encoded using DW_FORM_data<n>, then the bias value
  is treated as an unsigned integer.

Section "7.5.4 Attribute Encodings" in table "Table 7.5 Attribute Encodings":
Add the following row to the table with the next available value:
  --------------------- ------- ---------------------------------------------
  Attribute name        Value   Classes
  --------------------- ------- ---------------------------------------------
  DW_AT_bias            0x??    constant

Section "7.32 Type Signature Computation" in table "Table 7.32 Attributes used
in type signature computation":
Add item:
  DW_AT_bias

Appendix A "Attributes By Tag (Informative)", in table A.1 "Attributes by tag value"
Add "DW_AT_bias" to the "Applicable attributes" column for DW_TAG_base_type:
  --------------------- -----------------------------------------------------
  TAG name              Applicable attributes
  --------------------- -----------------------------------------------------
  DW_TAG_base_type      ... existing attributes ...
                        DW_AT_bias

Appendix D "Examples (Informative):
Add this new section:
  D.2.9 Ada Biased Bit-Field Example
  The Ada source in Figure D.25 demonstrates how a member of a record which
  normally occupies six bits can be biased to fit into three bits when the
  range is known. The encoded values [ 0..7 ] correspond to the values
  [ 50..57 ] used by the application.

  The DWARF description is shown in Figure D.26.  The bias chosen, which in
  this case corresponds to the lower bound, is specified in the base type at
  1$.

  +-------------------------------------------------------------------------+
  | type SmallRangeType is range 50 .. 57;                                  |
  | type RecordType is record                                               |
  |    A : SmallRangeType;                                                  |
  | end record;                                                             |
  | for RecordType use record                                               |
  |    A at 0 range 0 .. 2;                                                 |
  | end record;                                                             |
  | LocalRecord : RecordType;                                               |
  +-------------------------------------------------------------------------+
                  Figure D.25 Biased Bit-Field Ada Example

  +-------------------------------------------------------------------------+
  | 1$: DW_TAG_base_type                                                    |
  |         DW_AT_byte_size(1)                                              |
  |         DW_AT_encoding(7)                                               |
  |         DW_AT_bias(50)                                                  |
  |         DW_AT_artificial(1)                                             |
  | 2$: DW_TAG_subrange_type                                                |
  |         DW_AT_name("SmallRangeType")                                    |
  |         DW_AT_lower_bound(50)                                           |
  |         DW_AT_upper_bound(57)                                           |
  |         DW_AT_type(reference to 1$)                                     |
  | 3$: DW_TAG_structure_type                                               |
  |         DW_AT_name("RecordType")                                        |
  |         DW_AT_byte_size(1)                                              |
  | 4$:     DW_TAG_member                                                   |
  |             DW_AT_name("A")                                             |
  |             DW_AT_type(reference to 2$)                                 |
  |             DW_AT_bit_size(3)                                           |
  |             DW_AT_data_bit_offset(0)                                    |
  | 5$: DW_TAG_variable                                                     |
  |             DW_AT_name("LocalRecord")                                   |
  |             DW_AT_type(reference to 3$)                                 |
  |             DW_AT_location ...                                          |
  +-------------------------------------------------------------------------+
               Figure D.26 Biased Bit-Field DWARF Description

Note that other choices of encoding and bias lead to the same result. For
example, the DW_ATE_signed encoding can be used in combination with a bias
of 54.

If the valid range of values is completely negative (for example, -57..-50) then
only signed encoding is valid, and the bias will also need to be negative (-53).


--
2022-04-13:  Add propopsed changes.
2022-06-27:  Accepted with modifications: integer types only, editorial changes TBD.
2022-07-05:  Editorial changes: Move new text from 5.1.1 to 5.1.1.1, reword.  
             Add text following Fig. D.26.