Background:
Evidently, originally DWARF didn't allow arithmetic operations on
floating point numbers and most uses of the DWARF stack were done with
the assumption that the values being acted upon were addresses and so
the computation was assumed to be acting upon unsigned numbers.
At some point, DWARF began to allow the arithmetic operations to work on
floating point numbers and several operations were explicitly defined to
work over non-integral values. This led to the paragraph in the current
DWARF working draft that says in section 2.5.2.4 on page 37 lines 24-27:
"Operations other than DW_OP_abs, DW_OP_div, DW_OP_minus,
DW_OP_mul, DW_OP_neg and DW_OP_plus require integral types of the
operand (either integral base type or the generic type). Operations do
not cause
an exception on overflow."
Unlike all the other arithmetic operations this explicitly limits
DW_OP_mod to integral base types and the generic type. It lumps
DW_OP_mod in with the logical operations. Furthermore, there are
multiple definitions of the modulo operator which vary in how they
handle signed values.
According to the dwarf-discuss archives, this issue came up back in 2011
and at that time Michael Eager made a pronouncement that DW_OP_mod used
the modulo algorithm for unsigned arithmetic. However, this decision was
not recorded in the standard. Since that time, consumers have
implemented different implementations of DW_OP_mod.
This proposal seeks to clarify and harmonize the consumer
implementations of the DW_OP_mod operator by defining which algorithm to
use for signed arithmetic as well as define it for floating point numbers.
Proposal:
Add DW_OP_mod to the list of operators which do not require integral
base types by changing:
Operations other than DW_OP_abs, DW_OP_div, DW_OP_minus, DW_OP_mul,
DW_OP_neg and DW_OP_plus require integral types of the operand (either
integral base type or the generic type).
To:
Operations other than DW_OP_abs, DW_OP_div, DW_OP_mod, DW_OP_minus,
DW_OP_mul, DW_OP_neg and DW_OP_plus require integral types of the
operand (either integral base type or the generic type).
Then append the following sentence to the description of the DW_OP_mod:
The algorithm used to implement modulo shall be the one defined in The
Art of Computer Programming Volume 1: Fundamental Algorithms Chapter 2
Section 4. Knuth.
Alternative proposals:
1) Explicitly state in the standard that DW_OP_mod is only defined for
unsigned integral arithmetic. This effectively standardizes the Michael
Eager's pronouncement from 2011.
2) Pick any algorithm for modulo that works for signed as well unsigned
arithmetic and specify that DW_OP_modulo shall follow it. The current
GDB implementation follows Knuth 1.2.4 for signed and unsigned integral
arithmetic but excludes the algorithm for reals and floating point numbers.
--
Dwarf-discuss mailing list
[email protected]
https://lists.dwarfstd.org/mailman/listinfo/dwarf-discuss