On Wed, Oct 19, 2011 at 9:47 PM, John David Anglin <dave.anglin@xxxxxxxx> wrote:
> I looked at this a bit. The problem is legitimize_tls_address doesn't work
> properly. First, GCC doesn't know that the libcall needs r26 and ret0 when the
> __thread variable is an argument to a call. Secondly, the implementation of __tls_get_addr
> clobbers some other call clobbered registers. I'm thinking the glibc implementation
> might need to be in assembly language so that the clobbered registers are limited (i.e.,
> it needs to save registers). This all seems really ugly...
>
> The issues occur in generating PIC code.
Yes, __tls_get_addr is a normal C function and follows normal function
register usage.
Why does __tls_get_addr need to be a special function?
Almost all the targets in glibc-ports have C versions of __tls_get_addr.
For example I notice that on Alpha the call to __tls_get_addr is *not*
done via a emit_library_call_value, instead they use some emit_insn,
emit_libcall_block and use_reg.
So it looks like they tamper with the register usage via use_reg
before the call to __tls_get_addr?
Another example is Sparc which also uses a custom sequence and
manipulates the used registers.
I think our legitimize_tls_address needs to be rewritten to match
something like what alpha or sparc has, otherwise we are going to run
into trouble trying to get emit_library_call_value to work correctly.
Cheers,
Carlos.
--
To unsubscribe from this list: send the line "unsubscribe linux-parisc" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
[Linux USB Devel]
[Video for Linux]
[Linux Audio Users]
[Photo]
[Yosemite News]
[Yosemite Photos]
[Free Online Dating]
[Linux Kernel]
[Linux SCSI]
[XFree86]