[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Commits] r25237 - in /trunk: ./ libc/ libc/csu/ libc/elf/ libc/include/ libc/inet/netinet/ libc/libio/ libc/manual/ libc/math/ libc/n...



Author: joseph
Date: Fri Feb  7 13:04:10 2014
New Revision: 25237

Log:
Merge changes between r25087 and r25236 from /fsf/trunk.

Added:
    trunk/libc/libio/tst-ftell-partial-wide.c
      - copied unchanged from r25236, fsf/trunk/libc/libio/tst-ftell-partial-wide.c
    trunk/libc/manual/check-safety.sh
      - copied unchanged from r25236, fsf/trunk/libc/manual/check-safety.sh
    trunk/libc/manual/libdl.texi
      - copied unchanged from r25236, fsf/trunk/libc/manual/libdl.texi
    trunk/libc/sysdeps/sh/fpu_control.h
      - copied unchanged from r25236, fsf/trunk/libc/sysdeps/sh/fpu_control.h
    trunk/libc/sysdeps/sh/libm-test-ulps
      - copied unchanged from r25236, fsf/trunk/libc/sysdeps/sh/libm-test-ulps
    trunk/libc/sysdeps/sh/sh4/Makefile
      - copied unchanged from r25236, fsf/trunk/libc/sysdeps/sh/sh4/Makefile
    trunk/libc/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/ld-le.abilist
      - copied unchanged from r25236, fsf/trunk/libc/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/ld-le.abilist
    trunk/libc/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libBrokenLocale-le.abilist
      - copied unchanged from r25236, fsf/trunk/libc/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libBrokenLocale-le.abilist
    trunk/libc/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libanl-le.abilist
      - copied unchanged from r25236, fsf/trunk/libc/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libanl-le.abilist
    trunk/libc/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libc-le.abilist
      - copied unchanged from r25236, fsf/trunk/libc/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libc-le.abilist
    trunk/libc/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libcrypt-le.abilist
      - copied unchanged from r25236, fsf/trunk/libc/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libcrypt-le.abilist
    trunk/libc/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libdl-le.abilist
      - copied unchanged from r25236, fsf/trunk/libc/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libdl-le.abilist
    trunk/libc/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libm-le.abilist
      - copied unchanged from r25236, fsf/trunk/libc/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libm-le.abilist
    trunk/libc/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libnsl-le.abilist
      - copied unchanged from r25236, fsf/trunk/libc/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libnsl-le.abilist
    trunk/libc/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libpthread-le.abilist
      - copied unchanged from r25236, fsf/trunk/libc/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libpthread-le.abilist
    trunk/libc/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libresolv-le.abilist
      - copied unchanged from r25236, fsf/trunk/libc/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libresolv-le.abilist
    trunk/libc/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/librt-le.abilist
      - copied unchanged from r25236, fsf/trunk/libc/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/librt-le.abilist
    trunk/libc/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libthread_db-le.abilist
      - copied unchanged from r25236, fsf/trunk/libc/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libthread_db-le.abilist
    trunk/libc/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libutil-le.abilist
      - copied unchanged from r25236, fsf/trunk/libc/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libutil-le.abilist
    trunk/libc/sysdeps/unix/sysv/linux/s390/sys/ucontext.h
      - copied unchanged from r25236, fsf/trunk/libc/sysdeps/unix/sysv/linux/s390/sys/ucontext.h
    trunk/libc/sysdeps/unix/sysv/linux/sh/sys/ucontext.h
      - copied unchanged from r25236, fsf/trunk/libc/sysdeps/unix/sysv/linux/sh/sys/ucontext.h
Removed:
    trunk/libc/nptl/tst-tls7.c
    trunk/libc/nptl/tst-tls7mod.c
    trunk/libc/ports/sysdeps/microblaze/fegetround.c
    trunk/libc/ports/sysdeps/microblaze/fesetround.c
    trunk/libc/ports/sysdeps/microblaze/libm-test-ulps_new
    trunk/libc/sysdeps/sh/sh4/fpu/fpu_control.h
    trunk/libc/sysdeps/sh/sh4/fpu/libm-test-ulps
    trunk/libc/sysdeps/sh/sys/
    trunk/libc/sysdeps/unix/sysv/linux/s390/s390-32/sys/
    trunk/libc/sysdeps/unix/sysv/linux/s390/s390-64/sys/
    trunk/libc/sysdeps/unix/sysv/linux/sh/sh3/sys/
    trunk/libc/sysdeps/unix/sysv/linux/sh/sh4/sys/
Modified:
    trunk/   (props changed)
    trunk/libc/ChangeLog
    trunk/libc/Makerules
    trunk/libc/NEWS
    trunk/libc/csu/libc-tls.c
    trunk/libc/elf/Versions
    trunk/libc/elf/dl-close.c
    trunk/libc/elf/dl-iteratephdr.c
    trunk/libc/elf/dl-load.c
    trunk/libc/elf/dl-misc.c
    trunk/libc/elf/dl-open.c
    trunk/libc/elf/dl-reloc.c
    trunk/libc/elf/dl-support.c
    trunk/libc/elf/dl-tls.c
    trunk/libc/include/features.h
    trunk/libc/inet/netinet/in.h
    trunk/libc/libio/Makefile
    trunk/libc/libio/wfileops.c
    trunk/libc/manual/Makefile
    trunk/libc/manual/argp.texi
    trunk/libc/manual/arith.texi
    trunk/libc/manual/charset.texi
    trunk/libc/manual/conf.texi
    trunk/libc/manual/contrib.texi
    trunk/libc/manual/crypt.texi
    trunk/libc/manual/ctype.texi
    trunk/libc/manual/debug.texi
    trunk/libc/manual/errno.texi
    trunk/libc/manual/filesys.texi
    trunk/libc/manual/getopt.texi
    trunk/libc/manual/intro.texi
    trunk/libc/manual/job.texi
    trunk/libc/manual/lang.texi
    trunk/libc/manual/llio.texi
    trunk/libc/manual/locale.texi
    trunk/libc/manual/macros.texi
    trunk/libc/manual/math.texi
    trunk/libc/manual/memory.texi
    trunk/libc/manual/message.texi
    trunk/libc/manual/pattern.texi
    trunk/libc/manual/pipe.texi
    trunk/libc/manual/platform.texi
    trunk/libc/manual/process.texi
    trunk/libc/manual/resource.texi
    trunk/libc/manual/search.texi
    trunk/libc/manual/setjmp.texi
    trunk/libc/manual/signal.texi
    trunk/libc/manual/socket.texi
    trunk/libc/manual/startup.texi
    trunk/libc/manual/stdio.texi
    trunk/libc/manual/string.texi
    trunk/libc/manual/sysinfo.texi
    trunk/libc/manual/syslog.texi
    trunk/libc/manual/terminal.texi
    trunk/libc/manual/threads.texi
    trunk/libc/manual/time.texi
    trunk/libc/manual/users.texi
    trunk/libc/math/gen-libm-test.pl
    trunk/libc/nptl/ChangeLog
    trunk/libc/nptl/Makefile
    trunk/libc/nptl/allocatestack.c
    trunk/libc/nptl/shlib-versions
    trunk/libc/nptl/sysdeps/unix/sysv/linux/tst-setgetname.c
    trunk/libc/nscd/netgroupcache.c
    trunk/libc/nss/nss_files/files-netgrp.c
    trunk/libc/po/fr.po
    trunk/libc/po/sl.po
    trunk/libc/ports/ChangeLog.aarch64
    trunk/libc/ports/ChangeLog.alpha
    trunk/libc/ports/ChangeLog.arm
    trunk/libc/ports/ChangeLog.hppa
    trunk/libc/ports/ChangeLog.ia64
    trunk/libc/ports/ChangeLog.m68k
    trunk/libc/ports/ChangeLog.microblaze
    trunk/libc/ports/ChangeLog.tile
    trunk/libc/ports/sysdeps/aarch64/libm-test-ulps
    trunk/libc/ports/sysdeps/alpha/fpu/libm-test-ulps
    trunk/libc/ports/sysdeps/alpha/tls-macros.h
    trunk/libc/ports/sysdeps/hppa/fpu/libm-test-ulps
    trunk/libc/ports/sysdeps/m68k/m680x0/fpu/libm-test-ulps
    trunk/libc/ports/sysdeps/microblaze/libm-test-ulps
    trunk/libc/ports/sysdeps/tile/libm-test-ulps
    trunk/libc/ports/sysdeps/unix/sysv/linux/arm/clone.S
    trunk/libc/ports/sysdeps/unix/sysv/linux/ia64/setjmp.S
    trunk/libc/shlib-versions
    trunk/libc/sysdeps/generic/ldsodefs.h
    trunk/libc/sysdeps/mach/hurd/dl-sysdep.h
    trunk/libc/sysdeps/powerpc/Makefile
    trunk/libc/sysdeps/sparc/fpu/libm-test-ulps
    trunk/libc/sysdeps/unix/sysv/linux/dl-sysdep.c
    trunk/libc/sysdeps/unix/sysv/linux/dl-sysdep.h
    trunk/libc/sysdeps/unix/sysv/linux/kernel-features.h
    trunk/libc/sysdeps/x86/fpu/bits/mathinline.h
    trunk/libc/sysdeps/x86_64/fpu/libm-test-ulps
    trunk/libc/version.h

Propchange: trunk/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Fri Feb  7 13:04:10 2014
@@ -1,1 +1,1 @@
-/fsf/trunk:15224-25087
+/fsf/trunk:15224-25236

