Issue 210208.2: Standardize DW_AT_GNU_numerator and DW_AT_GNU_denominator
Background:
Currently, we can describe scale factors that are a (positive or
negative) power of 2 with DW_AT_binary_scale, and scale factors that
are a (positive or negative) power of 10 with DW_AT_decimal_scale.
Both of these attributes provide an integer constant directly in the
attribute, giving the logarithm of the scale factor.
For other scale factors, we have DW_AT_small, which takes a reference
class value that points to a DW_TAG_constant DIE, which allows that
constant to provide an arbitrary scale factor as either a
floating-point or integer constant. In order to provide a rational
number as the scale factor, GCC currently implements an extension,
which adds DW_AT_numerator and DW_AT_denominator attributes
to the constant DIE.
It seems to me that this is unnecessarily complex and wasteful of
space. The only reason to put the constant in a separate DIE was
inability to represent a floating-point number directly in an
attribute, using a form code. A rational number has no such problem,
and I think it would be better to provide two additional scale
attributes that can be added directly to the type in question.
Proposed Change:
Add the following to Section 5.1.1.3 (Scaled Encodings)
on page 106.
"""
For a data type with a rational scale factor, one or both of the
following attributes may be used:
- DW_AT_scale_multiplier. This attribute is an integer constant value
that represents a multiplicative scale factor to be applied to an
instance of the type.
- DW_AT_scale_divisor. This attribute is an integer constant value
that represents the reciprocal of a multiplicative scale factor to be
applied to an instance of the type.
If both attributes are present, both are applied, with the result
being equivalent to a rational scale factor x/y, where x is the
DW_AT_scale_multiplier, and y is the DW_AT_scale_divisor.
"""
On line 14, where it says "For a data type with a non-decimal and
non-binary scale factor...", I suggest changing it to "For a data type
with a non-rational scale factor...".
At the end of Section 5.1.1.3, add the following:
"""
If a type entry has attributes that describe more than one kind of scale
factor, the resulting scale factor for the type is the product of the
individual scale factors.
"""
--
2021-03-25: Revised.
2022-04-04: Revised. Add paragraph to clarify multiple scale factors.
2022-05-02: Accepted with modification: Change "non-rational" to
"floating point".