sjlj-exceptions ICE. simplified test case

Richard Henderson
Wed Apr 26 14:51:00 GMT 2000

On Wed, Apr 26, 2000 at 01:15:22PM -0700, Jason Merrill wrote:
> We ought have a fallback unwinder, perhaps based on gdb code.  For SPARC
> this would be trivial, and remove the need for any unwind information in
> most cases.

For some targets (e.g. Alpha) this is impossible. 

Digital defines a "procedure descriptor" that is a bit more compact
that dwarf2 information, at the expense of restricting the scheduling
that can be done on the prologue.  Their compilers _always_ emit this
descriptor.  We do not.

> Absolutely.  What were the suggestions again?  The ia64 unwind info avoids
> this by putting the tables in text and using self-relative offsets.

Not quite.  The ia64 unwind info is segment-relative, not self-relative.
You need special relocations to accomplish that.

The one relocation type that everyone has is pc-relative.  So instead
of writing ".4byte .LFB1" we'd write ".4byte .LFB1-.".  Depending on
the exact quirks of the machine's relocation, the correct value would
be loaded as either

	v = *p + (size_t)p;
	v = *p + (size_t)(p + 1);

If the later, we can usually get rid of the extra bias by writing
".4byte .LFB1-.-4".

It is of course necessary to have a target hook for writing this;
Sun's assembler for instance wants ".long %r_disp32(.LFB1)".
Conveniently, I don't think sparc gas accepts this same syntax.  :-/

Unfortunately, some systems have broken assemblers, in that while
the object file format has a pc-relative relocation, you can't
actually create one.  One would hope that there are very few systems
remaining that support shared libraries but not pc relative relocations
in the assembler.

Also, some 64-bit systems (e.g. Alpha and MIPS) can use a 32-bit 
pc-relative displacement here.  Both machines already limit the
size of any one dso by the way they load the gp from the pc in
the prologue.


More information about the Gcc-patches mailing list