bug in implementation of __throw in gcc?

Geoff Keating geoffk@geoffk.org
Tue Dec 12 11:56:00 GMT 2000


Kevin B. Hendricks <kevin.hendricks@sympatico.ca> writes:

> The libgcc2.c _throw code is:
> 
>   /* Now reset pc to the right throw point.  */
>   pc = __builtin_extract_return_addr (__builtin_return_address (0)) - 1;
> 
>   handler = throw_helper (eh, pc, my_udata, &offset);
> 
> If I disassemble this code under ppc linux, it shows pc getting decremented 
> by 1 (not by 4) which makes pc on entry to throw_helper not point to the 
> address of the __throw but instead to 3 bytes after it.
> 
> Is this a bug?  Why use the "-1" here and not -4 (bytes) so that the actual 
> address of the __throw is in pc as the comments in libgcc2.c indicate they 
> should for entry to throw_helper.

This works.  I don't know if it was intentional, but note that on many
other ports it has the same effect: `pc' points somewhere inside the
call instruction, not necessarily at its start.

I think the important thing is that `pc' doesn't point just after the
end of the call instruction, because that might be the boundary between
two EH regions.

-- 
- Geoffrey Keating <geoffk@geoffk.org>


More information about the Gcc mailing list