[dmd-internals] fixing DWARF
Martin Nowak
dawg at dawgfoto.de
Tue Mar 15 11:47:37 PDT 2011
I spend some time trying to get dwarf running for 64 bit.
There are two reasons this currently doesn't work.
The simple one being, that the CFA state bookkeeping is partly 64-bit
unaware.
The more subtle one concerns the function frame base and how values are
addressed.
It got recently broken for 32-bit by commit b90e32b0.., I think
you actually want to revert this commit for now.
The issue is that debug_info variable locations are emitted relative to
EBP seen from within the function.
In contrast the DW_AT_frame_base location list follows the outer frame
pointer.
Now there are two possibilities to solve this:
1. make DW_AT_frame_base follow the inner frame pointer
Pro:
- can use var addresses the compiler is emitting anyways
Con:
- CFA and DW_AT_frame_base diverge while DWARF3 allows to
define frame_base as CFA making location lists for each
prolog obsolete (DW_OP_call_frame_cfa).
- There is not alway two pointers between inner/outer frame
pointer (farfunc on 32, interrupt func)
2. adjust variable addresses to account for the difference
Pro:
- frame_base is easier computed and equals gcc behavior, also equal
to CFA
- frame_base doesn't point into unallocated area during call
Con:
- need to cope with different storage classes for parameters
-------------------- <- DW_AT_frame_base and CFA point here (outer frame
pointer)
| Return address |
--------------------
| pushed EBP |
-------------------- <- EBP points here during function (inner frame
pointer)
| pushed registers |
--------------------
| local storage |
--------------------
So any opinions about this ?
Maybe someone could also help with the following.
How can I declare a an interrupt function?
What's the exact semantic of Aoff, Poff, BPoff and symbol->Soffset?
More information about the dmd-internals
mailing list