Modified: trunk/libc/ChangeLog
==============================================================================
--- trunk/libc/ChangeLog (original)
+++ trunk/libc/ChangeLog Fri Feb  7 13:04:10 2014
@@ -1,3 +1,291 @@
+2014-02-06  Carlos O'Donell  <carlos@xxxxxxxxxx>
+
+	[BZ #16529]
+	* inet/netinet/in.h: Remove comma after IPPROTO_MH.
+
+2014-02-06  Siddhesh Poyarekar  <siddhesh@xxxxxxxxxx>
+
+	* manual/contrib.texi: Update entry for Carlos O'Donell,
+	Joseph Myers, Roland McGrath, Alexandre Oliva and Ryan Arnold.
+
+2014-02-05  Carlos O'Donell  <carlos@xxxxxxxxxx>
+
+	* sysdeps/unix/sysv/linux/kernel-features.h: Fix comment.
+
+	* sysdeps/unix/sysv/linux/kernel-features.h
+	[__LINUX_KERNEL_VERSION >= 0x020621]
+	(__ASSUME_PROC_PID_TASK_COMM): Define.
+
+2014-02-05  Siddhesh Poyarekar  <siddhesh@xxxxxxxxxx>
+
+	* manual/contrib.texi: Update entry for Ondrej Bilka, Will
+	Newton and Alexandre Oliva.  Add entries for Steve Ellcey, Chris
+	Leonard and Allan McRae.
+
+2014-02-04  David S. Miller  <davem@xxxxxxxxxxxxx>
+
+	* sysdeps/sparc/fpu/libm-test-ulps: Update for some 64-bit differences from
+	32-bit.
+
+2014-02-04  Adhemerval Zanella  <azanella@xxxxxxxxxxxxxxxxxx>
+
+	* sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/ld-le.abilist: New
+	file
+	* sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libBrokenLocale-le.abilist:
+	New file
+	* sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libanl-le.abilist: New
+	file.
+	* sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libc-le.abilist: New
+	file.
+	* sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libcrypt-le.abilist:
+	New file.
+	* sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libdl-le.abilist: New
+	file.
+	* sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libm-le.abilist: New
+	file.
+	* sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libnsl-le.abilist:
+	New file.
+	* sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libpthread-le.abilist:
+	New file.
+	* sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libresolv-le.abilist:
+	New file.
+	* sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/librt-le.abilist:
+	New file.
+	* sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libthread_db-le.abilist:
+	New file.
+	* sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libutil-le.abilist:
+	New file.
+
+2014-02-01  Adhemerval Zanella  <azanella@xxxxxxxxxxxxxxxxxx>
+
+	* nptl/shlib-versions: Change powerpc*le start to 2.17.
+	* shlib-versions: Likewise.
+
+2014-02-04  Roland McGrath  <roland@xxxxxxxxxxxxx>
+	    Adhemerval Zanella  <azanella@xxxxxxxxxxxxxxxxxx>
+
+	* sysdeps/powerpc/Makefile [$(config-machine) ends with 'le']
+	(abilist-pattern): New variable, set to %-le.abilist.
+
+	* Makerules (abilist-pattern): New variable.
+	(vpath): Use $(abilist-pattern) in place of %.abilist.
+	(check-abi-% pattern rule): Likewise.
+	(check-abi, update-abi): Likewise.
+
+2014-02-04  Eric Wong  <normalperson@xxxxxxxx>
+
+	* sysdeps/x86_64/fpu/libm-test-ulps: Update.
+
+2014-02-04  Eric Wong  <normalperson@xxxxxxxx>
+
+	* sysdeps/x86_64/fpu/libm-test-ulps: Update.
+
+2014-02-03  Carlos O'Donell  <carlos@xxxxxxxxxx>
+
+	* manual/startup.texi: Add next, previous, and top entries for
+	the `Program Arguments' and `Environment Variables' nodes.
+
+2014-02-03  Alexandre Oliva <aoliva@xxxxxxxxxx>
+
+	* manual/macros.texi: Add comments before MTASC-safety macros.
+
+	* manual/users.texi: Document MTASC-safety properties.
+
+	* manual/threads.texi (pthread_key_create, pthread_key_delete,
+	pthread_getspecific, pthread_setspecific): Format with
+	@deftypefun, and add @safety note.
+	* manual/signal.texi: Move comments that analyze the above
+	functions to their home place.
+
+2014-02-03  Allan McRae  <allan@xxxxxxxxxxxxx>
+
+	* po/sl.po: Update Slovenian translation from translation project.
+
+2014-02-02  Alexandre Oliva <aoliva@xxxxxxxxxx>
+
+	* manual/time.texi (timegm): Add missing blank after @c.
+	Reported by Joseph Myers <joseph@xxxxxxxxxxxxxxxx>.
+
+2014-02-01  Alexandre Oliva <aoliva@xxxxxxxxxx>
+
+	* manual/check-safety.sh: New.
+	* manual/Makefile ($(objpfx)stamp-summary): Run it.
+
+	* manual/terminal.texi: Document MTASC-safety properties.
+
+	* manual/filesys.texi: Document MTASC-safety properties.
+
+	* manual/errno.texi: Document MTASC-safety properties.
+
+	* manual/intro.texi: Document safety identifiers and
+	conditionals.
+
+	* manual/string.texi (wcstok): Fix prototype.
+	(wcstok, strtok, strtok_r): Adjust reentrancy remarks.
+
+	* manual/time.texi: Document MTASC-safety properties.
+
+	* manual/string.texi: Document MTASC-safety properties.
+
+	* manual/threads.texi: Document MTASC-safety properties.
+
+	* manual/stdio.texi: Document MTASC-safety properties.
+
+	* manual/syslog.texi: Document MTASC-safety properties.
+
+	* manual/sysinfo.texi: Document MTASC-safety properties.
+
+	* manual/startup.texi: Document MTASC-safety properties.
+
+	* manual/socket.texi: Document MTASC-safety properties.
+
+	* manual/signal.texi: Document MTASC-safety properties.
+
+2014-01-31  Alexandre Oliva <aoliva@xxxxxxxxxx>
+
+	* manual/setjmp.texi: Document MTASC-safety properties.
+
+	* manual/search.texi: Document MTASC-safety properties.
+
+	* manual/resource.texi: Document MTASC-safety properties.
+
+	* manual/process.texi: Document MTASC-safety properties.
+
+	* manual/platform.texi: Document MTASC-safety properties.
+
+	* manual/pipe.texi: Document MTASC-safety properties.
+
+	* manual/pattern.texi: Document MTASC-safety properties.
+
+	* manual/message.texi: Document MTASC-safety properties.
+
+	[BZ #12751]
+	* manual/memory.texi: Document MTASC-safety properties.
+
+	* manual/math.texi: Document MTASC-safety properties.
+
+	* manual/locale.texi: Document MTASC-safety properties.
+
+	* manual/llio.texi: Document MTASC-safety properties.
+
+	* manual/libdl.texi: New.
+
+	* manual/lang.texi: Document MTASC-safety properties.
+
+	* manual/job.texi: Document MTASC-safety properties.
+
+	* manual/getopt.texi: Document MTASC-safety properties.
+
+	* manual/ctype.texi: Document MTASC-safety properties.
+
+2014-01-31  Maciej W. Rozycki  <macro@xxxxxxxxxxxxxxxx>
+
+	[BZ #16046]
+	* csu/libc-tls.c (static_map): Remove variable.
+	(__libc_setup_tls): Use main executable's link map for TLS data.
+	* elf/dl-close.c (_dl_close_worker) [!SHARED]: Remove special
+	casing for LM_ID_BASE and GL(dl_nns).
+	* elf/dl-iteratephdr.c [!SHARED] (dl_iterate_phdr): Remove
+	function.  Alias dl_iterate_phdr to __dl_iterate_phdr.
+	* elf/dl-load.c (_dl_map_object) [!SHARED]: Remove special
+	casing for GL(dl_ns)[LM_ID_BASE]._ns_loaded.
+	* elf/dl-support.c (_dl_main_map): Also initialize l_flags_1
+	member.
+	(_dl_non_dynamic_init): Also initialize _dl_main_map's l_phdr and
+	l_phnum members.
+
+2014-01-30  Alexandre Oliva <aoliva@xxxxxxxxxx>
+
+	* manual/debug.texi: Document MTASC-safety properties.
+
+2014-01-29  H.J. Lu  <hongjiu.lu@xxxxxxxxx>
+
+	[BZ #16510]
+	* sysdeps/x86/fpu/bits/mathinline.h: Check __SSE2_MATH__ instead
+	of __x86_64__ when disabling x87 inline functions.
+
+2014-01-29  Alexandre Oliva <aoliva@xxxxxxxxxx>
+
+	* manual/charset.texi: Document MTASC-safety properties.
+
+	* manual/crypt.texi: Document MTASC-safety properties.
+
+	* manual/conf.texi: Document MTASC-safety properties.
+
+	* manual/arith.texi: Document MTASC-safety properties.
+
+	* manual/argp.texi: Document MTASC-safety properties.
+
+	* manual/macros.texi: Introduce macros to document multi
+	thread, asynchronous signal and asynchronous cancellation
+	safety properties.
+	* manual/intro.texi: Introduce the properties themselves.
+
+2014-01-27  Kaz Kojima  <kkojima@xxxxxxxxxxxxxx>
+
+	* sysdeps/sh/sh4/Makefile: New file.
+
+2014-01-27  Andreas Schwab  <schwab@xxxxxxxxxxxxxx>
+
+	* math/gen-libm-test.pl ($srcdir): New variable.
+	($auto_input): Use it.
+
+2014-01-27  Siddhesh Poyarekar  <siddhesh@xxxxxxxxxx>
+
+	[BZ #16506]
+	* nss/nss_files/files-netgrp.c (_nss_files_setnetgrent): Avoid
+	access beyond array bounds when parsing netgroups file.
+
+	* nscd/netgroupcache.c (addgetnetgrentX): Compute offset from
+	the old buffer before realloc.
+
+2014-01-27  Allan McRae  <allan@xxxxxxxxxxxxx>
+
+	* po/fr.po: Update French translation from translation project.
+
+2014-01-26  Kaz Kojima  <kkojima@xxxxxxxxxxxxxx>
+
+	* sysdeps/sh/libm-test-ulps: Regenerate.
+
+2014-01-24  David S. Miller  <davem@xxxxxxxxxxxxx>
+
+	* sysdeps/sparc/fpu/libm-test-ulps: Regenerate.
+
+2014-01-25  Kaz Kojima  <kkojima@xxxxxxxxxxxxxx>
+
+	* sysdeps/sh/sh4/fpu/libm-test-ulps: Move to ...
+	* sysdeps/sh/libm-test-ulps: ... here and regenerated.
+
+2013-01-24  Siddhesh Poyarekar  <siddhesh@xxxxxxxxxx>
+
+	[BZ #16474]
+	* nscd/netgroupcache.c (addgetnetgrentX): Adjust triplet
+	string pointers after reallocation.
+
+2014-01-24  Kaz Kojima  <kkojima@xxxxxxxxxxxxxx>
+
+	* sysdeps/unix/sysv/linux/sh/sys/ucontext.h: Use __SH4__ and
+	__SH4A__ instead of __SH_FPU_ANY__.
+
+2014-01-23  Kaz Kojima  <kkojima@xxxxxxxxxxxxxx>
+
+	* sysdeps/sh/fpu_control.h: New file.
+	* sysdeps/sh/sh4/fpu/fpu_control.h: Remove.
+	* sysdeps/unix/sysv/linux/sh/sys/ucontext.h: New file.
+	* sysdeps/unix/sysv/linux/sh/sh3/sys/ucontext.h: Remove.
+	* sysdeps/unix/sysv/linux/sh/sh3/sys: Remove directory.
+	* sysdeps/unix/sysv/linux/sh/sh4/sys/ucontext.h: Remove.
+	* sysdeps/unix/sysv/linux/sh/sh4/sys: Remove directory.
+	* sysdeps/sh/sys/ucontext.h: Remove.
+	* sysdeps/sh/sys: Remove directory.
+
+2014-01-22  Andreas Krebbel  <Andreas.Krebbel@xxxxxxxxxx>
+
+	* sysdeps/unix/sysv/linux/s390/s390-32/sys/ucontext.h: Merge into
+	s390/sys/ucontext.h.
+	* sysdeps/unix/sysv/linux/s390/s390-64/sys/ucontext.h: Likewise.
+	* sysdeps/unix/sysv/linux/s390/sys/ucontext.h: New file.
+
 2014-01-20  H.J. Lu  <hongjiu.lu@xxxxxxxxx>
 
 	[BZ #15605]
@@ -288,15 +576,6 @@
 	* sysdeps/powerpc/powerpc64/multiarch/strnlen-power7.S: Likewise.
 	* sysdeps/powerpc/powerpc64/multiarch/wcscpy.c: Likewise.
 
-2014-01-03  Andrew Hunter  <ahh@xxxxxxxxxx>
-
-	* elf/dl-open.c (dl_open_worker): New comment.
-	* elf/dl-reloc.c (_dl_try_allocate_static_tls): Use
-	atomic_compare_and_exchange_bool_acq
-	(_dl_allocate_static_tls): Block signals.
-	* elf/dl-tls.c (allocate_and_init): Return void.
-	(_dl_update_slotinfo): Block signals, use atomic update.
-
 2014-01-03  Joseph Myers  <joseph@xxxxxxxxxxxxxxxx>
 
 	* sysdeps/powerpc/nofpu/libm-test-ulps: Regenerated.
@@ -697,12 +976,6 @@
 
 	* sysdeps/powerpc/fpu/libm-test-ulps: Update.
 
-2013-12-19  Paul Pluzhnikov  <ppluzhnikov@xxxxxxxxxx>
-
-	* elf/dl-misc.c (ptr_to_signal_safe_allocator_header): New function.
-	(__signal_safe_memalign, __signal_safe_free): Use it.
-	(__signal_safe_realloc): Likewise.
-
 2013-12-19  Joseph Myers  <joseph@xxxxxxxxxxxxxxxx>
 
 	* manual/texinfo.tex: Update to version 2013-11-26.10 with
@@ -786,37 +1059,6 @@
 	* manual/install.texi: Suppress menu for plain text output.
 	* INSTALL: Regenerated.
 
-2013-12-18  Andrew Hunter  <ahh@xxxxxxxxxx>
-
-	* sysdeps/generic/ldsodefs.h (__signal_safe_memalign): New prototype.
-	(__signal_safe_malloc, __signal_safe_free): Likewise.
-	(__signal_safe_realloc, __signal_safe_calloc): Likewise.
-	* elf/dl-misc.c (__signal_safe_allocator_header): New struct.
-	(__signal_safe_memalign, __signal_safe_malloc): New function.
-	(__signal_safe_free, __signal_safe_realloc): Likewise.
-	(__signal_safe_calloc): Likewise.
-	* elf/dl-tls.c (allocate_dtv, _dl_clear_dtv): Call signal-safe
-	functions.
-	(_dl_deallocate_tls, _dl_update_slotinfo): Likewise.
-
-2013-12-18  Andrew Hunter  <ahh@xxxxxxxxxx>
-
-	* elf/Versions (ld): Add _dl_clear_dtv.
-	* sysdeps/generic/ldsodefs.h (_dl_clear_dtv): New prototype.
-	* elf/dl-tls.c (_dl_clear_dtv): New function.
-	* nptl/allocatestack.c (get_cached_stack): Call _dl_clear_dtv.
-
-2013-12-18  Andrew Hunter  <ahh@xxxxxxxxxx>
-
-	* sysdeps/generic/ldsodefs.h (_dl_mask_all_signals): New prototype.
-	(_dl_unmask_signals): Likewise.
-	* sysdeps/mach/hurd/dl-sysdep.h (_dl_mask_all_signals): New stub.
-	(_dl_unmask_all_signals): Likewise.
-	* sysdeps/unix/sysv/linux/dl-sysdep.h (_dl_mask_all_signals): New prototype.
-	(_dl_unmask_all_signals): Likewise.
-	* sysdeps/unix/sysv/linux/dl-sysdep.c (_dl_mask_all_signals): New function.
-	(_dl_unmask_signals): Likewise.
-
 2013-12-18  Brooks Moses  <bmoses@xxxxxxxxxx>
 
 	[BZ #15846]
@@ -889,6 +1131,7 @@
 
 2013-12-17  Paul Eggert  <eggert@xxxxxxxxxxx>
 
+	[BZ #15968]
 	Support TZ transition times < 00:00:00.
 	This is needed for version-3 tz-format files; it supports time
 	stamps past 2037 for America/Godthab (the only entry in the tz
@@ -3640,6 +3883,7 @@
 
 2013-11-04  Joseph Myers  <joseph@xxxxxxxxxxxxxxxx>
 
+	[BZ #6981]
 	* include/stdc-predef.h [__GCC_IEC_559] (__STDC_IEC_559__): Define
 	depending on [__GCC_IEC_559 > 0].
 	[__GCC_IEC_559_COMPLEX] (__STDC_IEC_559_COMPLEX__): Define

Modified: trunk/libc/Makerules
==============================================================================
--- trunk/libc/Makerules (original)
+++ trunk/libc/Makerules Fri Feb  7 13:04:10 2014
@@ -1232,6 +1232,14 @@
 	LC_ALL=C $(OBJDUMP) --dynamic-syms $< > $@T
 	mv -f $@T $@
 
+# A sysdeps/.../Makefile can set abilist-pattern to something like
+# %-foo.abilist to look for libc-foo.abilist instead of libc.abilist.
+# This makes sense if multiple ABIs can be most cleanly supported by a
+# configuration without using separate sysdeps directories for each.
+ifdef abilist-pattern
+vpath $(abilist-pattern) $(+sysdep_dirs)
+endif
+
 vpath %.abilist $(+sysdep_dirs)
 
 # The .PRECIOUS rule prevents the files built by an implicit rule whose
@@ -1241,18 +1249,42 @@
 .PRECIOUS: %.symlist
 generated += $(extra-libs:=.symlist)
 
+ifdef abilist-pattern
+check-abi-%: $(common-objpfx)config.make $(abilist-pattern) $(objpfx)%.symlist
+	$(check-abi-pattern)
+check-abi-%: $(common-objpfx)config.make $(abilist-pattern) \
+	     $(common-objpfx)%.symlist
+	$(check-abi-pattern)
+endif
 check-abi-%: $(common-objpfx)config.make %.abilist $(objpfx)%.symlist
 	$(check-abi)
 check-abi-%: $(common-objpfx)config.make %.abilist $(common-objpfx)%.symlist
 	$(check-abi)
+define check-abi-pattern
+	diff -p -U 0 $(filter $(abilist-pattern),$^) $(filter %.symlist,$^)
+endef
 define check-abi
 	diff -p -U 0 $(filter %.abilist,$^) $(filter %.symlist,$^)
 endef
 
+ifdef abilist-pattern
+update-abi-%: $(objpfx)%.symlist $(abilist-pattern)
+	$(update-abi-pattern)
+update-abi-%: $(common-objpfx)%.symlist $(abilist-pattern)
+	$(update-abi-pattern)
+endif
 update-abi-%: $(objpfx)%.symlist %.abilist
 	$(update-abi)
 update-abi-%: $(common-objpfx)%.symlist %.abilist
 	$(update-abi)
+define update-abi-pattern
+@if cmp -s $^ 2> /dev/null; \
+ then \
+      echo '+++ $(filter $(abilist-pattern),$^) is unchanged'; \
+ else cp -f $^; \
+      echo '*** Now check $(filter $(abilist-pattern),$^) changes for correctness ***'; \
+ fi
+endef
 define update-abi
 @if cmp -s $^ 2> /dev/null; \
  then \

Modified: trunk/libc/NEWS
==============================================================================
--- trunk/libc/NEWS (original)
+++ trunk/libc/NEWS Fri Feb  7 13:04:10 2014
@@ -9,23 +9,24 @@
 
 * The following bugs are resolved with this release:
 
-  156, 387, 431, 762, 832, 926, 2801, 4772, 6786, 6787, 6807, 6810, 7003,
-  9721, 9954, 10253, 10278, 11087, 11157, 11214, 12100, 12486, 12986,
-  13028, 13982, 13985, 14029, 14032, 14120, 14143, 14155, 14286, 14547,
-  14699, 14752, 14782, 14876, 14910, 15004, 15048, 15073, 15089, 15128,
-  15218, 15268, 15277, 15308, 15362, 15374, 15400, 15425, 15427, 15483,
-  15522, 15531, 15532, 15593, 15601, 15608, 15609, 15610, 15632, 15640,
-  15670, 15672, 15680, 15681, 15723, 15734, 15735, 15736, 15748, 15749,
-  15754, 15760, 15763, 15764, 15797, 15799, 15825, 15843, 15844, 15846,
-  15847, 15849, 15850, 15855, 15856, 15857, 15859, 15867, 15886, 15887,
-  15890, 15892, 15893, 15895, 15897, 15901, 15905, 15909, 15915, 15917,
-  15919, 15921, 15923, 15939, 15941, 15948, 15963, 15966, 15985, 15988,
-  15997, 16032, 16034, 16036, 16037, 16038, 16041, 16055, 16071, 16072,
-  16074, 16077, 16078, 16103, 16112, 16133, 16143, 16144, 16146, 16150,
-  16151, 16153, 16167, 16169, 16172, 16195, 16214, 16245, 16271, 16274,
-  16283, 16289, 16293, 16314, 16316, 16330, 16337, 16338, 16356, 16365,
-  16366, 16369, 16372, 16375, 16379, 16384, 16385, 16386, 16387, 16390,
-  16394, 16400, 16407, 16408, 16414, 16430, 16431, 16453.
+  156, 387, 431, 762, 832, 926, 2801, 4772, 6786, 6787, 6807, 6810, 6981,
+  7003, 9721, 9954, 10253, 10278, 11087, 11157, 11214, 12100, 12486, 12751,
+  12986, 13028, 13982, 13985, 14029, 14032, 14120, 14143, 14155, 14286,
+  14547, 14699, 14752, 14782, 14876, 14910, 15004, 15048, 15073, 15089,
+  15128, 15218, 15268, 15277, 15308, 15362, 15374, 15400, 15425, 15427,
+  15483, 15522, 15531, 15532, 15593, 15601, 15608, 15609, 15610, 15632,
+  15640, 15670, 15672, 15680, 15681, 15723, 15734, 15735, 15736, 15748,
+  15749, 15754, 15760, 15763, 15764, 15797, 15799, 15825, 15843, 15844,
+  15846, 15847, 15849, 15850, 15855, 15856, 15857, 15859, 15867, 15886,
+  15887, 15890, 15892, 15893, 15895, 15897, 15901, 15905, 15909, 15915,
+  15917, 15919, 15921, 15923, 15939, 15941, 15948, 15963, 15966, 15968,
+  15985, 15988, 15997, 16032, 16034, 16036, 16037, 16038, 16041, 16046,
+  16055, 16071, 16072, 16074, 16077, 16078, 16103, 16112, 16143, 16144,
+  16146, 16150, 16151, 16153, 16167, 16169, 16172, 16195, 16214, 16245,
+  16271, 16274, 16283, 16289, 16293, 16314, 16316, 16330, 16337, 16338,
+  16356, 16365, 16366, 16369, 16372, 16375, 16379, 16384, 16385, 16386,
+  16387, 16390, 16394, 16398, 16400, 16407, 16408, 16414, 16430, 16431,
+  16453, 16474, 16506, 16510, 16529
 
 * Slovenian translations for glibc messages have been contributed by the
   Translation Project's Slovenian team of translators.
@@ -118,6 +119,9 @@
 * The _BSD_SOURCE feature test macro no longer enables BSD interfaces that
   conflict with POSIX.  The libbsd-compat library (which was a dummy library
   that did nothing) has also been removed.
+
+* Preliminary documentation about Multi-Thread, Async-Signal and
+  Async-Cancel Safety has been added.
 
 Version 2.18
 

Modified: trunk/libc/csu/libc-tls.c
==============================================================================
--- trunk/libc/csu/libc-tls.c (original)
+++ trunk/libc/csu/libc-tls.c Fri Feb  7 13:04:10 2014
@@ -41,9 +41,6 @@
      through the 'si' element.  */
   struct dtv_slotinfo info[2 + TLS_SLOTINFO_SURPLUS];
 } static_slotinfo;
-
-/* Fake link map for the application.  */
-static struct link_map static_map;
 
 
 /* Highest dtv index currently needed.  */
@@ -162,14 +159,16 @@
   _dl_static_dtv[0].counter = (sizeof (_dl_static_dtv) / sizeof (_dl_static_dtv[0])) - 2;
   // _dl_static_dtv[1].counter = 0;		would be needed if not already done
 
+  struct link_map *main_map = GL(dl_ns)[LM_ID_BASE]._ns_loaded;
+
   /* Initialize the TLS block.  */
 #if TLS_TCB_AT_TP
   _dl_static_dtv[2].pointer.val = ((char *) tlsblock + tcb_offset
 			       - roundup (memsz, align ?: 1));
-  static_map.l_tls_offset = roundup (memsz, align ?: 1);
+  main_map->l_tls_offset = roundup (memsz, align ?: 1);
 #elif TLS_DTV_AT_TP
   _dl_static_dtv[2].pointer.val = (char *) tlsblock + tcb_offset;
-  static_map.l_tls_offset = tcb_offset;
+  main_map->l_tls_offset = tcb_offset;
 #else
 # error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
 #endif
@@ -193,19 +192,17 @@
   if (__builtin_expect (lossage != NULL, 0))
     __libc_fatal (lossage);
 
-  /* We have to create a fake link map which normally would be created
-     by the dynamic linker.  It just has to have enough information to
-     make the TLS routines happy.  */
-  static_map.l_tls_align = align;
-  static_map.l_tls_blocksize = memsz;
-  static_map.l_tls_initimage = initimage;
-  static_map.l_tls_initimage_size = filesz;
-  static_map.l_type = lt_executable;
-  static_map.l_tls_modid = 1;
+  /* Update the executable's link map with enough information to make
+     the TLS routines happy.  */
+  main_map->l_tls_align = align;
+  main_map->l_tls_blocksize = memsz;
+  main_map->l_tls_initimage = initimage;
+  main_map->l_tls_initimage_size = filesz;
+  main_map->l_tls_modid = 1;
 
   init_slotinfo ();
   // static_slotinfo.si.slotinfo[1].gen = 0; already zero
-  static_slotinfo.si.slotinfo[1].map = &static_map;
+  static_slotinfo.si.slotinfo[1].map = main_map;
 
   memsz = roundup (memsz, align ?: 1);
 

Modified: trunk/libc/elf/Versions
==============================================================================
--- trunk/libc/elf/Versions (original)
+++ trunk/libc/elf/Versions Fri Feb  7 13:04:10 2014
@@ -53,7 +53,6 @@
     _dl_allocate_tls; _dl_allocate_tls_init;
     _dl_argv; _dl_find_dso_for_object; _dl_get_tls_static_info;
     _dl_deallocate_tls; _dl_make_stack_executable; _dl_out_of_memory;
-    _dl_clear_dtv;
     _dl_rtld_di_serinfo; _dl_starting_up; _dl_tls_setup;
     _rtld_global; _rtld_global_ro;
 

Modified: trunk/libc/elf/dl-close.c
==============================================================================
--- trunk/libc/elf/dl-close.c (original)
+++ trunk/libc/elf/dl-close.c Fri Feb  7 13:04:10 2014
@@ -643,9 +643,7 @@
 	    imap->l_prev->l_next = imap->l_next;
 	  else
 	    {
-#ifdef SHARED
 	      assert (nsid != LM_ID_BASE);
-#endif
 	      ns->_ns_loaded = imap->l_next;
 
 	      /* Update the pointer to the head of the list
@@ -736,13 +734,7 @@
   if (__builtin_expect (ns->_ns_loaded == NULL, 0)
       && nsid == GL(dl_nns) - 1)
     do
-      {
-	--GL(dl_nns);
-#ifndef SHARED
-	if (GL(dl_nns) == 0)
-	  break;
-#endif
-      }
+      --GL(dl_nns);
     while (GL(dl_ns)[GL(dl_nns) - 1]._ns_loaded == NULL);
 
   /* Notify the debugger those objects are finalized and gone.  */

Modified: trunk/libc/elf/dl-iteratephdr.c
==============================================================================
--- trunk/libc/elf/dl-iteratephdr.c (original)
+++ trunk/libc/elf/dl-iteratephdr.c Fri Feb  7 13:04:10 2014
@@ -86,34 +86,4 @@
 }
 hidden_def (__dl_iterate_phdr)
 
-#ifdef SHARED
-
 weak_alias (__dl_iterate_phdr, dl_iterate_phdr);
-
-#else
-
-int
-dl_iterate_phdr (int (*callback) (struct dl_phdr_info *info,
-				  size_t size, void *data), void *data)
-{
-  if (_dl_phnum != 0)
-    {
-      /* This entry describes this statically-linked program itself.  */
-      struct dl_phdr_info info;
-      int ret;
-      info.dlpi_addr = 0;
-      info.dlpi_name = "";
-      info.dlpi_phdr = _dl_phdr;
-      info.dlpi_phnum = _dl_phnum;
-      info.dlpi_adds = GL(dl_load_adds);
-      info.dlpi_subs = GL(dl_load_adds) - GL(dl_ns)[LM_ID_BASE]._ns_nloaded;
-      ret = (*callback) (&info, sizeof (struct dl_phdr_info), data);
-      if (ret)
-	return ret;
-    }
-
-  return __dl_iterate_phdr (callback, data);
-}
-
-
-#endif

Modified: trunk/libc/elf/dl-load.c
==============================================================================
--- trunk/libc/elf/dl-load.c (original)
+++ trunk/libc/elf/dl-load.c Fri Feb  7 13:04:10 2014
@@ -2233,23 +2233,17 @@
 
 	  if (cached != NULL)
 	    {
-# ifdef SHARED
 	      // XXX Correct to unconditionally default to namespace 0?
 	      l = (loader
 		   ?: GL(dl_ns)[LM_ID_BASE]._ns_loaded
-		   ?: &GL(dl_rtld_map));
-# else
-	      l = loader;
+# ifdef SHARED
+		   ?: &GL(dl_rtld_map)
 # endif
+		  );
 
 	      /* If the loader has the DF_1_NODEFLIB flag set we must not
 		 use a cache entry from any of these directories.  */
-	      if (
-# ifndef SHARED
-		  /* 'l' is always != NULL for dynamically linked objects.  */
-		  l != NULL &&
-# endif
-		  __builtin_expect (l->l_flags_1 & DF_1_NODEFLIB, 0))
+	      if (__builtin_expect (l->l_flags_1 & DF_1_NODEFLIB, 0))
 		{
 		  const char *dirp = system_dirs;
 		  unsigned int cnt = 0;

Modified: trunk/libc/elf/dl-misc.c
==============================================================================
--- trunk/libc/elf/dl-misc.c (original)
+++ trunk/libc/elf/dl-misc.c Fri Feb  7 13:04:10 2014
@@ -19,7 +19,6 @@
 #include <assert.h>
 #include <fcntl.h>
 #include <ldsodefs.h>
-#include <libc-symbols.h>
 #include <limits.h>
 #include <link.h>
 #include <stdarg.h>
@@ -365,144 +364,3 @@
 
   return *low;
 }
-
-/* To support accessing TLS variables from signal handlers, we need an
-   async signal safe memory allocator.  These routines are never
-   themselves invoked reentrantly (all calls to them are surrounded by
-   signal masks) but may be invoked concurrently from many threads.
-   The current implementation is not particularly performant nor space
-   efficient, but it will be used rarely (and only in binaries that use
-   dlopen.)  The API matches that of malloc() and friends.  */
-
-struct __signal_safe_allocator_header
-{
-  size_t size;
-  void *start;
-};
-
-static inline struct __signal_safe_allocator_header *
-ptr_to_signal_safe_allocator_header (void *ptr)
-{
-  return (struct __signal_safe_allocator_header *)
-    ((char *) (ptr) - sizeof (struct __signal_safe_allocator_header));
-}
-
-void *weak_function
-__signal_safe_memalign (size_t boundary, size_t size)
-{
-  struct __signal_safe_allocator_header *header;
-
-  if (boundary < sizeof (*header))
-    boundary = sizeof (*header);
-
-  /* Boundary must be a power of two.  */
-  if (!powerof2 (boundary))
-    return NULL;
-
-  size_t pg = GLRO (dl_pagesize);
-  size_t padded_size;
-  if (boundary <= pg)
-    {
-      /* We'll get a pointer certainly aligned to boundary, so just
-	 add one more boundary-sized chunk to hold the header.  */
-      padded_size = roundup (size, boundary) + boundary;
-    }
-  else
-    {
-      /* If we want K pages aligned to a J-page boundary, K+J+1 pages
-	 contains at least one such region that isn't directly at the start
-	 (so we can place the header.)	This is wasteful, but you're the one
-	 who wanted 64K-aligned TLS.  */
-      padded_size = roundup (size, pg) + boundary + pg;
-    }
-
-
-  size_t actual_size = roundup (padded_size, pg);
-  void *actual = mmap (NULL, actual_size, PROT_READ | PROT_WRITE,
-		       MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
-  if (actual == MAP_FAILED)
-    return NULL;
-
-  if (boundary <= pg)
-    {
-      header = actual + boundary - sizeof (*header);
-    }
-  else
-    {
-      intptr_t actual_pg = ((intptr_t) actual) / pg;
-      intptr_t boundary_pg = boundary / pg;
-      intptr_t start_pg = actual_pg + boundary_pg;
-      start_pg -= start_pg % boundary_pg;
-      if (start_pg > (actual_pg + 1))
-	{
-	  int ret = munmap (actual, (start_pg - actual_pg - 1) * pg);
-	  assert (ret == 0);
-	  actual = (void *) ((start_pg - 1) * pg);
-	}
-      char *start = (void *) (start_pg * pg);
-      header = ptr_to_signal_safe_allocator_header (start);
-    }
-
-  header->size = actual_size;
-  header->start = actual;
-  void *ptr = header;
-  ptr += sizeof (*header);
-  if (((intptr_t) ptr) % boundary != 0)
-    _dl_fatal_printf ("__signal_safe_memalign produced incorrect alignment\n");
-  return ptr;
-}
-
-void * weak_function
-__signal_safe_malloc (size_t size)
-{
-  return __signal_safe_memalign (1, size);
-}
-
-void weak_function
-__signal_safe_free (void *ptr)
-{
-  if (ptr == NULL)
-    return;
-
-  struct __signal_safe_allocator_header *header
-    = ptr_to_signal_safe_allocator_header (ptr);
-  int ret = munmap (header->start, header->size);
-
-  assert (ret == 0);
-}
-
-void * weak_function
-__signal_safe_realloc (void *ptr, size_t size)
-{
-  if (size == 0)
-    {
-      __signal_safe_free (ptr);
-      return NULL;
-    }
-  if (ptr == NULL)
-    return __signal_safe_malloc (size);
-
-  struct __signal_safe_allocator_header *header
-    = ptr_to_signal_safe_allocator_header (ptr);
-  size_t old_size = header->size;
-  if (old_size - sizeof (*header) >= size)
-    return ptr;
-
-  void *new_ptr = __signal_safe_malloc (size);
-  if (new_ptr == NULL)
-    return NULL;
-
-  memcpy (new_ptr, ptr, old_size);
-  __signal_safe_free (ptr);
-
-  return new_ptr;
-}
-
-void * weak_function
-__signal_safe_calloc (size_t nmemb, size_t size)
-{
-  void *ptr = __signal_safe_malloc (nmemb * size);
-  if (ptr == NULL)
-    return NULL;
-  return memset (ptr, 0, nmemb * size);
-}

Modified: trunk/libc/elf/dl-open.c
==============================================================================
--- trunk/libc/elf/dl-open.c (original)
+++ trunk/libc/elf/dl-open.c Fri Feb  7 13:04:10 2014
@@ -548,10 +548,7 @@
 	     generation of the DSO we are allocating data for.  */
 	  _dl_update_slotinfo (imap->l_tls_modid);
 #endif
-	  /* We do this iteration under a signal mask in dl-reloc; why not
-	     here?  Because these symbols are new and dlopen hasn't
-	     returned yet.  So we can't possibly be racing with a TLS
-	     access to them from another thread.  */
+
 	  GL(dl_init_static_tls) (imap);
 	  assert (imap->l_need_tls_init == 0);
 	}

Modified: trunk/libc/elf/dl-reloc.c
==============================================================================
--- trunk/libc/elf/dl-reloc.c (original)
+++ trunk/libc/elf/dl-reloc.c Fri Feb  7 13:04:10 2014
@@ -16,10 +16,8 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#include <atomic.h>
 #include <errno.h>
 #include <libintl.h>
-#include <signal.h>
 #include <stdlib.h>
 #include <unistd.h>
 #include <ldsodefs.h>
@@ -72,6 +70,8 @@
 
   size_t offset = GL(dl_tls_static_used) + (freebytes - n * map->l_tls_align
 					    - map->l_tls_firstbyte_offset);
+
+  map->l_tls_offset = GL(dl_tls_static_used) = offset;
 #elif TLS_DTV_AT_TP
   /* dl_tls_static_used includes the TCB at the beginning.  */
   size_t offset = (((GL(dl_tls_static_used)
@@ -83,36 +83,7 @@
   if (used > GL(dl_tls_static_size))
     goto fail;
 
-#else
-# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
-#endif
-  /* We've computed the new value we want, now try to install it.  */
-  ptrdiff_t val;
-  if ((val = map->l_tls_offset) == NO_TLS_OFFSET)
-    {
-      /* l_tls_offset starts out at NO_TLS_OFFSET, and all attempts to
-	 change it go from NO_TLS_OFFSET to some other value.  We use
-	 compare_and_exchange to ensure only one attempt succeeds.  We
-	 don't actually need any memory ordering here, but _acq is the
-	 weakest available.  */
-      (void ) atomic_compare_and_exchange_bool_acq (&map->l_tls_offset,
-						    offset,
-						    NO_TLS_OFFSET);
-      val = map->l_tls_offset;
-      assert (val != NO_TLS_OFFSET);
-    }
-  if (val != offset)
-    {
-      /* We'd like to set a static offset for this section, but another
-	 thread has already used a dynamic TLS block for it.  Since we can
-	 only use static offsets if everyone does (and it's not practical
-	 to move that thread's dynamic block), we have to fail.  */
-      goto fail;
-    }
-  /* We installed the value; now update the globals.  */
-#if TLS_TCB_AT_TP
-  GL(dl_tls_static_used) = offset;
-#elif TLS_DTV_AT_TP
+  map->l_tls_offset = offset;
   map->l_tls_firstbyte_offset = GL(dl_tls_static_used);
   GL(dl_tls_static_used) = used;
 #else
@@ -143,17 +114,8 @@
 internal_function __attribute_noinline__
 _dl_allocate_static_tls (struct link_map *map)
 {
-  /* We wrap this in a signal mask because it has to iterate all threads
-     (including this one) and update this map's TLS entry. A signal handler
-     accessing TLS would try to do the same update and break.  */
-  sigset_t old;
-  _dl_mask_all_signals (&old);
-  int err = -1;
-  if (map->l_tls_offset != FORCED_DYNAMIC_TLS_OFFSET)
-    err = _dl_try_allocate_static_tls (map);
-
-  _dl_unmask_signals (&old);
-  if (err != 0)
+  if (map->l_tls_offset == FORCED_DYNAMIC_TLS_OFFSET
+      || _dl_try_allocate_static_tls (map))
     {
       _dl_signal_error (0, map->l_name, NULL, N_("\
 cannot allocate memory in static TLS block"));

Modified: trunk/libc/elf/dl-support.c
==============================================================================
--- trunk/libc/elf/dl-support.c (original)
+++ trunk/libc/elf/dl-support.c Fri Feb  7 13:04:10 2014
@@ -94,6 +94,7 @@
     .l_scope = _dl_main_map.l_scope_mem,
     .l_local_scope = { &_dl_main_map.l_searchlist },
     .l_used = 1,
+    .l_flags_1 = DF_1_NODEFLIB,
     .l_tls_offset = NO_TLS_OFFSET,
     .l_serial = 1,
   };
@@ -314,6 +315,8 @@
 _dl_non_dynamic_init (void)
 {
   _dl_main_map.l_origin = _dl_get_origin ();
+  _dl_main_map.l_phdr = GL(dl_phdr);
+  _dl_main_map.l_phnum = GL(dl_phnum);
 
   if (HP_TIMING_AVAIL)
     HP_TIMING_NOW (_dl_cpuclock_offset);

Modified: trunk/libc/elf/dl-tls.c
==============================================================================
--- trunk/libc/elf/dl-tls.c (original)
+++ trunk/libc/elf/dl-tls.c Fri Feb  7 13:04:10 2014
@@ -17,7 +17,6 @@
    <http://www.gnu.org/licenses/>.  */
 
 #include <assert.h>
-#include <atomic.h>
 #include <errno.h>
 #include <libintl.h>
 #include <signal.h>
@@ -294,7 +293,7 @@
      initial set of modules.  This should avoid in most cases expansions
      of the dtv.  */
   dtv_length = GL(dl_tls_max_dtv_idx) + DTV_SURPLUS;
-  dtv = __signal_safe_calloc (dtv_length + 2, sizeof (dtv_t));
+  dtv = calloc (dtv_length + 2, sizeof (dtv_t));
   if (dtv != NULL)
     {
       /* This is the initial length of the dtv.  */
@@ -464,18 +463,6 @@
 }
 rtld_hidden_def (_dl_allocate_tls)
 
-void
-internal_function
-_dl_clear_dtv (dtv_t *dtv)
-{
-  for (size_t cnt = 0; cnt < dtv[-1].counter; ++cnt)
-    if (! dtv[1 + cnt].pointer.is_static
-	&& dtv[1 + cnt].pointer.val != TLS_DTV_UNALLOCATED)
-      __signal_safe_free (dtv[1 + cnt].pointer.val);
-  memset (dtv, '\0', (dtv[-1].counter + 1) * sizeof (dtv_t));
-}
-
-rtld_hidden_def (_dl_clear_dtv)
 
 #ifndef SHARED
 extern dtv_t _dl_static_dtv[];
@@ -492,11 +479,11 @@
   for (size_t cnt = 0; cnt < dtv[-1].counter; ++cnt)
     if (! dtv[1 + cnt].pointer.is_static
 	&& dtv[1 + cnt].pointer.val != TLS_DTV_UNALLOCATED)
-      __signal_safe_free (dtv[1 + cnt].pointer.val);
+      free (dtv[1 + cnt].pointer.val);
 
   /* The array starts with dtv[-1].  */
   if (dtv != GL(dl_initial_dtv))
-    __signal_safe_free (dtv - 1);
+    free (dtv - 1);
 
   if (dealloc_tcb)
     {
@@ -534,21 +521,20 @@
 # endif
 
 
-static void
-allocate_and_init (dtv_t *dtv, struct link_map *map)
+static void *
+allocate_and_init (struct link_map *map)
 {
   void *newp;
-  newp = __signal_safe_memalign (map->l_tls_align, map->l_tls_blocksize);
+
+  newp = __libc_memalign (map->l_tls_align, map->l_tls_blocksize);
   if (newp == NULL)
     oom ();
 
-  /* Initialize the memory. Since this is our thread's space, we are
-     under a signal mask, and no one has touched this section before,
-     we can safely just overwrite whatever's there.  */
+  /* Initialize the memory.  */
   memset (__mempcpy (newp, map->l_tls_initimage, map->l_tls_initimage_size),
 	  '\0', map->l_tls_blocksize - map->l_tls_initimage_size);
 
-  dtv->pointer.val = newp;
+  return newp;
 }
 
 
@@ -590,15 +576,7 @@
 	 the entry we need.  */
       size_t new_gen = listp->slotinfo[idx].gen;
       size_t total = 0;
-      sigset_t old;
-
-      _dl_mask_all_signals (&old);
-      /* We use the signal mask as a lock against reentrancy here.
-         Check that a signal taken before the lock didn't already
-         update us.  */
-      dtv = THREAD_DTV ();
-      if (dtv[0].counter >= listp->slotinfo[idx].gen)
-        goto out;
+
       /* We have to look through the entire dtv slotinfo list.  */
       listp =  GL(dl_tls_dtv_slotinfo_list);
       do
@@ -617,8 +595,6 @@
 		 know we don't have to handle it.  */
 	      if (gen <= dtv[0].counter)
 		continue;
-
-	      size_t modid = total + cnt;
 
 	      /* If there is no map this means the entry is empty.  */
 	      struct link_map *map = listp->slotinfo[cnt].map;
@@ -626,19 +602,19 @@
 		{
 		  /* If this modid was used at some point the memory
 		     might still be allocated.  */
-		  if (dtv[-1].counter >= modid
-		      && !dtv[modid].pointer.is_static
-		      && dtv[modid].pointer.val != TLS_DTV_UNALLOCATED)
+		  if (! dtv[total + cnt].pointer.is_static
+		      && dtv[total + cnt].pointer.val != TLS_DTV_UNALLOCATED)
 		    {
-		      __signal_safe_free (dtv[modid].pointer.val);
-		      dtv[modid].pointer.val = TLS_DTV_UNALLOCATED;
+		      free (dtv[total + cnt].pointer.val);
+		      dtv[total + cnt].pointer.val = TLS_DTV_UNALLOCATED;
 		    }
 
 		  continue;
 		}
 
-	      assert (modid == map->l_tls_modid);
 	      /* Check whether the current dtv array is large enough.  */
+	      size_t modid = map->l_tls_modid;
+	      assert (total + cnt == modid);
 	      if (dtv[-1].counter < modid)
 		{
 		  /* Reallocate the dtv.  */
@@ -652,18 +628,17 @@
 		    {
 		      /* This is the initial dtv that was allocated
 			 during rtld startup using the dl-minimal.c
-			 malloc instead of the real allocator.  We can't
+			 malloc instead of the real malloc.  We can't
 			 free it, we have to abandon the old storage.  */
 
-		      newp = __signal_safe_malloc (
-					(2 + newsize) * sizeof (dtv_t));
+		      newp = malloc ((2 + newsize) * sizeof (dtv_t));
 		      if (newp == NULL)
 			oom ();
 		      memcpy (newp, &dtv[-1], (2 + oldsize) * sizeof (dtv_t));
 		    }
 		  else
 		    {
-		      newp = __signal_safe_realloc (&dtv[-1],
+		      newp = realloc (&dtv[-1],
 				      (2 + newsize) * sizeof (dtv_t));
 		      if (newp == NULL)
 			oom ();
@@ -693,7 +668,7 @@
 		   deallocate even if it is this dtv entry we are
 		   supposed to load.  The reason is that we call
 		   memalign and not malloc.  */
-		__signal_safe_free (dtv[modid].pointer.val);
+		free (dtv[modid].pointer.val);
 
 	      /* This module is loaded dynamically- We defer memory
 		 allocation.  */
@@ -710,8 +685,6 @@
 
       /* This will be the new maximum generation counter.  */
       dtv[0].counter = new_gen;
-   out:
-      _dl_unmask_signals (&old);
     }
 
   return the_map;
@@ -737,60 +710,39 @@
 
       the_map = listp->slotinfo[idx].map;
     }
-  sigset_t old;
-  _dl_mask_all_signals (&old);
-
-  /* As with update_slotinfo, we use the sigmask as a check against
-     reentrancy.  */
-  if (dtv[GET_ADDR_MODULE].pointer.val != TLS_DTV_UNALLOCATED)
-    goto out;
-
-  /* Synchronize against a parallel dlopen() forcing this variable
-     into static storage.  If that happens, we have to be more careful
-     about initializing the area, as that dlopen() will be iterating
-     the threads to do so itself.  */
-  ptrdiff_t offset;
-  if ((offset = the_map->l_tls_offset) == NO_TLS_OFFSET)
-    {
-      /* l_tls_offset starts out at NO_TLS_OFFSET, and all attempts to
-	 change it go from NO_TLS_OFFSET to some other value.  We use
-	 compare_and_exchange to ensure only one attempt succeeds.  We
-	 don't actually need any memory ordering here, but _acq is the
-	 weakest available.  */
-      (void) atomic_compare_and_exchange_bool_acq (&the_map->l_tls_offset,
-						   FORCED_DYNAMIC_TLS_OFFSET,
-						   NO_TLS_OFFSET);
-      offset = the_map->l_tls_offset;
-      assert (offset != NO_TLS_OFFSET);
-    }
-  if (offset == FORCED_DYNAMIC_TLS_OFFSET)
-    {
-      allocate_and_init (&dtv[GET_ADDR_MODULE], the_map);
-    }
-  else
-    {
-      void **pp = &dtv[GET_ADDR_MODULE].pointer.val;
-      while (atomic_forced_read (*pp) == TLS_DTV_UNALLOCATED)
-	{
-	  /* for lack of a better (safe) thing to do, just spin.
-	    Someone else (not us; it's done under a signal mask) set
-	    this map to a static TLS offset, and they'll iterate all
-	    threads to initialize it.  They'll eventually write
-	    to pointer.val, at which point we know they've fully
-	    completed initialization.  */
-	  atomic_delay ();
-	}
-      /* Make sure we've picked up their initialization of the actual
-	 block; this pairs against the write barrier in
-	 init_one_static_tls, guaranteeing that we see their write of
-	 the tls_initimage into the static region.  */
-      atomic_read_barrier ();
-    }
-out:
-  assert (dtv[GET_ADDR_MODULE].pointer.val != TLS_DTV_UNALLOCATED);
-  _dl_unmask_signals (&old);
-
-  return (char *) dtv[GET_ADDR_MODULE].pointer.val + GET_ADDR_OFFSET;
+
+ again:
+  /* Make sure that, if a dlopen running in parallel forces the
+     variable into static storage, we'll wait until the address in the
+     static TLS block is set up, and use that.  If we're undecided
+     yet, make sure we make the decision holding the lock as well.  */
+  if (__builtin_expect (the_map->l_tls_offset
+			!= FORCED_DYNAMIC_TLS_OFFSET, 0))
+    {
+      __rtld_lock_lock_recursive (GL(dl_load_lock));
+      if (__builtin_expect (the_map->l_tls_offset == NO_TLS_OFFSET, 1))
+	{
+	  the_map->l_tls_offset = FORCED_DYNAMIC_TLS_OFFSET;
+	  __rtld_lock_unlock_recursive (GL(dl_load_lock));
+	}
+      else
+	{
+	  __rtld_lock_unlock_recursive (GL(dl_load_lock));
+	  if (__builtin_expect (the_map->l_tls_offset
+				!= FORCED_DYNAMIC_TLS_OFFSET, 1))
+	    {
+	      void *p = dtv[GET_ADDR_MODULE].pointer.val;
+	      if (__builtin_expect (p == TLS_DTV_UNALLOCATED, 0))
+		goto again;
+
+	      return (char *) p + GET_ADDR_OFFSET;
+	    }
+	}
+    }
+  void *p = dtv[GET_ADDR_MODULE].pointer.val = allocate_and_init (the_map);
+  dtv[GET_ADDR_MODULE].pointer.is_static = false;
+
+  return (char *) p + GET_ADDR_OFFSET;
 }
 
 

Modified: trunk/libc/include/features.h
==============================================================================
--- trunk/libc/include/features.h (original)
+++ trunk/libc/include/features.h Fri Feb  7 13:04:10 2014
@@ -367,7 +367,7 @@
 /* Major and minor version number of the GNU C library package.  Use
    these macros to test for features in specific releases.  */
 #define	__GLIBC__	2
-#define	__GLIBC_MINOR__	18
+#define	__GLIBC_MINOR__	19
 
 #define __GLIBC_PREREQ(maj, min) \
 	((__GLIBC__ << 16) + __GLIBC_MINOR__ >= ((maj) << 16) + (min))

Modified: trunk/libc/inet/netinet/in.h
==============================================================================
--- trunk/libc/inet/netinet/in.h (original)
+++ trunk/libc/inet/netinet/in.h Fri Feb  7 13:04:10 2014
@@ -108,7 +108,7 @@
 #define IPPROTO_NONE		IPPROTO_NONE
     IPPROTO_DSTOPTS = 60,  /* IPv6 destination options.  */
 #define IPPROTO_DSTOPTS		IPPROTO_DSTOPTS
-    IPPROTO_MH = 135,      /* IPv6 mobility header.  */
+    IPPROTO_MH = 135       /* IPv6 mobility header.  */
 #define IPPROTO_MH		IPPROTO_MH
   };
 #endif /* !__USE_KERNEL_IPV6_DEFS */

Modified: trunk/libc/libio/Makefile
==============================================================================
--- trunk/libc/libio/Makefile (original)
+++ trunk/libc/libio/Makefile Fri Feb  7 13:04:10 2014
@@ -78,7 +78,7 @@
 	bug-wfflush bug-wmemstream1 tst-fopenloc2	\
 	tst_getwc					\
 	tst_putwc tst_wprintf tst_wprintf2 tst_wscanf	\
-	tst-fgetwc bug-wsetpos tst-fseek
+	tst-fgetwc bug-wsetpos tst-fseek tst-ftell-partial-wide
 tests-$(OPTION_POSIX_C_LANG_WIDE_CHAR)			\
      += tst_swprintf tst_swscanf			\
 	tst-sscanf					\

Modified: trunk/libc/libio/wfileops.c
==============================================================================
--- trunk/libc/libio/wfileops.c (original)
+++ trunk/libc/libio/wfileops.c Fri Feb  7 13:04:10 2014
@@ -715,7 +715,7 @@
 		       - fp->_wide_data->_IO_write_base) / clen;
 	  else
 	    {
-	      enum __codecvt_result status;
+	      enum __codecvt_result status = __codecvt_ok;
 	      delta = (fp->_wide_data->_IO_write_ptr
 		       - fp->_wide_data->_IO_write_base);
 	      const wchar_t *write_base = fp->_wide_data->_IO_write_base;
@@ -728,9 +728,12 @@
 		 flush buffers for every ftell.  */
 	      do
 		{
-		  /* Ugh, no point trying to avoid the flush.  Just do it
-		     and go back to how it was with the read mode.  */
-		  if (delta > 0 && new_write_ptr == fp->_IO_buf_end)
+		  /* There is not enough space in the buffer to do the entire
+		     conversion, so there is no point trying to avoid the
+		     buffer flush.  Just do it and go back to how it was with
+		     the read mode.  */
+		  if (status == __codecvt_partial
+		      || (delta > 0 && new_write_ptr == fp->_IO_buf_end))
 		    {
 		      if (_IO_switch_to_wget_mode (fp))
 			return WEOF;

Modified: trunk/libc/manual/Makefile
==============================================================================
--- trunk/libc/manual/Makefile (original)
+++ trunk/libc/manual/Makefile Fri Feb  7 13:04:10 2014
@@ -88,6 +88,7 @@
 $(objpfx)summary.texi: $(objpfx)stamp-summary ;
 $(objpfx)stamp-summary: summary.awk $(filter-out $(objpfx)summary.texi, \
 					$(texis-path))
+	-$(SHELL) ./check-safety.sh $(filter-out $(objpfx)%, $(texis-path))
 	$(AWK) -f $^ | sort -t'' -df -k 1,1 | tr '\014' '\012' \
 		> $(objpfx)summary-tmp
 	$(move-if-change) $(objpfx)summary-tmp $(objpfx)summary.texi
@@ -157,7 +158,7 @@
 
 # Distribution.
 minimal-dist = summary.awk texis.awk tsort.awk libc-texinfo.sh libc.texinfo \
-	       libm-err.texi stamp-libm-err				    \
+	       libm-err.texi stamp-libm-err check-safety.sh		    \
 	       $(filter-out summary.texi, $(nonexamples))		    \
 	       $(patsubst %.c.texi,examples/%.c, $(examples))
 

Modified: trunk/libc/manual/argp.texi
==============================================================================
--- trunk/libc/manual/argp.texi (original)
+++ trunk/libc/manual/argp.texi Fri Feb  7 13:04:10 2014
@@ -36,6 +36,35 @@
 @comment argp.h
 @comment GNU
 @deftypefun {error_t} argp_parse (const struct argp *@var{argp}, int @var{argc}, char **@var{argv}, unsigned @var{flags}, int *@var{arg_index}, void *@var{input})
+@safety{@prelim{}@mtunsafe{@mtasurace{:argpbuf} @mtslocale{} @mtsenv{}}@asunsafe{@ascuheap{} @ascuintl{} @asulock{} @asucorrupt{}}@acunsafe{@acsmem{} @aculock{} @acucorrupt{}}}
+@c Optionally alloca()tes standard help options, initializes the parser,
+@c then parses individual args in a loop, and then finalizes.
+@c  parser_init
+@c   calc_sizes ok
+@c    option_is_end ok
+@c   malloc @ascuheap @acsmem
+@c   parser_convert @mtslocale
+@c    convert_options @mtslocale
+@c     option_is_end ok
+@c     option_is_short ok
+@c      isprint, but locale may change within the loop
+@c     find_long_option ok
+@c   group_parse
+@c    group->parser (from argp->parser)
+@c  parser_parse_next
+@c   getopt_long(_only)_r many issues, same as non_r minus @mtasurace
+@c   parser_parse_arg
+@c    group_parse dup
+@c   parser_parse_opt
+@c    group_parse dup
+@c    argp_error dup @mtasurace:argpbuf @mtsenv @mtslocale @ascuheap @ascuintl @asucorrupt @acsmem @acucorrupt @aculock
+@c    dgettext (bad key error) dup @mtsenv @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsfd @acsmem
+@c  parser_finalize
+@c   group_parse
+@c   fprintf dup @mtslocale @asucorrupt @aculock @acucorrupt [no @ascuheap @acsmem]
+@c   dgettext dup @mtsenv @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsfd @acsmem
+@c   arg_state_help
+@c   free dup @ascuhelp @acsmem
 The @code{argp_parse} function parses the arguments in @var{argv}, of
 length @var{argc}, using the argp parser @var{argp}.  @xref{Argp
 Parsers}.  Passing a null pointer for @var{argp} is the same as using
@@ -660,6 +689,8 @@
 @comment argp.h
 @comment GNU
 @deftypefun void argp_usage (const struct argp_state *@var{state})
+@safety{@prelim{}@mtunsafe{@mtasurace{:argpbuf} @mtsenv{} @mtslocale{}}@asunsafe{@ascuheap{} @ascuintl{} @asucorrupt{}}@acunsafe{@acsmem{} @acucorrupt{} @aculock{}}}
+@c Just calls argp_state_help with stderr and ARGP_HELP_STD_USAGE.
 Outputs the standard usage message for the argp parser referred to by
 @var{state} to @code{@var{state}->err_stream} and terminate the program
 with @code{exit (argp_err_exit_status)}.  @xref{Argp Global Variables}.
@@ -669,6 +700,13 @@
 @comment argp.h
 @comment GNU
 @deftypefun void argp_error (const struct argp_state *@var{state}, const char *@var{fmt}, @dots{})
+@safety{@prelim{}@mtunsafe{@mtasurace{:argpbuf} @mtsenv{} @mtslocale{}}@asunsafe{@ascuheap{} @ascuintl{} @asucorrupt{}}@acunsafe{@acsmem{} @acucorrupt{} @aculock{}}}
+@c Lock stream, vasprintf the formatted message into a buffer, print the
+@c buffer prefixed by the short program name (in libc,
+@c argp_short_program_name is a macro that expands to
+@c program_invocation_short_name), releases the buffer, then call
+@c argp_state_help with stream and ARGP_HELP_STD_ERR, unlocking the
+@c stream at the end.
 Prints the printf format string @var{fmt} and following args, preceded
 by the program name and @samp{:}, and followed by a @w{@samp{Try @dots{}
 --help}} message, and terminates the program with an exit status of
@@ -679,6 +717,12 @@
 @comment argp.h
 @comment GNU
 @deftypefun void argp_failure (const struct argp_state *@var{state}, int @var{status}, int @var{errnum}, const char *@var{fmt}, @dots{})
+@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{} @ascuheap{}}@acunsafe{@aculock{} @acucorrupt{} @acsmem{}}}
+@c Lock stream, write out the short program name, vasprintf the optional
+@c formatted message to a buffer, print the buffer prefixed by colon and
+@c blank, release the buffer, call strerror_r with an automatic buffer,
+@c print it out after colon and blank, put[w]c a line break, unlock the
+@c stream, then exit unless ARGP_NO_EXIT.
 Similar to the standard gnu error-reporting function @code{error}, this
 prints the program name and @samp{:}, the printf format string
 @var{fmt}, and the appropriate following args.  If it is non-zero, the
@@ -695,6 +739,142 @@
 @comment argp.h
 @comment GNU
 @deftypefun void argp_state_help (const struct argp_state *@var{state}, FILE *@var{stream}, unsigned @var{flags})
+@safety{@prelim{}@mtunsafe{@mtasurace{:argpbuf} @mtsenv{} @mtslocale{}}@asunsafe{@ascuheap{} @ascuintl{} @asucorrupt{}}@acunsafe{@acsmem{} @acucorrupt{} @aculock{}}}
+@c Just calls _help with the short program name and optionally exit.
+@c The main problems in _help, besides the usual issues with stream I/O
+@c and translation, are the use of a static buffer (uparams, thus
+@c @mtasurace:argpbuf) that makes the whole thing thread-unsafe, reading
+@c from the environment for ARGP_HELP_FMT, accessing the locale object
+@c multiple times.
+
+@c _help @mtsenv @mtasurace:argpbuf @mtslocale @ascuheap @ascuintl @asucorrupt @acsmem @acucorrupt @aculock
+@c  dgettext @ascuintl
+@c  flockfile @aculock
+@c  funlockfile @aculock
+@c  fill_in_uparams @mtsenv @mtasurace:argpbuf @mtslocale @asucorrupt @ascuheap @aculock @acucorrupt @acsmem
+@c   argp_failure dup (status = errnum = 0)
+@c   atoi dup @mtslocale
+@c  argp_hol @ascuheap @acsmem
+@c   make_hol @ascuheap @acsmem
+@c   hol_add_cluster @ascuheap @acsmem
+@c   hol_append @ascuheap @acsmem
+@c  hol_set_group ok
+@c   hol_find_entry ok
+@c  hol_sort @mtslocale @acucorrupt
+@c   qsort dup @acucorrupt
+@c    hol_entry_qcmp @mtslocale
+@c     hol_entry_cmp @mtslocale
+@c      group_cmp ok
+@c      hol_cluster_cmp ok
+@c       group_cmp ok
+@c      hol_entry_first_short @mtslocale
+@c       hol_entry_short_iterate [@mtslocale]
+@c        until_short ok
+@c         oshort ok
+@c          isprint ok
+@c      odoc ok
+@c      hol_entry_first_long ok
+@c      canon_doc_option @mtslocale
+@c      tolower dup
+@c  hol_usage @mtslocale @ascuintl @ascuheap @acsmem
+@c   hol_entry_short_iterate ok
+@c    add_argless_short_opt ok
+@c   argp_fmtstream_printf dup
+@c   hol_entry_short_iterate @mtslocale @ascuintl @ascuheap @acsmem
+@c    usage_argful_short_opt @mtslocale @ascuintl @ascuheap @acsmem
+@c     dgettext dup
+@c     argp_fmtstream_printf dup
+@c   hol_entry_long_iterate @mtslocale @ascuintl @ascuheap @acsmem
+@c    usage_long_opt @mtslocale @ascuintl @ascuheap @acsmem
+@c     dgettext dup
+@c     argp_fmtstream_printf dup
+@c  hol_help @mtslocale @mtasurace:argpbuf @ascuheap @ascuintl @asucorrupt @acsmem @acucorrupt @aculock
+@c   hol_entry_help @mtslocale @mtasurace:argpbuf @ascuheap @ascuintl @asucorrupt @acsmem @acucorrupt @aculock
+@c    argp_fmtstream_set_lmargin dup
+@c    argp_fmtstream_wmargin dup
+@c    argp_fmtstream_set_wmargin dup
+@c    comma @mtslocale @ascuheap @ascuintl @asucorrupt @acsmem @acucorrupt @aculock
+@c     argp_fmtstream_putc dup
+@c     hol_cluster_is_child ok
+@c     argp_fmtstream_wmargin dup
+@c     print_header dup
+@c     argp_fmtstream_set_wmargin dup
+@c     argp_fmtstream_puts dup
+@c     indent_to dup
+@c    argp_fmtstream_putc dup
+@c    arg @mtslocale @ascuheap @acsmem
+@c     argp_fmtstream_printf dup
+@c    odoc dup
+@c    argp_fmtstream_puts dup
+@c    argp_fmtstream_printf dup
+@c    print_header @mtslocale @mtasurace:argpbuf @ascuheap @ascuintl @asucorrupt @acsmem @acucorrupt @aculock
+@c     dgettext dup
+@c     filter_doc dup
+@c     argp_fmtstream_putc dup
+@c     indent_to dup
+@c     argp_fmtstream_set_lmargin dup
+@c     argp_fmtstream_set_wmargin dup
+@c     argp_fmtstream_puts dup
+@c     free dup
+@c    filter_doc dup
+@c    argp_fmtstream_point dup
+@c    indent_to @mtslocale @ascuheap @asucorrupt @acsmem @acucorrupt @aculock
+@c     argp_fmtstream_point dup
+@c     argp_fmtstream_putc dup
+@c   dgettext dup
+@c   filter_doc dup
+@c   argp_fmtstream_putc dup
+@c   argp_fmtstream_puts dup
+@c   free dup
+@c  hol_free @ascuheap @acsmem
+@c   free dup
+@c  argp_args_levels ok
+@c  argp_args_usage @mtslocale @ascuintl @ascuheap @asucorrupt @acsmem @acucorrupt @aculock
+@c   dgettext dup
+@c   filter_doc ok
+@c    argp_input ok
+@c    argp->help_filter
+@c   space @mtslocale @ascuheap @asucorrupt @acsmem @acucorrupt @aculock
+@c    argp_fmtstream_point dup
+@c    argp_fmtstream_rmargin @mtslocale @asucorrupt @acucorrupt @aculock
+@c     argp_fmtstream_update dup
+@c    argp_fmtstream_putc dup
+@c   argp_fmtstream_write dup
+@c   free dup
+@c  argp_doc @mtslocale @ascuheap @ascuintl @asucorrupt @acsmem @acucorrupt @aculock
+@c   dgettext @ascuintl
+@c   strndup @ascuheap @acsmem
+@c   argp_input dup
+@c   argp->help_filter
+@c   argp_fmtstream_putc @mtslocale @ascuheap @asucorrupt @acsmem @acucorrupt @aculock
+@c    argp_fmtstream_ensure dup
+@c   argp_fmtstream_write dup
+@c   argp_fmtstream_puts dup
+@c   argp_fmtstream_point @mtslocale @asucorrupt @acucorrupt @aculock
+@c    argp_fmtstream_update dup
+@c   argp_fmtstream_lmargin dup
+@c   free dup
+@c  argp_make_fmtstream @ascuheap @acsmem
+@c  argp_fmtstream_free @mtslocale @ascuheap @asucorrupt @acsmem @acucorrupt @aculock
+@c   argp_fmtstream_update @mtslocale @asucorrupt @acucorrupt @aculock
+@c    put[w]c_unlocked dup
+@c    isblank in loop @mtslocale
+@c    fxprintf @aculock
+@c   fxprintf @aculock
+@c   free dup
+@c  argp_fmtstream_set_wmargin @mtslocale @asucorrupt @acucorrupt @aculock
+@c   argp_fmtstream_update dup
+@c  argp_fmtstream_printf @mtslocale @ascuheap @acsmem
+@c   argp_fmtstream_ensure dup
+@c   vsnprintf dup
+@c  argp_fmtstream_set_lmargin @mtslocale @asucorrupt @acucorrupt @aculock
+@c   argp_fmtstream_update dup
+@c  argp_fmtstream_puts @mtslocale @ascuheap @asucorrupt @acsmem @acucorrupt @aculock
+@c   argp_fmtstream_write @mtslocale @ascuheap @asucorrupt @acsmem @acucorrupt @aculock
+@c    argp_fmtstream_ensure @mtslocale @ascuheap @asucorrupt @acsmem @acucorrupt @aculock
+@c     argp_fmtstream_update dup
+@c     fxprintf @aculock
+@c     realloc @ascuheap @acsmem
 Outputs a help message for the argp parser referred to by @var{state},
 to @var{stream}.  The @var{flags} argument determines what sort of help
 message is produced.  @xref{Argp Help Flags}.
@@ -928,6 +1108,8 @@
 @comment argp.h
 @comment GNU
 @deftypefun void argp_help (const struct argp *@var{argp}, FILE *@var{stream}, unsigned @var{flags}, char *@var{name})
+@safety{@prelim{}@mtunsafe{@mtasurace{:argpbuf} @mtsenv{} @mtslocale{}}@asunsafe{@ascuheap{} @ascuintl{} @asucorrupt{}}@acunsafe{@acsmem{} @acucorrupt{} @aculock{}}}
+@c Just calls _help.
 This outputs a help message for the argp parser @var{argp} to
 @var{stream}.  The type of messages printed will be determined by
 @var{flags}.

Modified: trunk/libc/manual/arith.texi
==============================================================================
--- trunk/libc/manual/arith.texi (original)
+++ trunk/libc/manual/arith.texi Fri Feb  7 13:04:10 2014
@@ -160,6 +160,8 @@
 @comment stdlib.h
 @comment ISO
 @deftypefun div_t div (int @var{numerator}, int @var{denominator})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
+@c Functions in this section are pure, and thus safe.
 This function @code{div} computes the quotient and remainder from
 the division of @var{numerator} by @var{denominator}, returning the
 result in a structure of type @code{div_t}.
@@ -199,6 +201,7 @@
 @comment stdlib.h
 @comment ISO
 @deftypefun ldiv_t ldiv (long int @var{numerator}, long int @var{denominator})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 The @code{ldiv} function is similar to @code{div}, except that the
 arguments are of type @code{long int} and the result is returned as a
 structure of type @code{ldiv_t}.
@@ -225,6 +228,7 @@
 @comment stdlib.h
 @comment ISO
 @deftypefun lldiv_t lldiv (long long int @var{numerator}, long long int @var{denominator})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 The @code{lldiv} function is like the @code{div} function, but the
 arguments are of type @code{long long int} and the result is returned as
 a structure of type @code{lldiv_t}.
@@ -256,6 +260,7 @@
 @comment inttypes.h
 @comment ISO
 @deftypefun imaxdiv_t imaxdiv (intmax_t @var{numerator}, intmax_t @var{denominator})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 The @code{imaxdiv} function is like the @code{div} function, but the
 arguments are of type @code{intmax_t} and the result is returned as
 a structure of type @code{imaxdiv_t}.
@@ -318,6 +323,7 @@
 @comment math.h
 @comment ISO
 @deftypefn {Macro} int fpclassify (@emph{float-type} @var{x})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 This is a generic macro which works on all floating-point types and
 which returns a value of type @code{int}.  The possible values are:
 
@@ -354,6 +360,7 @@
 @comment math.h
 @comment ISO
 @deftypefn {Macro} int isfinite (@emph{float-type} @var{x})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 This macro returns a nonzero value if @var{x} is finite: not plus or
 minus infinity, and not NaN.  It is equivalent to
 
@@ -368,6 +375,7 @@
 @comment math.h
 @comment ISO
 @deftypefn {Macro} int isnormal (@emph{float-type} @var{x})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 This macro returns a nonzero value if @var{x} is finite and normalized.
 It is equivalent to
 
@@ -379,6 +387,7 @@
 @comment math.h
 @comment ISO
 @deftypefn {Macro} int isnan (@emph{float-type} @var{x})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 This macro returns a nonzero value if @var{x} is NaN.  It is equivalent
 to
 
@@ -390,6 +399,7 @@
 @comment math.h
 @comment GNU
 @deftypefn {Macro} int issignaling (@emph{float-type} @var{x})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 This macro returns a nonzero value if @var{x} is a signaling NaN
 (sNaN).  It is based on draft TS 18661 and currently enabled as a GNU
 extension.
@@ -410,6 +420,7 @@
 @comment math.h
 @comment BSD
 @deftypefunx int isinfl (long double @var{x})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 This function returns @code{-1} if @var{x} represents negative infinity,
 @code{1} if @var{x} represents positive infinity, and @code{0} otherwise.
 @end deftypefun
@@ -423,6 +434,7 @@
 @comment math.h
 @comment BSD
 @deftypefunx int isnanl (long double @var{x})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 This function returns a nonzero value if @var{x} is a ``not a number''
 value, and zero otherwise.
 
@@ -445,6 +457,7 @@
 @comment math.h
 @comment BSD
 @deftypefunx int finitel (long double @var{x})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 This function returns a nonzero value if @var{x} is finite or a ``not a
 number'' value, and zero otherwise.
 @end deftypefun
@@ -714,6 +727,14 @@
 @comment fenv.h
 @comment ISO
 @deftypefun int feclearexcept (int @var{excepts})
+@safety{@prelim{}@mtsafe{}@assafe{@assposix{}}@acsafe{@acsposix{}}}
+@c The other functions in this section that modify FP status register
+@c mostly do so with non-atomic load-modify-store sequences, but since
+@c the register is thread-specific, this should be fine, and safe for
+@c cancellation.  As long as the FP environment is restored before the
+@c signal handler returns control to the interrupted thread (like any
+@c kernel should do), the functions are also safe for use in signal
+@c handlers.
 This function clears all of the supported exception flags indicated by
 @var{excepts}.
 
@@ -724,6 +745,7 @@
 @comment fenv.h
 @comment ISO
 @deftypefun int feraiseexcept (int @var{excepts})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 This function raises the supported exceptions indicated by
 @var{excepts}.  If more than one exception bit in @var{excepts} is set
 the order in which the exceptions are raised is undefined except that
@@ -739,6 +761,7 @@
 @comment fenv.h
 @comment ISO
 @deftypefun int fetestexcept (int @var{excepts})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 Test whether the exception flags indicated by the parameter @var{except}
 are currently set.  If any of them are, a nonzero value is returned
 which specifies which exceptions are set.  Otherwise the result is zero.
@@ -775,6 +798,7 @@
 @comment fenv.h
 @comment ISO
 @deftypefun int fegetexceptflag (fexcept_t *@var{flagp}, int @var{excepts})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 This function stores in the variable pointed to by @var{flagp} an
 implementation-defined value representing the current setting of the
 exception flags indicated by @var{excepts}.
@@ -786,6 +810,7 @@
 @comment fenv.h
 @comment ISO
 @deftypefun int fesetexceptflag (const fexcept_t *@var{flagp}, int @var{excepts})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 This function restores the flags for the exceptions indicated by
 @var{excepts} to the values stored in the variable pointed to by
 @var{flagp}.
@@ -951,6 +976,7 @@
 @comment fenv.h
 @comment ISO
 @deftypefun int fegetround (void)
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 Returns the currently selected rounding mode, represented by one of the
 values of the defined rounding mode macros.
 @end deftypefun
@@ -961,6 +987,7 @@
 @comment fenv.h
 @comment ISO
 @deftypefun int fesetround (int @var{round})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 Changes the currently selected rounding mode to @var{round}.  If
 @var{round} does not correspond to one of the supported rounding modes
 nothing is changed.  @code{fesetround} returns zero if it changed the
@@ -1005,6 +1032,7 @@
 @comment fenv.h
 @comment ISO
 @deftypefun int fegetenv (fenv_t *@var{envp})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 Store the floating-point environment in the variable pointed to by
 @var{envp}.
 
@@ -1015,6 +1043,7 @@
 @comment fenv.h
 @comment ISO
 @deftypefun int feholdexcept (fenv_t *@var{envp})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 Store the current floating-point environment in the object pointed to by
 @var{envp}.  Then clear all exception flags, and set the FPU to trap no
 exceptions.  Not all FPUs support trapping no exceptions; if
@@ -1053,6 +1082,7 @@
 @comment fenv.h
 @comment ISO
 @deftypefun int fesetenv (const fenv_t *@var{envp})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 Set the floating-point environment to that described by @var{envp}.
 
 The function returns zero in case the operation was successful, a
@@ -1062,6 +1092,7 @@
 @comment fenv.h
 @comment ISO
 @deftypefun int feupdateenv (const fenv_t *@var{envp})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 Like @code{fesetenv}, this function sets the floating-point environment
 to that described by @var{envp}.  However, if any exceptions were
 flagged in the status word before @code{feupdateenv} was called, they
@@ -1082,6 +1113,7 @@
 @comment fenv.h
 @comment GNU
 @deftypefun int feenableexcept (int @var{excepts})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 This functions enables traps for each of the exceptions as indicated by
 the parameter @var{except}.  The individual exceptions are described in
 @ref{Status bit operations}.  Only the specified exceptions are
@@ -1094,6 +1126,7 @@
 @comment fenv.h
 @comment GNU
 @deftypefun int fedisableexcept (int @var{excepts})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 This functions disables traps for each of the exceptions as indicated by
 the parameter @var{except}.  The individual exceptions are described in
 @ref{Status bit operations}.  Only the specified exceptions are
@@ -1106,6 +1139,7 @@
 @comment fenv.h
 @comment GNU
 @deftypefun int fegetexcept (void)
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 The function returns a bitmask of all currently enabled exceptions.  It
 returns @code{-1} in case of failure.
 @end deftypefun
@@ -1157,6 +1191,7 @@
 @comment inttypes.h
 @comment ISO
 @deftypefunx intmax_t imaxabs (intmax_t @var{number})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 These functions return the absolute value of @var{number}.
 
 Most computers use a two's complement integer representation, in which
@@ -1178,6 +1213,7 @@
 @comment math.h
 @comment ISO
 @deftypefunx {long double} fabsl (long double @var{number})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 This function returns the absolute value of the floating-point number
 @var{number}.
 @end deftypefun
@@ -1191,6 +1227,7 @@
 @comment complex.h
 @comment ISO
 @deftypefunx {long double} cabsl (complex long double @var{z})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 These functions return the absolute  value of the complex number @var{z}
 (@pxref{Complex Numbers}).  The absolute value of a complex number is:
 
@@ -1228,6 +1265,7 @@
 @comment math.h
 @comment ISO
 @deftypefunx {long double} frexpl (long double @var{value}, int *@var{exponent})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 These functions are used to split the number @var{value}
 into a normalized fraction and an exponent.
 
@@ -1253,6 +1291,7 @@
 @comment math.h
 @comment ISO
 @deftypefunx {long double} ldexpl (long double @var{value}, int @var{exponent})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 These functions return the result of multiplying the floating-point
 number @var{value} by 2 raised to the power @var{exponent}.  (It can
 be used to reassemble floating-point numbers that were taken apart
@@ -1274,6 +1313,7 @@
 @comment math.h
 @comment BSD
 @deftypefunx {long double} scalbl (long double @var{value}, long double @var{exponent})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 The @code{scalb} function is the BSD name for @code{ldexp}.
 @end deftypefun
 
@@ -1286,6 +1326,7 @@
 @comment math.h
 @comment BSD
 @deftypefunx {long double} scalbnl (long double @var{x}, int @var{n})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 @code{scalbn} is identical to @code{scalb}, except that the exponent
 @var{n} is an @code{int} instead of a floating-point number.
 @end deftypefun
@@ -1299,6 +1340,7 @@
 @comment math.h
 @comment BSD
 @deftypefunx {long double} scalblnl (long double @var{x}, long int @var{n})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 @code{scalbln} is identical to @code{scalb}, except that the exponent
 @var{n} is a @code{long int} instead of a floating-point number.
 @end deftypefun
@@ -1312,6 +1354,7 @@
 @comment math.h
 @comment BSD
 @deftypefunx {long double} significandl (long double @var{x})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 @code{significand} returns the mantissa of @var{x} scaled to the range
 @math{[1, 2)}.
 It is equivalent to @w{@code{scalb (@var{x}, (double) -ilogb (@var{x}))}}.
@@ -1346,6 +1389,7 @@
 @comment math.h
 @comment ISO
 @deftypefunx {long double} ceill (long double @var{x})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 These functions round @var{x} upwards to the nearest integer,
 returning that value as a @code{double}.  Thus, @code{ceil (1.5)}
 is @code{2.0}.
@@ -1360,6 +1404,7 @@
 @comment math.h
 @comment ISO
 @deftypefunx {long double} floorl (long double @var{x})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 These functions round @var{x} downwards to the nearest
 integer, returning that value as a @code{double}.  Thus, @code{floor
 (1.5)} is @code{1.0} and @code{floor (-1.5)} is @code{-2.0}.
@@ -1374,6 +1419,7 @@
 @comment math.h
 @comment ISO
 @deftypefunx {long double} truncl (long double @var{x})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 The @code{trunc} functions round @var{x} towards zero to the nearest
 integer (returned in floating-point format).  Thus, @code{trunc (1.5)}
 is @code{1.0} and @code{trunc (-1.5)} is @code{-1.0}.
@@ -1388,6 +1434,7 @@
 @comment math.h
 @comment ISO
 @deftypefunx {long double} rintl (long double @var{x})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 These functions round @var{x} to an integer value according to the
 current rounding mode.  @xref{Floating Point Parameters}, for
 information about the various rounding modes.  The default
@@ -1408,6 +1455,7 @@
 @comment math.h
 @comment ISO
 @deftypefunx {long double} nearbyintl (long double @var{x})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 These functions return the same value as the @code{rint} functions, but
 do not raise the inexact exception if @var{x} is not an integer.
 @end deftypefun
@@ -1421,6 +1469,7 @@
 @comment math.h
 @comment ISO
 @deftypefunx {long double} roundl (long double @var{x})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 These functions are similar to @code{rint}, but they round halfway
 cases away from zero instead of to the nearest integer (or other
 current rounding mode).
@@ -1435,6 +1484,7 @@
 @comment math.h
 @comment ISO
 @deftypefunx {long int} lrintl (long double @var{x})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 These functions are just like @code{rint}, but they return a
 @code{long int} instead of a floating-point number.
 @end deftypefun
@@ -1448,6 +1498,7 @@
 @comment math.h
 @comment ISO
 @deftypefunx {long long int} llrintl (long double @var{x})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 These functions are just like @code{rint}, but they return a
 @code{long long int} instead of a floating-point number.
 @end deftypefun
@@ -1461,6 +1512,7 @@
 @comment math.h
 @comment ISO
 @deftypefunx {long int} lroundl (long double @var{x})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 These functions are just like @code{round}, but they return a
 @code{long int} instead of a floating-point number.
 @end deftypefun
@@ -1474,6 +1526,7 @@
 @comment math.h
 @comment ISO
 @deftypefunx {long long int} llroundl (long double @var{x})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 These functions are just like @code{round}, but they return a
 @code{long long int} instead of a floating-point number.
 @end deftypefun
@@ -1488,6 +1541,7 @@
 @comment math.h
 @comment ISO
 @deftypefunx {long double} modfl (long double @var{value}, long double *@var{integer-part})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 These functions break the argument @var{value} into an integer part and a
 fractional part (between @code{-1} and @code{1}, exclusive).  Their sum
 equals @var{value}.  Each of the parts has the same sign as @var{value},
@@ -1514,6 +1568,7 @@
 @comment math.h
 @comment ISO
 @deftypefunx {long double} fmodl (long double @var{numerator}, long double @var{denominator})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 These functions compute the remainder from the division of
 @var{numerator} by @var{denominator}.  Specifically, the return value is
 @code{@var{numerator} - @w{@var{n} * @var{denominator}}}, where @var{n}
@@ -1536,6 +1591,7 @@
 @comment math.h
 @comment BSD
 @deftypefunx {long double} dreml (long double @var{numerator}, long double @var{denominator})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 These functions are like @code{fmod} except that they round the
 internal quotient @var{n} to the nearest integer instead of towards zero
 to an integer.  For example, @code{drem (6.5, 2.3)} returns @code{-0.4},
@@ -1559,6 +1615,7 @@
 @comment math.h
 @comment BSD
 @deftypefunx {long double} remainderl (long double @var{numerator}, long double @var{denominator})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 This function is another name for @code{drem}.
 @end deftypefun
 
@@ -1580,6 +1637,7 @@
 @comment math.h
 @comment ISO
 @deftypefunx {long double} copysignl (long double @var{x}, long double @var{y})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 These functions return @var{x} but with the sign of @var{y}.  They work
 even if @var{x} or @var{y} are NaN or zero.  Both of these can carry a
 sign (although not all implementations support it) and this is one of
@@ -1595,6 +1653,7 @@
 @comment math.h
 @comment ISO
 @deftypefun int signbit (@emph{float-type} @var{x})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 @code{signbit} is a generic macro which can work on all floating-point
 types.  It returns a nonzero value if the value of @var{x} has its sign
 bit set.
@@ -1613,6 +1672,7 @@
 @comment math.h
 @comment ISO
 @deftypefunx {long double} nextafterl (long double @var{x}, long double @var{y})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 The @code{nextafter} function returns the next representable neighbor of
 @var{x} in the direction towards @var{y}.  The size of the step between
 @var{x} and the result depends on the type of the result.  If
@@ -1636,6 +1696,7 @@
 @comment math.h
 @comment ISO
 @deftypefunx {long double} nexttowardl (long double @var{x}, long double @var{y})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 These functions are identical to the corresponding versions of
 @code{nextafter} except that their second argument is a @code{long
 double}.
@@ -1651,6 +1712,8 @@
 @comment math.h
 @comment ISO
 @deftypefunx {long double} nanl (const char *@var{tagp})
+@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}}
+@c The unsafe-but-ruled-safe locale use comes from strtod.
 The @code{nan} function returns a representation of NaN, provided that
 NaN is supported by the target platform.
 @code{nan ("@var{n-char-sequence}")} is equivalent to
@@ -1685,6 +1748,7 @@
 @comment math.h
 @comment ISO
 @deftypefn Macro int isgreater (@emph{real-floating} @var{x}, @emph{real-floating} @var{y})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 This macro determines whether the argument @var{x} is greater than
 @var{y}.  It is equivalent to @code{(@var{x}) > (@var{y})}, but no
 exception is raised if @var{x} or @var{y} are NaN.
@@ -1693,6 +1757,7 @@
 @comment math.h
 @comment ISO
 @deftypefn Macro int isgreaterequal (@emph{real-floating} @var{x}, @emph{real-floating} @var{y})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 This macro determines whether the argument @var{x} is greater than or
 equal to @var{y}.  It is equivalent to @code{(@var{x}) >= (@var{y})}, but no
 exception is raised if @var{x} or @var{y} are NaN.
@@ -1701,6 +1766,7 @@
 @comment math.h
 @comment ISO
 @deftypefn Macro int isless (@emph{real-floating} @var{x}, @emph{real-floating} @var{y})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 This macro determines whether the argument @var{x} is less than @var{y}.
 It is equivalent to @code{(@var{x}) < (@var{y})}, but no exception is
 raised if @var{x} or @var{y} are NaN.
@@ -1709,6 +1775,7 @@
 @comment math.h
 @comment ISO
 @deftypefn Macro int islessequal (@emph{real-floating} @var{x}, @emph{real-floating} @var{y})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 This macro determines whether the argument @var{x} is less than or equal
 to @var{y}.  It is equivalent to @code{(@var{x}) <= (@var{y})}, but no
 exception is raised if @var{x} or @var{y} are NaN.
@@ -1717,6 +1784,7 @@
 @comment math.h
 @comment ISO
 @deftypefn Macro int islessgreater (@emph{real-floating} @var{x}, @emph{real-floating} @var{y})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 This macro determines whether the argument @var{x} is less or greater
 than @var{y}.  It is equivalent to @code{(@var{x}) < (@var{y}) ||
 (@var{x}) > (@var{y})} (although it only evaluates @var{x} and @var{y}
@@ -1729,6 +1797,7 @@
 @comment math.h
 @comment ISO
 @deftypefn Macro int isunordered (@emph{real-floating} @var{x}, @emph{real-floating} @var{y})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 This macro determines whether its arguments are unordered.  In other
 words, it is true if @var{x} or @var{y} are NaN, and false otherwise.
 @end deftypefn
@@ -1762,6 +1831,7 @@
 @comment math.h
 @comment ISO
 @deftypefunx {long double} fminl (long double @var{x}, long double @var{y})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 The @code{fmin} function returns the lesser of the two values @var{x}
 and @var{y}.  It is similar to the expression
 @smallexample
@@ -1782,6 +1852,7 @@
 @comment math.h
 @comment ISO
 @deftypefunx {long double} fmaxl (long double @var{x}, long double @var{y})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 The @code{fmax} function returns the greater of the two values @var{x}
 and @var{y}.
 
@@ -1798,6 +1869,7 @@
 @comment math.h
 @comment ISO
 @deftypefunx {long double} fdiml (long double @var{x}, long double @var{y})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 The @code{fdim} function returns the positive difference between
 @var{x} and @var{y}.  The positive difference is @math{@var{x} -
 @var{y}} if @var{x} is greater than @var{y}, and @math{0} otherwise.
@@ -1815,6 +1887,7 @@
 @comment ISO
 @deftypefunx {long double} fmal (long double @var{x}, long double @var{y}, long double @var{z})
 @cindex butterfly
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 The @code{fma} function performs floating-point multiply-add.  This is
 the operation @math{(@var{x} @mul{} @var{y}) + @var{z}}, but the
 intermediate result is not rounded to the destination type.  This can
@@ -1944,6 +2017,7 @@
 @comment complex.h
 @comment ISO
 @deftypefunx {long double} creall (complex long double @var{z})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 These functions return the real part of the complex number @var{z}.
 @end deftypefun
 
@@ -1956,6 +2030,7 @@
 @comment complex.h
 @comment ISO
 @deftypefunx {long double} cimagl (complex long double @var{z})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 These functions return the imaginary part of the complex number @var{z}.
 @end deftypefun
 
@@ -1968,6 +2043,7 @@
 @comment complex.h
 @comment ISO
 @deftypefunx {complex long double} conjl (complex long double @var{z})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 These functions return the conjugate value of the complex number
 @var{z}.  The conjugate of a complex number has the same real part and a
 negated imaginary part.  In other words, @samp{conj(a + bi) = a + -bi}.
@@ -1982,6 +2058,7 @@
 @comment complex.h
 @comment ISO
 @deftypefunx {long double} cargl (complex long double @var{z})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 These functions return the argument of the complex number @var{z}.
 The argument of a complex number is the angle in the complex plane
 between the positive real axis and a line passing through zero and the
@@ -2000,6 +2077,7 @@
 @comment complex.h
 @comment ISO
 @deftypefunx {complex long double} cprojl (complex long double @var{z})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 These functions return the projection of the complex value @var{z} onto
 the Riemann sphere.  Values with an infinite imaginary part are projected
 to positive infinity on the real axis, even if the real part is NaN.  If
@@ -2045,6 +2123,15 @@
 @comment stdlib.h
 @comment ISO
 @deftypefun {long int} strtol (const char *restrict @var{string}, char **restrict @var{tailptr}, int @var{base})
+@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}}
+@c strtol uses the thread-local pointer to the locale in effect, and
+@c strtol_l loads the LC_NUMERIC locale data from it early on and once,
+@c but if the locale is the global locale, and another thread calls
+@c setlocale in a way that modifies the pointer to the LC_CTYPE locale
+@c category, the behavior of e.g. IS*, TOUPPER will vary throughout the
+@c execution of the function, because they re-read the locale data from
+@c the given locale pointer.  We solved this by documenting setlocale as
+@c MT-Unsafe.
 The @code{strtol} (``string-to-long'') function converts the initial
 part of @var{string} to a signed integer, which is returned as a value
 of type @code{long int}.
@@ -2108,6 +2195,7 @@
 @comment wchar.h
 @comment ISO
 @deftypefun {long int} wcstol (const wchar_t *restrict @var{string}, wchar_t **restrict @var{tailptr}, int @var{base})
+@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}}
 The @code{wcstol} function is equivalent to the @code{strtol} function
 in nearly all aspects but handles wide character strings.
 
@@ -2117,6 +2205,7 @@
 @comment stdlib.h
 @comment ISO
 @deftypefun {unsigned long int} strtoul (const char *retrict @var{string}, char **restrict @var{tailptr}, int @var{base})
+@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}}
 The @code{strtoul} (``string-to-unsigned-long'') function is like
 @code{strtol} except it converts to an @code{unsigned long int} value.
 The syntax is the same as described above for @code{strtol}.  The value
@@ -2135,6 +2224,7 @@
 @comment wchar.h
 @comment ISO
 @deftypefun {unsigned long int} wcstoul (const wchar_t *restrict @var{string}, wchar_t **restrict @var{tailptr}, int @var{base})
+@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}}
 The @code{wcstoul} function is equivalent to the @code{strtoul} function
 in nearly all aspects but handles wide character strings.
 
@@ -2144,6 +2234,7 @@
 @comment stdlib.h
 @comment ISO
 @deftypefun {long long int} strtoll (const char *restrict @var{string}, char **restrict @var{tailptr}, int @var{base})
+@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}}
 The @code{strtoll} function is like @code{strtol} except that it returns
 a @code{long long int} value, and accepts numbers with a correspondingly
 larger range.
@@ -2160,6 +2251,7 @@
 @comment wchar.h
 @comment ISO
 @deftypefun {long long int} wcstoll (const wchar_t *restrict @var{string}, wchar_t **restrict @var{tailptr}, int @var{base})
+@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}}
 The @code{wcstoll} function is equivalent to the @code{strtoll} function
 in nearly all aspects but handles wide character strings.
 
@@ -2169,12 +2261,14 @@
 @comment stdlib.h
 @comment BSD
 @deftypefun {long long int} strtoq (const char *restrict @var{string}, char **restrict @var{tailptr}, int @var{base})
+@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}}
 @code{strtoq} (``string-to-quad-word'') is the BSD name for @code{strtoll}.
 @end deftypefun
 
 @comment wchar.h
 @comment GNU
 @deftypefun {long long int} wcstoq (const wchar_t *restrict @var{string}, wchar_t **restrict @var{tailptr}, int @var{base})
+@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}}
 The @code{wcstoq} function is equivalent to the @code{strtoq} function
 in nearly all aspects but handles wide character strings.
 
