public inbox for newlib@sourceware.org
 help / color / mirror / Atom feed
* How to disable per-local string functions?
@ 2017-03-19  7:25 Philip Munts
  2017-03-20 10:58 ` Corinna Vinschen
  0 siblings, 1 reply; 4+ messages in thread
From: Philip Munts @ 2017-03-19  7:25 UTC (permalink / raw)
  To: newlib

I have a resource constrained Cortex-M0 application that fails with newlib 2.5.0.  The strncasecmp() function is now pulling in a lot of locale handling code, which I presume results from commit c1b7d9d93dc8e88693162c0d984a114371919fdd, "Implement per-locale string functions".

How can I either build newlib, or build my application to use the original string functions instead of the new *_l locale handling string functions?

Phil

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: How to disable per-local string functions?
  2017-03-19  7:25 How to disable per-local string functions? Philip Munts
@ 2017-03-20 10:58 ` Corinna Vinschen
  2017-03-20 12:33   ` Philip Munts
  0 siblings, 1 reply; 4+ messages in thread
From: Corinna Vinschen @ 2017-03-20 10:58 UTC (permalink / raw)
  To: newlib; +Cc: Philip Munts

[-- Attachment #1: Type: text/plain, Size: 1262 bytes --]

On Mar 19 08:24, Philip Munts wrote:
> I have a resource constrained Cortex-M0 application that fails with
> newlib 2.5.0.  The strncasecmp() function is now pulling in a lot of
> locale handling code, which I presume results from commit
> c1b7d9d93dc8e88693162c0d984a114371919fdd, "Implement per-locale string
> functions".
> 
> How can I either build newlib, or build my application to use the
> original string functions instead of the new *_l locale handling
> string functions?

strncasecmp does not use strncasecmp_l.  It just calls tolower, which
calls isupper, which in turn calls a function accessing the
__global_locale struct.  I *think* the problem is that this pulls in all
of libc/locale/locale.c, so the problem could perhaps alleviated by
moving __locale_ctype_ptr() and the __global_locale struct to separate
files...?

When I implemented this functionality I asked specificially for input
from users of small targets.  I tried to keep the footprint as small as
possible, but there's very likely room for further improvement.

So, here's my request again:  If somebody has problems with the size
of the code due to the locale stuff, please provide patches.

Corinna

-- 
Corinna Vinschen
Cygwin Maintainer
Red Hat

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: How to disable per-local string functions?
  2017-03-20 10:58 ` Corinna Vinschen
@ 2017-03-20 12:33   ` Philip Munts
  2017-03-21  0:12     ` Hans-Bernhard Bröker
  0 siblings, 1 reply; 4+ messages in thread
From: Philip Munts @ 2017-03-20 12:33 UTC (permalink / raw)
  To: newlib

On 03/20/2017 11:58 AM, Corinna Vinschen wrote:
> On Mar 19 08:24, Philip Munts wrote:
>> I have a resource constrained Cortex-M0 application that fails with
>> newlib 2.5.0.  The strncasecmp() function is now pulling in a lot of
>> locale handling code, which I presume results from commit
>> c1b7d9d93dc8e88693162c0d984a114371919fdd, "Implement per-locale string
>> functions".
>>
>> How can I either build newlib, or build my application to use the
>> original string functions instead of the new *_l locale handling
>> string functions?
>
> strncasecmp does not use strncasecmp_l.  It just calls tolower, which
> calls isupper, which in turn calls a function accessing the
> __global_locale struct.  I *think* the problem is that this pulls in all
> of libc/locale/locale.c, so the problem could perhaps alleviated by
> moving __locale_ctype_ptr() and the __global_locale struct to separate
> files...?
>
> When I implemented this functionality I asked specificially for input
> from users of small targets.  I tried to keep the footprint as small as
> possible, but there's very likely room for further improvement.
>
> So, here's my request again:  If somebody has problems with the size
> of the code due to the locale stuff, please provide patches.
>
> Corinna

tolower() and isupper() both must be getting inlined.  Here is the fragment of
disassembly code that made me think I was getting strncasecmp_l() instead of
strncasecmp:

00004808 <strncasecmp>:
     4808:	b5f0      	push	{r4, r5, r6, r7, lr}
     480a:	464f      	mov	r7, r9
     480c:	46d6      	mov	lr, sl
     480e:	4646      	mov	r6, r8
     4810:	4682      	mov	sl, r0
     4812:	b5c0      	push	{r6, r7, lr}
     4814:	4689      	mov	r9, r1
     4816:	4690      	mov	r8, r2
     4818:	2500      	movs	r5, #0
     481a:	2703      	movs	r7, #3
     481c:	2a00      	cmp	r2, #0
     481e:	d110      	bne.n	4842 <strncasecmp+0x3a>
     4820:	e023      	b.n	486a <strncasecmp+0x62>
     4822:	464b      	mov	r3, r9
     4824:	5d5e      	ldrb	r6, [r3, r5]
     4826:	f000 fc8b 	bl	5140 <__locale_ctype_ptr>
     482a:	1980      	adds	r0, r0, r6
     482c:	7843      	ldrb	r3, [r0, #1]

tolower() and isupper() as functions are nowhere to be found in my assembly code.

For now I'll just use a private implementation of strncasecmp() that calls _tolower().

Phil

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: How to disable per-local string functions?
  2017-03-20 12:33   ` Philip Munts
@ 2017-03-21  0:12     ` Hans-Bernhard Bröker
  0 siblings, 0 replies; 4+ messages in thread
From: Hans-Bernhard Bröker @ 2017-03-21  0:12 UTC (permalink / raw)
  To: newlib

Am 20.03.2017 um 13:33 schrieb Philip Munts:
> On 03/20/2017 11:58 AM, Corinna Vinschen wrote:
>> On Mar 19 08:24, Philip Munts wrote:

> tolower() and isupper() both must be getting inlined.

Close, but not quite.  Like most of <ctype.h>'s public interfaces 
typically are, they're macros.  So they generate in-line code by 
definition, not by inlining or optimization.

They do however refer to locale-specific tables to find properties of 
given characters.  Those tables are managed by the <locale.h> machinery. 
  That's the __locale_ctype_ptr you see in your assembly listing.  And 
yes, that will drag in a large part, if not all, of the locale 
implementation without anyone having much of a choice about it.  By 
definition of Standard C the <ctype.h> functions are locale-sensitive, 
after all.

The only way to avoid all the memory consumption that goes with this 
would be to build the library with support for the 'C' locale only.  I 
don't think there's a configure-time option for that.

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2017-03-21  0:12 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-03-19  7:25 How to disable per-local string functions? Philip Munts
2017-03-20 10:58 ` Corinna Vinschen
2017-03-20 12:33   ` Philip Munts
2017-03-21  0:12     ` Hans-Bernhard Bröker

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).