This is the mail archive of the
newlib@sourceware.org
mailing list for the newlib project.
Re: How to disable per-local string functions?
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