[PATCH] Fix PR middle-end/52894
Dave Anglin
dave.anglin@bell.net
Tue Apr 10 12:29:00 GMT 2012
On 10-Apr-12, at 7:06 AM, Richard Guenther wrote:
> I can't immediately see how your description of "the list of pending
> externals
> and the vector" is deleted. pa.c keeps its own vector which
> references the
> decls and the only issue I see is that if you call assemble_external
> after
> processing externals you ICE because the pointer-set is not
> initialized?
>
> Why does the pa backend end up calling assemble_external at final
> time?
The backend calls assemble_integer to output function descriptors at
final
time. This indirectly calls assemble_external from output_addr_const.
This can be seen in comment #4 in the PR. This occurs after the pending
externals are processed.
We have to ensure that we only output function descriptors that are
referenced,
and we can only determine this at final.
As a result, assemble_external is called after the VEC has been deleted.
The compiler doesn't ICE. It goes into an infinite loop when a call to
pointer_set_insert tries to extend the deleted VEC. It does this even
if the
pointer is already in the VEC hash.
Previously, the storage wasn't deleted. I suspect the ineffective
calls on hpux
weren't noticed because assemble_external had already been called for
the
function descriptors earlier, so the list in the backend was complete.
The problem was first seen with the Linux target. There is no backend
list for this target because it doesn't use or need assemble_external.
I personally think it was wrong to add the deferral in
assemble_external,
but that's another issue.
Dave.
More information about the Gcc-patches
mailing list