[PATCH] Change calling convention of dwarf_getmacros to allow opcode 0xff
mjw at redhat.com
Wed Dec 3 16:35:18 UTC 2014
On Tue, 2014-12-02 at 21:42 +0100, Petr Machata wrote:
> We now require callers to pass DWARF_GETMACROS_START to start the
> iteration. 0 is still accepted, but signals to libdw that the
> iteration request comes from an old-style caller, and that opcode 0xff
> should be rejected when iterating .debug_macro, to avoid confusion.
> +/* Token layout:
> + - sign bit is used for distinguishing between .debug_macinfo
> + iteration (when unset) and .debug_macro iteration (when set,
> + i.e. negative values). The mask is DWARF_GETMACROS_DMACRO.
> + - the next highest bit is used for distinguishing between callers
> + that know that opcode 0xff may have one of two incompatible
> + meanings. The mask that we use for selecting this bit is
> + DWARF_GETMACROS_START.
> + Besides, token value of 0 signals end of iteration and -1 is
> + reserved for signaling errors.
> + That means that on a 32-bit machine, 30 bits are allowed for
> + offset, and therefore the maximum macro unit size is 1GB. Also,
> + because -1 is reserved, it's impossible to represent maximum offset
> + of a .debug_macro unit to new-style callers (which in practice
> + decreases the permissible macro unit size by another 1 byte). */
I am wondering whether we really need to track both issues with the
toke/offset. It looks like we only need to track old-vs-new caller (0xff
allowed). Whether we are using macinfo or macro seems to be discoverable
from the call made.
If the user calls dwarf_getmacros they provide the CU DIE. From that we
can determine whether we are using macinfo or macro by looking for the
DW_AT_macro_info or DW_AT_macros attribute.
If the user calls dwarf_getmacros_off then they are a new style caller
by default because that function didn't exist previously. And it only
works for macro because it is meant for the transparent_include style
macro which doesn't exist with macinfo.
Sorry to bring this up after you have written all this code. But if we
can use a simpler token encoding then I think we should.
More information about the elfutils-devel