On 03/07/12 10:44, Andrew MacLeod wrote:
> rth, you are familiar with how this part is suppose to hook up properly...
>
> I traced the code in expand_mem_thread_fence, and the sync_synchronize is
> being emiited by:
>
> else if (synchronize_libfunc != NULL_RTX)
> emit_library_call (synchronize_libfunc, LCT_NORMAL, VOIDmode, 0);
>
> presumably something just isn't being linked to the executable? or maybe not
> being built into libgcc?
These functions are in libgcc, but only built for linux.
See libgcc/config/arm/t-linux-eabi.
if (TARGET_AAPCS_BASED)
synchronize_libfunc = init_one_libfunc ("__sync_synchronize");
I assume this is because the default fallback, lacking an optab,
for synchronize is a no-op, and this is actively incorrect for
many ARM cpu revisions.
I also assume that rtems is now encountering this because of the
switch from arm-elf to arm-elf-eabi. In order to finish the port
to the eabi, rtems will need to provide this symbol somehow.
If rtems is always universally built explicitly targeting a
specific cpu revision, then this can be as simple as
void
__sync_synchronize (void)
{
#if defined(arm revisions supporting dmb)
asm volatile("dmb" : : : "memory");
#else
asm volatile("" : : : "memory");
#endif
}
Otherwise you may need help from the rtems kernel, as linux does.
r~