@@ -2184,6 +2278,7 @@
 @comment stdlib.h
 @comment ISO
 @deftypefun {unsigned long long int} strtoull (const char *restrict @var{string}, char **restrict @var{tailptr}, int @var{base})
+@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}}
 The @code{strtoull} function is related to @code{strtoll} the same way
 @code{strtoul} is related to @code{strtol}.
 
@@ -2193,6 +2288,7 @@
 @comment wchar.h
 @comment ISO
 @deftypefun {unsigned long long int} wcstoull (const wchar_t *restrict @var{string}, wchar_t **restrict @var{tailptr}, int @var{base})
+@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}}
 The @code{wcstoull} function is equivalent to the @code{strtoull} function
 in nearly all aspects but handles wide character strings.
 
@@ -2202,12 +2298,14 @@
 @comment stdlib.h
 @comment BSD
 @deftypefun {unsigned long long int} strtouq (const char *restrict @var{string}, char **restrict @var{tailptr}, int @var{base})
+@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}}
 @code{strtouq} is the BSD name for @code{strtoull}.
 @end deftypefun
 
 @comment wchar.h
 @comment GNU
 @deftypefun {unsigned long long int} wcstouq (const wchar_t *restrict @var{string}, wchar_t **restrict @var{tailptr}, int @var{base})
