[fpc-devel] AVR debug info - bug 0033914

Christo christo.crause at gmail.com
Sat Jun 30 21:51:13 CEST 2018

I'm trying to figure out how to fix bug 33914. This bug causes gdb to read variable addresses
from flash, not RAM.  Looking at the DWARF info, the address of a variable is written as a word,
while gdb expects a prefixed address ($800000 + address) to indicate a RAM address, so the size
of the address needs to be larger than 16 bits.  In dbgdwarf.pas it appears as if the size of
addresses are taken from pint/puint in globtype.pas and aitconst_ptr_unaligned in aasmtai.pas,
all of which are 16 bit sizes for AVR.

To fix the problem of storing the addresses of variables with RAM prefixes I've added a level of
indirection in dbgdwarf by adding the following declarations to remap the size of addresses for

{$ifdef avr}
puint_d = cardinal;
pint_d = longint;
{$else avr}
puint_d = PUint;
pint_d = pint;
{$endif avr}

{$ifdef avr}
aitconst_ptr_unaligned_d = aitconst_32bit_unaligned;
{$else avr}
aitconst_ptr_unaligned_d = aitconst_ptr_unaligned;
{$endif avr}

Of course all instances pint/puint types and aitconst_ptr_unaligned constants are appended with
"_d" as part of this indirection.  A patch with this approach is attached to the bug report.

This appears to work correctly, but I'm not sure this is an elegant way of fixing the problem.
Any comments or hints on how to fix the issue more elegantly?

More information about the fpc-devel mailing list