Recent libstdc++ regression on i686-linux: abi/cxx_runtime_only_linkage.cc

Sebastian Redl sebastian.redl@getdesigned.at
Fri Aug 22 16:27:00 GMT 2008


H.J. Lu wrote:
> On Fri, Aug 22, 2008 at 8:59 AM, Paolo Carlini <paolo.carlini@oracle.com> wrote:
>   
>> Hi,
>>
>> apparently, between Revisions 139407 and 139411, this test started failing
>> the build:
>>
>>   FAIL: abi/cxx_runtime_only_linkage.cc (test for excess errors)
>>
>> Any idea what's going wrong? Maybe HJ can post the error?
>>
>>     
>
>
> /export/gnu/import/svn/gcc-test/bld/x86_64-unknown-linux-gnu/32/libstdc++-v3/libsupc++/.libs/libsupc++.a(eh_throw.o):
> In function `__exchange_and_add_dispatch':^M
> /export/gnu/import/svn/gcc-test/bld/x86_64-unknown-linux-gnu/32/libstdc++-v3/include/ext/atomicity.h:84:
> undefined reference to `__gnu_cxx::__exchange_and_add(int volatile*,
> int)'^M
> collect2: ld returned 1 exit status^M
>   
That's my exception_ptr code again (indirectly, this time). Apparently, 
__exchange_and_add has exactly the same problem as 
__sync_add_and_fetch_4: it's just not implemented on i386 targets.

That makes the regression range incorrect, though: the specified range 
doesn't contain any changes to my code. This was introduced as early as 
r139091.

The other weird thing is that the 32-bit target of the x86_64 compiler 
doesn't have _GLIBCXX_ATOMIC_BUILTINS_4 defined - apparently it defaults 
to a i386 profile. Now, I understand that for the 32-bit x86 compiler, 
but the 64-bit compiler is not a cross-compiler and should merely target 
the 32-bit mode of x86_64 CPUs. It should have the __sync built-ins.

Also, it's curious that we haven't seen this test failure for real x86 
builds. They don't default to __GTHREADS undefined, do they?

Sebastian



More information about the Libstdc++ mailing list