+@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}}
 The @code{wcstouq} function is equivalent to the @code{strtouq} function
 in nearly all aspects but handles wide character strings.
 
@@ -2217,6 +2315,7 @@
 @comment inttypes.h
 @comment ISO
 @deftypefun intmax_t strtoimax (const char *restrict @var{string}, char **restrict @var{tailptr}, int @var{base})
+@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}}
 The @code{strtoimax} function is like @code{strtol} except that it returns
 a @code{intmax_t} value, and accepts numbers of a corresponding range.
 
@@ -2233,6 +2332,7 @@
 @comment wchar.h
 @comment ISO
 @deftypefun intmax_t wcstoimax (const wchar_t *restrict @var{string}, wchar_t **restrict @var{tailptr}, int @var{base})
+@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}}
 The @code{wcstoimax} function is equivalent to the @code{strtoimax} function
 in nearly all aspects but handles wide character strings.
 
@@ -2242,6 +2342,7 @@
 @comment inttypes.h
 @comment ISO
 @deftypefun uintmax_t strtoumax (const char *restrict @var{string}, char **restrict @var{tailptr}, int @var{base})
+@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}}
 The @code{strtoumax} function is related to @code{strtoimax}
 the same way that @code{strtoul} is related to @code{strtol}.
 
@@ -2252,6 +2353,7 @@
 @comment wchar.h
 @comment ISO
 @deftypefun uintmax_t wcstoumax (const wchar_t *restrict @var{string}, wchar_t **restrict @var{tailptr}, int @var{base})
