svn commit: r234014 - head/lib/libc/arm/gen

Juli Mallett jmallett at FreeBSD.org
Mon Apr 9 01:37:07 UTC 2012


On Sat, Apr 7, 2012 at 21:45, Andrew Turner <andrew at fubar.geek.nz> wrote:
> On Sun, 8 Apr 2012 04:36:27 +0000 (UTC)
> Andrew Turner <andrew at FreeBSD.org> wrote:
>
>> Author: andrew
>> Date: Sun Apr  8 04:36:27 2012
>> New Revision: 234014
>> URL: http://svn.freebsd.org/changeset/base/234014
>>
>> Log:
>>   Unlike other functions __aeabi_read_tp function must preserve
>> r1-r3. The currently generated code clobbers r3. Fix this by loading
>> ARM_TP_ADDRESS using inline assembly.
>>
>>   Approved by:        imp (mentor)
>
> This fixes thread local storage on ARM in cases when the compiler loads
> the offset of the variable in r3 before calling __aeabi_read_tp as has
> been observed when the variable is in a shared library.

I don't believe this is safe unless you specify __attribute__
((__naked__)) in the declaration — currently the compiler is free to
clobber registers that the calling convention/ABI allows it to
clobber.  I don't see the benefit of implementing this in C over using
an assembly file, that said, although GCC does have this attribute
precisely to allow one to write assembly in a C source file without
having to worry about unexpected behavior.

How do you know GCC won't allocate r2 to be used as a temporary in
between the assembly and the return?

I tried to raise this concern on IRC previously, but hopefully it's clearer now.

Thanks,
Juli.


More information about the svn-src-all mailing list