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~

Reply via email to