[Dwarf-discuss] PROPOSAL: add support for bundled instructions (e.g., Itanium)
Cary Coutant
cary@cup.hp.com
Thu Apr 26 22:33:34 GMT 2007
[Resubmitted with the right mailing address. Sorry!]
I submitted this idea for discussion last year, and got some positive
feedback, but never followed through. Here's a formal proposal for
the next DWARF revision.
Chris had these comments on July 14, 2006:
> Shouldn't the new header fields go at the end
> of the header so that old code might still work?
> Of course, you would also want to update the version
> number for that dwarf section.
I'd prefer to see them immediately following the
minimum_instruction_length field. Moving them to the end means that
they'd end up following three variable-length fields: the array of
standard opcode lengths, and the two lists of include directory names
and file names (with the extra null byte at the end of each list).
That's just begging for trouble. Any old code trying to read a line
number table that uses this new convention just isn't going to work
anyway. Any old code trying to read a new line number table that
doesn't use this convention won't see any difference, and will
continue to work.
> Also, you could leave the minimum instruction length
> set to something normal (like 1 or 16) and use a non-zero
> value in the two new fields to indicate the new
> style of information.
Again, I don't think that's going to help old code -- it would just
make it *think* it's working, while producing nonsense instruction
addresses.
-cary
Background
On the Itanium architecture, three instructions are packed into one
16-byte "bundle". Only the bundle itself has a real (16-byte aligned)
address, leaving the compiler and debugger to agree on a convention
for how to represent the addresses of the instructions inside the
bundle. On HP-UX, we use the bundle address plus 0, 4, and 8 to
represent these; Linux has chosen the bundle address plus 0, 1, and
2. In the line number program, we set minimum_instruction_length to
4, and we then have to use increments of 1, 1, 2, 1, 1, 2, ....
Worse, Linux chose to set minimum_instruction_length to 1, and uses
increments of 1, 1, 14, 1, 1, 14, .... Ideally, I'd like to set
minimum_instruction_length to 16/3, so we can just use uniform
increments of 1.
Proposal
I propose to extend the definition of the minimum_instruction_length
field of the line number program header, in Section 6.2.4, as follows:
"If minimum_instruction_length is zero, it is immediately followed by
two additional ubytes -- bundle_length and
instruction_slots_per_bundle. For architectures with instruction
bundles, the address register has two components: a bundle address
and a slot number. Line number program opcodes that alter the address
register first compute the new bundle address as (bundle_adress +
bundle_length * ((slot_number + operand) div
instruction_slots_per_bundle)), then compute the new slot number as
((slot_number + operand) rem instruction_slots_per_bundle), where div
and rem are defined such that (a div b) is an integer and a = (a div
b) * b + (a rem b) and 0 <= (a rem b) < b."
For Itanium, we would set the minimum_instruction_length field to 0,
followed by the bundle_length and instruction_slots_per_bundle fields
of 16 and 3, respectively. (We consider all bundles to have exactly 3
slots, even for those bundle type where one instruction spans two
slots.)
Because this change has the potential to break existing consumers,
the version number in the line number program header, specified in
Section 7.21, should be changed to 4, although producers who do not
set minimum_instruction_length to zero can (and should?) continue to
generate version 3.
-cary
More information about the Dwarf-discuss
mailing list