__DYNAMIC_REENT__ part of external API?
Jeff Johnston
jjohnstn@redhat.com
Tue Oct 1 21:12:00 GMT 2013
On 10/01/2013 03:42 PM, Jonathan S. Shapiro wrote:
> Jeff:
>
> Thanks for the reply, and for such a succinct identification of the problem.
>
> What brings this on is that I'm bringing up an RTOS on a noMMU multicore
> processor. Where use of __getreent() could previously be selected as a
> target platform decision, and wasn't commonly used, it now seems to be
> more situational. If my build targets a Cortex M3 unicore, the
> impure_ptr mechanism works fine. If it instead targets something like an
> LPC43xx (Cortex M4+M0), then impure_ptr isn't good enough any more. Note
> here that the target tuple between the two is identical, and the
> selected OS might also be identical. There isn't an obvious way to
> decide whether __DYNAMIC_REENT__ should be defined based on the target
> tuple. So it seems to me there is a conceptual model problem here.
>
I should clarify that it isn't actually the tuple. It is usually
builtins from the tuple's compiler (e.g. platform/model/endian
specifiers). The compiler can have multilib options for a particular
single configuration (e.g. -mmulti or -mlpc43xx could be a multilib
option from the compiler). This could be in turn be used to turn on the
__DYNAMIC_REENT__ flag and the user would be expected to use it when
they used that board.
> People who produce cross tool generators are justifiably reluctant to
> lug around a long list of patches for various cases. Especially so when
> they touch on things that are outside their scope. As a concrete example
> here, I was looking at modding FreeRTOS to supply __getreent(), and
> either tweaking the config.h or adding __DYNAMIC_REENT__ as a gcc
> predefine for my target. y_morin would prefer to see patches pushed
> upstream, but you guys would presumably prefer patches that have general
> utility (and rightly so).
>
I wouldn't push __DYNAMIC_REENT__ upstream, but they would certainly be
more inclined to add model specifiers if they don't already have them
which you can use to map to __DYNAMIC_REENT__.
> This leads me to wonder whether we shouldn't consider a configure option
> --with-dynamic-reent coupled with a default (weak symbol) implementation
> of __getreent() that simply returns the current value of impure_ptr (for
> compatibility).
>
A possibility, but you are expecting the end-user to link in the real
__getreent() ahead of time as a special step or you have it in the RTOS
which begs the question, why not just have it in newlib? If you wanted
to make use of it optional, you could have your configure option which
you could use to set __DYNAMIC_REENT__ via newlib.h and this would solve
the header file issue (i.e. library and headers would be consistent).
Or you could simply just set the __DYNAMIC_REENT__ flag on permanently
in sys/config.h and always supply __getreent() one way or another.
> This touches on libgloss as well, and I wonder there if we shouldn't
> consider --with-external-libgloss or some such thing, so that we can
> leave implementation of "system calls" to the selected bare-metal runtime.
>
You can already handle that with a libgloss linker script which doesn't
link in any library created in libgloss.
> But I may be approaching this in entirely the wrong way, so I'd welcome
> feedback. Is there a clean way to do this short of patching newlib?
>
>
> Thanks again.
>
>
>
> Jonathan
More information about the Newlib
mailing list