+@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}}
 The @code{wcstoumax} function is equivalent to the @code{strtoumax} function
 in nearly all aspects but handles wide character strings.
 
@@ -2261,6 +2363,7 @@
 @comment stdlib.h
 @comment ISO
 @deftypefun {long int} atol (const char *@var{string})
+@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}}
 This function is similar to the @code{strtol} function with a @var{base}
 argument of @code{10}, except that it need not detect overflow errors.
 The @code{atol} function is provided mostly for compatibility with
@@ -2270,6 +2373,7 @@
 @comment stdlib.h
 @comment ISO
 @deftypefun int atoi (const char *@var{string})
+@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}}
 This function is like @code{atol}, except that it returns an @code{int}.
 The @code{atoi} function is also considered obsolete; use @code{strtol}
 instead.
@@ -2278,6 +2382,7 @@
 @comment stdlib.h
 @comment ISO
 @deftypefun {long long int} atoll (const char *@var{string})
+@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}}
 This function is similar to @code{atol}, except it returns a @code{long
 long int}.
 
@@ -2342,6 +2447,35 @@
 @comment stdlib.h
 @comment ISO
 @deftypefun double strtod (const char *restrict @var{string}, char **restrict @var{tailptr})
+@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}}
+@c Besides the unsafe-but-ruled-safe locale uses, this uses a lot of
+@c mpn, but it's all safe.
+@c
+@c round_and_return
+@c   get_rounding_mode ok
+@c   mpn_add_1 ok
+@c   mpn_rshift ok
+@c   MPN_ZERO ok
+@c   MPN2FLOAT -> mpn_construct_(float|double|long_double) ok
+@c str_to_mpn
+@c   mpn_mul_1 -> umul_ppmm ok
+@c   mpn_add_1 ok
+@c mpn_lshift_1 -> mpn_lshift ok
+@c STRTOF_INTERNAL
+@c   MPN_VAR ok
+@c   SET_MANTISSA ok
+@c   STRNCASECMP ok, wide and narrow
+@c   round_and_return ok
+@c   mpn_mul ok
+@c     mpn_addmul_1 ok
+@c     ... mpn_sub
+@c   mpn_lshift ok
+@c   udiv_qrnnd ok
+@c   count_leading_zeros ok
+@c   add_ssaaaa ok
+@c   sub_ddmmss ok
+@c   umul_ppmm ok
+@c   mpn_submul_1 ok
 The @code{strtod} (``string-to-double'') function converts the initial
 part of @var{string} to a floating-point number, which is returned as a
 value of type @code{double}.
