Re: Dwarf unwinder problems with store.exp and preserved regs

Andreas Jaeger
2003-07-02T06:38:44Z

Daniel Jacobowitz <drow@mvista.com> writes:

> I see two kinds of failures in store.exp right now, on the two targets I'm
> testing. On i386, with DWARF 2 unwinding, I see spurious <value optimized
> out> messages; and on ARM (without DWARF 2 unwinding) I see legitimately
> corrupted values. The latter are easy, so I'll send a patch momentarily.
> The former are more interesting.

I see the same problem on x86-64 with the <value optimized out> messages.

> Here's the problem: the unwinder does not know what registers are considered
> call saved. GDB reads some initial CIE unwind information from the debug
> file:
>
> /* Instruction sequence to initialize a register set. */
> unsigned char *initial_instructions;
>
> /* True if a 'z' augmentation existed. */
> unsigned char saw_z_augmentation;
>
> cie->saw_z_augmentation = (*augmentation == 'z');
> if (cie->saw_z_augmentation)
> {
> ULONGEST length;
>
> length = read_unsigned_leb128 (unit->abfd, buf, &bytes_read);
> buf += bytes_read;
> cie->initial_instructions = buf + length;
> augmentation++;
> }
>
> However, GCC only emits information about the CFA, not about the default
> saved-ness of registers. So we get:
>
> 168 /* Initialize newly allocated registers. */
> 169 memset (rs->reg + rs->num_regs, 0, (num_regs - rs->num_regs) * size);
>
> And 0 is UNDEFINED. So $ebx - a call-saved register on i386 - shows up as
> undefined.
>
> There are two things we can do about this, I think, and perhaps we should
> do both:
> - Fix GCC. I -believe-, from reading the spec, that GCC is to blame for
> not emiting this information.
> - Provide an architecture method to pre-initialize the register table
> before initial_instructions is evaluated.

I think the later is the way to go - but didn't read the spec fully to
give an authoritative answer,

Andreas
--
Andreas Jaeger, aj@suse.de, http://www.suse.de/~aj
SuSE Linux AG, Deutschherrnstr. 15-19, 90429 NÃ¼rnberg, Germany
GPG fingerprint = 93A3 365E CE47 B889 DF7F FED1 389A 563C C272 A126