On 03/03/17 11:13, jan.som...@dlr.de wrote:
-----Original Message-----
From: Sebastian Huber [mailto:sebastian.hu...@embedded-brains.de]
Sent: Wednesday, March 01, 2017 7:47 AM
To: Sommer, Jan; devel@rtems.org
Subject: Re: Undefined reference to `__sync_bool_compare_and_swap_4' for
some Leon configurations with gfortran
  [...]
I updated the __sync-check of libbacktrace and now the undefined references
are gone and my test program compiles.
If there are no objections I would try to push something like the attached
patch upstream. Do you have any suggestions to which branches?
I thought about trunk and the gcc-6 branch or do we need further backports
for older RTEMS versions?

I don't think this is the way to go. Firstly, this is certainly not a 
SPARC-specific
problem.
Secondly, RTEMS is multi-threaded, are you sure you can simply disable
this feature?
Well, the patch only disabled the feature in the configuration of libbacktrace.
If I understand autotools correctly, this shouldn't affect other parts of gcc, 
i.e.
if the builtins are used there they should still show up as undefined 
references.

Yes, you disable it in libbacktrace. Will libbacktrace work correctly in this case?


RTEMS supports C11 atomic operations which includes libatomic
support. However, we lack the
__sync_* builtin support on targets without atomic operations in hardware. This
is the problem we should fix. We should provide these functions either in libgcc
or in libatomic.

I was afraid you would say that ;-). However, I am not sure I would know 
where/how  to start.

We have to figure out where to add it. In libgcc similar to

https://gcc.gnu.org/viewcvs/gcc/trunk/libgcc/config/nios2/linux-atomic.c?revision=243994&view=markup
https://gcc.gnu.org/viewcvs/gcc/trunk/libgcc/sync.c?revision=243994&view=markup

or in libatomic. Adding it to libatomic is more work, however, the resulting functions are a bit more efficient.

In libgcc you can for example do this (use a macro to generate the variants)

typedefunsignedintUQItype__attribute__((mode(QI)));

UQItype __sync_fetch_and_add_1(UQItype *ptr, UQItype val)
{
   __atomic_fetch_add(ptr, val, |__ATOMIC_SEQ_CST);|
}


One open question is why is there a libbacktrace dependency in libgfortran?
Does this add any value to embedded targets?

I don't think so. That's why I assumed it would be safe to change the 
configuration of libbacktrace
in order to get the fortran program to compile.

If you don't think its useful for embedded targets, then maybe libgfortran should simply not use libbacktrace at all, e.g. for RTEMS targets. I guess it is used to generate fancy error messages.

--
Sebastian Huber, embedded brains GmbH

Address : Dornierstr. 4, D-82178 Puchheim, Germany
Phone   : +49 89 189 47 41-16
Fax     : +49 89 189 47 41-09
E-Mail  : sebastian.hu...@embedded-brains.de
PGP     : Public key available on request.

Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.

_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel

Reply via email to