@@ -2427,6 +2561,7 @@
 @comment stdlib.h
 @comment ISO
 @deftypefunx {long double} strtold (const char *@var{string}, char **@var{tailptr})
+@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}}
 These functions are analogous to @code{strtod}, but return @code{float}
 and @code{long double} values respectively.  They report errors in the
 same way as @code{strtod}.  @code{strtof} can be substantially faster
@@ -2446,6 +2581,7 @@
 @comment stdlib.h
 @comment ISO
 @deftypefunx {long double} wcstold (const wchar_t *@var{string}, wchar_t **@var{tailptr})
+@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}}
 The @code{wcstod}, @code{wcstof}, and @code{wcstol} functions are
 equivalent in nearly all aspect to the @code{strtod}, @code{strtof}, and
 @code{strtold} functions but it handles wide character string.
@@ -2458,6 +2594,7 @@
 @comment stdlib.h
 @comment ISO
 @deftypefun double atof (const char *@var{string})
+@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}}
 This function is similar to the @code{strtod} function, except that it
 need not detect overflow and underflow errors.  The @code{atof} function
 is provided mostly for compatibility with existing code; using
@@ -2485,6 +2622,7 @@
 @comment stdlib.h
 @comment SVID, Unix98
 @deftypefun {char *} ecvt (double @var{value}, int @var{ndigit}, int *@var{decpt}, int *@var{neg})
