aboutsummaryrefslogtreecommitdiff
path: root/newlib/libc/stdlib
AgeCommit message (Collapse)AuthorFilesLines
2022-02-08newlib: switch to standard AC_PROG_CCMike Frysinger1-6/+1
Now that we use AC_NO_EXECUTABLES, and we require a recent version of autoconf, we don't need to define our own copies of these macros. So switch to the standard AC_PROG_CC.
2022-02-05newlib: drop shared documentation rulesMike Frysinger1-34/+1
Now that the top-level makefile handles these, don't need to copy these into every single subdir.
2022-02-05newlib: move man page generation into top-level buildMike Frysinger2-21/+2
This allows building the libc & libm pages in parallel, and drops the duplication in the subdirs with the chew/chapter settings. The unused rules in Makefile.shared are left in place to minimize noise in the change.
2022-02-04newlib: libc: move manual into top-level buildMike Frysinger3-105/+72
This doesn't migrate all the docs, just the libc's manual (pdf/info). This is to show the basic form of migrating the chew files. For subdirs that didn't have any docs, I've stripped their settings for clarity. If someone wanted to suddenly add docs, they can add the corresponding Makefile.inc files easily.
2022-02-04newlib: libc: include all chapters all the time in the manualMike Frysinger1-5/+0
THe stdio subdir is actually required by the documentation. The stdio/def is handled dynamically, but libc.texi always expects it to be included, and fails if it isn't. So making it required when building docs is safe. The xdr subdir is handled dynamically, but it doesn't include any docs, so the dynamic logic isn't (currently) adding any value. So making it required when building docs is safe. That leaves: iconv, stdio64, posix, and signal subdirs. The chapters have a little disclaimer saying they are system-dependent, but even then, imo having stable manuals regardless of the target is preferable, and we can add more disclaimer language to these chapters if we want. This doesn't touch the man page codepaths, just the info/pdf.
2022-01-29newlib: export abs_newlib_basedir for all subdirsMike Frysinger1-0/+1
When using the top-level configure script but subdir Makefiles, the newlib_basedir value gets a bit out of sync: it's relative to where configure lives, not where the Makefile lives. Move the abs setting from the top-level configure script into acinclude.m4 so we can rely on it being available everywhere. Although this commit doesn't use it anywhere, just lays the groundwork.
2022-01-26Fix null-pointer dereference in nano-mallocCyril Yared1-1/+1
If p is NULL, then the free_list is empty and we should return the correct failure values.
2022-01-26newlib: libc: merge machine/ configure scripts up a levelMike Frysinger1-1/+6
The machine configure scripts are all effectively stub scripts that pass the higher level options to its own makefile. There were only three doing custom tests. The rest were all effectively the same as the libc/ configure script. So instead of recursively running configure in all of these subdirs, generate their makefiles from the top-level configure. For the few unique ones, deploy a pattern of including subdir logic via m4: m4_include([machine/nds32/acinclude.m4]) Some of the generated machine makefiles have a bunch of extra stuff added to them, but that's because they were inconsistent in their configure libtool calls. The top-level has it, so it exports some new vars to the ones that weren't already.
2022-01-26newlib: libc: merge sys/ trampoline up a levelMike Frysinger1-0/+1
The sys/{configure,Makefile} files exist to fan out to the specific sys/$arch/ subdir, and to possibly generate a crt0. We already have all that same info in the libc/ dir itself, so by moving the recursive configure and make calls into it, we can cut off some of this logic entirely and save the overhead. For arches that don't have a sys subdir, it means they can skip the logic entirely. The sys subdir itself is kept for the crt0 logic, for now. We'll try and clean that up next.
2022-01-26newlib: libc: merge machine/ trampoline up a levelMike Frysinger1-0/+1
The machine/{configure,Makefile} files exist only to fan out to the specific machine/$arch/ subdir. We already have all that same info in the libc/ dir itself, so by moving the recursive configure and make calls into it, we can cut off this logic entirely and save the overhead. For arches that don't have a machine subdir, it means they can skip the logic entirely. Although there's prob not too many of those.
2022-01-21newlib: punt unused LIBC_EXTRA_LIB settingsMike Frysinger1-3/+0
This was added decades ago, but the commit message lacks any explanation, and it was unused when it was merged. It's still unused today. So punt it all.
2022-01-19newlib: internalize HAVE_INITFINI_ARRAYMike Frysinger1-1/+1
This define is only used by newlib internally, so stop exporting it as HAVE_INITFINI_ARRAY since this can conflict with defines packages use themselves. We don't really need to add _ to HAVE_INIT_FINI too since it isn't exported in newlib.h, but might as well be consistent here. We can't (easily) add this to newlib_cflags like HAVE_INIT_FINI is because this is based on a compile-time test in the top configure, not on plain shell code in configure.host. We'd have to replicate the test in every subdir in order to have it passed down.
2022-01-14newlib: update to automake-1.15Mike Frysinger1-78/+146
This matches what the other GNU toolchain projects have done already. The generated diff in practice isn't terribly large. This will allow more use of subdir local.mk includes due to fixes & improvements that came after the 1.11 release series.
2022-01-14require autoconf-2.69 exactlyMike Frysinger1-1/+4
The newlib & libgloss dirs are already generated using autoconf-2.69. To avoid merging new code and/or accidental regeneration using diff versions, leverage config/override.m4 to pin to 2.69 exactly. This matches what gcc/binutils/gdb are already doing. The README file already says to use autoconf-2.69. To accomplish this, it's just as simple as adding -I flags to the top-level config/ dir when running aclocal. This is because the override.m4 file overrides AC_INIT to first require the specific autoconf version before calling the real AC_INIT.
2022-01-05newlib: fix silent build in a few subdirsMike Frysinger2-4/+4
A few subdirs have custom compile rules. Utilize AM_V_xxx settings so they respect the silent build option.
2022-01-05newlib: migrate from INCLUDES to AM_CPPFLAGSMike Frysinger2-2/+2
Since automake deprecated the INCLUDES name in favor of AM_CPPFLAGS, change all existing users over. The generated code is the same since the two variables have been used in the same exact places by design. There are other cleanups to be done, but lets focus on just renaming here so we can upgrade to a newer automake version w/out triggering new warnings.
2021-12-29newlib: Regenerate autotools filesJon Turney1-4/+3
2021-12-29newlib: Remove automake option 'cygnus'Jon Turney1-2/+0
The 'cygnus' option was removed from automake 1.13 in 2012, so the presence of this option prevents that or a later version of automake being used. A check-list of the effects of '--cygnus' from the automake 1.12 documentation, and steps taken (where possible) to preserve those effects (See also this thread [1] for discussion on that): [1] https://lists.gnu.org/archive/html/bug-automake/2012-03/msg00048.html 1. The foreign strictness is implied. Already present in AM_INIT_AUTOMAKE in newlib/acinclude.m4 2. The options no-installinfo, no-dependencies and no-dist are implied. Already present in AM_INIT_AUTOMAKE in newlib/acinclude.m4 Future work: Remove no-dependencies and any explicit header dependencies, and use automatic dependency tracking instead. Are there explicit rules which are now redundant to removing no-installinfo and no-dist? 3. The macro AM_MAINTAINER_MODE is required. Already present in newlib/acinclude.m4 Note that maintainer-mode is still disabled by default. 4. Info files are always created in the build directory, and not in the source directory. This appears to be an error in the automake documentation describing '--cygnus' [2]. newlib's info files are generated in the source directory, and no special steps are needed to keep doing that. [2] https://lists.gnu.org/archive/html/bug-automake/2012-04/msg00028.html 5. texinfo.tex is not required if a Texinfo source file is specified. (The assumption is that the file will be supplied, but in a place that automake cannot find.) This effect is overriden by an explicit setting of the TEXINFO_TEX variable (the directory part of which is fed into texi2X via the TEXINPUTS environment variable). 6. Certain tools will be searched for in the build tree as well as in the user's PATH. These tools are runtest, expect, makeinfo and texi2dvi. For obscure automake reasons, this effect of '--cygnus' is not active for makeinfo in newlib's configury. However, there appears to be top-level configury which selects in-tree runtest, expect and makeinfo, if present. So, if that works as it appears, this effect is preserved. If not, this may cause problem if anyone is building those tools in-tree. This effect is not preserved for texi2dvi. This may cause problems if anyone is building texinfo in-tree. If needed, explicit checks for those tools looking in places relative to $(top_srcdir)/../ as well as in PATH could be added. 7. The check target doesn't depend on all. This effect is not preseved. The check target now depends on the all target. This concern seems somewhat academic given the current state of the testsuite. Also note that this doesn't touch libgloss.
2021-12-29newlib: Regenerate autotools filesJon Turney1-2/+2
2021-12-09newlib: Regenerate all autotools filesJon Turney1-269/+288
Regenerate all aclocal.m4, configure and Makefile.in files.
2021-12-03ldtoa: Import gdtoa from OpenBSD.Takashi Yano10-27/+1695
- This patch uses gdtoa imported from OpenBSD if newlib configure option "--enable-newlib-use-gdtoa=no" is NOT specified. gdtoa provides more accurate output and faster conversion than legacy ldtoa, while it requires more heap memory.
2021-11-26ldtoa: Fix insufficient valid output digits for "%f" format.Takashi Yano1-16/+25
- If the number has large integer part and small fraction part is specified in output format, e.g. printf("%.3f", sqrt(2)*1e60);, valid output digits were insufficient. This patch fixes the issue.
2021-11-22ldtoa: don't restrict outbuf size to ndigitsCorinna Vinschen1-10/+25
https://cygwin.com/pipermail/cygwin/2021-November/249930.html reported a regression introduce by using a dynamically sized local char array in favor of a statically sized array. Fix this by reverting to a statically sized array, using a small buffer on the stack for a reasonable number of requested digits, a big mallocated buffer otherwise. This should work for small targets as well, given that malloc is used in printf anyway right now. This is *still* hopefully just a temporary measure, unless somebody actually provides a new ldtoa. Fixes: 4d90e53359145 ("ldtoa: fix dropping too many digits from output") Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
2021-11-06libgloss/newlib: update configure.ac in Makefile.in filesMike Frysinger1-1/+1
The maintainer rules refer to configure.in directly, so update that after renaming all the configure.ac files.
2021-11-04ldtoa: fix dropping too many digits from outputCorinna Vinschen1-3/+6
ldtoa cuts the number of digits it returns based on a computation of number of supported bits (144) divide by log10(2). Not only is the integer approximation of log10(2) ~= 8/27 missing a digit here, it also fails to take really small double and long double values into account. Allow for the full potential precision of long double values. At the same time, change the local string array allocation to request only as much bytes as necessary to support the caller-requested number of digits, to keep the stack size low on small targets. In the long run a better fix would be to switch to gdtoa, as the BSD variants, as well as Mingw64 do. Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
2021-09-06nano-malloc: Fix redefined compilation warningTorbjorn SVENSSON via Newlib1-0/+1
When newlib is configured with --enable-newlib-reent-check-verify, the assert macro is already defined in the nano-mallocr.c compile unit. Contributed by STMicroelectronics Signed-off-by: Torbjörn SVENSSON <torbjorn.svensson@st.com>
2021-08-23stdlib: conditionalize locale usageCorinna Vinschen2-4/+15
_strtod_l as well as the gethex function both fetch the decimal point from the current LC_NUMERIC locale info. This pulls in _C_numeric_locale unconditionally even on targets not supporting locales at all. Another problem is that strtod.c and gdtoa-gethex.c are ELIX 1, while locale information in general isn't. This leads to potential build breakage on bare metal targets. Fix this by setting the decimal point to "." on all targets not defining __HAVE_LOCALE_INFO__. While at it, const'ify the entire local decimal point info in the affected functions. Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
2021-07-07stdlib: Make strtod/strtof set ERANGE consistently for underflow.Keith Packard1-2/+29
The C standard says that errno may acquire the value ERANGE if the result from strtod underflows. According to IEEE 754, underflow occurs whenever the value cannot be represented in normalized form. Newlib is inconsistent in this, setting errno to ERANGE only if the value underflows to zero, but not for denorm values, and never for hex format floats. This patch attempts to consistently set errno to ERANGE for all 'underflow' conditions, which is to say all values which are not exactly zero and which cannot be represented in normalized form. This matches glibc behavior, as well as the Linux, Mac OS X, OpenBSD, FreeBSD and SunOS strtod man pages. Signed-off-by: Keith Packard <keithp@keithp.com>
2021-05-03Nano-malloc: Fix for unwanted external heap fragmentationOla Olsson1-9/+61
The only reason why it is tough for us to use nano malloc is because of the small shortcoming where nano_malloc() splits a bigger chunk from the free list into two pieces while handing back the second one (the tail) to the user. This is error prone and especially bad for smaller heaps, where nano malloc is supposed to be superior. The normal malloc doesn't have this issue and we need to use it even though it costs us ~2k bytes compared to nano-malloc. The problem arise especially after giving back _every_ malloced memory to the heap and then starting to exercise the heap again by allocating something small. This small item might split the whole heap in two equally big parts depending on how the heap has been exercised before. I have uploaded the smallest possible application (only tested on ST and Nordic devices) to show the issue while the real customer applications are far more complicated: https://drive.google.com/file/d/1kfSC2KOm3Os3mI7EBd-U0j63qVs8xMbt/view?usp=sharing The application works like the following pseudo code, where we assume a heap of 100 bytes (I haven't taken padding and other nitty and gritty details into account. Everything to simplify understanding): void *ptr = malloc(52); // We get 52 bytes and we have // 48 bytes to use. free(ptr); // Hand back the 52 bytes to nano_malloc // This is the magic line that shows the issue of // nano_malloc ptr = malloc(1); // Nano malloc will split the 52 bytes // in the free list and hand you a pointer // somewhere in the // middle of the heap. ptr2 = malloc(52); // Out of memory... I have done a fix which hands back the first part of the splitted chunk. Once this is fixed we obviously have the 1 byte placed in position 0 of the heap instead of somewhere in the middle. However, this won't let us malloc 52 new bytes even though we potentially have 99 bytes left to use in the heap. The reason is that when we try to do the allocation, nano-malloc looks into the free list and sees a 51 byte chunk to be used. This is not big enough so nano-malloc decides to call sbrk for _another_ 52 bytes which is not possible since there is only 48 bytes left to ask for. The solution for this problem is to check if the last item in the free list is adjacent to sbrk(0). If it is, as it is in this case, we can just ask sbrk for the remainder of what is needed. In this case 1 byte. NB! I have only tested the solution on our ST device.
2021-04-13Add build mechanism to share common header files between machinesCorinna Vinschen1-0/+1
So far the build mechanism in newlib only allowed to either define machine-specific headers, or headers shared between all machines. In some cases, architectures are sufficiently alike to share header files between them, but not with other architectures. A good example is ix86 vs. x86_64, which share certain traits with each other, but not with other architectures. Introduce a new configure variable called "shared_machine_dir". This dir can then be used for headers shared between architectures. Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
2021-02-18Include malloc.h in libc/stdlib/aligned_alloc.cHans-Peter Nilsson1-0/+1
Without this, for a bare-iron/simulator target such as cris-elf, you'll see, at newlib build time: /x/gccobj/./gcc/xgcc -B/x/gccobj/./gcc/ <many options elided> -c -o lib_a-aligned_alloc.o \ `test -f 'aligned_alloc.c' || echo '/y/newlib/libc/stdlib/'`aligned_alloc.c /y/newlib/libc/stdlib/aligned_alloc.c: In function 'aligned_alloc': /y/newlib/libc/stdlib/aligned_alloc.c:35:10: warning: implicit declaration of function \ '_memalign_r' [-Wimplicit-function-declaration] 35 | return _memalign_r (_REENT, align, size); | ^~~~~~~~~~~
2020-11-17malloc/nano-malloc: correctly check for out-of-bounds allocation reqsCorinna Vinschen2-2/+27
The overflow check in mEMALIGn erroneously checks for INT_MAX, albeit the input parameter is size_t. Fix this to check for __SIZE_MAX__ instead. Also, it misses to check the req against adding the alignment before calling mALLOc. While at it, add out-of-bounds checks to pvALLOc, nano_memalign, nano_valloc, and Cygwin's (unused) dlpvalloc. Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
2020-09-03Fix warnings when building for msp430-elfJozef Lawrynowicz2-11/+14
The MSP430 target supports both 16-bit and 20-bit size_t and intptr_t. Some implicit casts in Newlib expect these types to be "long", (a 32-bit type on MSP430) which causes warnings during compilation such as: "cast from pointer to integer of different size"
2020-08-17libm/stdlib: Realloc when shrinking by 2* or moreKeith Packard via Newlib1-3/+3
This reduces memory usage when reallocating objects much smaller. Signed-off-by: Keith Packard <keithp@keithp.com>
2020-08-17libm/stdlib: don't read past source in nano_reallocKeith Packard via Newlib1-2/+4
Save the computed block size and use it to avoid reading past the end of the source block. Signed-off-by: Keith Packard <keithp@keithp.com>
2020-08-13libc/stdlib: Fix build failure in nano_callocCraig Blackmore1-2/+2
commit 588a5e1ddebdf6d74391c7409680ea20e050c0e1 added a non-reentrant call to nano_malloc which causes a build failure if INTERNAL_NEWLIB is defined. Here is a snippet of the error: In file included from .../newlib/newlib/libc/stdlib/nano-mallocr.c:38: .../newlib/newlib/libc/include/malloc.h:42:25: note: expected 'struct _reent *' but argument is of type 'ptrdiff_t' {aka 'int'} 42 | extern void *_malloc_r (struct _reent *, size_t); | ^~~~~~~~~~~~~~~ .../newlib/newlib/libc/stdlib/nano-mallocr.c:67:22: error: too few arguments to function '_malloc_r' 67 | #define nano_malloc _malloc_r | ^~~~~~~~~ .../newlib/newlib/libc/stdlib/nano-mallocr.c:456:11: note: in expansion of macro 'nano_malloc' 456 | mem = nano_malloc(bytes); | ^~~~~~~~~~~ In file included from .../newlib/newlib/libc/stdlib/nano-mallocr.c:38: .../newlib/newlib/libc/include/malloc.h:42:14: note: declared here 42 | extern void *_malloc_r (struct _reent *, size_t); | ^~~~~~~~~ .../newlib/newlib/libc/stdlib/nano-mallocr.c:43: warning: "assert" redefined 43 | #define assert(x) ((void)0) | This patch adds a missing RCALL to the args when calling nano_malloc from nano_calloc, so that if the call is reentrant, reent_ptr is passed as the first argument. The variable `bytes` (also added in 588a5e1d) has been changed from a `ptrdiff_t` to `malloc_size_t` as it does not need to be signed. It is used to store the product of two unsigned malloc_size_t variables and then iff there was no overflow is it passed to malloc and memset which both expect size_t which is unsigned. Signed-off-by: Craig Blackmore <craig.blackmore@embecosm.com>
2020-08-12libc/stdlib: Use __builtin_mul_overflow for reallocarray and callocKeith Packard via Newlib3-15/+22
This built-in function (available in both gcc and clang) is more efficient and generates shorter code than open-coding the test. Signed-off-by: Keith Packard <keithp@keithp.com>
2020-05-19Reimplement aligned_allocSzabolcs Nagy1-32/+30
The original implementation had multiple issues: - Only worked when posix_memalign was available (Linux, RTEMS). - Violated C11 link namespace rules by calling posix_memalign. - Failed to set errno on error. These can be fixed by essentially using the same implementation for aligned_alloc as for memalign, i.e. simply calling _memalign_r (which is always available and a "more reserved name" although technically still not in the reserved link namespace, at least code written in c cannot define a colliding symbol, newlib has plenty such namespace issues so this is fine). It is not clear what the right policy is when MALLOC_PROVIDED is set, currently that does not cover aligned_alloc so it is kept that way. Tested on aarch64-none-elf
2020-01-29Use remove-advertising-clause script to edit BSD licensesKeith Packard19-83/+25
This edits licenses held by Berkeley and NetBSD, both of which have removed the advertising requirement from their licenses. Signed-off-by: Keith Packard <keithp@keithp.com>
2020-01-09Prevent more NULL ptr accesses due to Balloc out of memoryJeff Johnston3-9/+9
- fix gdtoa-gethex.c, ldtoa.c, and strtodg.c to use eBalloc
2019-12-18Don't display trailing '.' in _dcvtKeith Packard1-3/+12
In the two helper functions that _dcvt calls for 'f' and 'e' mode, if there are no digits to display after the decimal point, don't add one. Signed-off-by: Keith Packard <keithp@keithp.com>
2019-12-18Fix gcvt to always show 'ndigits' of precisionKeith Packard1-11/+7
Leading zeros after the decimal point should not count towards the 'ndigits' limit. This makes gcvt match glibc and the posix gcvt man page. Signed-off-by: Keith Packard <keithp@keithp.com>
2019-12-18Fix fcvt to only show 'ndigit' past decimalKeith Packard1-8/+1
Even if the number is really small and this means showing *no* digits. This makes newlib match glibc, and the fcvt posix man page. Signed-off-by: Keith Packard <keithp@keithp.com>
2019-12-17Return EINVAL for illegal base in strtolKeith Packard1-2/+7
Signed-off-by: Keith Packard <keithp@keithp.com>
2019-12-16strtold: set errno to ERANGE on underflow per POSIXBruno Haible1-0/+21
https://pubs.opengroup.org/onlinepubs/9699919799/functions/strtod.html
2019-10-04Prevent NULL ptr accesses due to Balloc out of memoryJeff Johnston3-12/+20
- add new eBalloc macro to mprec.h which calls Balloc and aborts if Balloc fails due to out of memory - change mprec.c functions that use Balloc without checking to use eBalloc instead - fix dtoa.c to use eBalloc
2019-07-24fix compile errors for efgcvt.cuchan-nos1-15/+18
2018-12-31Bump release to 3.1.0 for yearly snapshotnewlib-snapshot-20181231newlib-3.1.0Jeff Johnston1-23/+26
2018-10-10newlib: Build internal strtold code only if HAVE_LONG_DOUBLE definedCorinna Vinschen2-8/+9
Commit fbace81684f8cbb80a2048c01dc545af247f5cb7 ("Import correctly working strtold from David M. Gay.") introduced two new files, strtorx.c and strtodg.c. The functions are only called from strtold.c. However, while strtold.c is only built if HAVE_LONG_DOUBLE is defined, the patch erroneously added the two new files to GENERAL_SOURCES unconditionally. Fix this by building both files only if HAVE_LONG_DOUBLE has been defined. Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
2018-10-10newlib: strtold: use __builtin_nanl to avoid libm dependencyCorinna Vinschen1-1/+1
Commit 6c212a8b7873703c4f98c6b68579b234918be83a ("Fix strtod ("nan") and strtold ("nan") returns wrong negative NaN") introduced an unconditional dependency to nanl and, in turn, to libm. Rather than including nanl in libc as well, just call __builtin_nanl from here. Requires GCC 3.3 or later. Signed-off-by: Corinna Vinschen <corinna@vinschen.de>