[Dwarf-discuss] Clarification: DW_OP_mod doesn't specify which definition of modulo
Ben Woodard
woodard@redhat.com
Mon Nov 10 17:15:56 GMT 2025
On 11/10/25 8:47 AM, Mark Wielaard wrote:
> Hi,
>
> OK. Let me try to summarize the proposal(s) and choices so we have
> something concrete to discuss in the DWARF Committee meeting this
> afternoon.
>
> - Clarify what DW_OP_mod means on generic types.
> This doesn't seem to need extra/explicit clarification because
> 2.5.1.4 "Arithmetic and Logical Operations" says:
>
> If the type of the operands is the generic type, except as otherwise
> specified, the arithmetic operations perform addressing arithmetic,
> that is, unsigned arithmetic that is performed modulo one plus the
> largest representable address.
>
> [This formulation might need some tweaking if there are multiple
> address spaces with different representable addresses. But IMHO
> that can wait for another time.]
>
> - Define DW_OP_mod for integral (possibly signed) typed DWARF values.
> There are a couple of choices of how to define this for (signed)
> typed values. But the most "natural" way would be using either
> floored or truncated division. Lets pick floored division?
I would argue for truncated division for DW_OP_mod
>
> - Mention backward compatibility of the choice. If we assume producers
> work like Jakub showed for GCC (where DW_OP_mod is only used for
> unsigned/generic types) then there is no issue if we define it for
> integral (signed) types.
agreed.
> For GDB there might be some assumption it
> would be modulo using floored division.
Yes it breaks GDB's current implementation but other consumers have
interpreted it as truncated division. If you add DW_OP_modulo, GDB's
current implementation could be used for that and DW_OP_mod could be
implemented with % like it is in other consumers.
> But in general it seems
> our choice would just mean that consumers should explicitly implement
> DW_OP_mod for typed DWARF vales as specified.
>
> - Rename DW_OP_mod to DW_OP_rem? And/Or introduce a new DW_OP_modulo.
> If the implementation choice is not "true" modulo should we give
> the DW_OP_mod a new name? IMHO No. It really is too confusing.
> mod(ulo) and rem(ainder) are already not consistently used in
> different languages.
I like what Cary pointed out about Fortran MOD for truncated division
and then MODULO for floored. I think that is the best choice. As long as
the algorithm is specified in the description, and given Fortran's prior
usage, I no longer think we need to change the name.
>
> - Add a new DW_OP_rem that uses truncated (if we pick floored for mod)
> division? If yes then we should explicitly mention this shouldn't
> be used for 6.4.2 Call Frame Instructions (it would be redundant
> with DW_OP_mod anyway for the generic type).
>
> - Should this new DW_OP_rem be an extended DW_OP?
I would say DW_OP_modulo (floored) should be the one considered for
being an extended op. I don't have very strong opinion on this. Slightly
more than "whatever".
>
> - Extend DW_OP_mod (and DW_OP_rem) to float types?
> That is the original proposal, changing 2.5.1.4 ("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").
> I admit to not really know how to define this or if the mod/rem
> operation is "simply" dictated by the the DW_ATE_*float* definitions.
> Also, is it really needed?
I believe that it is needed to be able to create implicit storage for
floating point values optimized out real storage. ref:
https://dwarfstd.org/issues/140425.1.html
>
> Hope that is a good summary of the proposals/choices we have to make.
>
> Cheers,
>
> Mark
>
More information about the Dwarf-discuss
mailing list