+@safety{@prelim{}@mtunsafe{@mtasurace{:ecvt}}@asunsafe{}@acsafe{}}
 The function @code{ecvt} converts the floating-point number @var{value}
 to a string with at most @var{ndigit} decimal digits.  The
 returned string contains no decimal point or sign. The first digit of
@@ -2510,6 +2648,7 @@
 @comment stdlib.h
 @comment SVID, Unix98
 @deftypefun {char *} fcvt (double @var{value}, int @var{ndigit}, int *@var{decpt}, int *@var{neg})
+@safety{@prelim{}@mtunsafe{@mtasurace{:fcvt}}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}}
 The function @code{fcvt} is like @code{ecvt}, but @var{ndigit} specifies
 the number of digits after the decimal point.  If @var{ndigit} is less
 than zero, @var{value} is rounded to the @math{@var{ndigit}+1}'th place to the
@@ -2528,6 +2667,9 @@
 @comment stdlib.h
 @comment SVID, Unix98
 @deftypefun {char *} gcvt (double @var{value}, int @var{ndigit}, char *@var{buf})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
+@c gcvt calls sprintf, that ultimately calls vfprintf, which malloc()s
+@c args_value if it's too large, but gcvt never exercises this path.
 @code{gcvt} is functionally equivalent to @samp{sprintf(buf, "%*g",
 ndigit, value}.  It is provided only for compatibility's sake.  It
 returns @var{buf}.
@@ -2542,6 +2684,7 @@
 @comment stdlib.h
 @comment GNU
 @deftypefun {char *} qecvt (long double @var{value}, int @var{ndigit}, int *@var{decpt}, int *@var{neg})
+@safety{@prelim{}@mtunsafe{@mtasurace{:qecvt}}@asunsafe{}@acsafe{}}
 This function is equivalent to @code{ecvt} except that it takes a
 @code{long double} for the first parameter and that @var{ndigit} is
 restricted by the precision of a @code{long double}.
@@ -2550,6 +2693,7 @@
 @comment stdlib.h
 @comment GNU
 @deftypefun {char *} qfcvt (long double @var{value}, int @var{ndigit}, int *@var{decpt}, int *@var{neg})
+@safety{@prelim{}@mtunsafe{@mtasurace{:qfcvt}}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}}
 This function is equivalent to @code{fcvt} except that it
 takes a @code{long double} for the first parameter and that @var{ndigit} is
 restricted by the precision of a @code{long double}.
@@ -2558,6 +2702,7 @@
 @comment stdlib.h
 @comment GNU
 @deftypefun {char *} qgcvt (long double @var{value}, int @var{ndigit}, char *@var{buf})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 This function is equivalent to @code{gcvt} except that it takes a
 @code{long double} for the first parameter and that @var{ndigit} is
 restricted by the precision of a @code{long double}.
@@ -2578,6 +2723,7 @@
 @comment stdlib.h
 @comment GNU
 @deftypefun int ecvt_r (double @var{value}, int @var{ndigit}, int *@var{decpt}, int *@var{neg}, char *@var{buf}, size_t @var{len})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}

[... 84844 lines stripped ...]
_______________________________________________
Commits mailing list
Commits@xxxxxxxxxx
http://eglibc.org/cgi-bin/mailman/listinfo/commits