aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2007-07-31 13:33:18 +0000
committerJakub Jelinek <jakub@redhat.com>2007-07-31 13:33:18 +0000
commit32c075e1f01849e161724bbd400ba77244e482cc (patch)
tree5f083a3f352104f32bb6c902d57fa3f294bd8d4d
parentd6220e9ee38c1c9285221b023346201ec5f511b3 (diff)
downloadtermbaud-32c075e1f01849e161724bbd400ba77244e482cc.tar.gz
termbaud-32c075e1f01849e161724bbd400ba77244e482cc.tar.xz
termbaud-32c075e1f01849e161724bbd400ba77244e482cc.zip
.
-rw-r--r--ChangeLog1625
-rw-r--r--Makeconfig2
-rw-r--r--Makerules3
-rw-r--r--NEWS14
-rw-r--r--README4
-rw-r--r--Versions.def2
-rw-r--r--argp/Makefile4
-rw-r--r--argp/argp-help.c9
-rw-r--r--argp/tst-argp2.c101
-rw-r--r--catgets/gencat.c4
-rw-r--r--config.h.in23
-rw-r--r--config.make.in5
-rwxr-xr-xconfigure81
-rw-r--r--configure.in44
-rw-r--r--csu/Versions4
-rw-r--r--csu/libc-start.c17
-rw-r--r--csu/libc-tls.c58
-rw-r--r--csu/tst-atomic.c113
-rw-r--r--csu/version.c7
-rwxr-xr-xdebug/catchsegv.sh5
-rwxr-xr-xdebug/xtrace.sh20
-rw-r--r--dlfcn/Makefile5
-rw-r--r--dlfcn/dlinfo.c15
-rw-r--r--elf/Makefile14
-rw-r--r--elf/cache.c2
-rw-r--r--elf/dl-addr.c236
-rw-r--r--elf/dl-cache.c6
-rw-r--r--elf/dl-close.c158
-rw-r--r--elf/dl-deps.c2
-rw-r--r--elf/dl-dst.h9
-rw-r--r--elf/dl-fptr.c4
-rw-r--r--elf/dl-iteratephdr.c10
-rw-r--r--elf/dl-libc.c2
-rw-r--r--elf/dl-load.c18
-rw-r--r--elf/dl-lookup.c22
-rw-r--r--elf/dl-minimal.c24
-rw-r--r--elf/dl-object.c9
-rw-r--r--elf/dl-open.c139
-rw-r--r--elf/dl-profile.c14
-rw-r--r--elf/dl-reloc.c24
-rw-r--r--elf/dl-runtime.c42
-rw-r--r--elf/dl-support.c9
-rw-r--r--elf/dl-sym.c23
-rw-r--r--elf/dl-sysdep.c50
-rw-r--r--elf/dl-tls.c79
-rw-r--r--elf/do-lookup.h9
-rw-r--r--elf/elf.h5
-rw-r--r--elf/ldconfig.c22
-rw-r--r--elf/ldd.bash.in4
-rw-r--r--elf/rtld.c71
-rw-r--r--elf/sprof.c4
-rw-r--r--elf/tst-thrlock.c8
-rw-r--r--elf/tst-tls-dlinfo.c4
-rw-r--r--elf/tst-tls1.c8
-rw-r--r--elf/tst-tls10.h3
-rw-r--r--elf/tst-tls14.c8
-rw-r--r--elf/tst-tls2.c8
-rw-r--r--elf/tst-tls3.c8
-rw-r--r--elf/tst-tls4.c4
-rw-r--r--elf/tst-tls5.c4
-rw-r--r--elf/tst-tls6.c4
-rw-r--r--elf/tst-tls7.c4
-rw-r--r--elf/tst-tls8.c4
-rw-r--r--elf/tst-tls9.c4
-rw-r--r--elf/tst-tlsmod1.c4
-rw-r--r--elf/tst-tlsmod13.c3
-rw-r--r--elf/tst-tlsmod13a.c3
-rw-r--r--elf/tst-tlsmod14a.c10
-rw-r--r--elf/tst-tlsmod2.c2
-rw-r--r--elf/tst-tlsmod3.c4
-rw-r--r--elf/tst-tlsmod4.c4
-rw-r--r--elf/tst-tlsmod5.c2
-rw-r--r--elf/tst-tlsmod6.c2
-rw-r--r--gmon/mcount.c4
-rw-r--r--iconv/gconv_charset.h4
-rw-r--r--iconv/iconv_open.c4
-rw-r--r--iconv/iconv_prog.c4
-rw-r--r--iconv/iconvconfig.c4
-rw-r--r--iconvdata/gconv-modules4
-rw-r--r--iconvdata/johab.c6
-rw-r--r--iconvdata/ksc5601.c6
-rw-r--r--iconvdata/ksc5601.h4
-rw-r--r--iconvdata/uhc.c16
-rw-r--r--include/atomic.h365
-rw-r--r--include/dlfcn.h3
-rw-r--r--include/errno.h2
-rw-r--r--include/libc-symbols.h75
-rw-r--r--include/link.h18
-rw-r--r--include/rpcsvc/nislib.h2
-rw-r--r--include/shlib-compat.h16
-rw-r--r--include/stdio.h1
-rw-r--r--include/sys/cdefs.h6
-rw-r--r--include/sys/mman.h3
-rw-r--r--include/tls.h3
-rw-r--r--inet/Makefile4
-rw-r--r--inet/inet6_opt.c36
-rw-r--r--inet/test-inet6_opt.c207
-rw-r--r--io/Makefile17
-rw-r--r--io/bug-ftw5.c25
-rw-r--r--io/fstat.c12
-rw-r--r--io/fstat64.c9
-rw-r--r--io/fstatat.c9
-rw-r--r--io/fstatat64.c9
-rw-r--r--io/ftw.c28
-rw-r--r--io/lstat.c12
-rw-r--r--io/lstat64.c9
-rw-r--r--io/mknod.c12
-rw-r--r--io/mknodat.c10
-rw-r--r--io/stat.c12
-rw-r--r--io/stat64.c9
-rw-r--r--libio/Banner1
-rw-r--r--libio/bits/stdio.h12
-rw-r--r--libio/fileops.c11
-rw-r--r--libio/libio.h32
-rw-r--r--libio/libioP.h235
-rw-r--r--libio/oldfileops.c5
-rw-r--r--libio/stdio.c10
-rw-r--r--libio/stdio.h41
-rw-r--r--libio/vswprintf.c2
-rw-r--r--locale/C-translit.h759
-rw-r--r--locale/C-translit.h.in3
-rw-r--r--locale/global-locale.c4
-rw-r--r--locale/iso-3166.def1
-rw-r--r--locale/iso-4217.def1
-rw-r--r--locale/localeinfo.h4
-rw-r--r--locale/programs/charmap.c6
-rw-r--r--locale/programs/ld-collate.c4
-rw-r--r--locale/programs/ld-ctype.c11
-rw-r--r--locale/programs/ld-monetary.c2
-rw-r--r--locale/programs/ld-numeric.c2
-rw-r--r--locale/programs/ld-time.c4
-rw-r--r--locale/programs/locale.c4
-rw-r--r--locale/programs/localedef.c4
-rw-r--r--locale/programs/repertoire.c4
-rw-r--r--localedata/ChangeLog58
-rw-r--r--localedata/SUPPORTED2
-rw-r--r--localedata/charmaps/EUC-KR1
-rw-r--r--localedata/charmaps/JOHAB3
-rw-r--r--localedata/locales/as_IN34
-rw-r--r--localedata/locales/bn_BD8
-rw-r--r--localedata/locales/cs_CZ4
-rw-r--r--localedata/locales/en_ZA15
-rw-r--r--localedata/locales/ru_RU2
-rw-r--r--localedata/locales/sl_SI12
-rw-r--r--localedata/locales/sr_ME81
-rw-r--r--localedata/locales/sr_RS360
-rw-r--r--localedata/locales/sr_RS@latin174
-rw-r--r--localedata/locales/translit_neutral2
-rw-r--r--login/utmp_file.c8
-rw-r--r--malloc/arena.c45
-rw-r--r--malloc/hooks.c4
-rw-r--r--malloc/malloc.c48
-rw-r--r--malloc/memusage.c152
-rwxr-xr-xmalloc/memusage.sh24
-rw-r--r--malloc/memusagestat.c8
-rw-r--r--malloc/mtrace.pl4
-rw-r--r--manual/argp.texi2
-rw-r--r--manual/charset.texi6
-rw-r--r--manual/conf.texi5
-rw-r--r--manual/errno.texi4
-rw-r--r--manual/filesys.texi10
-rw-r--r--manual/lang.texi2
-rw-r--r--manual/maint.texi2
-rw-r--r--manual/memory.texi8
-rw-r--r--manual/message.texi4
-rw-r--r--manual/resource.texi10
-rw-r--r--manual/search.texi18
-rw-r--r--manual/signal.texi2
-rw-r--r--manual/startup.texi2
-rw-r--r--manual/stdio.texi4
-rw-r--r--manual/string.texi9
-rw-r--r--manual/sysinfo.texi2
-rw-r--r--manual/syslog.texi2
-rw-r--r--manual/time.texi8
-rw-r--r--math/atest-exp.c8
-rw-r--r--math/atest-exp2.c7
-rw-r--r--math/atest-sincos.c10
-rw-r--r--math/basic-test.c36
-rw-r--r--math/bug-nextafter.c255
-rw-r--r--math/bug-nexttoward.c255
-rw-r--r--math/libm-test.inc16
-rw-r--r--math/math_private.h6
-rw-r--r--math/s_nextafter.c20
-rw-r--r--math/s_nexttowardf.c21
-rw-r--r--math/test-misc.c74
-rw-r--r--misc/madvise.c3
-rw-r--r--nis/Banner1
-rw-r--r--nis/nis_call.c400
-rw-r--r--nis/nis_domain_of.c16
-rw-r--r--nis/nis_lookup.c21
-rw-r--r--nis/nis_print_group_entry.c2
-rw-r--r--nis/nis_table.c15
-rw-r--r--nis/nss-default.c5
-rw-r--r--nis/nss_nis/nis-hosts.c20
-rw-r--r--nis/nss_nis/nis-service.c2
-rw-r--r--nis/nss_nisplus/nisplus-ethers.c9
-rw-r--r--nis/nss_nisplus/nisplus-network.c11
-rw-r--r--nis/nss_nisplus/nisplus-publickey.c2
-rw-r--r--nis/nss_nisplus/nisplus-pwd.c6
-rw-r--r--nis/nss_nisplus/nisplus-rpc.c11
-rw-r--r--nis/nss_nisplus/nisplus-service.c11
-rw-r--r--nis/nss_nisplus/nisplus-spwd.c5
-rw-r--r--nis/rpcsvc/nislib.h9
-rw-r--r--nptl/ChangeLog253
-rw-r--r--nptl/Makefile10
-rw-r--r--nptl/allocatestack.c59
-rw-r--r--nptl/descr.h3
-rw-r--r--nptl/init.c6
-rw-r--r--nptl/pthreadP.h4
-rw-r--r--nptl/pthread_attr_setstack.c15
-rw-r--r--nptl/pthread_attr_setstacksize.c14
-rw-r--r--nptl/pthread_getattr_np.c10
-rw-r--r--nptl/pthread_mutex_lock.c4
-rw-r--r--nptl/pthread_mutex_timedlock.c8
-rw-r--r--nptl/pthread_mutex_trylock.c8
-rw-r--r--nptl/sysdeps/alpha/tls.h28
-rw-r--r--nptl/sysdeps/i386/tls.h26
-rw-r--r--nptl/sysdeps/ia64/pthread_spin_unlock.c4
-rw-r--r--nptl/sysdeps/ia64/tls.h28
-rw-r--r--nptl/sysdeps/powerpc/tls.h28
-rw-r--r--nptl/sysdeps/pthread/pthread_barrier_wait.c (renamed from nptl/pthread_barrier_wait.c)0
-rw-r--r--nptl/sysdeps/pthread/pthread_cond_broadcast.c (renamed from nptl/pthread_cond_broadcast.c)0
-rw-r--r--nptl/sysdeps/pthread/pthread_cond_signal.c (renamed from nptl/pthread_cond_signal.c)0
-rw-r--r--nptl/sysdeps/pthread/pthread_cond_timedwait.c (renamed from nptl/pthread_cond_timedwait.c)0
-rw-r--r--nptl/sysdeps/pthread/pthread_cond_wait.c (renamed from nptl/pthread_cond_wait.c)0
-rw-r--r--nptl/sysdeps/pthread/pthread_getcpuclockid.c (renamed from nptl/pthread_getcpuclockid.c)0
-rw-r--r--nptl/sysdeps/pthread/pthread_once.c (renamed from nptl/pthread_once.c)0
-rw-r--r--nptl/sysdeps/pthread/pthread_rwlock_rdlock.c (renamed from nptl/pthread_rwlock_rdlock.c)0
-rw-r--r--nptl/sysdeps/pthread/pthread_rwlock_timedrdlock.c (renamed from nptl/pthread_rwlock_timedrdlock.c)0
-rw-r--r--nptl/sysdeps/pthread/pthread_rwlock_timedwrlock.c (renamed from nptl/pthread_rwlock_timedwrlock.c)0
-rw-r--r--nptl/sysdeps/pthread/pthread_rwlock_unlock.c (renamed from nptl/pthread_rwlock_unlock.c)0
-rw-r--r--nptl/sysdeps/pthread/pthread_rwlock_wrlock.c (renamed from nptl/pthread_rwlock_wrlock.c)0
-rw-r--r--nptl/sysdeps/pthread/pthread_spin_destroy.c (renamed from nptl/pthread_spin_destroy.c)0
-rw-r--r--nptl/sysdeps/pthread/pthread_spin_init.c (renamed from nptl/pthread_spin_init.c)0
-rw-r--r--nptl/sysdeps/pthread/pthread_spin_unlock.c (renamed from nptl/pthread_spin_unlock.c)0
-rw-r--r--nptl/sysdeps/s390/tls.h29
-rw-r--r--nptl/sysdeps/sh/tls.h28
-rw-r--r--nptl/sysdeps/sparc/tls.h34
-rw-r--r--nptl/sysdeps/unix/sysv/linux/alpha/bits/local_lim.h3
-rw-r--r--nptl/sysdeps/unix/sysv/linux/alpha/bits/semaphore.h3
-rw-r--r--nptl/sysdeps/unix/sysv/linux/bits/local_lim.h3
-rw-r--r--nptl/sysdeps/unix/sysv/linux/fork.c9
-rw-r--r--nptl/sysdeps/unix/sysv/linux/i386/bits/semaphore.h3
-rw-r--r--nptl/sysdeps/unix/sysv/linux/i386/i486/sem_timedwait.S11
-rw-r--r--nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h10
-rw-r--r--nptl/sysdeps/unix/sysv/linux/ia64/bits/local_lim.h3
-rw-r--r--nptl/sysdeps/unix/sysv/linux/ia64/bits/semaphore.h3
-rw-r--r--nptl/sysdeps/unix/sysv/linux/lowlevelrobustlock.c22
-rw-r--r--nptl/sysdeps/unix/sysv/linux/powerpc/Versions4
-rw-r--r--nptl/sysdeps/unix/sysv/linux/powerpc/bits/local_lim.h93
-rw-r--r--nptl/sysdeps/unix/sysv/linux/powerpc/bits/semaphore.h3
-rw-r--r--nptl/sysdeps/unix/sysv/linux/powerpc/pthread_attr_setstack.c2
-rw-r--r--nptl/sysdeps/unix/sysv/linux/powerpc/pthread_attr_setstacksize.c8
-rw-r--r--nptl/sysdeps/unix/sysv/linux/rtld-lowlevel.h2
-rw-r--r--nptl/sysdeps/unix/sysv/linux/s390/bits/semaphore.h3
-rw-r--r--nptl/sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h21
-rw-r--r--nptl/sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h21
-rw-r--r--nptl/sysdeps/unix/sysv/linux/sh/bits/semaphore.h3
-rw-r--r--nptl/sysdeps/unix/sysv/linux/sparc/bits/local_lim.h3
-rw-r--r--nptl/sysdeps/unix/sysv/linux/sparc/bits/semaphore.h3
-rw-r--r--nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/pthread_barrier_wait.c2
-rw-r--r--nptl/sysdeps/unix/sysv/linux/x86_64/bits/semaphore.h3
-rw-r--r--nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S4
-rw-r--r--nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h28
-rw-r--r--nptl/sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S10
-rw-r--r--nptl/sysdeps/x86_64/tls.h26
-rw-r--r--nptl/tst-cancel-wrappers.sh3
-rw-r--r--nptl/tst-cancel4.c44
-rw-r--r--nptl/tst-robust9.c94
-rw-r--r--nptl/tst-robustpi9.c2
-rw-r--r--nptl/tst-sem10.c88
-rw-r--r--nptl/tst-tls5.h2
-rw-r--r--nptl_db/ChangeLog4
-rw-r--r--nptl_db/structs.def6
-rw-r--r--nscd/Makefile2
-rw-r--r--nscd/cache.c2
-rw-r--r--nscd/gai.c5
-rw-r--r--nscd/grpcache.c3
-rw-r--r--nscd/nscd-client.h10
-rw-r--r--nscd/nscd.c4
-rw-r--r--nscd/nscd.init9
-rw-r--r--nscd/nscd_getai.c71
-rw-r--r--nscd/nscd_getgr_r.c108
-rw-r--r--nscd/nscd_gethst_r.c147
-rw-r--r--nscd/nscd_getpw_r.c70
-rw-r--r--nscd/nscd_helper.c43
-rw-r--r--nscd/nscd_initgroups.c62
-rw-r--r--nscd/pwdcache.c3
-rw-r--r--nscd/selinux.c18
-rw-r--r--nscd/selinux.h4
-rw-r--r--nss/getent.c4
-rw-r--r--nss/nss_files/files-hosts.c42
-rw-r--r--po/ru.po7736
-rw-r--r--po/sv.po74
-rw-r--r--posix/Makefile3
-rw-r--r--posix/bug-regex27.c64
-rw-r--r--posix/bug-regex28.c75
-rw-r--r--posix/getconf.c4
-rw-r--r--posix/regcomp.c8
-rw-r--r--posix/unistd.h10
-rw-r--r--posix/wordexp.c4
-rw-r--r--resolv/Makefile4
-rw-r--r--resolv/Versions6
-rw-r--r--resolv/arpa/nameser.h2
-rw-r--r--resolv/inet_ntop.c2
-rw-r--r--resolv/mapv4v6addr.h10
-rw-r--r--resolv/nss_dns/dns-host.c15
-rw-r--r--resolv/nss_dns/dns-network.c43
-rw-r--r--resolv/res_libc.c2
-rw-r--r--resolv/tst-inet_ntop.c111
-rwxr-xr-xscripts/check-local-headers.sh3
-rw-r--r--soft-fp/op-4.h6
-rw-r--r--soft-fp/op-common.h9
-rw-r--r--stdio-common/Makefile4
-rw-r--r--stdio-common/_itoa.c5
-rw-r--r--stdio-common/bug17.c31
-rw-r--r--stdio-common/printf_fp.c99
-rw-r--r--stdio-common/test-vfprintf.c8
-rw-r--r--stdio-common/tfformat.c33
-rw-r--r--stdio-common/tst-sprintf.c21
-rw-r--r--stdio-common/tst-sprintf2.c82
-rw-r--r--stdio-common/tstscanf.c4
-rw-r--r--stdio-common/vfprintf.c43
-rw-r--r--stdio-common/vfscanf.c8
-rw-r--r--stdlib/Makefile4
-rw-r--r--stdlib/atexit.c11
-rw-r--r--stdlib/cxa_finalize.c4
-rw-r--r--stdlib/stdlib.h16
-rw-r--r--sunrpc/auth_unix.c2
-rw-r--r--sunrpc/clnt_raw.c2
-rw-r--r--sunrpc/pm_getmaps.c2
-rw-r--r--sunrpc/rpc_main.c2
-rw-r--r--sunrpc/svc_run.c38
-rw-r--r--sysdeps/alpha/dl-machine.h28
-rw-r--r--sysdeps/alpha/libc-tls.c6
-rw-r--r--sysdeps/generic/ldsodefs.h72
-rw-r--r--sysdeps/generic/tls.h7
-rw-r--r--sysdeps/gnu/errlist-compat.awk12
-rw-r--r--sysdeps/gnu/netinet/tcp.h1
-rw-r--r--sysdeps/gnu/siglist.c27
-rw-r--r--sysdeps/i386/bits/byteswap.h6
-rw-r--r--sysdeps/i386/dl-machine.h12
-rw-r--r--sysdeps/i386/fpu/e_log.S11
-rw-r--r--sysdeps/i386/fpu/e_logf.S11
-rw-r--r--sysdeps/i386/fpu/e_logl.S11
-rw-r--r--sysdeps/i386/fpu/e_pow.S18
-rw-r--r--sysdeps/i386/fpu/e_powf.S18
-rw-r--r--sysdeps/i386/fpu/e_powl.S18
-rw-r--r--sysdeps/i386/fpu/math_private.h18
-rw-r--r--sysdeps/i386/fpu/s_nextafterl.c18
-rw-r--r--sysdeps/i386/fpu/s_nexttoward.c25
-rw-r--r--sysdeps/i386/fpu/s_nexttowardf.c25
-rw-r--r--sysdeps/i386/i486/bits/atomic.h370
-rw-r--r--sysdeps/i386/i686/memcmp.S70
-rw-r--r--sysdeps/i386/ldbl2mpn.c13
-rw-r--r--sysdeps/i386/soft-fp/sfp-machine.h89
-rw-r--r--sysdeps/i386/sysdep.h14
-rw-r--r--sysdeps/ia64/dl-machine.h6
-rw-r--r--sysdeps/ia64/fpu/fesetround.c6
-rw-r--r--sysdeps/ia64/ldbl2mpn.c1
-rw-r--r--sysdeps/ia64/libc-tls.c6
-rw-r--r--sysdeps/ieee754/dbl-64/e_pow.c22
-rw-r--r--sysdeps/ieee754/flt-32/s_nextafterf.c20
-rw-r--r--sysdeps/ieee754/ldbl-128/s_nextafterl.c18
-rw-r--r--sysdeps/ieee754/ldbl-128/s_nexttoward.c23
-rw-r--r--sysdeps/ieee754/ldbl-128ibm/mpn2ldbl.c75
-rw-r--r--sysdeps/ieee754/ldbl-128ibm/printf_fphex.c35
-rw-r--r--sysdeps/ieee754/ldbl-128ibm/s_fpclassifyl.c37
-rw-r--r--sysdeps/ieee754/ldbl-128ibm/s_nextafterl.c107
-rw-r--r--sysdeps/ieee754/ldbl-128ibm/s_nexttoward.c23
-rw-r--r--sysdeps/ieee754/ldbl-128ibm/s_nexttowardf.c26
-rw-r--r--sysdeps/ieee754/ldbl-96/s_nextafterl.c20
-rw-r--r--sysdeps/ieee754/ldbl-96/s_nexttoward.c23
-rw-r--r--sysdeps/ieee754/ldbl-96/s_nexttowardf.c28
-rw-r--r--sysdeps/ieee754/ldbl-opt/s_nexttowardfd.c28
-rw-r--r--sysdeps/mach/hurd/fork.c4
-rw-r--r--sysdeps/mach/hurd/futimes.c18
-rw-r--r--sysdeps/mach/hurd/i386/tls.h5
-rw-r--r--sysdeps/mach/hurd/lutimes.c17
-rw-r--r--sysdeps/mach/hurd/utimes.c19
-rw-r--r--sysdeps/posix/euidaccess.c10
-rw-r--r--sysdeps/posix/getaddrinfo.c14
-rw-r--r--sysdeps/powerpc/fpu/bits/mathinline.h58
-rw-r--r--sysdeps/powerpc/fpu/math_private.h83
-rw-r--r--sysdeps/powerpc/powerpc32/dl-machine.c6
-rw-r--r--sysdeps/powerpc/powerpc32/dl-machine.h8
-rw-r--r--sysdeps/powerpc/powerpc32/sysdep.h2
-rw-r--r--sysdeps/powerpc/powerpc64/dl-machine.h11
-rw-r--r--sysdeps/s390/libc-tls.c8
-rw-r--r--sysdeps/s390/s390-32/dl-machine.h12
-rw-r--r--sysdeps/s390/s390-64/dl-machine.h12
-rw-r--r--sysdeps/sh/dl-machine.h6
-rw-r--r--sysdeps/sparc/sparc32/dl-machine.h4
-rw-r--r--sysdeps/sparc/sparc64/dl-machine.h4
-rw-r--r--sysdeps/unix/sysv/linux/Versions3
-rw-r--r--sysdeps/unix/sysv/linux/bits/statvfs.h6
-rw-r--r--sysdeps/unix/sysv/linux/check_pf.c42
-rw-r--r--sysdeps/unix/sysv/linux/i386/clone.S4
-rw-r--r--sysdeps/unix/sysv/linux/i386/getgroups.c5
-rw-r--r--sysdeps/unix/sysv/linux/i386/sigaction.c14
-rw-r--r--sysdeps/unix/sysv/linux/ifaddrs.c75
-rw-r--r--sysdeps/unix/sysv/linux/internal_statvfs.c4
-rw-r--r--sysdeps/unix/sysv/linux/posix_madvise.c38
-rw-r--r--sysdeps/unix/sysv/linux/sh/bits/shm.h101
-rw-r--r--sysdeps/unix/sysv/linux/sh/sys/io.h48
-rw-r--r--sysdeps/unix/sysv/linux/sys/epoll.h20
-rw-r--r--sysdeps/unix/sysv/linux/syscalls.list4
-rw-r--r--sysdeps/unix/sysv/linux/x86_64/Makefile2
-rw-r--r--sysdeps/unix/sysv/linux/x86_64/clone.S4
-rw-r--r--sysdeps/unix/sysv/linux/x86_64/sigaction.c104
-rw-r--r--sysdeps/unix/sysv/linux/x86_64/ucontext_i.sym3
-rw-r--r--sysdeps/x86_64/bits/atomic.h334
-rw-r--r--sysdeps/x86_64/bits/byteswap.h7
-rw-r--r--sysdeps/x86_64/dl-machine.h8
-rw-r--r--sysdeps/x86_64/fpu/e_log10l.S5
-rw-r--r--sysdeps/x86_64/fpu/e_log2l.S5
-rw-r--r--sysdeps/x86_64/fpu/e_logl.S12
-rw-r--r--sysdeps/x86_64/fpu/e_powl.S19
-rw-r--r--sysdeps/x86_64/fpu/math_private.h21
-rw-r--r--sysdeps/x86_64/fpu/s_copysign.S5
-rw-r--r--sysdeps/x86_64/fpu/s_copysignf.S3
-rw-r--r--sysdeps/x86_64/fpu/s_log1pl.S5
-rw-r--r--sysdeps/x86_64/ldbl2mpn.c1
-rw-r--r--sysdeps/x86_64/soft-fp/sfp-machine.h51
-rw-r--r--time/Makefile5
-rw-r--r--time/strptime_l.c11
-rw-r--r--time/tst-strptime3.c55
-rw-r--r--time/tzfile.c114
-rw-r--r--timezone/africa73
-rw-r--r--timezone/antarctica32
-rw-r--r--timezone/asia315
-rw-r--r--timezone/australasia52
-rw-r--r--timezone/backward3
-rw-r--r--timezone/checktab.awk2
-rw-r--r--timezone/europe254
-rw-r--r--timezone/ialloc.c7
-rw-r--r--timezone/iso3166.tab12
-rw-r--r--timezone/northamerica614
-rw-r--r--timezone/private.h83
-rw-r--r--timezone/scheck.c7
-rw-r--r--timezone/southamerica193
-rw-r--r--timezone/tzfile.h23
-rw-r--r--timezone/tzselect.ksh2
-rw-r--r--timezone/zdump.c37
-rw-r--r--timezone/zic.c709
-rw-r--r--timezone/zone.tab43
-rw-r--r--tls.make.c6
-rw-r--r--version.h4
448 files changed, 13180 insertions, 10321 deletions
diff --git a/ChangeLog b/ChangeLog
index 88065954f44..3ad38a2b310 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,15 +1,864 @@
-2007-01-11 Jakub Jelinek <jakub@redhat.com>
+2007-07-31 Jakub Jelinek <jakub@redhat.com>
+
+ * NEWS, version.h (VERSION): 2.5.1.
+
+ * stdio-common/tfformat.c (sprint_doubles): Add 12 new tests.
+
+2007-07-28 Ulrich Drepper <drepper@redhat.com>
+
+ [BZ #4858]
+ * stdio-common/printf_fp.c (___printf_fp): Fix special case of
+ #.0g and value rounded to 1.0.
+ * stdio-common/tfformat.c (sprint_doubles): Add two new tests.
+
+2007-07-03 Jakub Jelinek <jakub@redhat.com>
+
+ [BZ #4702]
+ * nis/nss-default.c: Include errno.h.
+ (init): Preserve errno.
+
+2007-07-01 Jakub Jelinek <jakub@redhat.com>
+
+ * elf/dl-sysdep.c (_dl_important_hwcaps): Add integer overflow check.
+ * elf/dl-minimal.c (__libc_memalign): Likewise. Handle malloc (0).
+ Return NULL if mmap failed instead of asserting it does not.
+ (calloc): Check for integer overflow.
+
+ * elf/dl-minimal.c (__strtoul_internal): Fix parsing of numbers bigger
+ than LONG_MAX / 10.
+
+2007-06-19 Ulrich Drepper <drepper@redhat.com>
+
+ * sysdeps/generic/ldsodefs.h (rtld_global): Reorder some elements
+ to fill in holes
+ (rtld_global_ro): Likewise.
+
+2007-06-18 Jakub Jelinek <jakub@redhat.com>
+
+ * elf/dl-addr.c (_dl_addr): Skip PT_LOAD checking if l_contiguous.
+ Move PT_LOAD checking to...
+ (_dl_addr_inside_object): ... here, new function.
+ * elf/dl-sym.c (do_sym): If not l_contiguous,
+ call _dl_addr_inside_object.
+ * elf/dl-iteratephdr.c (__dl_iterate_phdr): Likewise.
+ * dlfcn/dlinfo.c (dlinfo_doit): Likewise.
+ * elf/dl-open.c (dl_open_worker): Likewise.
+ (_dl_addr_inside_object): New function if IS_IN_rtld.
+ * elf/dl-load.c (_dl_map_object_from_fd): Set l_contiguous if no
+ holes are present or are PROT_NONE protected.
+ * include/link.h (struct link_map): Add l_contiguous field.
+ * sysdeps/generic/ldsodefs.h (_dl_addr_inside_object): New prototype.
+
+2007-06-18 Jakub Jelinek <jakub@redhat.com>
+
+ * elf/rtld.c (dl_main): Don't call init_tls more than once.
+
+2007-06-19 Ulrich Drepper <drepper@redhat.com>
+
+ * elf/dl-close.c (free_mem): Free _dl_scope_free_list.
+
+2007-06-13 Jakub Jelinek <jakub@redhat.com>
+
+ * include/link.h: Don't include rtld-lowlevel.h.
+ (struct link_map): Remove l_scope_lock.
+ * sysdeps/generic/ldsodefs.h: Don't include rtld-lowlevel.h.
+ (_dl_scope_free_list): New field (variable) in _rtld_global.
+ (DL_LOOKUP_SCOPE_LOCK): Remove.
+ (_dl_scope_free): New prototype.
+ * elf/dl-runtime.c (_dl_fixup): Don't use __rtld_mrlock_*lock.
+ Don't pass DL_LOOKUP_SCOPE_LOCK to _dl_lookup_symbol_x.
+ (_dl_profile_fixup): Likewise.
+ * elf/dl-sym.c (do_sym): Likewise. Use wrapped _dl_lookup_symbol_x
+ whenever !RTLD_SINGLE_THREAD_P, use THREAD_GSCOPE_SET_FLAG and
+ THREAD_GSCOPE_RESET_FLAG around it.
+ * elf/dl-close.c (_dl_close_worker): Don't use
+ __rtld_mrlock_{change,done}. Call _dl_scope_free on the old
+ scope. Make sure THREAD_GSCOPE_WAIT () happens if any old
+ scopes were queued or if l_scope_mem has been abandoned.
+ * elf/dl-open.c (_dl_scope_free): New function.
+ (dl_open_worker): Use it. Don't use __rtld_mrlock_{change,done}.
+ * elf/dl-support.c (_dl_scope_free_list): New variable.
+ * elf/dl-lookup.c (add_dependency): Remove flags argument.
+ Remove DL_LOOKUP_SCOPE_LOCK handling.
+ (_dl_lookup_symbol_x): Adjust caller. Remove DL_LOOKUP_SCOPE_LOCK
+ handling.
+ * elf/dl-object.c (_dl_new_object): Don't use
+ __rtld_mrlock_initialize.
- [BZ #3855]
- * stdlib/strtod_l.c (____STRTOF_INTERNAL): 0x. not followed by
- hexadecimal digit should accept just the initial 0.
- * stdlib/tst-strtod2.c (tests): New variable.
- (do_test): Run several tests rather than just one.
+2007-06-09 Ulrich Drepper <drepper@redhat.com>
-2007-01-11 Jakub Jelinek <jakub@redhat.com>
+ * elf/do-lookup.h (do_lookup_x): Read r_nlist before r_list and
+ make sure gcc doesn't mess around with this.
+
+2007-06-08 Ulrich Drepper <drepper@redhat.com>
+
+ * elf/dl-lookup.c (_dl_lookup_symbol_x): Remove use of r_nlist.
+
+2007-06-08 Jakub Jelinek <jakub@redhat.com>
+
+ * elf/dl-close.c (_dl_close_worker): Remove all to be removed
+ libraries from the global scope at once and call THREAD_GSCOPE_WAIT
+ at most once per _dl_close_worker.
+
+2007-05-18 Ulrich Drepper <drepper@redhat.com>
+
+ * elf/dl-close.c (_dl_close_worker): When removing object from
+ global scope, wait for all lookups to finish afterwards.
+ * elf/dl-open.c (add_to_global): When global scope array must
+ grow, allocate a new one and free old array only after all
+ lookups finish.
+ * elf/dl-runtime.c (_dl_fixup): Protect using global scope.
+ (_dl_lookup_symbol_x): Likewise.
+ * elf/dl-support.c: Define _dl_wait_lookup_done.
+ * sysdeps/generic/ldsodefs.h (struct rtld_global): Add
+ _dl_wait_lookup_done.
+
+2007-05-11 Ulrich Drepper <drepper@redhat.com>
+
+ * elf/dl-close.c (_dl_close_worker): Help gcc to optimize by
+ adding new variables.
+
+ * elf/dl-open.c (add_to_global): Introduce variable ns to help gcc
+ optimize. Completely extend global scope array before making the
+ new entries visible.
+
+2007-01-15 Ulrich Drepper <drepper@redhat.com>
+
+ * sysdeps/generic/ldsodefs.h: Define DL_LOOKUP_SCOPE_LOCK.
+ * elf/dl-lookup.c (add_dependency): If scope map is locked, unlock
+ it before getting dl_load_lock and then relock.
+ (_dl_lookup_symbol_x): Pass flags to add_dependency.
+ When rerunning _dl_lookup_symbol_x, compute symbol_scope again in
+ case we unlocked the scope.
+ * elf/dl-runtime.c (_dl_fixup): Pass DL_LOOKUP_SCOPE_LOCK to
+ _dl_lookup_symbol_x in case we locked the scope.
+ (_dl_profile_fixup): Likewise.
+ * elf/dl-sym.c (do_sym): In flags passed to call_dl_lookup, also
+ set DL_LOOKUP_SCOPE_LOCK.
+
+2006-10-29 Jakub Jelinek <jakub@redhat.com>
+
+ * elf/dl-sym.c (do_sym): Use RTLD_SINGLE_THREAD_P.
+ * elf/dl-runtime.c (_dl_fixup, _dl_profile_fixup): Likewise.
+ * elf/dl-close.c (_dl_close_worker): Likewise.
+ * elf/dl-open.c (_dl_open_worker): Likewise.
+ * sysdeps/generic/sysdep-cancel.h (RTLD_SINGLE_THREAD_P): Define.
+
+2006-10-27 Jakub Jelinek <jakub@redhat.com>
+
+ * elf/dl-lookup.c (_dl_debug_bindings): Remove unused symbol_scope
+ argument.
+ (_dl_lookup_symbol_x): Adjust caller.
+
+ * sysdeps/generic/ldsodefs.h (struct link_namespaces): Remove
+ _ns_global_scope.
+ * elf/rtld.c (dl_main): Don't initialize _ns_global_scope.
+
+ * elf/dl-libc.c: Revert l_scope name changes.
+ * elf/dl-load.c: Likewise.
+ * elf/dl-object.c: Likewise.
+ * elf/rtld.c: Likewise.
+ * elf/dl-close.c (_dl_close): Likewise.
+ * elf/dl-open.c (dl_open_worker): Likewise. If not SINGLE_THREAD_P,
+ always use __rtld_mrlock_{change,done}. Always free old scope list
+ here if not l_scope_mem.
+ * elf/dl-runtime.c (_dl_fixup, _dl_profile_fixup): Revert l_scope name
+ change. Never free scope list here. Just __rtld_mrlock_lock before
+ the lookup and __rtld_mrlock_unlock it after the lookup.
+ * elf/dl-sym.c: Likewise.
+ * include/link.h (struct r_scoperec): Remove.
+ (struct link_map): Replace l_scoperec with l_scope, l_scoperec_mem
+ with l_scope_mem and l_scoperec_lock with l_scope_lock.
+
+2006-10-18 Ulrich Drepper <drepper@redhat.com>
+
+ * elf/dl-lookup.c (_dl_lookup_symbol_x): Add warning to
+ _dl_lookup_symbol_x code.
+
+2006-10-17 Jakub Jelinek <jakub@redhat.com>
+
+ * elf/dl-runtime.c: Include sysdep-cancel.h.
+ (_dl_fixup, _dl_profile_fixup): Use __rtld_mrlock_* and
+ scoperec->nusers only if !SINGLE_THREAD_P.
+ * elf/dl-sym.c: Include sysdep-cancel.h.
+ (do_sym): Use __rtld_mrlock_* and scoperec->nusers only
+ if !SINGLE_THREAD_P.
+ * elf/dl-close.c: Include sysdep-cancel.h.
+ (_dl_close): Use __rtld_mrlock_* and scoperec->nusers only
+ if !SINGLE_THREAD_P.
+ * elf/dl-open.c: Include sysdep-cancel.h.
+ (dl_open_worker): Use __rtld_mrlock_* and scoperec->nusers only
+ if !SINGLE_THREAD_P.
+
+2006-10-09 Ulrich Drepper <drepper@redhat.com>
+ Jakub Jelinek <jakub@redhat.com>
+
+ Implement reference counting of scope records.
+ * elf/dl-close.c (_dl_close): Remove all scopes from removed objects
+ from the list in objects which remain. Always allocate new scope
+ record.
+ * elf/dl-open.c (dl_open_worker): When growing array for scopes,
+ don't resize, allocate a new one.
+ * elf/dl-runtime.c: Update reference counters before using a scope
+ array.
+ * elf/dl-sym.c: Likewise.
+ * elf/dl-libc.c: Adjust for l_scope name change.
+ * elf/dl-load.c: Likewise.
+ * elf/dl-object.c: Likewise.
+ * elf/rtld.c: Likewise.
+ * include/link.h: Include <rtld-lowlevel.h>. Define struct
+ r_scoperec. Replace r_scope with pointer to r_scoperec structure.
+ Add l_scoperec_lock.
+ * sysdeps/generic/ldsodefs.h: Include <rtld-lowlevel.h>.
+ * sysdeps/generic/rtld-lowlevel.h: New file.
+
+2007-06-06 Jakub Jelinek <jakub@redhat.com>
+
+ [BZ #4586]
+ * sysdeps/i386/ldbl2mpn.c (__mpn_extract_long_double): Treat
+ pseudo-zeros as zero.
+ * sysdeps/x86_64/ldbl2mpn.c: New file.
+ * sysdeps/ia64/ldbl2mpn.c: New file.
+
+2007-06-05 Jakub Jelinek <jakub@redhat.com>
+
+ * sysdeps/ieee754/ldbl-128ibm/mpn2ldbl.c
+ (__mpn_construct_long_double): Fix conversion where result ought
+ to be smaller than __LDBL_MIN__, or the low double should be
+ denormal. Fix decision where to negate low double - honor round
+ to even rules.
+ * stdio-common/tst-sprintf2.c: Include string.h.
+ (COMPARE_LDBL): Define.
+ (TEST): Also test whether a string hexadecimal float representation
+ can be parsed back to the number.
+ (main): Add a couple of further tests.
+
+2007-06-04 Jakub Jelinek <jakub@redhat.com>
+
+ * sysdeps/ieee754/ldbl-128ibm/printf_fphex.c
+ (PRINT_FPHEX_LONG_DOUBLE): Fix printing numbers where lower double
+ is non-zero, but smaller than 2 * __DBL_MIN__.
+ * stdio-common/tst-sprintf2.c: New test.
+ * stdio-common/Makefile (tests): Add tst-sprintf2.
+
+2007-06-04 Jakub Jelinek <jakub@redhat.com>
+
+ * sysdeps/ieee754/ldbl-128ibm/s_nextafterl.c (nextafterl): Remove
+ unused ily variable. Fix nextafterl on +-__LDBL_MAX__ and +-Inf.
+ Remove unreachable code at the end.
+
+2007-06-01 Steven Munroe <sjmunroe@us.ibm.com>
+
+ * sysdeps/ieee754/ldbl-128ibm/s_fpclassifyl.c: Correct description of
+ ldbl-128ibm in comment.
+ (fpclassifyl): Correct classification of denormals.
+ * sysdeps/ieee754/ldbl-128ibm/s_nextafterl.c (nextafterl): Correct
+ return value for MIN denormal. Rewrite using long double math too
+ correctly handle denormals and canonicalize the results.
+
+2007-05-29 Ulrich Drepper <drepper@redhat.com>
+
+ * nscd/nscd_helper.c (get_mapping): Handle short replies instead
+ of crashing. When this is the case or if the reply is malformed,
+ don't try to close the new file descriptor since it does not
+ exist.
+ Patch in part by Guillaume Chazarain <guichaz@yahoo.fr>.
+
+2007-05-21 Jakub Jelinek <jakub@redhat.com>
+
+ [BZ #4514]
+ * stdio-common/vfprintf.c (vfprintf): Don't shadow workstart variable,
+ reinitialize workend at the start of each do_positional format spec
+ loop, free workstart before do_positional loops.
+ (printf_unknown): Fix size of work_buffer.
+ * stdio-common/tst-sprintf.c (main): Add 3 new testcases.
+
+2007-05-10 Ulrich Drepper <drepper@redhat.com>
+
+ * include/sys/cdefs.h: Redefine __nonnull so that test for
+ incorrect parameters in the libc code itself are not omitted.
+
+2007-05-07 Ulrich Drepper <drepper@redhat.com>
+ Jakub Jelinek <jakub@redhat.com>
+
+ * malloc/arena.c (heap_info): Add mprotect_size field, adjust pad.
+ (new_heap): Initialize mprotect_size.
+ (grow_heap): When growing, only mprotect from mprotect_size till
+ new_size if mprotect_size is smaller. When shrinking, use PROT_NONE
+ MMAP for __libc_enable_secure only, otherwise use MADV_DONTNEED.
+
+2007-05-06 Ulrich Drepper <drepper@redhat.com>
+
+ * stdio-common/vfprintf.c (process_string_arg): Optimize
+ ridiculous precision in wide char code printing multi-byte string.
+ Reported by Jim Meyering <jim@meyering.net>.
+
+2007-05-06 Ulrich Drepper <drepper@redhat.com>
+
+ [BZ #4465]
+ * posix/unistd.h: Remove __THROW from fdatasync.
+
+2007-05-06 Mike Frysinger <vapier@gentoo.org>
+
+ [BZ #4465]
+ * sysdeps/unix/sysv/linux/syscalls.list (fdatasync): Add "C" to args.
+
+2007-05-06 Ulrich Drepper <drepper@redhat.com>
+
+ [BZ #4131]
+ * elf/dl-addr.c (_dl_addr): Compare address with actual segment
+ boundaries to work around systems with overlapping binary loading.
+ Based on a patch by Suzuki <suzuki@in.ibm.com>.
+
+2007-05-04 Ulrich Drepper <drepper@redhat.com>
+
+ * stdio-common/vfprintf.c (process_string_arg): Adjust call to
+ __mbsnrtowcs after last change.
+
+2007-05-02 Jakub Jelinek <jakub@redhat.com>
+
+ * stdio-common/vfprintf.c (process_string_arg): Use a VLA rather than
+ fixed length array for ignore.
+
+2007-04-30 Ulrich Drepper <drepper@redhat.com>
+
+ [BZ #4438]
+ * stdio-common/vfprintf.c (process_string_arg): Don't overflow the
+ stack for large precisions.
+ * stdio-common/test-vfprintf.c (main): Add test for large
+ precision.
+
+2007-04-30 Jakub Jelinek <jakub@redhat.com>
+
+ * stdio-common/printf_fp.c (___printf_fp): Don't print negative sign
+ for exponent 0.
+ * stdio-common/tfformat.c (sprint_doubles): Add a new test.
+
+2007-04-30 Jakub Jelinek <jakub@redhat.com>
+
+ [BZ #4439]
+ * resolv/inet_ntop.c (inet_ntop4): Take terminating '\0' into
+ account in the size check.
+ * resolv/tst-inet_ntop.c: New test.
+ * resolv/Makefile (tests): Add tst-inet_ntop.
+
+2007-04-28 Ulrich Drepper <drepper@redhat.com>
+
+ [BZ #4102]
+ * sysdeps/posix/getaddrinfo.c (default_labels): Assign separate
+ label to Teredo tunnel addresses 2001://32.
+
+2007-04-27 Ulrich Drepper <drepper@redhat.com>
+
+ [BZ #4342]
+ * stdio-common/vfscanf.c (_IO_vfscanf_internal): Allow
+ hexa-decimal floats without exponent.
+ * stdio-common/tstscanf.c (main): Adjust Test 8 test for success.
+
+2007-04-27 Ulrich Drepper <drepper@redhat.com>
+
+ [BZ #3213]
+ * locale/C-translit.h.in: Add entry for U2044.
+
+2007-04-25 Jakub Jelinek <jakub@redhat.com>
+
+ * sysdeps/unix/sysv/linux/check_pf.c (make_request): Return -1 instead
+ of 0 after the out_fail label.
+
+2007-03-18 Jakub Jelinek <jakub@redhat.com>
+
+ * nscd/gai.c: Include alloca.h.
+ (__libc_use_alloca): Define.
+
+2007-03-15 Jakub Jelinek <jakub@redhat.com>
+
+ * sysdeps/unix/sysv/linux/ifaddrs.c (__netlink_request): Never
+ reallocate the buffer, instead fail for MSG_TRUNC or for EBUSY
+ NLMSG_ERR. Instead use a page sized buffer.
+ * sysdeps/unix/sysv/linux/check_pf.c (make_request): Use page sized
+ buffer.
+
+2007-03-02 Jakub Jelinek <jakub@redhat.com>
+
+ * sysdeps/unix/sysv/linux/ifaddrs.c (__netlink_request): Retry with
+ a new netlink socket if NLMSG_ERR -EBUSY is seen after some MSG_TRUNC
+ message.
+
+2007-02-27 Jakub Jelinek <jakub@redhat.com>
+
+ * sysdeps/unix/sysv/linux/ifaddrs.c (__netlink_request): Fix
+ memory reallocation.
+
+2007-04-25 Jakub Jelinek <jakub@redhat.com>
+
+ * libio/bits/stdio.h (fgetc_unlocked): Add extern inline optimized
+ version.
+
+2007-04-25 Ulrich Drepper <drepper@redhat.com>
+
+ [BZ #4406]
+ * iconv/gconv_charset.h (strip): Allow ':'
+ * iconv/iconv_open.c (iconv_open): Adjust comment.
+
+2007-04-23 Jakub Jelinek <jakub@redhat.com>
+
+ [BZ #4405]
+ * iconvdata/gconv-modules (E13B): Add a missing slash to the alias
+ name. Patch by Aurelien Jarno <aurelien@aurel32.net>.
- * sysdeps/i386/soft-fp/sfp-machine.h: Remove.
- * sysdeps/x86_64/soft-fp/sfp-machine.h: Likewise.
+2007-04-23 Jakub Jelinek <jakub@redhat.com>
+
+ [BZ #4381]
+ * nss/nss_files/files-hosts.c (HOST_DB_LOOKUP): Ensure sufficient
+ alignment of buffer and tmp_buffer.
+ * nis/nss_nis/nis-hosts.c (internal_nis_gethostent_r,
+ internal_gethostbyname2_r, _nss_nis_gethostbyaddr_r): Ensure sufficient
+ alignment of buffer.
+ * resolv/nss_dns/dns-hosts.c (getanswer_r): Likewise. Handle buflen
+ bigger than INT_MAX.
+ * resolv/nss_dns/dns-network.c (getanswer_r): Likewise. Add errnop and
+ h_errnop arguments. Fail if buflen is too small.
+ (_nss_dns_getnetbyname_r, _nss_dns_getnetbyaddr_r): Adjust callers.
+
+2007-04-19 Ulrich Drepper <drepper@redhat.com>
+
+ * include/sys/mman.h: Mark madvise hidden.
+ * misc/madvise.c: Add libc_hidden_def.
+
+2007-04-17 Ulrich Drepper <drepper@redhat.com>
+
+ [BZ #4368]
+ * stdlib/stdlib.h: Remove obsolete part of comment for realpath.
+
+2007-04-16 Ulrich Drepper <drepper@redhat.com>
+
+ [BZ #4364]
+ * posix/unistd.h (_XOPEN_VERSION): Define appropriately for SUSv3.
+
+2007-04-13 Jakub Jelinek <jakub@redhat.com>
+
+ [BZ #4344]
+ * elf/ldconfig.c (search_dir): Fix 2 off-by-2 errors.
+ Reported by David Anderson <davea42@earthlink.net>.
+
+2007-04-13 Jakub Jelinek <jakub@redhat.com>
+
+ * stdio-common/printf_fp.c (___printf_fp): Fix exponent -4
+ special case handling when wcp == wstartp + 1. Fix a comment typo.
+ * stdio-common/tfformat.c (sprint_doubles): Add a new testcase.
+
+2007-02-21 Ulrich Drepper <drepper@redhat.com>
+
+ [BZ #4070]
+ * stdio-common/printf_fp.c (___printf_fp): Handle a few more
+ special cases.
+ * stdio-common/tfformat.c (sprint_doubles): Some more tests.
+
+2007-02-19 Ulrich Drepper <drepper@redhat.com>
+
+ * stdio-common/printf_fp.c (___printf_fp): Cleanups and minor
+ optimization.
+
+2007-04-06 Jakub Jelinek <jakub@redhat.com>
+
+ * nis/nis_domain_of.c (__nis_domain_of): New function.
+ * include/rpcsvc/nislib.h (__nis_domain_of): New prototype.
+ * nis/nis_lookup.c (nis_lookup): Use __nis_domain_of.
+ * nis/nis_call.c (rec_dirsearch): Likewise.
+ (first_shoot): Likewise. Remove search_parent_first argument.
+ (struct nis_server_cache): Rename search_parent_first field
+ to search_parent.
+ (nis_server_cache_search, nis_server_cache_add): Rename
+ search_parent_first argument to search_parent.
+ (__nisfind_server): Likewise. If search_parent, call
+ __nis_domain_of.
+
+2007-04-05 Jakub Jelinek <jakub@redhat.com>
+
+ * nis/nis_call.c (__nisfind_server): Replace (*dir)->do_servers
+ with obj->do_servers after first_shoot.
+
+2007-03-21 Jakub Jelinek <jakub@redhat.com>
+
+ * nis/nis_call.c: Include bits/libc-lock.h, sys/stat.h, unistd.h.
+ (nis_server_cache, nis_server_cache_lock, nis_cold_start_mtime): New
+ variables.
+ (nis_server_cache_search, nis_server_cache_add): New functions.
+ (__nisfind_server): Use them. Add dbp and flags argument, if
+ call __nisbind_create.
+ (__nisbind_create): Add server_used and current_ep arguments,
+ only call __nis_findfastest if server_used is ~0.
+ (__do_niscall2, __prepare_niscall): Adjust callers.
+ (ckey_cache, ckey_cache_size, ckey_cache_allocated, ckey_cache_pid,
+ ckey_cache_euid, ckey_cache_lock): New variables.
+ (get_ckey): New function.
+ (__nisbind_connect): If not dbp->use_udp, pass IPPROTO_TCP to
+ __pmap_getnisport. Save __pmap_getnisport result in
+ dbp->addr.sin_port if non-zero. Use get_ckey to create conversation
+ key.
+ * nis/nis_lookup.c (nis_lookup): Likewise.
+ * nis/nis_table.c (nis_list): Likewise.
+ * nis/rpcsvc/nislib.h (__nisbind_create, __nisfind_server): Adjust
+ prototypes.
+
+ * nis/nss_nisplus/nisplus-pwd.c (_nss_nisplus_getpwnam_r,
+ _nss_nisplus_getpwuid_r): Pass USE_DGRAM flag to nis_list.
+ * nis/nss_nisplus/nisplus-service.c (_nss_nisplus_getservbyname_r,
+ _nss_nisplus_getservbyport_r): Likewise.
+ * nis/nss_nisplus/nisplus-network.c (_nss_nisplus_getnetbyname_r,
+ _nss_nisplus_getnetbyaddr_r): Likewise.
+ * nis/nss_nisplus/nisplus-spwd.c (_nss_nisplus_getspnam_r): Likewise.
+ * nis/nss_nisplus/nisplus-ethers.c (_nss_nisplus_gethostton_r,
+ _nss_nisplus_getntohost_r): Likewise.
+ * nis/nss_nisplus/nisplus-rpc.c (_nss_nisplus_getrpcbyname_r,
+ _nss_nisplus_getrpcbynumber_r): Likewise.
+
+2007-04-01 Jakub Jelinek <jakub@redhat.com>
+
+ * sysdeps/ia64/fpu/fesetround.c (fesetround): Return 0 on success
+ and 1 on failure.
+
+2007-04-01 Jakub Jelinek <jakub@redhat.com>
+
+ * sysdeps/ieee754/ldbl-128ibm/s_nextafterl.c (__nextafterl): Use
+ math_opt_barrier and math_force_eval macros.
+
+2007-03-27 Jakub Jelinek <jakub@redhat.com>
+
+ [BZ #3306]
+ * math/math_private.h (math_opt_barrier, math_force_eval): Define.
+ * sysdeps/i386/fpu/math_private.h: New file.
+ * sysdeps/x86_64/fpu/math_private.h: New file.
+ * math/s_nexttowardf.c (__nexttowardf): Use math_opt_barrier and
+ math_force_eval macros. Use "+m" constraint on asm rather than
+ "=m" and "m".
+ * math/s_nextafter.c (__nextafter): Likewise.
+ * sysdeps/ieee754/ldbl-128ibm/s_nexttoward.c (__nexttoward):
+ Likewise.
+ * sysdeps/ieee754/flt-32/s_nextafterf.c (__nextafterf): Likewise.
+ * sysdeps/ieee754/ldbl-128/s_nexttoward.c (__nexttoward): Likewise.
+ * sysdeps/ieee754/ldbl-96/s_nexttoward.c (__nexttoward): Likewise.
+ * sysdeps/i386/fpu/s_nextafterl.c (__nextafterl): Use
+ math_opt_barrier and math_force_eval macros.
+ * sysdeps/ieee754/ldbl-128/s_nextafterl.c (__nextafterl): Likewise.
+ * sysdeps/ieee754/ldbl-96/s_nextafterl.c (__nextafterl): Likewise.
+ * sysdeps/i386/fpu/s_nexttoward.c: Include float.h.
+ (__nexttoward): Use math_opt_barrier and
+ math_force_eval macros. Use "+m" constraint on asm rather than
+ "=m" and "m". Only use asm to force double result if
+ FLT_EVAL_METHOD is 2.
+ * sysdeps/i386/fpu/s_nexttowardf.c: Include float.h.
+ (__nexttowardf): Use math_opt_barrier and
+ math_force_eval macros. Use "+m" constraint on asm rather than
+ "=m" and "m". Only use asm to force double result if
+ FLT_EVAL_METHOD is not 0.
+ * sysdeps/ieee754/ldbl-128ibm/s_nexttowardf.c: Include float.h.
+ (__nexttowardf): Use math_opt_barrier and
+ math_force_eval macros. If FLT_EVAL_METHOD is not 0, force
+ x to float using asm.
+ * sysdeps/ieee754/ldbl-opt/s_nexttowardfd.c: Include float.h.
+ (__nldbl_nexttowardf): Use math_opt_barrier and
+ math_force_eval macros. If FLT_EVAL_METHOD is not 0, force
+ x to float using asm.
+ * sysdeps/ieee754/ldbl-96/s_nexttowardf.c: Include float.h.
+ (__nexttowardf): Use math_opt_barrier and math_force_eval
+ macros. If FLT_EVAL_METHOD is not 0, force x to float using asm.
+ * math/bug-nextafter.c (zero, inf): New variables.
+ (main): Add new tests.
+ * math/bug-nexttoward.c (zero, inf): New variables.
+ (main): Add new tests.
+
+2007-03-30 Jakub Jelinek <jakub@redhat.com>
+
+ * libio/libio.h (__underflow, __uflow, __overflow, __wunderflow,
+ __wuflow, __woverflow, _IO_getc, _IO_putc, _IO_peekc_locked, _IO_padn,
+ _IO_sgetn, _IO_seekoff, _IO_seekpos, _IO_getwc, _IO_putwc, _IO_wpadn):
+ Remove __THROW.
+ * libio/fileops.c (new_do_write, _IO_file_xsgetn_mmap,
+ _IO_file_xsgetn_maybe_mmap): Likewise.
+ * libio/oldfileops.c (old_do_write): Likewise.
+ * libio/libioP.h (_IO_switch_to_get_mode, _IO_switch_to_wget_mode,
+ _IO_init_marker, _IO_init_wmarker, _IO_default_uflow,
+ _IO_wdefault_uflow, _IO_default_setbuf, _IO_default_seekpos,
+ _IO_do_write, _IO_new_do_write, _IO_old_do_write, _IO_wdo_write,
+ _IO_flush_all_lockp, _IO_flush_all, _IO_cleanup,
+ _IO_flush_all_linebuffered, _IO_new_fgetpos, _IO_old_fgetpos,
+ _IO_new_fsetpos, _IO_old_fsetpos, _IO_new_fgetpos64,
+ _IO_old_fgetpos64, _IO_new_fsetpos64, _IO_old_fsetpos64,
+ _IO_file_setbuf, _IO_file_seekoff, _IO_file_xsputn, _IO_file_xsgetn,
+ _IO_file_underflow, _IO_file_underflow_mmap,
+ _IO_file_underflow_maybe_mmap, _IO_file_overflow, _IO_file_attach,
+ _IO_file_open, _IO_file_fopen, _IO_file_write, _IO_file_read,
+ _IO_file_sync, _IO_file_close_it, _IO_file_finish,
+ _IO_new_file_attach, _IO_new_file_close_it, _IO_new_file_finish,
+ _IO_new_file_fopen, _IO_new_file_setbuf, _IO_file_setbuf_mmap,
+ _IO_new_file_sync, _IO_new_file_underflow, _IO_new_file_overflow,
+ _IO_new_file_seekoff, _IO_new_file_write, _IO_new_file_xsputn,
+ _IO_old_file_setbuf, _IO_old_file_seekoff, _IO_old_file_xsputn,
+ _IO_old_file_underflow, _IO_old_file_overflow, _IO_old_file_attach,
+ _IO_old_file_fopen, _IO_old_file_write, _IO_old_file_sync,
+ _IO_old_file_close_it, _IO_old_file_finish, _IO_wfile_xsputn,
+ _IO_wfile_setbuf, _IO_wfile_sync, _IO_wfile_underflow,
+ _IO_wfile_overflow, _IO_wfile_seekoff, _IO_old_proc_open,
+ _IO_old_proc_close, _IO_getdelim, _IO_flush_all_internal,
+ _IO_adjust_column_internal, _IO_default_uflow_internal,
+ _IO_default_xsgetn_internal, _IO_wdefault_xsputn_internal,
+ _IO_wdefault_xsgetn_internal, _IO_wdefault_uflow_internal,
+ _IO_file_setbuf_internal, _IO_file_seekoff_internal,
+ _IO_file_xsputn_internal, _IO_file_xsgetn_internal,
+ _IO_file_close_it_internal, _IO_file_underflow_internal,
+ _IO_file_overflow_internal, _IO_file_attach_internal,
+ _IO_file_fopen_internal, _IO_file_sync_internal,
+ _IO_file_finish_internal, _IO_wfile_xsputn_internal,
+ _IO_wfile_seekoff_internal, _IO_wfile_sync_internal,
+ _IO_switch_to_wget_mode_internal, _IO_padn_internal,
+ _IO_switch_to_get_mode_internal, _IO_seekoff_unlocked,
+ _IO_seekpos_unlocked): Likewise.
+ (_IO_strtod, _IO_dtoa, _IO_outfloat, _IO_read, _IO_write,
+ _IO_lseek, _IO_close, _IO_fstat): Remove unused prototypes.
+
+2007-03-23 Jakub Jelinek <jakub@redhat.com>
+
+ * scripts/check-local-headers.sh: Filter out sys/capability.h.
+
+2007-03-22 Jakub Jelinek <jakub@redhat.com>
+
+ * config.h.in (HAVE_LIBCAP): Add.
+ * nscd/selinux.h: Include sys/capability.h rather than non-existent
+ sys/capabilities.h.
+ * nscd/selinux.c (preserve_capabilities): Use cap_free instead of
+ free_caps. Cast away const from 4th cap_set_flag argument.
+
+2007-03-16 Jakub Jelinek <jakub@redhat.com>
+
+ * elf/dl-open.c (dl_open_worker): Declare l in 2 different
+ smaller scopes.
+ * elf/dl-dst.h (DL_DST_REQ_STATIC): Add l as macro argument.
+ (DL_DST_REQUIRED): Adjust user.
+
+2007-03-15 Jakub Jelinek <jakub@redhat.com>
+
+ * locale/programs/ld-ctype.c (find_translit): Return NULL if ctype is
+ NULL.
+
+2007-03-15 Jakub Jelinek <jakub@redhat.com>
+
+ [BZ #4181]
+ * inet/inet6_opt.c (add_padding): Only insert padding if npad > 0.
+ (inet6_opt_append): Don't check extlen is big enough if extbuf
+ is NULL.
+ (inet6_opt_finish): Likewise.
+ * inet/Makefile (tests): Add test-inet6_opt.
+ * inet/test-inet6_opt.c: New test.
+
+2007-03-15 Jakub Jelinek <jakub@redhat.com>
+
+ [BZ #4130]
+ * login/utmp_file.c (setutent_file): Use O_LARGEFILE for
+ open_not_cancel_2.
+ (updwtmp_file): Likewise.
+
+2007-03-15 Jakub Jelinek <jakub@redhat.com>
+
+ [BZ #4101]
+ * argp/argp-help.c (hol_cluster_cmp): Fix comparisons used to find
+ ancestors with the same depths.
+ Patch by Niels Moeller <nisse@lysator.liu.se>.
+ (filter_doc): Don't crash if argp is NULL.
+ * argp/Makefile (tests): Add tst-argp2.
+ * argp/tst-argp2.c: New test.
+
+2007-03-15 Jakub Jelinek <jakub@redhat.com>
+
+ [BZ #3919]
+ * math/libm-test.inc (log_test): Test -Inf and NaN.
+ (log10_test, log1p_test, log2_test): Test -Inf.
+ * sysdeps/i386/fpu/e_log.S (__ieee754_log): Don't raise
+ FE_INVALID when argument is qNaN.
+ * sysdeps/i386/fpu/e_logl.S (__ieee754_logl): Likewise.
+ * sysdeps/i386/fpu/e_logf.S (__ieee754_logf): Likewise.
+ * sysdeps/x86_64/fpu/e_logl.S (__ieee754_logl): Likewise.
+ * sysdeps/x86_64/fpu/e_log10l.S (__ieee754_log10l): Replace
+ andb $1, %ah with testb $1, %ah, don't test for parity, instead
+ testb $4, %ah and jump if non-zero.
+ * sysdeps/x86_64/fpu/e_log2l.S (__ieee754_log2l): Likewise.
+ * sysdeps/x86_64/fpu/s_log1pl.S (__log1pl): Likewise.
+
+2007-03-06 Ulrich Drepper <drepper@redhat.com>
+
+ * sysdeps/posix/getaddrinfo.c (get_scope): Correct test for
+ 172.16/12 address range.
+
+2007-03-01 Jakub Jelinek <jakub@redhat.com>
+
+ [BZ #4069]
+ * sysdeps/ieee754/dbl-64/e_pow.c (__ieee754_pow): Check for NaN
+ earlier.
+ * math/libm-test.inc (pow_test): Add more tests involving NaNs.
+
+ * sysdeps/i386/fpu/e_powf.S (__ieee754_powf): Avoid invalid exception
+ for x qNaN and y either +-inf or non-integer value.
+ * sysdeps/i386/fpu/e_pow.S (__ieee754_pow): Likewise.
+ * sysdeps/i386/fpu/e_powl.S (__ieee754_powl): Likewise.
+ * sysdeps/x86_64/fpu/e_powl.S (__ieee754_powl): Likewise.
+
+2007-02-21 Ulrich Drepper <drepper@redhat.com>
+
+ [BZ #4076]
+ * io/ftw.c (ftw_startup): Handle special case of FTW_CHDIR in /.
+ (open_dir_stream): Likewise.
+ * io/Makefile (tests): Add bug-ftw5.
+ * io/bug-ftw5.c: New file.
+
+2007-02-21 Ulrich Drepper <drepper@redhat.com>
+
+ * nscd/grpcache.c (cache_addgr): In case a record changed on
+ refresh, adjust key_copy.
+
+ [BZ #4074]
+ * nscd/pwdcache.c (cache_addpw): In case a record changed on
+ refresh, adjust key_copy.
+
+2007-02-21 Ulrich Drepper <drepper@redhat.com>
+
+ [BZ #3458]
+ * sysdeps/unix/sysv/linux/posix_madvise.c: New file.
+ * sysdeps/unix/sysv/linux/syscalls.list: Remove posix_madvise entry.
+
+2007-02-17 Ulrich Drepper <drepper@redhat.com>
+
+ [BZ #3842]
+ * sysdeps/posix/euidaccess.c [_LIBC] (euidaccess): Remove shortcut
+ using __libc_enable_secure.
+
+2007-02-17 Ulrich Drepper <drepper@redhat.com>
+
+ [BZ #3348]
+ * malloc/memusage.sh: Cleanups.
+ * debug/xtrace.sh: Quoting and trap changes.
+
+2007-02-16 Ulrich Drepper <drepper@redhat.com>
+
+ * locale/iso-3166.def: Add entry for Serbia.
+ * locale/iso-4217.def: Define RSD.
+
+2007-02-15 Ulrich Drepper <drepper@redhat.com>
+
+ * nscd/nscd_helper.c (open_socket): Don't send padding bytes from
+ reqdata.
+
+2007-02-13 Ulrich Drepper <drepper@redhat.com>
+
+ * po/ru.po: Update from translation team.
+
+2007-02-03 Ulrich Drepper <drepper@redhat.com>
+
+ * po/sv.po: Update from translation team.
+
+2007-02-12 Jakub Jelinek <jakub@redhat.com>
+
+ * sysdeps/i386/bits/byteswap.h (__bswap_32): Add __amdfam10__
+ to the list of i486+ CPUs.
+ * sysdeps/x86_64/bits/byteswap.h (__bswap_32): Likewise.
+
+2007-01-24 Jakub Jelinek <jakub@redhat.com>
+
+ * sysdeps/i386/bits/byteswap.h (__bswap_32): Add __nocona__, __core2__
+ and __geode__ to the list of i486+ CPUs.
+ * sysdeps/x86_64/bits/byteswap.h (__bswap_32): Likewise.
+
+2007-02-08 Jakub Jelinek <jakub@redhat.com>
+
+ [BZ #3944]
+ * time/strptime_l.c (__strptime_internal): Set have_mon for
+ %b/%B/%h. Set have_mon and have_mday if tm_mon and tm_mday
+ have been computed from tm_yday and tm_year. Don't crash
+ in day_of_the_week or day_of_the_year if not have_mon
+ and tm_mon contains bogus value.
+ * time/Makefile (tests): Add tst-strptime3.
+ * time/tst-strptime3.c: New test.
+
+2007-02-05 Jakub Jelinek <jakub@redhat.com>
+
+ [BZ #3957]
+ * posix/regcomp.c (parse_bracket_exp): Set '\n' bit rather than '\0'
+ bit for RE_HAT_LISTS_NOT_NEWLINE.
+ (build_charclass_op): Remove bogus comment.
+ * posix/Makefile (tests): Add bug-regex27 and bug-regex28.
+ * posix/bug-regex27.c: New test.
+ * posix/bug-regex28.c: New test.
+
+2007-02-02 Bruno Haible <bruno@clisp.org>
+
+ [BZ #3954]
+ * iconvdata/ksc5601.c (__ksc5601_sym_to_ucs, __ksc5601_sym_from_ucs):
+ Add mapping for U+327E.
+ * iconvdata/ksc5601.h (KSC5601_SYMBOL): Increment.
+ * iconvdata/johab.c (BODY for FROM_LOOP, BODY for TO_LOOP): Enable
+ mapping of 0xD9 0xE8.
+ * iconvdata/uhc.c (BODY for FROM_LOOP, BODY for TO_LOOP): Disable
+ mapping of U+327E.
+ Reported by Jungshik Shin <jungshik@google.com>.
+
+ [BZ #3955]
+ * iconvdata/johab.c (BODY for FROM_LOOP, BODY for TO_LOOP): Enable
+ mapping of 0xD9 0xE6 and of 0xD9 0xE7.
+ Reported by Jungshik Shin <jungshik@google.com>.
+
+2007-01-31 Jakub Jelinek <jakub@redhat.com>
+
+ * nscd/nscd-client.h (__nscd_cache_search): Remove const qualifier
+ from return value.
+ * nscd/nscd_helper.c: Include string.h.
+ (__nscd_cache_search): Remove const qualifier from return value.
+ On strict alignment architectures check hash entry and data head
+ alignment.
+ * nscd/nscd_getpw_r.c (nscd_getpw_r): Don't crash or fail because
+ mmapped data during GC cycle contains garbage. If
+ __nscd_drop_map_ref fails, decrement mapped->counter when returning
+ error or if retrying with NO_MAPPING, only __nscd_unmap if counter
+ dropped to 0.
+ * nscd/nscd_getgr_r.c (nscd_getgr_r): Likewise.
+ * nscd/nscd_initgroups.c (__nscd_getgrouplist): Likewise.
+ * nscd/nscd_gethst_r.c (nscd_gethst_r): Likewise.
+ * nscd/nscd_getai.c (__nscd_getai): Likewise.
+
+2007-01-22 Ulrich Drepper <drepper@redhat.com>
+
+ [BZ #3902]
+ * stdio-common/_itoa.c (_itoa): Make sure at least a zero is emitted.
+ * stdio-common/Makefile (tests): Add bug17.
+ * stdio-common/bug17.c: New file.
+
+2007-01-15 Jakub Jelinek <jakub@redhat.com>
+
+ * soft-fp/op-common.h (FP_TRUNC): When truncating a NaN, clear
+ workbits in semi-raw fraction.
+
+ * math/test-misc.c: Add new tests.
+
+2007-01-14 Steven Munroe <sjmunroe@us.ibm.com>
+
+ * math/basic-test.c: Include test-skeleton.c.
+ (TEST_TRUNC): Define.
+ (truncdfsf_test, trunctfsf_test, trunctfdf_test): New.
+ (main): Rename to ...
+ (do_test): ...this. Run new tests.
+ (TEST_FUNCTION): Define.
+
+2006-10-05 Steven Munroe <sjmunroe@us.ibm.com>
+ Joe Kerian <jkerian@us.us.ibm.com>
+
+ [BZ #2749]
+ * soft-fp/op-4.h (__FP_FRAC_SUB_3, __FP_FRAC_SUB_4): Correct borrow
+ handling for high words.
+ * soft-fp/op-common.h (_FP_OVERFLOW_SEMIRAW): Always set inexact
+ and overflow for infinity.
+
+2007-01-13 Ulrich Drepper <drepper@redhat.com>
+
+ * nis/nss_nis/nis-service.c (_nss_nis_getservbyname_r): Correct
+ computation of keylen.
2007-01-10 Ulrich Drepper <drepper@redhat.com>
@@ -17,11 +866,6 @@
fts_read.
Patch by Miloslav Trmac <mitr@redhat.com>.
-2006-10-27 Richard Sandiford <richard@codesourcery.com>
-
- * elf/elf.h (R_MIPS_GLOB_DAT): Define.
- (R_MIPS_NUM): Bump by 1.
-
2007-01-03 Jakub Jelinek <jakub@redhat.com>
* posix/execvp.c: Include alloca.h.
@@ -32,38 +876,77 @@
* posix/Makefile: Add rules to build and run tst-vfork3 test.
* posix/tst-vfork3.c: New test.
+2007-01-05 Steven Munroe <sjmunroe@us.ibm.com>
+
+ * stdlib/tst-makecontext.c: Include errno.h. Change main()
+ to do_test(). Define TEST_FUNCTION. Include test-skeleton.c.
+ (do_test): Check errno and exit(0) if ENOSYS.
+
+2007-01-11 Jakub Jelinek <jakub@redhat.com>
+
+ * stdlib/strtod_l.c (____STRTOF_INTERNAL): Fix handling of multi-byte
+ thousands separators.
+ * stdlib/Makefile: Add rules to build and run tst-strtod4.
+ * stdlib/tst-strtod4.c: New test.
+
+ [BZ #3855]
+ * stdlib/strtod_l.c (____STRTOF_INTERNAL): 0x. not followed by
+ hexadecimal digit should accept just the initial 0.
+ * stdlib/tst-strtod2.c (tests): New variable.
+ (do_test): Run several tests rather than just one.
+
2007-01-03 Ulrich Drepper <drepper@redhat.com>
- * string/Makefile (tst-strxfrm2-ENV): Define.
* stdlib/Makefile (tst-strtod3-ENV): Define.
-2007-01-02 Ulrich Drepper <drepper@redhat.com>
+2006-12-11 Ulrich Drepper <drepper@redhat.com>
+
+ * stdlib/strtod_l.c (____STRTOF_INTERNAL): Parse thousand
+ separators also if no non-zero digits found.
+ * stdlib/Makefile (tests): Add tst-strtod3.
+
+2006-12-09 Ulrich Drepper <drepper@redhat.com>
+
+ [BZ #3664]
+ * stdlib/strtod_l.c (____STRTOF_INTERNAL): Fix test to recognize
+ empty parsed strings.
+ * stdlib/Makefile (tests): Add tst-strtod2.
+ * stdlib/tst-strtod2.c: New file.
+
+ [BZ #3673]
+ * stdlib/strtod_l.c (____STRTOF_INTERNAL): Fix exp_limit
+ computation.
+ * stdlib/Makefile (tests): Add tst-atof2.
+ * stdlib/tst-atof2.c: New file.
- * posix/getconf.c: Update copyright year.
- * nss/getent.c: Likewise.
- * iconv/iconvconfig.c: Likewise.
- * iconv/iconv_prog.c: Likewise.
- * elf/ldconfig.c: Likewise.
- * catgets/gencat.c: Likewise.
- * csu/version.c: Likewise.
- * elf/ldd.bash.in: Likewise.
- * elf/sprof.c (print_version): Likewise.
- * locale/programs/locale.c: Likewise.
- * locale/programs/localedef.c: Likewise.
- * nscd/nscd.c (print_version): Likewise.
- * debug/xtrace.sh: Likewise.
- * malloc/memusage.sh: Likewise.
- * malloc/mtrace.pl: Likewise.
- * debug/catchsegv.sh: Likewise.
+ [BZ #3674]
+ * stdlib/strtod_l.c (____STRTOF_INTERNAL): Adjust exponent value
+ correctly if removing trailing zero of hex-float.
+ * stdlib/Makefile (tests): Add tst-atof1.
+ * stdlib/tst-atof1.c: New file.
-2006-12-24 Ulrich Drepper <drepper@redhat.com>
+2007-01-03 Ulrich Drepper <drepper@redhat.com>
- * malloc/malloc.c (sYSMALLOc): Remove some unnecessary alignment
- attempts.
+ * string/Makefile (tst-strxfrm2-ENV): Define.
-2006-12-23 Ulrich Drepper <drepper@redhat.com>
+2006-11-10 Jakub Jelinek <jakub@redhat.com>
- * posix/wordexp.c: Remove some unnecessary tests.
+ * string/strxfrm_l.c (STRXFRM): Fix trailing \1 optimization
+ if N is one bigger than return value.
+ * string/tst-strxfrm2.c (do_test): Also test strxfrm with l1 + 1
+ and l1 last arguments, if buf is defined, verify the return value
+ equals to strlen (buf) and verify no byte beyond passed length
+ is modified.
+
+2006-11-09 Ulrich Drepper <drepper@redhat.com>
+
+ * string/Makefile (tests): Add tst-strxfrm2.
+ * string/tst-strxfrm2.c: New file.
+
+2006-11-08 Jakub Jelinek <jakub@redhat.com>
+
+ * string/strxfrm_l.c (STRXFRM): Do the trailing \1 removal
+ optimization even if needed > n.
2006-12-22 Gavin Romig-Koch <gavin@redhat.com>
@@ -74,52 +957,30 @@
* include/atomic.h (atomic_forced_read): New macro.
-2006-12-20 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
-
- * sysdeps/unix/sysv/linux/sh/bits/shm.h: New file.
-
2006-12-19 Jakub Jelinek <jakub@redhat.com>
- * nss/getXXbyYY_r.c: Include atomic.h.
- (INTERNAL (REENTRANT_NAME)): Write startp after start_fct,
- add atomic_write_barrier () in between.
-
* stdlib/Makefile (tests): Add tst-makecontext.
* stdlib/tst-makecontext.c: New test.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/makecontext.S
(__makecontext): Don't realign uc_mcontext.uc_regs.
-2006-11-28 Jakub Jelinek <jakub@redhat.com>
+2006-12-13 Jakub Jelinek <jakub@redhat.com>
- * elf/dl-support.c: Include dl-procinfo.h.
- * sysdeps/powerpc/dl-procinfo.h (PPC_PLATFORM_POWER4,
- PPC_PLATFORM_PPC970, PPC_PLATFORM_POWER5, PPC_PLATFORM_POWER5_PLUS,
- PPC_PLATFORM_POWER6, PPC_PLATFORM_CELL_BE, PPC_PLATFORM_POWER6X):
- Define.
- (_dl_string_platform): Use PPC_PLATFORM_* macros instead of
- hardcoded constants.
- * sysdeps/powerpc/dl-procinfo.c (_dl_powerpc_platform): Use
- PPC_PLATFORM_* macros for array designators.
+ * sysdeps/unix/sysv/linux/powerpc/powerpc32/setcontext.S: Include
+ kernel-features.h.
-2006-11-11 Steven Munroe <sjmunroe@us.ibm.com>
+2006-12-19 Jakub Jelinek <jakub@redhat.com>
- * sysdeps/powerpc/dl-procinfo.c (_dl_powerpc_cap_flags): Add 3 new cap
- names to the beginning.
- (_dl_powerpc_platforms): Add "power6x".
- * sysdeps/powerpc/dl-procinfo.h (_DL_HWCAP_FIRST): Decrease.
- (HWCAP_IMPORTANT): Add PPC_FEATURE_HAS_DFP.
- (_DL_PLATFORMS_COUNT): Increase.
- (_dl_string_platform): Handle power6x case.
- * sysdeps/powerpc/sysdep.h (PPC_FEATURE_PA6T, PPC_FEATURE_HAS_DFP,
- PPC_FEATURE_POWER6_EXT): Define.
- (PPC_FEATURE_POWER5, PPC_FEATURE_POWER5_PLUS): Correct Comment.
+ * nss/getXXbyYY_r.c: Include atomic.h.
+ (INTERNAL (REENTRANT_NAME)): Write startp after start_fct,
+ add atomic_write_barrier () in between.
2006-12-18 Jakub Jelinek <jakub@redhat.com>
[BZ #3747]
* stdlib/jrand48_r.c (__jrand48_r): Make sure result is in the
- [-2^31 .. 2^31) range.
+ [-231 .. 231) range.
* stdlib/tst-rand48.c (main): Fix expected values for 64-bit
targets.
* stdlib/tst-rand48-2.c: New test.
@@ -136,10 +997,6 @@
2006-12-13 Ulrich Drepper <drepper@redhat.com>
- * sysdeps/unix/sysv/linux/bits/statvfs.h: Define ST_RELATIME.
- * sysdeps/unix/sysv/linux/internal_statvfs.c (__statvfs_getflags):
- Handle relatime mount option.
-
[BZ #2337]
* libio/Makefile (tests): Add tst-setvbuf1.
* libio/tst-setvbuf1.c: New file.
@@ -165,16 +1022,12 @@
* libio/fileops.c (_IO_new_file_close_it): Call _IO_set[bgp]
even for wide streams.
-2006-12-13 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/unix/sysv/linux/powerpc/powerpc32/setcontext.S: Include
- kernel-features.h.
-
-2006-12-11 Ulrich Drepper <drepper@redhat.com>
+2006-12-09 Jakub Jelinek <jakub@redhat.com>
- * stdlib/strtod_l.c (____STRTOF_INTERNAL): Parse thousand
- separators also if no non-zero digits found.
- * stdlib/Makefile (tests): Add tst-strtod3.
+ * misc/mntent_r.c (__hasmntopt): Check p[optlen] even when p == rest.
+ Start searching for next comma at p rather than rest.
+ * misc/Makefile (tests): Add tst-mntent2.
+ * misc/tst-mntent2.c: New test.
2006-12-09 Ulrich Drepper <drepper@redhat.com>
@@ -182,49 +1035,24 @@
* include/features.h: Fix comment about default value for
_POSIX_C_SOURCE.
- [BZ #3664]
- * stdlib/strtod_l.c (____STRTOF_INTERNAL): Fix test to recognize
- empty parsed strings.
- * stdlib/Makefile (tests): Add tst-strtod2.
- * stdlib/tst-strtod2.c: New file.
-
- [BZ #3673]
- * stdlib/strtod_l.c (____STRTOF_INTERNAL): Fix exp_limit
- computation.
- * stdlib/Makefile (tests): Add tst-atof2.
- * stdlib/tst-atof2.c: New file.
-
- [BZ #3674]
- * stdlib/strtod_l.c (____STRTOF_INTERNAL): Adjust exponent value
- correctly if removing trailing zero of hex-float.
- * stdlib/Makefile (tests): Add tst-atof1.
- * stdlib/tst-atof1.c: New file.
-
2006-12-09 Jakub Jelinek <jakub@redhat.com>
- * misc/mntent_r.c (__hasmntopt): Check p[optlen] even when p == rest.
- Start searching for next comma at p rather than rest.
- * misc/Makefile (tests): Add tst-mntent2.
- * misc/tst-mntent2.c: New test.
-
* misc/getusershell.c (initshells): Check for integer overflows.
Make strings buffer one bigger as fgets always succeeds when second
argument is 1. Don't use calloc for shells array. Disallow
/ as shell.
-2006-12-08 Ulrich Drepper <drepper@redhat.com>
-
- * malloc/memusage.c: Handle realloc with new size of zero and
- non-NULL pointer correctly.
- (me): Really write first record twice.
- (struct entry): Make format bi-arch safe.
- (dest): Write out more realloc statistics.
- * malloc/memusagestat.c (struct entry): Make format bi-arch safe.
-
2006-12-05 Jakub Jelinek <jakub@redhat.com>
* nis/nis_subr.c (nis_getnames): Revert last change.
+2006-10-11 Jakub Jelinek <jakub@redhat.com>
+
+ * nis/nis_defaults.c (__nis_default_access): Don't call getenv twice.
+
+ * nis/nis_subr.c (nis_getnames): Use __secure_getenv instead of getenv.
+ * sysdeps/generic/unsecvars.h: Add NIS_PATH.
+
2006-12-04 Jakub Jelinek <jakub@redhat.com>
* sysdeps/unix/sysv/linux/ttyname.c: Include termios.h.
@@ -235,189 +1063,77 @@
* io/Makefile: Add rules to build and run tst-ttyname_r test.
* io/tst-ttyname_r.c: New test.
-2006-12-03 Kaz Kojima <kkojima@rr.iij4u.or.jp>
-
- * sysdeps/unix/sysv/linux/sh/sys/io.h: Removed.
-
-2006-11-30 H.J. Lu <hongjiu.lu@intel.com>
-
- * sysdeps/i386/i686/memcmp.S: Use jump table as the base of
- jump table entries.
-
-2006-11-30 Jan Kratochvil <jan.kratochvil@redhat.com>
-
- * sysdeps/unix/sysv/linux/i386/clone.S: Provide CFI for the outermost
- `clone' function to ensure proper unwinding stop of gdb.
- * sysdeps/unix/sysv/linux/x86_64/clone.S: Likewise.
-
-2006-12-01 Ulrich Drepper <drepper@redhat.com>
-
- * nscd/nscd.init: Remove obsolete and commented-out -S option
- handling.
-
-2006-11-23 Jakub Jelinek <jakub@redhat.com>
-
- [BZ #3514]
- * manual/string.texi (strncmp): Fix pastos from wcscmp description.
-
- [BZ #3515]
- * manual/string.texi (strtok): Remove duplicate paragraph.
-
-2006-12-01 Jan Kratochvil <jan.kratochvil@redhat.com>
-
- * sysdeps/unix/sysv/linux/x86_64/sigaction.c: Fix compatibility with
- libgcc not supporting `rflags' unwinding (register # >= 17).
-
-2006-11-30 Jakub Jelinek <jakub@redhat.com>
+2006-11-28 Jakub Jelinek <jakub@redhat.com>
- * sunrpc/svc_run.c (svc_run): Set my_pollfd to new_pollfd if realloc
- succeeded.
+ * elf/dl-support.c: Include dl-procinfo.h.
+ * sysdeps/powerpc/dl-procinfo.h (PPC_PLATFORM_POWER4,
+ PPC_PLATFORM_PPC970, PPC_PLATFORM_POWER5, PPC_PLATFORM_POWER5_PLUS,
+ PPC_PLATFORM_POWER6, PPC_PLATFORM_CELL_BE, PPC_PLATFORM_POWER6X):
+ Define.
+ (_dl_string_platform): Use PPC_PLATFORM_* macros instead of
+ hardcoded constants.
+ * sysdeps/powerpc/dl-procinfo.c (_dl_powerpc_platform): Use
+ PPC_PLATFORM_* macros for array designators.
-2006-11-29 Daniel Jacobowitz <dan@codesourcery.com>
- Jakub Jelinek <jakub@redhat.com>
- Jan Kratochvil <jan.kratochvil@redhat.com>
+2006-11-11 Steven Munroe <sjmunroe@us.ibm.com>
- * sysdeps/unix/sysv/linux/x86_64/sigaction.c (restore_rt): Add correct
- unwind information.
- * sysdeps/unix/sysv/linux/x86_64/Makefile: Provide symbols for
- 'restore_rt' even in the 'signal' directory.
- * sysdeps/unix/sysv/linux/x86_64/ucontext_i.sym: Extend the regs list.
+ * sysdeps/powerpc/dl-procinfo.c (_dl_powerpc_cap_flags): Add 3 new cap
+ names to the beginning.
+ (_dl_powerpc_platforms): Add "power6x".
+ * sysdeps/powerpc/dl-procinfo.h (_DL_HWCAP_FIRST): Decrease.
+ (HWCAP_IMPORTANT): Add PPC_FEATURE_HAS_DFP.
+ (_DL_PLATFORMS_COUNT): Increase.
+ (_dl_string_platform): Handle power6x case.
+ * sysdeps/powerpc/sysdep.h (PPC_FEATURE_PA6T, PPC_FEATURE_HAS_DFP,
+ PPC_FEATURE_POWER6_EXT): Define.
+ (PPC_FEATURE_POWER5, PPC_FEATURE_POWER5_PLUS): Correct Comment.
2006-11-27 Jakub Jelinek <jakub@redhat.com>
[BZ #3559]
* sunrpc/svc_run.c (svc_run): Fail instead of segfaulting if
- malloc crashed. Don't allocate memory unnecessarily in each
- loop.
+ malloc crashed.
-2006-10-21 Jakub Jelinek <jakub@redhat.com>
+2006-11-14 Jakub Jelinek <jakub@redhat.com>
- * resolv/mapv4v6addr.h (map_v4v6_address): Fix last change.
+ * nss/nss_files/files-alias.c (get_next_alias): Set line back
+ to first_unused after parsing :include: file.
+
+2006-11-14 Ulrich Drepper <drepper@redhat.com>
-2006-11-20 Ulrich Drepper <drepper@redhat.com>
+ * po/nl.po: Update from translation team.
- * resolv/mapv4v6addr.h (map_v4v6_address): Optimize a bit.
+2006-11-10 Ulrich Drepper <drepper@redhat.com>
-2006-11-18 Bruno Haible <bruno@clisp.org>
+ * po/sv.po: Update from translation team.
- * sysdeps/unix/sysv/linux/i386/getgroups.c (__getgroups): Invoke
- __sysconf only after having tried to call getgroups32.
+2006-11-01 Ulrich Drepper <drepper@redhat.com>
-2006-11-19 Ulrich Drepper <drepper@redhat.com>
+ * po/sv.po: Update from translation team.
- * nss/nss_files/files-hosts.c (LINE_PARSER): Support IPv6-style
- addresses for IPv4 queries if they can be mapped.
+2006-10-29 Ulrich Drepper <drepper@redhat.com>
-2006-11-16 Jakub Jelinek <jakub@redhat.com>
+ * po/sv.po: Update from translation team.
- * sysdeps/x86_64/fpu/s_copysignf.S (__copysignf): Switch to .text.
- * sysdeps/x86_64/fpu/s_copysign.S (__copysign): Likewise.
- (signmask): Add .size directive.
- (othermask): Add .type directive.
+2006-10-09 Ulrich Drepper <drepper@redhat.com>
-2006-11-14 Ulrich Drepper <drepper@redhat.com>
+ * po/sv.po: Update from translation team.
- * po/nl.po: Update from translation team.
+2006-10-07 Ulrich Drepper <drepper@redhat.com>
- * timezone/zdump.c: Redo fix for BZ #3137.
+ * po/tr.po: Update from translation team.
-2006-11-14 Jakub Jelinek <jakub@redhat.com>
+2006-10-06 Ulrich Drepper <drepper@redhat.com>
- * nss/nss_files/files-alias.c (get_next_alias): Set line back
- to first_unused after parsing :include: file.
+ * po/pl.po: Update from translation team.
2006-11-10 Ulrich Drepper <drepper@redhat.com>
- * timezone/africa: Update from tzdata2006o.
- * timezone/antarctica: Likewise.
- * timezone/asia: Likewise.
- * timezone/australasia: Likewise.
- * timezone/backward: Likewise.
- * timezone/europe: Likewise.
- * timezone/iso3166.tab: Likewise.
- * timezone/northamerica: Likewise.
- * timezone/southamerica: Likewise.
- * timezone/zone.tab: Likewise.
-
- * time/tzfile.c (__tzfile_read): Extend to handle new file format
- on machines with 64-bit time_t.
-
- * timezone/checktab.awk: Update from tzcode2006o.
- * timezone/ialloc.c: Likewise.
- * timezone/private.h: Likewise.
- * timezone/scheck.c: Likewise.
- * timezone/tzfile.h: Likewise.
- * timezone/tzselect.ksh: Likewise.
- * timezone/zdump.c: Likewise.
- * timezone/zic.c: Likewise.
-
- [BZ #3483]
- * elf/ldconfig.c (main): Call setlocale and textdomain.
- Patch mostly by Benno Schulenberg <bensberg@justemail.net>.
-
- [BZ #3480]
- * manual/argp.texi: Fix typos.
- * manual/charset.texi: Likewise.
- * manual/errno.texi: Likewise.
- * manual/filesys.texi: Likewise.
- * manual/lang.texi: Likewise.
- * manual/maint.texi: Likewise.
- * manual/memory.texi: Likewise.
- * manual/message.texi: Likewise.
- * manual/resource.texi: Likewise.
- * manual/search.texi: Likewise.
- * manual/signal.texi: Likewise.
- * manual/startup.texi: Likewise.
- * manual/stdio.texi: Likewise.
- * manual/sysinfo.texi: Likewise.
- * manual/syslog.texi: Likewise.
- * manual/time.texi: Likewise.
- Patch by Ralf Wildenhues <Ralf.Wildenhues@gmx.de>.
-
- [BZ #3465]
- * sunrpc/clnt_raw.c: Minimal message improvements.
- * sunrpc/pm_getmaps.c: Likewise.
- * nis/nss_nisplus/nisplus-publickey.c: Likewise.
- * nis/nis_print_group_entry.c: Likewise.
- * locale/programs/repertoire.c: Likewise.
- * locale/programs/charmap.c: Likewise.
- * malloc/memusage.sh: Likewise.
- * elf/dl-deps.c: Likewise.
- * locale/programs/ld-collate.c: Likewise.
- * libio/vswprintf.c: Likewise.
- * malloc/memusagestat.c: Likewise.
- * sunrpc/auth_unix.c: Likewise.
- * sunrpc/rpc_main.c: Likewise.
- * nscd/cache.c: Likewise.
- * locale/programs/repertoire.c: Unify output messages.
- * locale/programs/charmap.c: Likewise.
- * locale/programs/ld-ctype.c: Likewise.
- * locale/programs/ld-monetary.c: Likewise.
- * locale/programs/ld-numeric.c: Likewise.
- * locale/programs/ld-time.c: Likewise.
- * elf/ldconfig.c: Likewise.
- * nscd/selinux.c: Likewise.
- * elf/cache.c: Likewise.
- Patch mostly by Benno Schulenberg <bensberg@justemail.net>.
-
[BZ #3451]
* sysdeps/i386/fpu/bits/mathinline.h (floor): Make rounding mode
change atomic.
(ceil): Likewise.
-2006-11-10 Jakub Jelinek <jakub@redhat.com>
-
- * string/strxfrm_l.c (STRXFRM): Fix trailing \1 optimization
- if N is one bigger than return value.
- * string/tst-strxfrm2.c (do_test): Also test strxfrm with l1 + 1
- and l1 last arguments, if buf is defined, verify the return value
- equals to strlen (buf) and verify no byte beyond passed length
- is modified.
-
-2006-11-10 Ulrich Drepper <drepper@redhat.com>
-
- * po/sv.po: Update from translation team.
-
2006-11-09 Ulrich Drepper <drepper@redhat.com>
* sysdeps/unix/sysv/linux/x86_64/sysconf.c (intel_check_word): Add
@@ -428,204 +1144,27 @@
* sysdeps/unix/sysv/linux/i386/sysconf.c (intel_check_word): Add
noinline attribute.
- * sysdeps/gnu/siglist.c (__old_sys_siglist, __old_sys_sigabbrev):
- Use __new_sys_siglist instead of _sys_siglist_internal as
- second macro argument.
- (_old_sys_siglist): Use declare_symbol_alias macro instead of
- strong_alias.
-
-2006-11-09 Ulrich Drepper <drepper@redhat.com>
-
- [BZ #3493]
- * posix/unistd.h (sysconf): Remove const attribute.
-
- * sysdeps/posix/getaddrinfo.c (getaddrinfo): Fix test for
- temporary or deprecated addresses.
- Patch by Sridhar Samudrala <sri@us.ibm.com>.
-
- * string/Makefile (tests): Add tst-strxfrm2.
- * string/tst-strxfrm2.c: New file.
-
-2006-10-09 Jakub Jelinek <jakub@redhat.com>
+2006-11-05 Ulrich Drepper <drepper@redhat.com>
- * elf/dl-debug.c (_dl_debug_initialize): Check r->r_map for 0
- rather than r->r_brk.
+ * sysdeps/unix/sysv/linux/i386/sysconf.c (intel_check_word):
+ Update handling of cache descriptor 0x49 for new models.
+ * sysdeps/unix/sysv/linux/x86_64/sysconf.c (intel_check_word):
+ Likewise.
2006-11-08 Jakub Jelinek <jakub@redhat.com>
- * string/strxfrm_l.c (STRXFRM): Do the trailing \1 removal
- optimization even if needed > n.
-
* elf/dl-load.c (decompose_rpath): Return bool rather than void.
If l->l_name is on inhibit_rpath list, set sps->dirs to -1 and
return false, otherwise return true.
(cache_rpath): Return decompose_rpath return value.
-2006-11-07 Jakub Jelinek <jakub@redhat.com>
-
- * include/libc-symbols.h (declare_symbol): Rename to...
- (declare_symbol_alias): ... this. Add ORIGINAL argument, imply
- strong_alias (ORIGINAL, SYMBOL) in asm to make sure it preceedes
- .size directive.
- * sysdeps/gnu/errlist-compat.awk: Adjust for declare_symbol_alias
- changes.
- * sysdeps/gnu/siglist.c: Likewise.
-
-2006-11-03 Steven Munroe <sjmunroe@us.ibm.com>
-
- * sysdeps/powerpc/fpu/bits/mathinline.h
- [__LIBC_INTERNAL_MATH_INLINES]: Moved to ...
- * sysdeps/powerpc/fpu/math_private.h: ...here. New file.
-
-2006-11-05 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/unix/sysv/linux/i386/sysconf.c (intel_check_word):
- Update handling of cache descriptor 0x49 for new models.
- * sysdeps/unix/sysv/linux/x86_64/sysconf.c (intel_check_word):
- Likewise.
-
2006-11-02 Jakub Jelinek <jakub@redhat.com>
* malloc/memusage.c (dest): Reset not_me back to false after
printing statistics.
-2006-11-02 Ulrich Drepper <drepper@redhat.com>
-
- * configure.in: Work around ld --help change and avoid -z relro
- test completely if the architecture doesn't care about security.
-
-2006-11-01 Ulrich Drepper <drepper@redhat.com>
-
- * po/sv.po: Update from translation team.
-
-2006-10-31 Ulrich Drepper <drepper@redhat.com>
-
- * stdlib/atexit.c (atexit): Don't mark as hidden when used to
- generate compatibility version.
-
-2006-10-29 Ulrich Drepper <drepper@redhat.com>
-
- * configure.in: Relax -z relro requirement a bit.
-
- * po/sv.po: Update from translation team.
-
-2006-10-29 Jakub Jelinek <jakub@redhat.com>
-
- * elf/dl-sym.c (do_sym): Use RTLD_SINGLE_THREAD_P.
- * elf/dl-runtime.c (_dl_fixup, _dl_profile_fixup): Likewise.
- * elf/dl-close.c (_dl_close_worker): Likewise.
- * elf/dl-open.c (_dl_open_worker): Likewise.
- * sysdeps/generic/sysdep-cancel.h (RTLD_SINGLE_THREAD_P): Define.
-
2006-10-27 Ulrich Drepper <drepper@redhat.com>
- * configure.in: Require assembler support for visibility, compiler
- support for visibility and aliases, linker support for various -z
- options.
- * Makeconfig: Remove conditional code which now is unnecessary.
- * config.h.in: Likewise.
- * config.make.in: Likewise.
- * dlfcn/Makefile: Likewise.
- * elf/Makefile: Likewise.
- * elf/dl-load.c: Likewise.
- * elf/rtld.c: Likewise.
- * include/libc-symbols.h: Likewise.
- * include/stdio.h: Likewise.
- * io/Makefile: Likewise.
- * io/fstat.c: Likewise.
- * io/fstat64.c: Likewise.
- * io/fstatat.c: Likewise.
- * io/fstatat64.c: Likewise.
- * io/lstat.c: Likewise.
- * io/lstat64.c: Likewise.
- * io/mknod.c: Likewise.
- * io/mknodat.c: Likewise.
- * io/stat.c: Likewise.
- * io/stat64.c: Likewise.
- * libio/stdio.c: Likewise.
- * nscd/Makefile: Likewise.
- * stdlib/Makefile: Likewise.
- * stdlib/atexit.c: Likewise.
- * sysdeps/generic/ldsodefs.h: Likewise.
- * sysdeps/i386/dl-machine.h: Likewise.
- * sysdeps/i386/sysdep.h: Likewise.
- * sysdeps/i386/i686/memcmp.S: Likewise.
- * sysdeps/powerpc/powerpc32/sysdep.h: Likewise.
- * sysdeps/unix/sysv/linux/i386/sigaction.c: Likewise.
- * sysdeps/unix/sysv/linux/x86_64/sigaction.c: Likewise.
-
- * Makerules: USE_TLS support is now default.
- * tls.make.c: Likewise.
- * csu/Versions: Likewise.
- * csu/libc-start.c: Likewise.
- * csu/libc-tls.c: Likewise.
- * csu/version.c: Likewise.
- * dlfcn/dlinfo.c: Likewise.
- * elf/dl-addr.c: Likewise.
- * elf/dl-cache.c: Likewise.
- * elf/dl-close.c: Likewise.
- * elf/dl-iteratephdr.c: Likewise.
- * elf/dl-load.c: Likewise.
- * elf/dl-lookup.c: Likewise.
- * elf/dl-object.c: Likewise.
- * elf/dl-open.c: Likewise.
- * elf/dl-reloc.c: Likewise.
- * elf/dl-support.c: Likewise.
- * elf/dl-sym.c: Likewise.
- * elf/dl-sysdep.c: Likewise.
- * elf/dl-tls.c: Likewise.
- * elf/ldconfig.c: Likewise.
- * elf/rtld.c: Likewise.
- * elf/tst-tls-dlinfo.c: Likewise.
- * elf/tst-tls1.c: Likewise.
- * elf/tst-tls10.h: Likewise.
- * elf/tst-tls14.c: Likewise.
- * elf/tst-tls2.c: Likewise.
- * elf/tst-tls3.c: Likewise.
- * elf/tst-tls4.c: Likewise.
- * elf/tst-tls5.c: Likewise.
- * elf/tst-tls6.c: Likewise.
- * elf/tst-tls7.c: Likewise.
- * elf/tst-tls8.c: Likewise.
- * elf/tst-tls9.c: Likewise.
- * elf/tst-tlsmod1.c: Likewise.
- * elf/tst-tlsmod13.c: Likewise.
- * elf/tst-tlsmod13a.c: Likewise.
- * elf/tst-tlsmod14a.c: Likewise.
- * elf/tst-tlsmod2.c: Likewise.
- * elf/tst-tlsmod3.c: Likewise.
- * elf/tst-tlsmod4.c: Likewise.
- * elf/tst-tlsmod5.c: Likewise.
- * elf/tst-tlsmod6.c: Likewise.
- * include/errno.h: Likewise.
- * include/link.h: Likewise.
- * include/tls.h: Likewise.
- * locale/global-locale.c: Likewise.
- * locale/localeinfo.h: Likewise.
- * malloc/arena.c: Likewise.
- * malloc/hooks.c: Likewise.
- * malloc/malloc.c: Likewise.
- * resolv/Versions: Likewise.
- * sysdeps/alpha/dl-machine.h: Likewise.
- * sysdeps/alpha/libc-tls.c: Likewise.
- * sysdeps/generic/ldsodefs.h: Likewise.
- * sysdeps/generic/tls.h: Likewise.
- * sysdeps/i386/dl-machine.h: Likewise.
- * sysdeps/ia64/dl-machine.h: Likewise.
- * sysdeps/ia64/libc-tls.c: Likewise.
- * sysdeps/mach/hurd/fork.c: Likewise.
- * sysdeps/mach/hurd/i386/tls.h: Likewise.
- * sysdeps/powerpc/powerpc32/dl-machine.c: Likwise.
- * sysdeps/powerpc/powerpc32/dl-machine.h: Likewise.
- * sysdeps/powerpc/powerpc64/dl-machine.h: Likewise.
- * sysdeps/s390/libc-tls.c: Likewise.
- * sysdeps/s390/s390-32/dl-machine.h: Likewise.
- * sysdeps/s390/s390-64/dl-machine.h: Likewise.
- * sysdeps/sh/dl-machine.h: Likewise.
- * sysdeps/sparc/sparc32/dl-machine.h: Likewise.
- * sysdeps/sparc/sparc64/dl-machine.h: Likewise.
- * sysdeps/x86_64/dl-machine.h: Likewise.
-
* elf/dl-close.c (_dl_close_worker): Renamed from _dl_close and
split out locking and parameter checking.
(_dl_close): Call _dl_close_worker after locking and checking.
@@ -634,50 +1173,12 @@
* elf/Makefile: Add rules to build and run tst-thrlock.
* elf/tst-thrlock.c: New file.
- [BZ #3426]
- * stdlib/stdlib.h: Adjust comment for canonicalize_file_name to
- reality.
-
[BZ #3429]
* elf/dl-open.c (dl_open_worker): Keep holding dl_load_lock until
we are sure we do not need it anymore for _dl_close. Also move
the asserts inside the lock region.
Patch mostly by Suzuki <suzuki@in.ibm.com>.
-2006-10-27 Jakub Jelinek <jakub@redhat.com>
-
- * elf/dl-lookup.c (_dl_debug_bindings): Remove unused symbol_scope
- argument.
- (_dl_lookup_symbol_x): Adjust caller.
-
- * sysdeps/generic/ldsodefs.h (struct link_namespaces): Remove
- _ns_global_scope.
- * elf/rtld.c (dl_main): Don't initialize _ns_global_scope.
-
- * elf/dl-libc.c: Revert l_scope name changes.
- * elf/dl-load.c: Likewise.
- * elf/dl-object.c: Likewise.
- * elf/rtld.c: Likewise.
- * elf/dl-close.c (_dl_close): Likewise.
- * elf/dl-open.c (dl_open_worker): Likewise. If not SINGLE_THREAD_P,
- always use __rtld_mrlock_{change,done}. Always free old scope list
- here if not l_scope_mem.
- * elf/dl-runtime.c (_dl_fixup, _dl_profile_fixup): Revert l_scope name
- change. Never free scope list here. Just __rtld_mrlock_lock before
- the lookup and __rtld_mrlock_unlock it after the lookup.
- * elf/dl-sym.c: Likewise.
- * include/link.h (struct r_scoperec): Remove.
- (struct link_map): Replace l_scoperec with l_scope, l_scoperec_mem
- with l_scope_mem and l_scoperec_lock with l_scope_lock.
-
-2006-10-25 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/gnu/netinet/tcp.h: Define TCP_CONGESTION.
-
-2006-10-18 Ulrich Drepper <drepper@redhat.com>
-
- * configure.in: Disable building profile libraries by default.
-
2006-10-17 Jakub Jelinek <jakub@redhat.com>
* sunrpc/xdr_mem.c (xdrmem_setpos): Don't compare addresses
@@ -685,68 +1186,14 @@
* sunrpc/Makefile (tests): Add tst-xdrmem2.
* sunrpc/tst-xdrmem2.c: New test.
-2006-10-18 Ulrich Drepper <drepper@redhat.com>
-
- * elf/dl-lookup.c (_dl_lookup_symbol_x): Add warning to
- _dl_lookup_symbol_x code.
-
-2006-10-17 Jakub Jelinek <jakub@redhat.com>
-
- * elf/dl-runtime.c: Include sysdep-cancel.h.
- (_dl_fixup, _dl_profile_fixup): Use __rtld_mrlock_* and
- scoperec->nusers only if !SINGLE_THREAD_P. Use atomic_*
- instead of catomic_* macros.
- * elf/dl-sym.c: Include sysdep-cancel.h.
- (do_sym): Use __rtld_mrlock_* and scoperec->nusers only
- if !SINGLE_THREAD_P. Use atomic_* instead of catomic_* macros.
- * elf/dl-close.c: Include sysdep-cancel.h.
- (_dl_close): Use __rtld_mrlock_* and scoperec->nusers only
- if !SINGLE_THREAD_P. Use atomic_* instead of catomic_* macros.
- * elf/dl-open.c: Include sysdep-cancel.h.
- (dl_open_worker): Use __rtld_mrlock_* and scoperec->nusers only
- if !SINGLE_THREAD_P. Use atomic_* instead of catomic_* macros.
-
-2006-10-17 Jakub Jelinek <jakub@redhat.com>
-
- [BZ #3313]
- * malloc/malloc.c (malloc_consolidate): Set maxfb to address of last
- fastbin rather than end of fastbin array.
-
-2006-10-18 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/i386/i486/bits/atomic.h (catomic_decrement): Use correct
- body macro.
- * sysdeps/x86_64/bits/atomic.h
- (__arch_c_compare_and_exchange_val_64_acq): Add missing casts.
- (catomic_decrement): Use correct body macro.
-
-2006-10-17 Jakub Jelinek <jakub@redhat.com>
-
- * include/atomic.h: Add a unique prefix to all local variables
- in macros.
- * csu/tst-atomic.c (do_test): Test also catomic_* macros.
-
2006-10-16 Ulrich Drepper <drepper@redhat.com>
[BZ #3369]
* sysdeps/posix/getaddrinfo.c (rfc3484_sort): Fix typos in rules 4
and 7.
-2006-10-14 Ulrich Drepper <drepper@redhat.com>
-
- * resolv/arpa/nameser.h: Document that ns_t_a6 is deprecated.
-
2006-10-13 Ulrich Drepper <drepper@redhat.com>
- [BZ #3313]
- * malloc/malloc.c (malloc_consolidate): Don't use get_fast_max to
- determine highest fast bin to consolidate, always look into all of
- them.
- (do_check_malloc_state): Only require for empty bins for large
- sizes in main arena.
-
- * libio/stdio.h: Add more __wur attributes.
-
* elf/dl-minimal.c (realloc): Optimize last patch.
2006-10-12 Richard Sandiford <richard@codesourcery.com>
@@ -755,56 +1202,10 @@
* elf/dl-minimal.c (realloc): Let malloc() return a new pointer,
and use memcpy() if it does.
-2006-11-12 Andreas Jaeger <aj@suse.de>
-
- [BZ #2510]
- * manual/search.texi (Hash Search Function): Clarify.
- (Array Search Function): Clarify.
-
-2006-11-12 Joseph Myers <joseph@codesourcery.com>
-
- [BZ #2830]
- * math/atest-exp.c (main): Cast hex value to mp_limb_t before
- shifting.
- * math/atest-exp2.c (read_mpn_hex): Likewise.
- * math/atest-sincos.c (main): Likewise.
-
2006-10-11 Ulrich Drepper <drepper@redhat.com>
- * sysdeps/unix/sysv/linux/syscalls.list: Add epoll_pwait.
- * sysdeps/unix/sysv/linux/sys/epoll.h: Declare epoll_pwait.
- * sysdeps/unix/sysv/linux/Versions (libc): Add epoll_pwait for
- version GLIBC_2.6.
- * Versions.def: Add GLIBC_2.6 for libc.
-
* sysdeps/unix/sysv/linux/i386/sysdep.h (DOARGS_6): Fix offset.
- * sysdeps/i386/i486/bits/atomic.h: Add catomic_* support.
-
-2006-10-11 Jakub Jelinek <jakub@redhat.com>
-
- * malloc/malloc.c (_int_malloc): Remove unused any_larger variable.
-
- * nis/nis_defaults.c (__nis_default_access): Don't call getenv twice.
-
- * nis/nis_subr.c (nis_getnames): Use __secure_getenv instead of getenv.
- * sysdeps/generic/unsecvars.h: Add NIS_PATH.
-
-2006-10-11 Ulrich Drepper <drepper@redhat.com>
-
- * include/atomic.c: Define catomic_* operations.
- * sysdeps/x86_64/bits/atomic.h: Likewise. Fix a few minor problems.
- * stdlib/cxa_finalize.c: Use catomic_* operations instead of atomic_*.
- * malloc/memusage.c: Likewise.
- * gmon/mcount.c: Likewise.
- * elf/dl-close.c: Likewise.
- * elf/dl-open.c: Likewise.
- * elf/dl-profile.c: Likewise.
- * elf/dl-sym.c: Likewise.
- * elf/dl-runtime.c: Likewise.
- * elf/dl-fptr.c: Likewise.
- * resolv/res_libc.c: Likewise.
-
2006-10-10 Ulrich Drepper <drepper@redhat.com>
* nis/nis_subr.c (nis_getnames): Add trailing dot to NIS_PATH
@@ -814,59 +1215,13 @@
at least one entry consisting of the parameter concatenated with
the domain.
-2006-10-10 Roland McGrath <roland@frob.com>
-
- * sysdeps/mach/hurd/utimes.c: Use a union to avoid an improper cast.
- * sysdeps/mach/hurd/futimes.c: Likewise.
- * sysdeps/mach/hurd/lutimes.c: Likewise.
-
-2006-10-09 Ulrich Drepper <drepper@redhat.com>
- Jakub Jelinek <jakub@redhat.com>
-
- Implement reference counting of scope records.
- * elf/dl-close.c (_dl_close): Remove all scopes from removed objects
- from the list in objects which remain. Always allocate new scope
- record.
- * elf/dl-open.c (dl_open_worker): When growing array for scopes,
- don't resize, allocate a new one.
- * elf/dl-runtime.c: Update reference counters before using a scope
- array.
- * elf/dl-sym.c: Likewise.
- * elf/dl-libc.c: Adjust for l_scope name change.
- * elf/dl-load.c: Likewise.
- * elf/dl-object.c: Likewise.
- * elf/rtld.c: Likewise.
- * include/link.h: Include <rtld-lowlevel.h>. Define struct
- r_scoperec. Replace r_scope with pointer to r_scoperec structure.
- Add l_scoperec_lock.
- * sysdeps/generic/ldsodefs.h: Include <rtld-lowlevel.h>.
- * sysdeps/generic/rtld-lowlevel.h: New file.
-
- * include/atomic.h: Rename atomic_and to atomic_and_val and
- atomic_or to atomic_or_val. Define new macros atomic_and and
- atomic_or which do not return values.
- * sysdeps/x86_64/bits/atomic.h: Define atomic_and and atomic_or.
- Various cleanups.
- * sysdeps/i386/i486/bits/atomic.h: Likewise.
-
- * po/sv.po: Update from translation team.
-
-2006-10-07 Ulrich Drepper <drepper@redhat.com>
-
- * Versions.def: Add GLIBC_2.6 to libpthread.
-
- * include/shlib-compat.h (SHLIB_COMPAT): Expand parameters before use.
- (versioned_symbol): Likewise.
- (compat_symbol): Likewise.
+2006-10-09 Jakub Jelinek <jakub@redhat.com>
- * po/tr.po: Update from translation team.
+ * elf/dl-debug.c (_dl_debug_initialize): Check r->r_map for 0
+ rather than r->r_brk.
2006-10-06 Ulrich Drepper <drepper@redhat.com>
- * nis/Banner: Removed. It's been integral part forever and the
- author info is incomplete anyway.
- * libio/Banner: Likewise.
-
* nis/nis_table.c (nis_list): If __follow_path fails in the new
code, make sure the nis_freeresult call doesn't crash and that the
result is reported correctly.
@@ -888,10 +1243,6 @@
Don't use locking around _nss_grp_create_tablename call.
* nis/nss_nisplus/nisplus-initgroups.c: New file.
-2006-10-06 Ulrich Drepper <drepper@redhat.com>
-
- * version.h (VERSION): Bump to 2.5.90 for new development tree.
-
2006-10-06 Andreas Jaeger <aj@suse.de>
* include/features.h (__GLIBC_MINOR__): It's glibc 2.5 now.
diff --git a/Makeconfig b/Makeconfig
index 349f94d9ac0..5a1aebccffa 100644
--- a/Makeconfig
+++ b/Makeconfig
@@ -407,9 +407,11 @@ LDFLAGS.so += $(combreloc-LDFLAGS)
LDFLAGS-rtld += $(combreloc-LDFLAGS)
endif
+ifeq (yes,$(have-z-relro))
relro-LDFLAGS = -Wl,-z,relro
LDFLAGS.so += $(relro-LDFLAGS)
LDFLAGS-rtld += $(relro-LDFLAGS)
+endif
ifeq (yes,$(have-hash-style))
# For the time being we unconditionally use 'both'. At some time we
diff --git a/Makerules b/Makerules
index 200f8d7eea4..b0be86b3683 100644
--- a/Makerules
+++ b/Makerules
@@ -1233,7 +1233,10 @@ endif
ifeq ($(firstword $(sysd-sorted-done) f)$(firstword $(generating) f),tf)
-include $(common-objpfx)tls.make
+config-tls := notls
+ifeq ($(use-tls),yes)
config-tls := tls
+endif
ifeq ($(use-thread),yes)
config-tls := thread
endif
diff --git a/NEWS b/NEWS
index f078f3cc63e..f18b2d73f07 100644
--- a/NEWS
+++ b/NEWS
@@ -1,13 +1,21 @@
-GNU C Library NEWS -- history of user-visible changes. 2006-10-11
+GNU C Library NEWS -- history of user-visible changes. 2006-09-29
Copyright (C) 1992-2002,2003,2004,2005,2006 Free Software Foundation, Inc.
See the end for copying conditions.
Please send GNU C library bug reports via <http://sources.redhat.com/bugzilla/>
using `glibc' in the "product" field.
-Version 2.6
+Version 2.5.1
-* New Linux interfaces: epoll_pwait.
+* The following bugs are resolved with this release:
+
+ 2337, 2749, 3213, 3291, 3306, 3320, 3322, 3334, 3348, 3352, 3369, 3429,
+ 3451, 3458, 3559, 3632, 3664, 3673, 3674, 3747, 3842, 3851, 3855, 3884,
+ 3902, 3919, 3944, 3954, 3955, 3957, 3995, 4069, 4070, 4074, 4076, 4101,
+ 4102, 4130, 4131, 4181, 4342, 4344, 4364, 4368, 4381, 4405, 4406, 4411,
+ 4438, 4439, 4465, 4512, 4514, 4586, 4702, 4858
+
+ Visit <http://sources.redhat.com/bugzilla/> for the details of each bug.
Version 2.5
diff --git a/README b/README
index 97b3a61e064..2980b10a017 100644
--- a/README
+++ b/README
@@ -1,4 +1,4 @@
-This directory contains the version 2.5 release of the GNU C Library.
+This directory contains the version 2.5.1 release of the GNU C Library.
The GNU C Library is the standard system C library for all GNU systems,
and is an important part of what makes up a GNU system. It provides the
@@ -52,7 +52,7 @@ The GNU C Library supports these configurations for using Linux kernels:
The code for other CPU configurations supported by volunteers outside of
the core glibc maintenance effort is contained in the separate `ports'
-add-on. You can find glibc-ports-2.5 distributed separately in the
+add-on. You can find glibc-ports-2.5.1 distributed separately in the
same place where you got the main glibc distribution files.
Currently these configurations are known to work using the `ports' add-on:
diff --git a/Versions.def b/Versions.def
index 254208469fb..b492caaf0bc 100644
--- a/Versions.def
+++ b/Versions.def
@@ -22,7 +22,6 @@ libc {
GLIBC_2.3.4
GLIBC_2.4
GLIBC_2.5
- GLIBC_2.6
%ifdef USE_IN_LIBIO
HURD_CTHREADS_0.3
%endif
@@ -83,7 +82,6 @@ libpthread {
GLIBC_2.3.3
GLIBC_2.3.4
GLIBC_2.4
- GLIBC_2.6
GLIBC_PRIVATE
}
libresolv {
diff --git a/argp/Makefile b/argp/Makefile
index 5ade517476b..b8c9fca0fb3 100644
--- a/argp/Makefile
+++ b/argp/Makefile
@@ -1,4 +1,4 @@
-# Copyright (C) 1997, 2002, 2003, 2006 Free Software Foundation, Inc.
+# Copyright (C) 1997, 2002, 2003, 2006, 2007 Free Software Foundation, Inc.
# This file is part of the GNU C Library.
# The GNU C Library is free software; you can redistribute it and/or
@@ -26,7 +26,7 @@ distribute = argp-fmtstream.h argp-namefrob.h
routines = $(addprefix argp-, ba fmtstream fs-xinl help parse pv \
pvh xinl eexst)
-tests = argp-test tst-argp1 bug-argp1
+tests = argp-test tst-argp1 bug-argp1 tst-argp2
CFLAGS-argp-help.c = $(uses-callbacks) -fexceptions
CFLAGS-argp-parse.c = $(uses-callbacks)
diff --git a/argp/argp-help.c b/argp/argp-help.c
index 13c0820710d..c12b10e235f 100644
--- a/argp/argp-help.c
+++ b/argp/argp-help.c
@@ -1,5 +1,6 @@
/* Hierarchial argument parsing help output
- Copyright (C) 1995-2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+ Copyright (C) 1995-2003, 2004, 2005, 2006, 2007
+ Free Software Foundation, Inc.
This file is part of the GNU C Library.
Written by Miles Bader <miles@gnu.ai.mit.edu>.
@@ -672,9 +673,9 @@ hol_cluster_cmp (const struct hol_cluster *cl1, const struct hol_cluster *cl2)
{
/* If one cluster is deeper than the other, use its ancestor at the same
level, so that finding the common ancestor is straightforward. */
- while (cl1->depth < cl2->depth)
+ while (cl1->depth > cl2->depth)
cl1 = cl1->parent;
- while (cl2->depth < cl1->depth)
+ while (cl2->depth > cl1->depth)
cl2 = cl2->parent;
/* Now reduce both clusters to their ancestors at the point where both have
@@ -987,7 +988,7 @@ static const char *
filter_doc (const char *doc, int key, const struct argp *argp,
const struct argp_state *state)
{
- if (argp->help_filter)
+ if (argp && argp->help_filter)
/* We must apply a user filter to this output. */
{
void *input = __argp_input (argp, state);
diff --git a/argp/tst-argp2.c b/argp/tst-argp2.c
new file mode 100644
index 00000000000..926614fbc89
--- /dev/null
+++ b/argp/tst-argp2.c
@@ -0,0 +1,101 @@
+/* Copyright (C) 2007 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Jakub Jelinek <jakub@redhat.com>, 2007.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <argp.h>
+
+static const struct argp_option opt1[] =
+ {
+ { "opt1", '1', "NUMBER", 0, "Option 1" },
+ { NULL, 0, NULL, 0, NULL }
+ };
+
+static const struct argp_option opt2[] =
+ {
+ { "opt2", '2', "NUMBER", 0, "Option 2" },
+ { NULL, 0, NULL, 0, NULL }
+ };
+
+static const struct argp_option opt3[] =
+ {
+ { "opt3", '3', "NUMBER", 0, "Option 3" },
+ { NULL, 0, NULL, 0, NULL }
+ };
+
+static const struct argp_option opt4[] =
+ {
+ { "opt4", '4', "NUMBER", 0, "Option 4" },
+ { NULL, 0, NULL, 0, NULL }
+ };
+
+static const struct argp_option opt5[] =
+ {
+ { "opt5", '5', "NUMBER", 0, "Option 5" },
+ { NULL, 0, NULL, 0, NULL }
+ };
+
+static struct argp argp5 =
+ {
+ opt5, NULL, "args doc5", "doc5", NULL, NULL, NULL
+ };
+
+static struct argp argp4 =
+ {
+ opt4, NULL, "args doc4", "doc4", NULL, NULL, NULL
+ };
+
+static struct argp argp3 =
+ {
+ opt3, NULL, "args doc3", "doc3", NULL, NULL, NULL
+ };
+
+static struct argp_child children2[] =
+ {
+ { &argp4, 0, "child3", 3 },
+ { &argp5, 0, "child4", 4 },
+ { NULL, 0, NULL, 0 }
+ };
+
+static struct argp argp2 =
+ {
+ opt2, NULL, "args doc2", "doc2", children2, NULL, NULL
+ };
+
+static struct argp_child children1[] =
+ {
+ { &argp2, 0, "child1", 1 },
+ { &argp3, 0, "child2", 2 },
+ { NULL, 0, NULL, 0 }
+ };
+
+static struct argp argp1 =
+ {
+ opt1, NULL, "args doc1", "doc1", children1, NULL, NULL
+ };
+
+
+static int
+do_test (void)
+{
+ argp_help (&argp1, stdout, ARGP_HELP_LONG, (char *) "tst-argp2");
+ return 0;
+}
+
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
diff --git a/catgets/gencat.c b/catgets/gencat.c
index f5cbb8e1b3e..e72754d526c 100644
--- a/catgets/gencat.c
+++ b/catgets/gencat.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996-2005, 2006, 2007 Free Software Foundation, Inc.
+/* Copyright (C) 1996-2005, 2006 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 1996.
@@ -246,7 +246,7 @@ print_version (FILE *stream, struct argp_state *state)
Copyright (C) %s Free Software Foundation, Inc.\n\
This is free software; see the source for copying conditions. There is NO\n\
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
-"), "2007");
+"), "2006");
fprintf (stream, gettext ("Written by %s.\n"), "Ulrich Drepper");
}
diff --git a/config.h.in b/config.h.in
index a46e405269b..ba4dec8affc 100644
--- a/config.h.in
+++ b/config.h.in
@@ -19,6 +19,9 @@
/* Defined if building with SELinux support & audit libs are detected. */
#undef HAVE_LIBAUDIT
+/* Defined if building with SELinux support & libcap libs are detected. */
+#undef HAVE_LIBCAP
+
/* Define if using XCOFF. Set by --with-xcoff. */
#undef HAVE_XCOFF
@@ -120,6 +123,23 @@
/* Define if the linker supports the -z combreloc option. */
#undef HAVE_Z_COMBRELOC
+/* Define if the assembler supported .protected. */
+#undef HAVE_PROTECTED
+
+/* Define if the assembler supported .hidden. */
+#undef HAVE_HIDDEN
+
+/* Define if the compiler supports __attribute__ ((visibility (...))). */
+#undef HAVE_VISIBILITY_ATTRIBUTE
+
+/* Define if the compiler doesn't support __attribute__ ((visibility (...)))
+ together with __asm__ redirection properly. */
+#undef HAVE_BROKEN_VISIBILITY_ATTRIBUTE
+
+/* Define if the compiler doesn't support __attribute__ ((alias (...)))
+ together with __asm__ redirection properly. */
+#undef HAVE_BROKEN_ALIAS_ATTRIBUTE
+
/* Define if _rtld_local structure should be forced into .sdata section. */
#undef HAVE_SDATA_SECTION
@@ -171,6 +191,9 @@
/* Defined if forced unwind support is available. */
#undef HAVE_FORCED_UNWIND
+/* Defined if the linker supports the -z relro option. */
+#undef HAVE_Z_RELRO
+
/* Defined of libidn is available. */
#undef HAVE_LIBIDN
diff --git a/config.make.in b/config.make.in
index 7aa9c1c12da..677da3a8917 100644
--- a/config.make.in
+++ b/config.make.in
@@ -38,9 +38,14 @@ c++-sysincludes = @CXX_SYSINCLUDES@
all-warnings = @all_warnings@
elf = @elf@
+have-protected = @libc_cv_asm_protected_directive@
+have-z-nodelete = @libc_cv_z_nodelete@
+have-z-nodlopen = @libc_cv_z_nodlopen@
+have-z-initfirst = @libc_cv_z_initfirst@
have-z-combreloc = @libc_cv_z_combreloc@
have-z-execstack = @libc_cv_z_execstack@
have-initfini = @libc_cv_have_initfini@
+have-z-relro = @libc_cv_z_relro@
have-Bgroup = @libc_cv_Bgroup@
have-as-needed = @libc_cv_as_needed@
libgcc_s_suffix = @libc_cv_libgcc_s_suffix@
diff --git a/configure b/configure
index 0f00394f038..d14f89a8a98 100755
--- a/configure
+++ b/configure
@@ -313,7 +313,7 @@ ac_includes_default="\
# include <unistd.h>
#endif"
-ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS with_fp with_cvs enable_check_abi oldest_abi bindnow force_install all_warnings build build_cpu build_vendor build_os host host_cpu host_vendor host_os subdirs add_ons add_on_subdirs base_machine submachine sysnames sysdeps_add_ons INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA LN_S CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC OBJEXT BUILD_CC cross_compiling CPP CXX CXXFLAGS ac_ct_CXX AR OBJDUMP RANLIB ac_ct_RANLIB MIG AS LD PWD_P MAKE MSGFMT MAKEINFO SED AUTOCONF SYSINCLUDES CXX_SYSINCLUDES libc_cv_gcc_static_libgcc BASH libc_cv_have_bash2 KSH libc_cv_have_ksh AWK PERL INSTALL_INFO BISON VERSIONING libc_cv_cc_with_libunwind libc_cv_Bgroup libc_cv_libgcc_s_suffix libc_cv_as_needed ASFLAGS_config libc_cv_z_combreloc libc_cv_z_execstack libc_cv_fpie libc_cv_hashstyle fno_unit_at_a_time libc_cv_ssp libc_cv_have_initfini no_whole_archive exceptions LIBGD have_libaudit have_libcap have_selinux EGREP sizeof_long_double libc_cv_gcc_unwind_find_fde uname_sysname uname_release uname_version old_glibc_headers libc_cv_slibdir libc_cv_localedir libc_cv_sysconfdir libc_cv_rootsbindir libc_cv_forced_unwind use_ldconfig ldd_rewrite_script elf xcoff static shared pic_default profile omitfp bounded static_nss nopic_initfini DEFINES mach_interface_list VERSION RELEASE LIBOBJS LTLIBOBJS'
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS with_fp with_cvs enable_check_abi oldest_abi bindnow force_install all_warnings build build_cpu build_vendor build_os host host_cpu host_vendor host_os subdirs add_ons add_on_subdirs base_machine submachine sysnames sysdeps_add_ons INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA LN_S CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC OBJEXT BUILD_CC cross_compiling CPP CXX CXXFLAGS ac_ct_CXX AR OBJDUMP RANLIB ac_ct_RANLIB MIG AS LD PWD_P MAKE MSGFMT MAKEINFO SED AUTOCONF SYSINCLUDES CXX_SYSINCLUDES libc_cv_gcc_static_libgcc BASH libc_cv_have_bash2 KSH libc_cv_have_ksh AWK PERL INSTALL_INFO BISON VERSIONING libc_cv_asm_protected_directive libc_cv_cc_with_libunwind libc_cv_z_nodelete libc_cv_z_nodlopen libc_cv_z_initfirst libc_cv_z_relro libc_cv_Bgroup libc_cv_libgcc_s_suffix libc_cv_as_needed ASFLAGS_config libc_cv_z_combreloc libc_cv_z_execstack libc_cv_fpie libc_cv_hashstyle fno_unit_at_a_time libc_cv_ssp libc_cv_have_initfini no_whole_archive exceptions LIBGD have_libaudit have_libcap have_selinux EGREP sizeof_long_double libc_cv_gcc_unwind_find_fde uname_sysname uname_release uname_version old_glibc_headers libc_cv_slibdir libc_cv_localedir libc_cv_sysconfdir libc_cv_rootsbindir libc_cv_forced_unwind use_ldconfig ldd_rewrite_script elf xcoff static shared pic_default profile omitfp bounded static_nss nopic_initfini DEFINES mach_interface_list VERSION RELEASE LIBOBJS LTLIBOBJS'
ac_subst_files=''
# Initialize some variables set by options.
@@ -864,7 +864,7 @@ Optional Features:
[default=no]
--enable-shared build shared library [default=yes if GNU ld &
ELF]
- --enable-profile build profiled library [default=no]
+ --enable-profile build profiled library [default=yes]
--enable-omitfp build undebuggable optimized library
[default=no]
--enable-bounded build with runtime bounds checking
@@ -1543,7 +1543,7 @@ if test "${enable_profile+set}" = set; then
enableval="$enable_profile"
profile=$enableval
else
- profile=no
+ profile=yes
fi;
# Check whether --enable-omitfp or --disable-omitfp was given.
if test "${enable_omitfp+set}" = set; then
@@ -5339,15 +5339,22 @@ EOF
(exit $ac_status); }; }; then
libc_cv_asm_protected_directive=yes
else
- { { echo "$as_me:$LINENO: error: assembler support for symbol visibility is required" >&5
-echo "$as_me: error: assembler support for symbol visibility is required" >&2;}
- { (exit 1); exit 1; }; }
+ libc_cv_asm_protected_directive=no
fi
rm -f conftest*
fi
echo "$as_me:$LINENO: result: $libc_cv_asm_protected_directive" >&5
echo "${ECHO_T}$libc_cv_asm_protected_directive" >&6
+ cat >>confdefs.h <<\_ACEOF
+#define HAVE_PROTECTED 1
+_ACEOF
+
+ cat >>confdefs.h <<\_ACEOF
+#define HAVE_HIDDEN 1
+_ACEOF
+
+
if test $libc_cv_asm_protected_directive = yes; then
echo "$as_me:$LINENO: checking whether __attribute__((visibility())) is supported" >&5
echo $ECHO_N "checking whether __attribute__((visibility())) is supported... $ECHO_C" >&6
@@ -5376,10 +5383,11 @@ EOF
fi
echo "$as_me:$LINENO: result: $libc_cv_visibility_attribute" >&5
echo "${ECHO_T}$libc_cv_visibility_attribute" >&6
- if test $libc_cv_visibility_attribute != yes; then
- { { echo "$as_me:$LINENO: error: compiler support for visibility attribute is required" >&5
-echo "$as_me: error: compiler support for visibility attribute is required" >&2;}
- { (exit 1); exit 1; }; }
+ if test $libc_cv_visibility_attribute = yes; then
+ cat >>confdefs.h <<\_ACEOF
+#define HAVE_VISIBILITY_ATTRIBUTE 1
+_ACEOF
+
fi
fi
@@ -5411,9 +5419,10 @@ fi
echo "$as_me:$LINENO: result: $libc_cv_broken_visibility_attribute" >&5
echo "${ECHO_T}$libc_cv_broken_visibility_attribute" >&6
if test $libc_cv_broken_visibility_attribute = yes; then
- { { echo "$as_me:$LINENO: error: working compiler support for visibility attribute is required" >&5
-echo "$as_me: error: working compiler support for visibility attribute is required" >&2;}
- { (exit 1); exit 1; }; }
+ cat >>confdefs.h <<\_ACEOF
+#define HAVE_BROKEN_VISIBILITY_ATTRIBUTE 1
+_ACEOF
+
fi
fi
@@ -5448,9 +5457,10 @@ fi
echo "$as_me:$LINENO: result: $libc_cv_broken_alias_attribute" >&5
echo "${ECHO_T}$libc_cv_broken_alias_attribute" >&6
if test $libc_cv_broken_alias_attribute = yes; then
- { { echo "$as_me:$LINENO: error: working alias attribute support required" >&5
-echo "$as_me: error: working alias attribute support required" >&2;}
- { (exit 1); exit 1; }; }
+ cat >>confdefs.h <<\_ACEOF
+#define HAVE_BROKEN_ALIAS_ATTRIBUTE 1
+_ACEOF
+
fi
if test $libc_cv_visibility_attribute = yes; then
@@ -5562,15 +5572,14 @@ EOF
then
libc_cv_z_nodelete=yes
else
- { { echo "$as_me:$LINENO: error: linker with -z nodelete support required" >&5
-echo "$as_me: error: linker with -z nodelete support required" >&2;}
- { (exit 1); exit 1; }; }
+ libc_cv_z_nodelete=no
fi
rm -f conftest*
fi
echo "$as_me:$LINENO: result: $libc_cv_z_nodelete" >&5
echo "${ECHO_T}$libc_cv_z_nodelete" >&6
+
echo "$as_me:$LINENO: checking for -z nodlopen option" >&5
echo $ECHO_N "checking for -z nodlopen option... $ECHO_C" >&6
if test "${libc_cv_z_nodlopen+set}" = set; then
@@ -5591,15 +5600,14 @@ EOF
then
libc_cv_z_nodlopen=yes
else
- { { echo "$as_me:$LINENO: error: linker with -z nodlopen support required" >&5
-echo "$as_me: error: linker with -z nodlopen support required" >&2;}
- { (exit 1); exit 1; }; }
+ libc_cv_z_nodlopen=no
fi
rm -f conftest*
fi
echo "$as_me:$LINENO: result: $libc_cv_z_nodlopen" >&5
echo "${ECHO_T}$libc_cv_z_nodlopen" >&6
+
echo "$as_me:$LINENO: checking for -z initfirst option" >&5
echo $ECHO_N "checking for -z initfirst option... $ECHO_C" >&6
if test "${libc_cv_z_initfirst+set}" = set; then
@@ -5620,18 +5628,15 @@ EOF
then
libc_cv_z_initfirst=yes
else
- { { echo "$as_me:$LINENO: error: linker with -z initfirst support required" >&5
-echo "$as_me: error: linker with -z initfirst support required" >&2;}
- { (exit 1); exit 1; }; }
+ libc_cv_z_initfirst=no
fi
rm -f conftest*
fi
echo "$as_me:$LINENO: result: $libc_cv_z_initfirst" >&5
echo "${ECHO_T}$libc_cv_z_initfirst" >&6
- case "$base_machine" in
- i[34567]86 | x86_64 | powerpc* | s390* | sparc* | alpha*)
- echo "$as_me:$LINENO: checking for -z relro option" >&5
+
+ echo "$as_me:$LINENO: checking for -z relro option" >&5
echo $ECHO_N "checking for -z relro option... $ECHO_C" >&6
if test "${libc_cv_z_relro+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -5657,14 +5662,13 @@ else
fi
echo "$as_me:$LINENO: result: $libc_cv_z_relro" >&5
echo "${ECHO_T}$libc_cv_z_relro" >&6
- if test "$libc_cv_z_relro" = no; then
- { { echo "$as_me:$LINENO: error: linker with -z relro support required" >&5
-echo "$as_me: error: linker with -z relro support required" >&2;}
- { (exit 1); exit 1; }; }
- fi
- ;;
- *) ;;
- esac
+
+ if test $libc_cv_z_relro = yes; then
+ cat >>confdefs.h <<\_ACEOF
+#define HAVE_Z_RELRO 1
+_ACEOF
+
+ fi
echo "$as_me:$LINENO: checking for -Bgroup option" >&5
echo $ECHO_N "checking for -Bgroup option... $ECHO_C" >&6
@@ -8506,7 +8510,12 @@ s,@PERL@,$PERL,;t t
s,@INSTALL_INFO@,$INSTALL_INFO,;t t
s,@BISON@,$BISON,;t t
s,@VERSIONING@,$VERSIONING,;t t
+s,@libc_cv_asm_protected_directive@,$libc_cv_asm_protected_directive,;t t
s,@libc_cv_cc_with_libunwind@,$libc_cv_cc_with_libunwind,;t t
+s,@libc_cv_z_nodelete@,$libc_cv_z_nodelete,;t t
+s,@libc_cv_z_nodlopen@,$libc_cv_z_nodlopen,;t t
+s,@libc_cv_z_initfirst@,$libc_cv_z_initfirst,;t t
+s,@libc_cv_z_relro@,$libc_cv_z_relro,;t t
s,@libc_cv_Bgroup@,$libc_cv_Bgroup,;t t
s,@libc_cv_libgcc_s_suffix@,$libc_cv_libgcc_s_suffix,;t t
s,@libc_cv_as_needed@,$libc_cv_as_needed,;t t
diff --git a/configure.in b/configure.in
index 71ceb04b332..924b0406cb4 100644
--- a/configure.in
+++ b/configure.in
@@ -131,9 +131,9 @@ AC_ARG_ENABLE([shared],
[shared=default])
AC_ARG_ENABLE([profile],
AC_HELP_STRING([--enable-profile],
- [build profiled library @<:@default=no@:>@]),
+ [build profiled library @<:@default=yes@:>@]),
[profile=$enableval],
- [profile=no])
+ [profile=yes])
AC_ARG_ENABLE([omitfp],
AC_HELP_STRING([--enable-omitfp],
[build undebuggable optimized library @<:@default=no@:>@]),
@@ -1259,9 +1259,12 @@ EOF
if AC_TRY_COMMAND(${CC-cc} -c $ASFLAGS conftest.s 1>&AS_MESSAGE_LOG_FD); then
libc_cv_asm_protected_directive=yes
else
- AC_MSG_ERROR(assembler support for symbol visibility is required)
+ libc_cv_asm_protected_directive=no
fi
rm -f conftest*])
+ AC_SUBST(libc_cv_asm_protected_directive)
+ AC_DEFINE(HAVE_PROTECTED)
+ AC_DEFINE(HAVE_HIDDEN)
if test $libc_cv_asm_protected_directive = yes; then
AC_CACHE_CHECK(whether __attribute__((visibility())) is supported,
@@ -1280,8 +1283,8 @@ EOF
fi
rm -f conftest.[cs]
])
- if test $libc_cv_visibility_attribute != yes; then
- AC_MSG_ERROR(compiler support for visibility attribute is required)
+ if test $libc_cv_visibility_attribute = yes; then
+ AC_DEFINE(HAVE_VISIBILITY_ATTRIBUTE)
fi
fi
@@ -1304,7 +1307,7 @@ changequote([,])dnl
rm -f conftest.c conftest.s
])
if test $libc_cv_broken_visibility_attribute = yes; then
- AC_MSG_ERROR(working compiler support for visibility attribute is required)
+ AC_DEFINE(HAVE_BROKEN_VISIBILITY_ATTRIBUTE)
fi
fi
@@ -1328,7 +1331,7 @@ EOF
rm -f conftest.c conftest.s
])
if test $libc_cv_broken_alias_attribute = yes; then
- AC_MSG_ERROR(working alias attribute support required)
+ AC_DEFINE(HAVE_BROKEN_ALIAS_ATTRIBUTE)
fi
if test $libc_cv_visibility_attribute = yes; then
@@ -1400,9 +1403,10 @@ EOF
then
libc_cv_z_nodelete=yes
else
- AC_MSG_ERROR(linker with -z nodelete support required)
+ libc_cv_z_nodelete=no
fi
rm -f conftest*])
+ AC_SUBST(libc_cv_z_nodelete)
AC_CACHE_CHECK(for -z nodlopen option,
libc_cv_z_nodlopen, [dnl
@@ -1416,9 +1420,10 @@ EOF
then
libc_cv_z_nodlopen=yes
else
- AC_MSG_ERROR(linker with -z nodlopen support required)
+ libc_cv_z_nodlopen=no
fi
rm -f conftest*])
+ AC_SUBST(libc_cv_z_nodlopen)
AC_CACHE_CHECK(for -z initfirst option,
libc_cv_z_initfirst, [dnl
@@ -1432,16 +1437,13 @@ EOF
then
libc_cv_z_initfirst=yes
else
- AC_MSG_ERROR(linker with -z initfirst support required)
+ libc_cv_z_initfirst=no
fi
rm -f conftest*])
+ AC_SUBST(libc_cv_z_initfirst)
- case "$base_machine" in
-changequote(,)dnl
- i[34567]86 | x86_64 | powerpc* | s390* | sparc* | alpha*)
-changequote([,])dnl
- AC_CACHE_CHECK(for -z relro option,
- libc_cv_z_relro, [dnl
+ AC_CACHE_CHECK(for -z relro option,
+ libc_cv_z_relro, [dnl
libc_cv_z_relro=no
if AC_TRY_COMMAND([${CC-cc} -v --help 2>&1|grep "z relro" 1>&AS_MESSAGE_LOG_FD])
then
@@ -1450,12 +1452,10 @@ changequote([,])dnl
libc_cv_z_relro=yes
fi
fi])
- if test "$libc_cv_z_relro" = no; then
- AC_MSG_ERROR(linker with -z relro support required)
- fi
- ;;
- *) ;;
- esac
+ AC_SUBST(libc_cv_z_relro)
+ if test $libc_cv_z_relro = yes; then
+ AC_DEFINE(HAVE_Z_RELRO)
+ fi
AC_CACHE_CHECK(for -Bgroup option,
libc_cv_Bgroup, [dnl
diff --git a/csu/Versions b/csu/Versions
index f0b4f00549a..a1321a9df8e 100644
--- a/csu/Versions
+++ b/csu/Versions
@@ -5,7 +5,7 @@ libc {
# helper functions
__libc_init_first; __libc_start_main;
-%if !HAVE___THREAD
+%if !(USE_TLS && HAVE___THREAD)
# global variables
_errno;
@@ -18,7 +18,7 @@ libc {
gnu_get_libc_release; gnu_get_libc_version;
}
GLIBC_PRIVATE {
-%if HAVE___THREAD
+%if USE_TLS && HAVE___THREAD
# This version is for the TLS symbol, GLIBC_2.0 is the old object symbol.
errno;
%endif
diff --git a/csu/libc-start.c b/csu/libc-start.c
index 634844759da..194db6b1ec5 100644
--- a/csu/libc-start.c
+++ b/csu/libc-start.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1998-2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+/* Copyright (C) 1998-2003, 2004, 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -30,7 +30,11 @@ extern int __libc_multiple_libcs;
#include <tls.h>
#ifndef SHARED
# include <dl-osinfo.h>
-extern void __pthread_initialize_minimal (void);
+extern void __pthread_initialize_minimal (void)
+# if !(USE_TLS - 0) && !defined NONTLS_INIT_TP
+ __attribute__ ((weak))
+# endif
+ ;
# ifndef THREAD_SET_STACK_GUARD
/* Only exported for architectures that don't store the stack guard canary
in thread local area. */
@@ -136,8 +140,13 @@ LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL),
/* Initialize the thread library at least a bit since the libgcc
functions are using thread functions if these are available and
- we need to setup errno. */
- __pthread_initialize_minimal ();
+ we need to setup errno. If there is no thread library and we
+ handle TLS the function is defined in the libc to initialized the
+ TLS handling. */
+# if !(USE_TLS - 0) && !defined NONTLS_INIT_TP
+ if (__pthread_initialize_minimal)
+# endif
+ __pthread_initialize_minimal ();
#endif
# ifndef SHARED
diff --git a/csu/libc-tls.c b/csu/libc-tls.c
index 0d240ccef99..3544e396dae 100644
--- a/csu/libc-tls.c
+++ b/csu/libc-tls.c
@@ -1,5 +1,5 @@
/* Initialization code for TLS in statically linked application.
- Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+ Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -29,6 +29,7 @@
#error makefile bug, this file is for static only
#endif
+#ifdef USE_TLS
extern ElfW(Phdr) *_dl_phdr;
extern size_t _dl_phnum;
@@ -142,19 +143,19 @@ __libc_setup_tls (size_t tcbsize, size_t tcbalign)
The initialized value of _dl_tls_static_size is provided by dl-open.c
to request some surplus that permits dynamic loading of modules with
IE-model TLS. */
-#if TLS_TCB_AT_TP
+# if TLS_TCB_AT_TP
tcb_offset = roundup (memsz + GL(dl_tls_static_size), tcbalign);
tlsblock = __sbrk (tcb_offset + tcbsize + max_align);
-#elif TLS_DTV_AT_TP
+# elif TLS_DTV_AT_TP
tcb_offset = roundup (tcbsize, align ?: 1);
tlsblock = __sbrk (tcb_offset + memsz + max_align
+ TLS_PRE_TCB_SIZE + GL(dl_tls_static_size));
tlsblock += TLS_PRE_TCB_SIZE;
-#else
+# else
/* In case a model with a different layout for the TCB and DTV
is defined add another #elif here and in the following #ifs. */
-# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
-#endif
+# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
+# endif
/* Align the TLS block. */
tlsblock = (void *) (((uintptr_t) tlsblock + max_align - 1)
@@ -165,16 +166,16 @@ __libc_setup_tls (size_t tcbsize, size_t tcbalign)
// static_dtv[1].counter = 0; would be needed if not already done
/* Initialize the TLS block. */
-#if TLS_TCB_AT_TP
+# if TLS_TCB_AT_TP
static_dtv[2].pointer.val = ((char *) tlsblock + tcb_offset
- roundup (memsz, align ?: 1));
static_map.l_tls_offset = roundup (memsz, align ?: 1);
-#elif TLS_DTV_AT_TP
+# elif TLS_DTV_AT_TP
static_dtv[2].pointer.val = (char *) tlsblock + tcb_offset;
static_map.l_tls_offset = tcb_offset;
-#else
-# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
-#endif
+# else
+# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
+# endif
static_dtv[2].pointer.is_static = true;
/* sbrk gives us zero'd memory, so we don't need to clear the remainder. */
memcpy (static_dtv[2].pointer.val, initimage, filesz);
@@ -182,16 +183,16 @@ __libc_setup_tls (size_t tcbsize, size_t tcbalign)
/* Install the pointer to the dtv. */
/* Initialize the thread pointer. */
-#if TLS_TCB_AT_TP
+# if TLS_TCB_AT_TP
INSTALL_DTV ((char *) tlsblock + tcb_offset, static_dtv);
const char *lossage = TLS_INIT_TP ((char *) tlsblock + tcb_offset, 0);
-#elif TLS_DTV_AT_TP
+# elif TLS_DTV_AT_TP
INSTALL_DTV (tlsblock, static_dtv);
const char *lossage = TLS_INIT_TP (tlsblock, 0);
-#else
-# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
-#endif
+# else
+# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
+# endif
if (__builtin_expect (lossage != NULL, 0))
__libc_fatal (lossage);
@@ -211,11 +212,11 @@ __libc_setup_tls (size_t tcbsize, size_t tcbalign)
memsz = roundup (memsz, align ?: 1);
-#if TLS_TCB_AT_TP
+# if TLS_TCB_AT_TP
memsz += tcbsize;
-#elif TLS_DTV_AT_TP
+# elif TLS_DTV_AT_TP
memsz += tcb_offset;
-#endif
+# endif
init_static_tls (memsz, MAX (TLS_TCB_ALIGN, max_align));
}
@@ -229,11 +230,11 @@ _dl_tls_setup (void)
{
init_slotinfo ();
init_static_tls (
-#if TLS_TCB_AT_TP
+# if TLS_TCB_AT_TP
TLS_TCB_SIZE,
-#else
+# else
0,
-#endif
+# endif
TLS_TCB_ALIGN);
return 0;
}
@@ -247,3 +248,16 @@ __pthread_initialize_minimal (void)
{
__libc_setup_tls (TLS_INIT_TCB_SIZE, TLS_INIT_TCB_ALIGN);
}
+
+#elif defined NONTLS_INIT_TP
+
+/* This is the minimal initialization function used when libpthread is
+ not used. */
+void
+__attribute__ ((weak))
+__pthread_initialize_minimal (void)
+{
+ NONTLS_INIT_TP;
+}
+
+#endif
diff --git a/csu/tst-atomic.c b/csu/tst-atomic.c
index 7c0b022b78f..7a2e3d08655 100644
--- a/csu/tst-atomic.c
+++ b/csu/tst-atomic.c
@@ -1,5 +1,5 @@
/* Tests for atomic.h macros.
- Copyright (C) 2003, 2004, 2006 Free Software Foundation, Inc.
+ Copyright (C) 2003, 2004 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
@@ -379,117 +379,6 @@ do_test (void)
}
#endif
-#ifdef catomic_compare_and_exchange_val_acq
- mem = 24;
- if (catomic_compare_and_exchange_val_acq (&mem, 35, 24) != 24
- || mem != 35)
- {
- puts ("catomic_compare_and_exchange_val_acq test 1 failed");
- ret = 1;
- }
-
- mem = 12;
- if (catomic_compare_and_exchange_val_acq (&mem, 10, 15) != 12
- || mem != 12)
- {
- puts ("catomic_compare_and_exchange_val_acq test 2 failed");
- ret = 1;
- }
-
- mem = -15;
- if (catomic_compare_and_exchange_val_acq (&mem, -56, -15) != -15
- || mem != -56)
- {
- puts ("catomic_compare_and_exchange_val_acq test 3 failed");
- ret = 1;
- }
-
- mem = -1;
- if (catomic_compare_and_exchange_val_acq (&mem, 17, 0) != -1
- || mem != -1)
- {
- puts ("catomic_compare_and_exchange_val_acq test 4 failed");
- ret = 1;
- }
-#endif
-
- mem = 24;
- if (catomic_compare_and_exchange_bool_acq (&mem, 35, 24)
- || mem != 35)
- {
- puts ("catomic_compare_and_exchange_bool_acq test 1 failed");
- ret = 1;
- }
-
- mem = 12;
- if (! catomic_compare_and_exchange_bool_acq (&mem, 10, 15)
- || mem != 12)
- {
- puts ("catomic_compare_and_exchange_bool_acq test 2 failed");
- ret = 1;
- }
-
- mem = -15;
- if (catomic_compare_and_exchange_bool_acq (&mem, -56, -15)
- || mem != -56)
- {
- puts ("catomic_compare_and_exchange_bool_acq test 3 failed");
- ret = 1;
- }
-
- mem = -1;
- if (! catomic_compare_and_exchange_bool_acq (&mem, 17, 0)
- || mem != -1)
- {
- puts ("catomic_compare_and_exchange_bool_acq test 4 failed");
- ret = 1;
- }
-
- mem = 2;
- if (catomic_exchange_and_add (&mem, 11) != 2
- || mem != 13)
- {
- puts ("catomic_exchange_and_add test failed");
- ret = 1;
- }
-
- mem = -21;
- catomic_add (&mem, 22);
- if (mem != 1)
- {
- puts ("catomic_add test failed");
- ret = 1;
- }
-
- mem = -1;
- catomic_increment (&mem);
- if (mem != 0)
- {
- puts ("catomic_increment test failed");
- ret = 1;
- }
-
- mem = 2;
- if (catomic_increment_val (&mem) != 3)
- {
- puts ("catomic_increment_val test failed");
- ret = 1;
- }
-
- mem = 17;
- catomic_decrement (&mem);
- if (mem != 16)
- {
- puts ("catomic_decrement test failed");
- ret = 1;
- }
-
- if (catomic_decrement_val (&mem) != 15)
- {
- puts ("catomic_decrement_val test failed");
- ret = 1;
- }
-
return ret;
}
diff --git a/csu/version.c b/csu/version.c
index f7a8fb35e93..2196d204325 100644
--- a/csu/version.c
+++ b/csu/version.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1992-2006, 2007 Free Software Foundation, Inc.
+/* Copyright (C) 1992-2002, 2003, 2004, 2006 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -25,7 +25,7 @@ static const char __libc_version[] = VERSION;
static const char banner[] =
"GNU C Library "RELEASE" release version "VERSION", by Roland McGrath et al.\n\
-Copyright (C) 2007 Free Software Foundation, Inc.\n\
+Copyright (C) 2006 Free Software Foundation, Inc.\n\
This is free software; see the source for copying conditions.\n\
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A\n\
PARTICULAR PURPOSE.\n\
@@ -34,6 +34,9 @@ Compiled by GNU CC version "__VERSION__".\n"
#ifdef GLIBC_OLDEST_ABI
"The oldest ABI supported: " GLIBC_OLDEST_ABI ".\n"
#endif
+#ifdef USE_TLS
+"Thread-local storage support included.\n"
+#endif
"For bug reporting instructions, please see:\n\
<http://www.gnu.org/software/libc/bugs.html>.\n";
diff --git a/debug/catchsegv.sh b/debug/catchsegv.sh
index 6f47fab42a2..f4d971e34b3 100755
--- a/debug/catchsegv.sh
+++ b/debug/catchsegv.sh
@@ -1,6 +1,5 @@
#! /bin/sh
-# Copyright (C) 1998,1999,2001,2003,2004,2006,2007
-# Free Software Foundation, Inc.
+# Copyright (C) 1998,1999,2001,2003,2004,2006 Free Software Foundation, Inc.
# This file is part of the GNU C Library.
# Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
@@ -40,7 +39,7 @@ if test $# -eq 0; then
;;
--v | --ve | --ver | --vers | --versi | --versio | --version)
echo 'catchsegv (GNU libc) @VERSION@'
- echo 'Copyright (C) 2007 Free Software Foundation, Inc.
+ echo 'Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Ulrich Drepper.'
diff --git a/debug/xtrace.sh b/debug/xtrace.sh
index e8ffe2f4208..c913c76d217 100755
--- a/debug/xtrace.sh
+++ b/debug/xtrace.sh
@@ -64,7 +64,7 @@ do_version() {
printf $"Copyright (C) %s Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-" "2007"
+" "2006"
printf $"Written by %s.
" "Ulrich Drepper"
exit 0
@@ -161,32 +161,32 @@ if test -n "$data"; then
while read fct; do
read file
if test "$fct" != '??' -a "$file" != '??:0'; then
- format_line $fct $file
+ format_line "$fct" "$file"
fi
done
else
- fifo=$(mktemp -u ${TMPDIR:-/tmp}/xtrace.XXXXXX)
+ fifo=$(mktemp -ut xtrace.XXXXXX) || exit
+ trap 'rm -f "$fifo"; exit 1' HUP INT QUIT TERM PIPE
mkfifo -m 0600 $fifo || exit 1
- trap 'rm $fifo; exit 1' SIGINT SIGTERM SIGPIPE
# Now start the program and let it write to the FIFO.
$TERMINAL_PROG -T "xtrace - $program $*" -e /bin/sh -c "LD_PRELOAD=$pcprofileso PCPROFILE_OUTPUT=$fifo $program $*; read < $fifo" &
termpid=$!
- $pcprofiledump -u $fifo |
+ $pcprofiledump -u "$fifo" |
while read line; do
- echo $line |
+ echo "$line" |
sed 's/this = \([^,]*\).*/\1/' |
- addr2line -fC -e $program
+ addr2line -fC -e "$program"
done |
while read fct; do
read file
if test "$fct" != '??' -a "$file" != '??:0'; then
- format_line $fct $file
+ format_line "$fct" "$file"
fi
done
read -p "Press return here to close $TERMINAL_PROG($program)."
- echo > $fifo
- rm $fifo
+ echo > "$fifo"
+ rm "$fifo"
fi
exit 0
diff --git a/dlfcn/Makefile b/dlfcn/Makefile
index e8fbab2958c..63e7b31b2a9 100644
--- a/dlfcn/Makefile
+++ b/dlfcn/Makefile
@@ -41,7 +41,10 @@ endif
ifeq (yes,$(build-shared))
tests = glrefmain failtest tst-dladdr default errmsg1 tstcxaatexit \
bug-dlopen1 bug-dlsym1 tst-dlinfo bug-atexit1 bug-atexit2 \
- bug-atexit3 tstatexit
+ bug-atexit3
+ifeq (yes,$(have-protected))
+tests += tstatexit
+endif
endif
modules-names = glreflib1 glreflib2 failtestmod defaultmod1 defaultmod2 \
errmsg1mod modatexit modcxaatexit \
diff --git a/dlfcn/dlinfo.c b/dlfcn/dlinfo.c
index 923127cbf3d..20aa9504fb1 100644
--- a/dlfcn/dlinfo.c
+++ b/dlfcn/dlinfo.c
@@ -1,5 +1,5 @@
/* dlinfo -- Get information from the dynamic linker.
- Copyright (C) 2003, 2004, 2006 Free Software Foundation, Inc.
+ Copyright (C) 2003, 2004, 2006, 2007 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -32,7 +32,9 @@ dlinfo (void *handle, int request, void *arg)
#else
-# include <dl-tls.h>
+# ifdef USE_TLS
+# include <dl-tls.h>
+# endif
struct dlinfo_args
{
@@ -56,9 +58,8 @@ dlinfo_doit (void *argsblock)
/* Find the highest-addressed object that CALLER is not below. */
for (nsid = 0; nsid < DL_NNS; ++nsid)
for (l = GL(dl_ns)[nsid]._ns_loaded; l != NULL; l = l->l_next)
- if (caller >= l->l_map_start && caller < l->l_map_end)
- /* There must be exactly one DSO for the range of the virtual
- memory. Otherwise something is really broken. */
+ if (caller >= l->l_map_start && caller < l->l_map_end
+ && (l->l_contiguous || _dl_addr_inside_object (l, caller)))
break;
if (l == NULL)
@@ -95,14 +96,18 @@ RTLD_SELF used in code not dynamically loaded"));
case RTLD_DI_TLS_MODID:
*(size_t *) args->arg = 0;
+#ifdef USE_TLS
*(size_t *) args->arg = l->l_tls_modid;
+#endif
break;
case RTLD_DI_TLS_DATA:
{
void *data = NULL;
+#ifdef USE_TLS
if (l->l_tls_modid != 0)
data = _dl_tls_get_addr_soft (l);
+#endif
*(void **) args->arg = data;
break;
}
diff --git a/elf/Makefile b/elf/Makefile
index afebaec1ec0..06e376d8032 100644
--- a/elf/Makefile
+++ b/elf/Makefile
@@ -159,8 +159,8 @@ endif
ifeq (yes,$(build-shared))
tests += loadtest restest1 preloadtest loadfail multiload origtest resolvfail \
constload1 order $(tests-vis-$(have-protected)) noload filter unload \
- reldep reldep2 reldep3 reldep4 nodelete nodelete2 \
- nodlopen nodlopen2 neededtest neededtest2 \
+ reldep reldep2 reldep3 reldep4 $(tests-nodelete-$(have-z-nodelete)) \
+ $(tests-nodlopen-$(have-z-nodlopen)) neededtest neededtest2 \
neededtest3 neededtest4 unload2 lateglobal initfirst global \
restest2 next dblload dblunload reldep5 reldep6 reldep7 reldep8 \
circleload1 tst-tls3 tst-tls4 tst-tls5 tst-tls6 tst-tls7 tst-tls8 \
@@ -175,6 +175,8 @@ tests += loadtest restest1 preloadtest loadfail multiload origtest resolvfail \
# reldep9
test-srcs = tst-pathopt
tests-vis-yes = vismain
+tests-nodelete-yes = nodelete nodelete2
+tests-nodlopen-yes = nodlopen nodlopen2
tests-execstack-yes = tst-execstack tst-execstack-needed tst-execstack-prog
endif
ifeq (yesyes,$(have-fpie)$(build-shared))
@@ -184,9 +186,8 @@ tests: $(objpfx)tst-leaks1-mem
modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \
testobj1_1 failobj constload2 constload3 unloadmod \
dep1 dep2 dep3 dep4 $(modules-vis-$(have-protected)) \
- nodelmod1 nodelmod2 nodelmod3 nodelmod4 \
- nodel2mod1 nodel2mod2 nodel2mod3 \
- nodlopenmod nodlopenmod2 filtmod1 filtmod2 \
+ $(modules-nodelete-$(have-z-nodelete)) \
+ $(modules-nodlopen-$(have-z-nodlopen)) filtmod1 filtmod2 \
reldepmod1 reldepmod2 reldepmod3 reldepmod4 nextmod1 nextmod2 \
reldep4mod1 reldep4mod2 reldep4mod3 reldep4mod4 \
neededobj1 neededobj2 neededobj3 neededobj4 \
@@ -220,6 +221,9 @@ ifeq (yesyes,$(have-fpie)$(build-shared))
modules-names += tst-piemod1
endif
modules-vis-yes = vismod1 vismod2 vismod3
+modules-nodelete-yes = nodelmod1 nodelmod2 nodelmod3 nodelmod4 \
+ nodel2mod1 nodel2mod2 nodel2mod3
+modules-nodlopen-yes = nodlopenmod nodlopenmod2
modules-execstack-yes = tst-execstack-mod
extra-test-objs += $(addsuffix .os,$(strip $(modules-names)))
# We need this variable to be sure the test modules get the right CPPFLAGS.
diff --git a/elf/cache.c b/elf/cache.c
index e18446644e5..6730fb36eb5 100644
--- a/elf/cache.c
+++ b/elf/cache.c
@@ -439,7 +439,7 @@ save_cache (const char *cache_name)
}
if (write (fd, strings, total_strlen) != (ssize_t) total_strlen)
- error (EXIT_FAILURE, errno, _("Writing of cache data failed"));
+ error (EXIT_FAILURE, errno, _("Writing of cache data failed."));
close (fd);
diff --git a/elf/dl-addr.c b/elf/dl-addr.c
index e55dc4b46f0..7dbf716cfa4 100644
--- a/elf/dl-addr.c
+++ b/elf/dl-addr.c
@@ -1,5 +1,5 @@
/* Locate the shared object symbol nearest a given address.
- Copyright (C) 1996-2004, 2005, 2006 Free Software Foundation, Inc.
+ Copyright (C) 1996-2004, 2005, 2006, 2007 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -22,139 +22,149 @@
#include <ldsodefs.h>
-int
-internal_function
-_dl_addr (const void *address, Dl_info *info,
- struct link_map **mapp, const ElfW(Sym) **symbolp)
+static void
+__attribute ((always_inline))
+determine_info (const ElfW(Addr) addr, struct link_map *match, Dl_info *info,
+ struct link_map **mapp, const ElfW(Sym) **symbolp)
{
- const ElfW(Addr) addr = DL_LOOKUP_ADDRESS (address);
+ /* Now we know what object the address lies in. */
+ info->dli_fname = match->l_name;
+ info->dli_fbase = (void *) match->l_map_start;
- /* Protect against concurrent loads and unloads. */
- __rtld_lock_lock_recursive (GL(dl_load_lock));
+ /* If this is the main program the information is incomplete. */
+ if (__builtin_expect (match->l_name[0], 'a') == '\0'
+ && match->l_type == lt_executable)
+ info->dli_fname = _dl_argv[0];
- /* Find the highest-addressed object that ADDRESS is not below. */
- struct link_map *match = NULL;
- for (Lmid_t ns = 0; ns < DL_NNS; ++ns)
- for (struct link_map *l = GL(dl_ns)[ns]._ns_loaded; l; l = l->l_next)
- if (addr >= l->l_map_start && addr < l->l_map_end)
- {
- /* We know ADDRESS lies within L if in any shared object.
- Make sure it isn't past the end of L's segments. */
- size_t n = l->l_phnum;
- if (n > 0)
- {
- do
- --n;
- while (l->l_phdr[n].p_type != PT_LOAD);
- if (addr >= (l->l_addr +
- l->l_phdr[n].p_vaddr + l->l_phdr[n].p_memsz))
- /* Off the end of the highest-addressed shared object. */
- continue;
- }
+ const ElfW(Sym) *symtab
+ = (const ElfW(Sym) *) D_PTR (match, l_info[DT_SYMTAB]);
+ const char *strtab = (const char *) D_PTR (match, l_info[DT_STRTAB]);
- match = l;
- break;
- }
+ ElfW(Word) strtabsize = match->l_info[DT_STRSZ]->d_un.d_val;
- int result = 0;
- if (match != NULL)
+ const ElfW(Sym) *matchsym = NULL;
+ if (match->l_info[DT_ADDRTAGIDX (DT_GNU_HASH) + DT_NUM + DT_THISPROCNUM
+ + DT_VERSIONTAGNUM + DT_EXTRANUM + DT_VALNUM] != NULL)
{
- /* Now we know what object the address lies in. */
- info->dli_fname = match->l_name;
- info->dli_fbase = (void *) match->l_map_start;
-
- /* If this is the main program the information is incomplete. */
- if (__builtin_expect (match->l_name[0], 'a') == '\0'
- && match->l_type == lt_executable)
- info->dli_fname = _dl_argv[0];
-
- const ElfW(Sym) *symtab
- = (const ElfW(Sym) *) D_PTR (match, l_info[DT_SYMTAB]);
- const char *strtab = (const char *) D_PTR (match, l_info[DT_STRTAB]);
-
- ElfW(Word) strtabsize = match->l_info[DT_STRSZ]->d_un.d_val;
-
- const ElfW(Sym) *matchsym = NULL;
- if (match->l_info[DT_ADDRTAGIDX (DT_GNU_HASH) + DT_NUM + DT_THISPROCNUM
- + DT_VERSIONTAGNUM + DT_EXTRANUM + DT_VALNUM] != NULL)
+ /* We look at all symbol table entries referenced by the hash
+ table. */
+ for (Elf_Symndx bucket = 0; bucket < match->l_nbuckets; ++bucket)
{
- /* We look at all symbol table entries referenced by the
- hash table. */
- for (Elf_Symndx bucket = 0; bucket < match->l_nbuckets; ++bucket)
+ Elf32_Word symndx = match->l_gnu_buckets[bucket];
+ if (symndx != 0)
{
- Elf32_Word symndx = match->l_gnu_buckets[bucket];
- if (symndx != 0)
+ const Elf32_Word *hasharr = &match->l_gnu_chain_zero[symndx];
+
+ do
{
- const Elf32_Word *hasharr = &match->l_gnu_chain_zero[symndx];
-
- do
- {
- /* The hash table never references local symbols
- so we can omit that test here. */
- if ((symtab[symndx].st_shndx != SHN_UNDEF
- || symtab[symndx].st_value != 0)
- && ELFW(ST_TYPE) (symtab[symndx].st_info) != STT_TLS
- && DL_ADDR_SYM_MATCH (match, &symtab[symndx],
- matchsym, addr)
- && symtab[symndx].st_name < strtabsize)
- matchsym = (ElfW(Sym) *) &symtab[symndx];
-
- ++symndx;
- }
- while ((*hasharr++ & 1u) == 0);
+ /* The hash table never references local symbols so
+ we can omit that test here. */
+ if ((symtab[symndx].st_shndx != SHN_UNDEF
+ || symtab[symndx].st_value != 0)
+#ifdef USE_TLS
+ && ELFW(ST_TYPE) (symtab[symndx].st_info) != STT_TLS
+#endif
+ && DL_ADDR_SYM_MATCH (match, &symtab[symndx],
+ matchsym, addr)
+ && symtab[symndx].st_name < strtabsize)
+ matchsym = (ElfW(Sym) *) &symtab[symndx];
+
+ ++symndx;
}
+ while ((*hasharr++ & 1u) == 0);
}
}
+ }
+ else
+ {
+ const ElfW(Sym) *symtabend;
+ if (match->l_info[DT_HASH] != NULL)
+ symtabend = (symtab
+ + ((Elf_Symndx *) D_PTR (match, l_info[DT_HASH]))[1]);
else
- {
- const ElfW(Sym) *symtabend;
- if (match->l_info[DT_HASH] != NULL)
- symtabend = (symtab
- + ((Elf_Symndx *) D_PTR (match, l_info[DT_HASH]))[1]);
- else
- /* There is no direct way to determine the number of symbols in the
- dynamic symbol table and no hash table is present. The ELF
- binary is ill-formed but what shall we do? Use the beginning of
- the string table which generally follows the symbol table. */
- symtabend = (const ElfW(Sym) *) strtab;
-
- for (; (void *) symtab < (void *) symtabend; ++symtab)
- if ((ELFW(ST_BIND) (symtab->st_info) == STB_GLOBAL
- || ELFW(ST_BIND) (symtab->st_info) == STB_WEAK)
- && ELFW(ST_TYPE) (symtab->st_info) != STT_TLS
- && (symtab->st_shndx != SHN_UNDEF
- || symtab->st_value != 0)
- && DL_ADDR_SYM_MATCH (match, symtab, matchsym, addr)
- && symtab->st_name < strtabsize)
- matchsym = (ElfW(Sym) *) symtab;
- }
+ /* There is no direct way to determine the number of symbols in the
+ dynamic symbol table and no hash table is present. The ELF
+ binary is ill-formed but what shall we do? Use the beginning of
+ the string table which generally follows the symbol table. */
+ symtabend = (const ElfW(Sym) *) strtab;
+
+ for (; (void *) symtab < (void *) symtabend; ++symtab)
+ if ((ELFW(ST_BIND) (symtab->st_info) == STB_GLOBAL
+ || ELFW(ST_BIND) (symtab->st_info) == STB_WEAK)
+#ifdef USE_TLS
+ && ELFW(ST_TYPE) (symtab->st_info) != STT_TLS
+#endif
+ && (symtab->st_shndx != SHN_UNDEF
+ || symtab->st_value != 0)
+ && DL_ADDR_SYM_MATCH (match, symtab, matchsym, addr)
+ && symtab->st_name < strtabsize)
+ matchsym = (ElfW(Sym) *) symtab;
+ }
- if (mapp)
- *mapp = match;
- if (symbolp)
- *symbolp = matchsym;
+ if (mapp)
+ *mapp = match;
+ if (symbolp)
+ *symbolp = matchsym;
- if (matchsym)
- {
- /* We found a symbol close by. Fill in its name and exact
- address. */
- lookup_t matchl = LOOKUP_VALUE (match);
+ if (matchsym)
+ {
+ /* We found a symbol close by. Fill in its name and exact
+ address. */
+ lookup_t matchl = LOOKUP_VALUE (match);
- info->dli_sname = strtab + matchsym->st_name;
- info->dli_saddr = DL_SYMBOL_ADDRESS (matchl, matchsym);
- }
- else
+ info->dli_sname = strtab + matchsym->st_name;
+ info->dli_saddr = DL_SYMBOL_ADDRESS (matchl, matchsym);
+ }
+ else
+ {
+ /* No symbol matches. We return only the containing object. */
+ info->dli_sname = NULL;
+ info->dli_saddr = NULL;
+ }
+}
+
+
+int
+internal_function
+_dl_addr (const void *address, Dl_info *info,
+ struct link_map **mapp, const ElfW(Sym) **symbolp)
+{
+ const ElfW(Addr) addr = DL_LOOKUP_ADDRESS (address);
+ int result = 0;
+
+ /* Protect against concurrent loads and unloads. */
+ __rtld_lock_lock_recursive (GL(dl_load_lock));
+
+ /* Find the highest-addressed object that ADDRESS is not below. */
+ for (Lmid_t ns = 0; ns < DL_NNS; ++ns)
+ for (struct link_map *l = GL(dl_ns)[ns]._ns_loaded; l; l = l->l_next)
+ if (addr >= l->l_map_start && addr < l->l_map_end
+ && (l->l_contiguous || _dl_addr_inside_object (l, addr)))
{
- /* No symbol matches. We return only the containing object. */
- info->dli_sname = NULL;
- info->dli_saddr = NULL;
+ determine_info (addr, l, info, mapp, symbolp);
+ result = 1;
+ goto out;
}
- result = 1;
- }
-
+ out:
__rtld_lock_unlock_recursive (GL(dl_load_lock));
return result;
}
libc_hidden_def (_dl_addr)
+
+/* Return non-zero if ADDR lies within one of L's segments. */
+int
+internal_function
+_dl_addr_inside_object (struct link_map *l, const ElfW(Addr) addr)
+{
+ int n = l->l_phnum;
+ const ElfW(Addr) reladdr = addr - l->l_addr;
+
+ while (--n >= 0)
+ if (l->l_phdr[n].p_type == PT_LOAD
+ && reladdr - l->l_phdr[n].p_vaddr >= 0
+ && reladdr - l->l_phdr[n].p_vaddr < l->l_phdr[n].p_memsz)
+ return 1;
+ return 0;
+}
diff --git a/elf/dl-cache.c b/elf/dl-cache.c
index bbeba77e4a1..fc7d9916c6f 100644
--- a/elf/dl-cache.c
+++ b/elf/dl-cache.c
@@ -256,7 +256,11 @@ _dl_load_cache_lookup (const char *name)
platform = 1ULL << platform;
/* Only accept hwcap if it's for the right platform. */
-#define _DL_HWCAP_TLS_MASK (1LL << 63)
+#ifdef USE_TLS
+# define _DL_HWCAP_TLS_MASK (1LL << 63)
+#else
+# define _DL_HWCAP_TLS_MASK 0
+#endif
#define HWCAP_CHECK \
if (GLRO(dl_osversion) && lib->osversion > GLRO(dl_osversion)) \
continue; \
diff --git a/elf/dl-close.c b/elf/dl-close.c
index df968fe649e..5cd8b9be2dc 100644
--- a/elf/dl-close.c
+++ b/elf/dl-close.c
@@ -1,5 +1,5 @@
/* Close a shared object opened by `_dl_open'.
- Copyright (C) 1996-2005, 2006 Free Software Foundation, Inc.
+ Copyright (C) 1996-2005, 2006, 2007 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -31,6 +31,7 @@
#include <sys/types.h>
#include <sys/mman.h>
#include <sysdep-cancel.h>
+#include <tls.h>
/* Type of the constructor functions. */
@@ -41,6 +42,7 @@ typedef void (*fini_t) (void);
#define IDX_STILL_USED -1
+#ifdef USE_TLS
/* Returns true we an non-empty was found. */
static bool
remove_slotinfo (size_t idx, struct dtv_slotinfo_list *listp, size_t disp,
@@ -102,13 +104,12 @@ remove_slotinfo (size_t idx, struct dtv_slotinfo_list *listp, size_t disp,
/* No non-entry in this list element. */
return false;
}
+#endif
void
_dl_close_worker (struct link_map *map)
{
- Lmid_t ns = map->l_ns;
-
/* One less direct use. */
--map->l_direct_opencount;
@@ -131,11 +132,16 @@ _dl_close_worker (struct link_map *map)
return;
}
+ Lmid_t nsid = map->l_ns;
+ struct link_namespaces *ns = &GL(dl_ns)[nsid];
+
retry:
dl_close_state = pending;
+#ifdef USE_TLS
bool any_tls = false;
- const unsigned int nloaded = GL(dl_ns)[ns]._ns_nloaded;
+#endif
+ const unsigned int nloaded = ns->_ns_nloaded;
char used[nloaded];
char done[nloaded];
struct link_map *maps[nloaded];
@@ -143,7 +149,7 @@ _dl_close_worker (struct link_map *map)
/* Run over the list and assign indexes to the link maps and enter
them into the MAPS array. */
int idx = 0;
- for (struct link_map *l = GL(dl_ns)[ns]._ns_loaded; l != NULL; l = l->l_next)
+ for (struct link_map *l = ns->_ns_loaded; l != NULL; l = l->l_next)
{
l->l_idx = idx;
maps[idx] = l;
@@ -220,20 +226,22 @@ _dl_close_worker (struct link_map *map)
}
/* Sort the entries. */
- _dl_sort_fini (GL(dl_ns)[ns]._ns_loaded, maps, nloaded, used, ns);
+ _dl_sort_fini (ns->_ns_loaded, maps, nloaded, used, nsid);
/* Call all termination functions at once. */
#ifdef SHARED
- bool do_audit = GLRO(dl_naudit) > 0 && !GL(dl_ns)[ns]._ns_loaded->l_auditing;
+ bool do_audit = GLRO(dl_naudit) > 0 && !ns->_ns_loaded->l_auditing;
#endif
bool unload_any = false;
+ bool scope_mem_left = false;
+ unsigned int unload_global = 0;
unsigned int first_loaded = ~0;
for (unsigned int i = 0; i < nloaded; ++i)
{
struct link_map *imap = maps[i];
/* All elements must be in the same namespace. */
- assert (imap->l_ns == ns);
+ assert (imap->l_ns == nsid);
if (!used[i])
{
@@ -248,7 +256,7 @@ _dl_close_worker (struct link_map *map)
if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_IMPCALLS,
0))
_dl_debug_printf ("\ncalling fini: %s [%lu]\n\n",
- imap->l_name, ns);
+ imap->l_name, nsid);
if (imap->l_info[DT_FINI_ARRAY] != NULL)
{
@@ -291,6 +299,9 @@ _dl_close_worker (struct link_map *map)
/* We indeed have an object to remove. */
unload_any = true;
+ if (imap->l_global)
+ ++unload_global;
+
/* Remember where the first dynamically loaded object is. */
if (i < first_loaded)
first_loaded = i;
@@ -334,7 +345,7 @@ _dl_close_worker (struct link_map *map)
struct link_map *tmap = (struct link_map *)
((char *) imap->l_scope[cnt]
- offsetof (struct link_map, l_searchlist));
- assert (tmap->l_ns == ns);
+ assert (tmap->l_ns == nsid);
if (tmap->l_idx == IDX_STILL_USED)
++remain;
else
@@ -399,18 +410,18 @@ _dl_close_worker (struct link_map *map)
struct r_scope_elem **old = imap->l_scope;
- if (RTLD_SINGLE_THREAD_P)
- imap->l_scope = newp;
- else
- {
- __rtld_mrlock_change (imap->l_scope_lock);
- imap->l_scope = newp;
- __rtld_mrlock_done (imap->l_scope_lock);
- }
+ imap->l_scope = newp;
/* No user anymore, we can free it now. */
if (old != imap->l_scope_mem)
- free (old);
+ {
+ if (_dl_scope_free (old))
+ /* If _dl_scope_free used THREAD_GSCOPE_WAIT (),
+ no need to repeat it. */
+ scope_mem_left = false;
+ }
+ else
+ scope_mem_left = true;
imap->l_scope_max = new_size;
}
@@ -435,7 +446,7 @@ _dl_close_worker (struct link_map *map)
/* Auditing checkpoint: we will start deleting objects. */
if (__builtin_expect (do_audit, 0))
{
- struct link_map *head = GL(dl_ns)[ns]._ns_loaded;
+ struct link_map *head = ns->_ns_loaded;
struct audit_ifaces *afct = GLRO(dl_audit);
/* Do not call the functions for any auditing object. */
if (head->l_auditing == 0)
@@ -452,13 +463,55 @@ _dl_close_worker (struct link_map *map)
#endif
/* Notify the debugger we are about to remove some loaded objects. */
- struct r_debug *r = _dl_debug_initialize (0, ns);
+ struct r_debug *r = _dl_debug_initialize (0, nsid);
r->r_state = RT_DELETE;
_dl_debug_state ();
+ if (unload_global)
+ {
+ /* Some objects are in the global scope list. Remove them. */
+ struct r_scope_elem *ns_msl = ns->_ns_main_searchlist;
+ unsigned int i;
+ unsigned int j = 0;
+ unsigned int cnt = ns_msl->r_nlist;
+
+ while (cnt > 0 && ns_msl->r_list[cnt - 1]->l_removed)
+ --cnt;
+
+ if (cnt + unload_global == ns_msl->r_nlist)
+ /* Speed up removing most recently added objects. */
+ j = cnt;
+ else
+ for (i = 0; i < cnt; i++)
+ if (ns_msl->r_list[i]->l_removed == 0)
+ {
+ if (i != j)
+ ns_msl->r_list[j] = ns_msl->r_list[i];
+ j++;
+ }
+ ns_msl->r_nlist = j;
+ }
+
+ if (!RTLD_SINGLE_THREAD_P
+ && (unload_global
+ || scope_mem_left
+ || (GL(dl_scope_free_list) != NULL
+ && GL(dl_scope_free_list)->count)))
+ {
+ struct dl_scope_free_list *fsl;
+
+ THREAD_GSCOPE_WAIT ();
+ /* Now we can free any queued old scopes. */
+ if ((fsl = GL(dl_scope_free_list)) != NULL)
+ while (fsl->count > 0)
+ free (fsl->list[--fsl->count]);
+ }
+
+#ifdef USE_TLS
size_t tls_free_start;
size_t tls_free_end;
tls_free_start = tls_free_end = NO_TLS_OFFSET;
+#endif
/* Check each element of the search list to see if all references to
it are gone. */
@@ -471,24 +524,8 @@ _dl_close_worker (struct link_map *map)
/* That was the last reference, and this was a dlopen-loaded
object. We can unmap it. */
- if (__builtin_expect (imap->l_global, 0))
- {
- /* This object is in the global scope list. Remove it. */
- unsigned int cnt = GL(dl_ns)[ns]._ns_main_searchlist->r_nlist;
-
- do
- --cnt;
- while (GL(dl_ns)[ns]._ns_main_searchlist->r_list[cnt] != imap);
-
- /* The object was already correctly registered. */
- while (++cnt
- < GL(dl_ns)[ns]._ns_main_searchlist->r_nlist)
- GL(dl_ns)[ns]._ns_main_searchlist->r_list[cnt - 1]
- = GL(dl_ns)[ns]._ns_main_searchlist->r_list[cnt];
-
- --GL(dl_ns)[ns]._ns_main_searchlist->r_nlist;
- }
+#ifdef USE_TLS
/* Remove the object from the dtv slotinfo array if it uses TLS. */
if (__builtin_expect (imap->l_tls_blocksize > 0, 0))
{
@@ -507,7 +544,7 @@ _dl_close_worker (struct link_map *map)
this search list, going in either direction. When the
whole chunk is at the end of the used area then we can
reclaim it. */
-#if TLS_TCB_AT_TP
+# if TLS_TCB_AT_TP
if (tls_free_start == NO_TLS_OFFSET
|| (size_t) imap->l_tls_offset == tls_free_start)
{
@@ -547,7 +584,7 @@ _dl_close_worker (struct link_map *map)
= tls_free_end - imap->l_tls_blocksize;
}
}
-#elif TLS_DTV_AT_TP
+# elif TLS_DTV_AT_TP
if ((size_t) imap->l_tls_offset == tls_free_end)
/* Extend the contiguous chunk being reclaimed. */
tls_free_end -= imap->l_tls_blocksize;
@@ -564,11 +601,12 @@ _dl_close_worker (struct link_map *map)
tls_free_start = imap->l_tls_offset;
tls_free_end = tls_free_start + imap->l_tls_blocksize;
}
-#else
-# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
-#endif
+# else
+# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
+# endif
}
}
+#endif
/* We can unmap all the maps at once. We determined the
start address and length when we loaded the object and
@@ -581,12 +619,12 @@ _dl_close_worker (struct link_map *map)
else
{
#ifdef SHARED
- assert (ns != LM_ID_BASE);
+ assert (nsid != LM_ID_BASE);
#endif
- GL(dl_ns)[ns]._ns_loaded = imap->l_next;
+ ns->_ns_loaded = imap->l_next;
}
- --GL(dl_ns)[ns]._ns_nloaded;
+ --ns->_ns_nloaded;
if (imap->l_next != NULL)
imap->l_next->l_prev = imap->l_prev;
@@ -634,6 +672,7 @@ _dl_close_worker (struct link_map *map)
}
}
+#ifdef USE_TLS
/* If we removed any object which uses TLS bump the generation counter. */
if (any_tls)
{
@@ -643,12 +682,13 @@ _dl_close_worker (struct link_map *map)
if (tls_free_end == GL(dl_tls_static_used))
GL(dl_tls_static_used) = tls_free_start;
}
+#endif
#ifdef SHARED
/* Auditing checkpoint: we have deleted all objects. */
if (__builtin_expect (do_audit, 0))
{
- struct link_map *head = GL(dl_ns)[ns]._ns_loaded;
+ struct link_map *head = ns->_ns_loaded;
/* Do not call the functions for any auditing object. */
if (head->l_auditing == 0)
{
@@ -702,6 +742,7 @@ _dl_close (void *_map)
}
+#ifdef USE_TLS
static bool __libc_freeres_fn_section
free_slotinfo (struct dtv_slotinfo_list **elemp)
{
@@ -728,45 +769,52 @@ free_slotinfo (struct dtv_slotinfo_list **elemp)
return true;
}
+#endif
libc_freeres_fn (free_mem)
{
- for (Lmid_t ns = 0; ns < DL_NNS; ++ns)
- if (__builtin_expect (GL(dl_ns)[ns]._ns_global_scope_alloc, 0) != 0
- && (GL(dl_ns)[ns]._ns_main_searchlist->r_nlist
+ for (Lmid_t nsid = 0; nsid < DL_NNS; ++nsid)
+ if (__builtin_expect (GL(dl_ns)[nsid]._ns_global_scope_alloc, 0) != 0
+ && (GL(dl_ns)[nsid]._ns_main_searchlist->r_nlist
// XXX Check whether we need NS-specific initial_searchlist
== GLRO(dl_initial_searchlist).r_nlist))
{
/* All object dynamically loaded by the program are unloaded. Free
the memory allocated for the global scope variable. */
- struct link_map **old = GL(dl_ns)[ns]._ns_main_searchlist->r_list;
+ struct link_map **old = GL(dl_ns)[nsid]._ns_main_searchlist->r_list;
/* Put the old map in. */
- GL(dl_ns)[ns]._ns_main_searchlist->r_list
+ GL(dl_ns)[nsid]._ns_main_searchlist->r_list
// XXX Check whether we need NS-specific initial_searchlist
= GLRO(dl_initial_searchlist).r_list;
/* Signal that the original map is used. */
- GL(dl_ns)[ns]._ns_global_scope_alloc = 0;
+ GL(dl_ns)[nsid]._ns_global_scope_alloc = 0;
/* Now free the old map. */
free (old);
}
+#ifdef USE_TLS
if (USE___THREAD || GL(dl_tls_dtv_slotinfo_list) != NULL)
{
/* Free the memory allocated for the dtv slotinfo array. We can do
this only if all modules which used this memory are unloaded. */
-#ifdef SHARED
+# ifdef SHARED
if (GL(dl_initial_dtv) == NULL)
/* There was no initial TLS setup, it was set up later when
it used the normal malloc. */
free_slotinfo (&GL(dl_tls_dtv_slotinfo_list));
else
-#endif
+# endif
/* The first element of the list does not have to be deallocated.
It was allocated in the dynamic linker (i.e., with a different
malloc), and in the static library it's in .bss space. */
free_slotinfo (&GL(dl_tls_dtv_slotinfo_list)->next);
}
+#endif
+
+ void *scope_free_list = GL(dl_scope_free_list);
+ GL(dl_scope_free_list) = NULL;
+ free (scope_free_list);
}
diff --git a/elf/dl-deps.c b/elf/dl-deps.c
index 4ec984e15bc..c35cc977fa5 100644
--- a/elf/dl-deps.c
+++ b/elf/dl-deps.c
@@ -123,7 +123,7 @@ DST not allowed in SUID/SGID programs")); \
processed. */ \
if (fatal) \
_dl_signal_error (0, __str, NULL, N_("\
-empty dynamic string token substitution")); \
+empty dynamics string token substitution")); \
else \
{ \
/* This is for DT_AUXILIARY. */ \
diff --git a/elf/dl-dst.h b/elf/dl-dst.h
index 83d16bdb0e0..175b7cd1951 100644
--- a/elf/dl-dst.h
+++ b/elf/dl-dst.h
@@ -1,5 +1,6 @@
/* Handling of dynamic sring tokens.
- Copyright (C) 1999,2001,2002,2003,2004,2006 Free Software Foundation, Inc.
+ Copyright (C) 1999,2001,2002,2003,2004,2006,2007
+ Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -50,7 +51,7 @@
\
First get the origin string if it is not available yet. \
This can only happen for the map of the executable. */ \
- DL_DST_REQ_STATIC \
+ DL_DST_REQ_STATIC (l) \
if ((l)->l_origin == NULL) \
{ \
assert ((l)->l_name[0] == '\0'); \
@@ -68,9 +69,9 @@
__len; })
#ifdef SHARED
-# define DL_DST_REQ_STATIC /* nothing */
+# define DL_DST_REQ_STATIC(l) /* nothing */
#else
-# define DL_DST_REQ_STATIC \
+# define DL_DST_REQ_STATIC(l) \
if ((l) == NULL) \
{ \
const char *origin = _dl_get_origin (); \
diff --git a/elf/dl-fptr.c b/elf/dl-fptr.c
index e068124d6fc..78beecfdcb6 100644
--- a/elf/dl-fptr.c
+++ b/elf/dl-fptr.c
@@ -1,5 +1,5 @@
/* Manage function descriptors. Generic version.
- Copyright (C) 1999-2004, 2006 Free Software Foundation, Inc.
+ Copyright (C) 1999,2000,2001,2002,2003,2004 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -40,7 +40,7 @@
#ifndef COMPARE_AND_SWAP
# define COMPARE_AND_SWAP(ptr, old, new) \
- (catomic_compare_and_exchange_bool_acq (ptr, new, old) == 0)
+ (atomic_compare_and_exchange_bool_acq (ptr, new, old) == 0)
#endif
ElfW(Addr) _dl_boot_fptr_table [ELF_MACHINE_BOOT_FPTR_TABLE_LEN];
diff --git a/elf/dl-iteratephdr.c b/elf/dl-iteratephdr.c
index d03d8b6daf1..b29534d5c9d 100644
--- a/elf/dl-iteratephdr.c
+++ b/elf/dl-iteratephdr.c
@@ -1,5 +1,5 @@
/* Get loaded objects program headers.
- Copyright (C) 2001,2002,2003,2004,2006 Free Software Foundation, Inc.
+ Copyright (C) 2001,2002,2003,2004,2006,2007 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Jakub Jelinek <jakub@redhat.com>, 2001.
@@ -54,9 +54,9 @@ __dl_iterate_phdr (int (*callback) (struct dl_phdr_info *info,
nloaded += GL(dl_ns)[cnt]._ns_nloaded;
if (caller >= (const void *) l->l_map_start
- && caller < (const void *) l->l_map_end)
- /* There must be exactly one DSO for the range of the virtual
- memory. Otherwise something is really broken. */
+ && caller < (const void *) l->l_map_end
+ && (l->l_contiguous
+ || _dl_addr_inside_object (l, (ElfW(Addr)) caller)))
ns = cnt;
}
@@ -70,9 +70,11 @@ __dl_iterate_phdr (int (*callback) (struct dl_phdr_info *info,
info.dlpi_subs = GL(dl_load_adds) - nloaded;
info.dlpi_tls_modid = 0;
info.dlpi_tls_data = NULL;
+#ifdef USE_TLS
info.dlpi_tls_modid = l->l_tls_modid;
if (info.dlpi_tls_modid != 0)
info.dlpi_tls_data = _dl_tls_get_addr_soft (l);
+#endif
ret = callback (&info, sizeof (struct dl_phdr_info), data);
if (ret)
break;
diff --git a/elf/dl-libc.c b/elf/dl-libc.c
index a6d0d1fcef3..1b995eda92c 100644
--- a/elf/dl-libc.c
+++ b/elf/dl-libc.c
@@ -1,5 +1,5 @@
/* Handle loading and unloading shared objects for internal libc purposes.
- Copyright (C) 1999-2002,2004,2005,2006 Free Software Foundation, Inc.
+ Copyright (C) 1999,2000,2001,2002,2004,2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Zack Weinberg <zack@rabi.columbia.edu>, 1999.
diff --git a/elf/dl-load.c b/elf/dl-load.c
index 1650ef953a7..9625030e886 100644
--- a/elf/dl-load.c
+++ b/elf/dl-load.c
@@ -1,5 +1,5 @@
/* Map in a shared object's segments from the file.
- Copyright (C) 1995-2005, 2006 Free Software Foundation, Inc.
+ Copyright (C) 1995-2005, 2006, 2007 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -1078,6 +1078,7 @@ _dl_map_object_from_fd (const char *name, int fd, struct filebuf *fbp,
break;
case PT_TLS:
+#ifdef USE_TLS
if (ph->p_memsz == 0)
/* Nothing to do for an empty segment. */
break;
@@ -1105,7 +1106,7 @@ _dl_map_object_from_fd (const char *name, int fd, struct filebuf *fbp,
break;
}
-#ifdef SHARED
+# ifdef SHARED
if (l->l_prev == NULL || (mode & __RTLD_AUDIT) != 0)
/* We are loading the executable itself when the dynamic linker
was executed directly. The setup will happen later. */
@@ -1114,7 +1115,7 @@ _dl_map_object_from_fd (const char *name, int fd, struct filebuf *fbp,
/* In a static binary there is no way to tell if we dynamically
loaded libpthread. */
if (GL(dl_error_catch_tsd) == &_dl_initial_error_catch_tsd)
-#endif
+# endif
{
/* We have not yet loaded libpthread.
We can do the TLS setup right now! */
@@ -1147,6 +1148,7 @@ cannot allocate TLS data structures for initial thread");
_dl_deallocate_tls (tcb, 1);
goto call_lose;
}
+#endif
/* Uh-oh, the binary expects TLS support but we cannot
provide it. */
@@ -1223,6 +1225,8 @@ cannot allocate TLS data structures for initial thread");
loadcmds[nloadcmds - 1].mapstart - c->mapend,
PROT_NONE);
+ l->l_contiguous = 1;
+
goto postmap;
}
@@ -1242,6 +1246,7 @@ cannot allocate TLS data structures for initial thread");
/* Remember which part of the address space this object uses. */
l->l_map_start = c->mapstart + l->l_addr;
l->l_map_end = l->l_map_start + maplength;
+ l->l_contiguous = !has_holes;
while (c < &loadcmds[nloadcmds])
{
@@ -1385,7 +1390,7 @@ cannot allocate TLS data structures for initial thread");
requires that it be executable. We must change the
protection of the variable which contains the flags used in
the mprotect calls. */
-#ifdef SHARED
+#if defined HAVE_Z_RELRO && defined SHARED
if ((mode & (__RTLD_DLOPEN | __RTLD_AUDIT)) == __RTLD_DLOPEN)
{
const uintptr_t p = (uintptr_t) &__stack_prot & -GLRO(dl_pagesize);
@@ -1422,9 +1427,11 @@ cannot enable executable stack as shared object requires");
}
}
+#ifdef USE_TLS
/* Adjust the address of the TLS initialization image. */
if (l->l_tls_initimage != NULL)
l->l_tls_initimage = (char *) l->l_tls_initimage + l->l_addr;
+#endif
/* We are done mapping in the file. We no longer need the descriptor. */
if (__builtin_expect (__close (fd) != 0, 0))
@@ -1928,10 +1935,11 @@ open_path (const char *name, size_t namelen, int preloaded,
must not be freed using the general free() in libc. */
if (sps->malloced)
free (sps->dirs);
-
+#ifdef HAVE_Z_RELRO
/* rtld_search_dirs is attribute_relro, therefore avoid writing
into it. */
if (sps != &rtld_search_dirs)
+#endif
sps->dirs = (void *) -1;
}
diff --git a/elf/dl-lookup.c b/elf/dl-lookup.c
index 019278c9b0b..e971929d0ec 100644
--- a/elf/dl-lookup.c
+++ b/elf/dl-lookup.c
@@ -1,5 +1,5 @@
/* Look up a symbol in the loaded objects.
- Copyright (C) 1995-2005, 2006 Free Software Foundation, Inc.
+ Copyright (C) 1995-2005, 2006, 2007 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -25,6 +25,7 @@
#include <ldsodefs.h>
#include <dl-hash.h>
#include <dl-machine.h>
+#include <sysdep-cancel.h>
#include <bits/libc-lock.h>
#include <tls.h>
@@ -228,17 +229,13 @@ _dl_lookup_symbol_x (const char *undef_name, struct link_map *undef_map,
/* No other flag than DL_LOOKUP_ADD_DEPENDENCY is allowed if we look
up a versioned symbol. */
- assert (version == NULL || flags == 0 || flags == DL_LOOKUP_ADD_DEPENDENCY);
+ assert (version == NULL || (flags & ~(DL_LOOKUP_ADD_DEPENDENCY)) == 0);
size_t i = 0;
if (__builtin_expect (skip_map != NULL, 0))
- {
- /* Search the relevant loaded objects for a definition. */
- while ((*scope)->r_list[i] != skip_map)
- ++i;
-
- assert (i < (*scope)->r_nlist);
- }
+ /* Search the relevant loaded objects for a definition. */
+ while ((*scope)->r_list[i] != skip_map)
+ ++i;
/* Search the relevant loaded objects for a definition. */
for (size_t start = i; *scope != NULL; start = 0, ++scope)
@@ -341,9 +338,8 @@ _dl_lookup_symbol_x (const char *undef_name, struct link_map *undef_map,
&& add_dependency (undef_map, current_value.m) < 0)
/* Something went wrong. Perhaps the object we tried to reference
was just removed. Try finding another definition. */
- return _dl_lookup_symbol_x (undef_name, undef_map, ref,
- symbol_scope, version, type_class,
- flags, skip_map);
+ return _dl_lookup_symbol_x (undef_name, undef_map, ref, symbol_scope,
+ version, type_class, flags, skip_map);
/* The object is used. */
current_value.m->l_used = 1;
@@ -449,10 +445,12 @@ _dl_debug_bindings (const char *undef_name, struct link_map *undef_map,
conflict = 1;
}
+# ifdef USE_TLS
if (value->s
&& (__builtin_expect (ELFW(ST_TYPE) (value->s->st_info)
== STT_TLS, 0)))
type_class = 4;
+# endif
if (conflict
|| GLRO(dl_trace_prelink_map) == undef_map
diff --git a/elf/dl-minimal.c b/elf/dl-minimal.c
index 8e78709b5a8..eeea790e40c 100644
--- a/elf/dl-minimal.c
+++ b/elf/dl-minimal.c
@@ -1,5 +1,5 @@
/* Minimal replacements for basic facilities used in the dynamic linker.
- Copyright (C) 1995-1998,2000-2002,2004,2005,2006
+ Copyright (C) 1995-1998,2000-2002,2004-2006,2007
Free Software Foundation, Inc.
This file is part of the GNU C Library.
@@ -75,14 +75,21 @@ __libc_memalign (size_t align, size_t n)
alloc_ptr = (void *) 0 + (((alloc_ptr - (void *) 0) + align - 1)
& ~(align - 1));
- if (alloc_ptr + n >= alloc_end)
+ if (alloc_ptr + n >= alloc_end || n >= -(uintptr_t) alloc_ptr)
{
/* Insufficient space left; allocate another page. */
caddr_t page;
size_t nup = (n + GLRO(dl_pagesize) - 1) & ~(GLRO(dl_pagesize) - 1);
+ if (__builtin_expect (nup == 0, 0))
+ {
+ if (n)
+ return NULL;
+ nup = GLRO(dl_pagesize);
+ }
page = __mmap (0, nup, PROT_READ|PROT_WRITE,
MAP_ANON|MAP_PRIVATE, _dl_zerofd, 0);
- assert (page != MAP_FAILED);
+ if (page == MAP_FAILED)
+ return NULL;
if (page != alloc_end)
alloc_ptr = page;
alloc_end = page + nup;
@@ -108,7 +115,14 @@ calloc (size_t nmemb, size_t size)
/* New memory from the trivial malloc above is always already cleared.
(We make sure that's true in the rare occasion it might not be,
by clearing memory in free, below.) */
- return malloc (nmemb * size);
+ size_t bytes = nmemb * size;
+
+#define HALF_SIZE_T (((size_t) 1) << (8 * sizeof (size_t) / 2))
+ if (__builtin_expect ((nmemb | size) >= HALF_SIZE_T, 0)
+ && size != 0 && bytes / size != nmemb)
+ return NULL;
+
+ return malloc (bytes);
}
/* This will rarely be called. */
@@ -264,7 +278,7 @@ __strtoul_internal (const char *nptr, char **endptr, int base, int group)
while (*nptr >= '0' && *nptr <= '9')
{
unsigned long int digval = *nptr - '0';
- if (result > LONG_MAX / 10
+ if (result > ULONG_MAX / 10
|| (result == ULONG_MAX / 10 && digval > ULONG_MAX % 10))
{
errno = ERANGE;
diff --git a/elf/dl-object.c b/elf/dl-object.c
index 33ee860e59c..86f7a8e4d93 100644
--- a/elf/dl-object.c
+++ b/elf/dl-object.c
@@ -1,5 +1,5 @@
/* Storage management for the chain of loaded shared objects.
- Copyright (C) 1995-2002, 2004, 2006 Free Software Foundation, Inc.
+ Copyright (C) 1995-2002, 2004 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -64,7 +64,7 @@ _dl_new_object (char *realname, const char *libname, int type,
new->l_name = realname;
new->l_type = type;
new->l_loader = loader;
-#if NO_TLS_OFFSET != 0
+#if defined USE_TLS && NO_TLS_OFFSET != 0
new->l_tls_offset = NO_TLS_OFFSET;
#endif
new->l_ns = nsid;
@@ -85,11 +85,6 @@ _dl_new_object (char *realname, const char *libname, int type,
new->l_scope = new->l_scope_mem;
new->l_scope_max = sizeof (new->l_scope_mem) / sizeof (new->l_scope_mem[0]);
- /* No need to initialize the scope lock if the initializer is zero. */
-#if _RTLD_MRLOCK_INITIALIZER != 0
- __rtld_mrlock_initialize (new->l_scope_lock);
-#endif
-
/* Counter for the scopes we have to handle. */
idx = 0;
diff --git a/elf/dl-open.c b/elf/dl-open.c
index c9975211266..32e7caac7fe 100644
--- a/elf/dl-open.c
+++ b/elf/dl-open.c
@@ -1,5 +1,5 @@
/* Load a shared object at runtime, relocate it, and run its initializer.
- Copyright (C) 1996-2004, 2005, 2006 Free Software Foundation, Inc.
+ Copyright (C) 1996-2004, 2005, 2006, 2007 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -32,6 +32,7 @@
#include <bp-sym.h>
#include <caller.h>
#include <sysdep-cancel.h>
+#include <tls.h>
#include <dl-dst.h>
@@ -97,17 +98,17 @@ add_to_global (struct link_map *new)
in an realloc() call. Therefore we allocate a completely new
array the first time we have to add something to the locale scope. */
- if (GL(dl_ns)[new->l_ns]._ns_global_scope_alloc == 0)
+ struct link_namespaces *ns = &GL(dl_ns)[new->l_ns];
+ if (ns->_ns_global_scope_alloc == 0)
{
/* This is the first dynamic object given global scope. */
- GL(dl_ns)[new->l_ns]._ns_global_scope_alloc
- = GL(dl_ns)[new->l_ns]._ns_main_searchlist->r_nlist + to_add + 8;
+ ns->_ns_global_scope_alloc
+ = ns->_ns_main_searchlist->r_nlist + to_add + 8;
new_global = (struct link_map **)
- malloc (GL(dl_ns)[new->l_ns]._ns_global_scope_alloc
- * sizeof (struct link_map *));
+ malloc (ns->_ns_global_scope_alloc * sizeof (struct link_map *));
if (new_global == NULL)
{
- GL(dl_ns)[new->l_ns]._ns_global_scope_alloc = 0;
+ ns->_ns_global_scope_alloc = 0;
nomem:
_dl_signal_error (ENOMEM, new->l_libname->name, NULL,
N_("cannot extend global scope"));
@@ -115,29 +116,39 @@ add_to_global (struct link_map *new)
}
/* Copy over the old entries. */
- GL(dl_ns)[new->l_ns]._ns_main_searchlist->r_list
- = memcpy (new_global,
- GL(dl_ns)[new->l_ns]._ns_main_searchlist->r_list,
- (GL(dl_ns)[new->l_ns]._ns_main_searchlist->r_nlist
+ ns->_ns_main_searchlist->r_list
+ = memcpy (new_global, ns->_ns_main_searchlist->r_list,
+ (ns->_ns_main_searchlist->r_nlist
* sizeof (struct link_map *)));
}
- else if (GL(dl_ns)[new->l_ns]._ns_main_searchlist->r_nlist + to_add
- > GL(dl_ns)[new->l_ns]._ns_global_scope_alloc)
+ else if (ns->_ns_main_searchlist->r_nlist + to_add
+ > ns->_ns_global_scope_alloc)
{
/* We have to extend the existing array of link maps in the
main map. */
+ struct link_map **old_global
+ = GL(dl_ns)[new->l_ns]._ns_main_searchlist->r_list;
+ size_t new_nalloc = ((ns->_ns_global_scope_alloc + to_add) * 2);
+
new_global = (struct link_map **)
- realloc (GL(dl_ns)[new->l_ns]._ns_main_searchlist->r_list,
- ((GL(dl_ns)[new->l_ns]._ns_global_scope_alloc + to_add + 8)
- * sizeof (struct link_map *)));
+ malloc (new_nalloc * sizeof (struct link_map *));
if (new_global == NULL)
goto nomem;
- GL(dl_ns)[new->l_ns]._ns_global_scope_alloc += to_add + 8;
- GL(dl_ns)[new->l_ns]._ns_main_searchlist->r_list = new_global;
+ memcpy (new_global, old_global,
+ ns->_ns_global_scope_alloc * sizeof (struct link_map *));
+
+ ns->_ns_global_scope_alloc = new_nalloc;
+ ns->_ns_main_searchlist->r_list = new_global;
+
+ if (!RTLD_SINGLE_THREAD_P)
+ THREAD_GSCOPE_WAIT ();
+
+ free (old_global);
}
/* Now add the new entries. */
+ unsigned int new_nlist = ns->_ns_main_searchlist->r_nlist;
for (cnt = 0; cnt < new->l_searchlist.r_nlist; ++cnt)
{
struct link_map *map = new->l_searchlist.r_list[cnt];
@@ -145,15 +156,49 @@ add_to_global (struct link_map *new)
if (map->l_global == 0)
{
map->l_global = 1;
- GL(dl_ns)[new->l_ns]._ns_main_searchlist->r_list[GL(dl_ns)[new->l_ns]._ns_main_searchlist->r_nlist]
- = map;
- ++GL(dl_ns)[new->l_ns]._ns_main_searchlist->r_nlist;
+ ns->_ns_main_searchlist->r_list[new_nlist++] = map;
}
}
+ atomic_write_barrier ();
+ ns->_ns_main_searchlist->r_nlist = new_nlist;
return 0;
}
+int
+_dl_scope_free (struct r_scope_elem **old)
+{
+ struct dl_scope_free_list *fsl;
+#define DL_SCOPE_FREE_LIST_SIZE (sizeof (fsl->list) / sizeof (fsl->list[0]))
+
+ if (RTLD_SINGLE_THREAD_P)
+ free (old);
+ else if ((fsl = GL(dl_scope_free_list)) == NULL)
+ {
+ GL(dl_scope_free_list) = fsl = malloc (sizeof (*fsl));
+ if (fsl == NULL)
+ {
+ THREAD_GSCOPE_WAIT ();
+ free (old);
+ return 1;
+ }
+ else
+ {
+ fsl->list[0] = old;
+ fsl->count = 1;
+ }
+ }
+ else if (fsl->count < DL_SCOPE_FREE_LIST_SIZE)
+ fsl->list[fsl->count++] = old;
+ else
+ {
+ THREAD_GSCOPE_WAIT ();
+ while (fsl->count > 0)
+ free (fsl->list[--fsl->count]);
+ return 1;
+ }
+ return 0;
+}
static void
dl_open_worker (void *a)
@@ -161,10 +206,12 @@ dl_open_worker (void *a)
struct dl_open_args *args = a;
const char *file = args->file;
int mode = args->mode;
- struct link_map *new, *l;
+ struct link_map *new;
int lazy;
unsigned int i;
+#ifdef USE_TLS
bool any_tls = false;
+#endif
struct link_map *call_map = NULL;
/* Check whether _dl_open() has been called from a valid DSO. */
@@ -186,13 +233,14 @@ dl_open_worker (void *a)
By default we assume this is the main application. */
call_map = GL(dl_ns)[LM_ID_BASE]._ns_loaded;
+ struct link_map *l;
for (Lmid_t ns = 0; ns < DL_NNS; ++ns)
for (l = GL(dl_ns)[ns]._ns_loaded; l != NULL; l = l->l_next)
if (caller_dlopen >= (const void *) l->l_map_start
- && caller_dlopen < (const void *) l->l_map_end)
+ && caller_dlopen < (const void *) l->l_map_end
+ && (l->l_contiguous
+ || _dl_addr_inside_object (l, (ElfW(Addr)) caller_dlopen)))
{
- /* There must be exactly one DSO for the range of the virtual
- memory. Otherwise something is really broken. */
assert (ns == l->l_ns);
call_map = l;
goto found_caller;
@@ -325,7 +373,7 @@ dl_open_worker (void *a)
/* Relocate the objects loaded. We do this in reverse order so that copy
relocs of earlier objects overwrite the data written by later objects. */
- l = new;
+ struct link_map *l = new;
while (l->l_next)
l = l->l_next;
while (1)
@@ -417,17 +465,10 @@ dl_open_worker (void *a)
memcpy (newp, imap->l_scope, cnt * sizeof (imap->l_scope[0]));
struct r_scope_elem **old = imap->l_scope;
- if (RTLD_SINGLE_THREAD_P)
- imap->l_scope = newp;
- else
- {
- __rtld_mrlock_change (imap->l_scope_lock);
- imap->l_scope = newp;
- __rtld_mrlock_done (imap->l_scope_lock);
- }
+ imap->l_scope = newp;
if (old != imap->l_scope_mem)
- free (old);
+ _dl_scope_free (old);
imap->l_scope_max = new_size;
}
@@ -439,6 +480,7 @@ dl_open_worker (void *a)
atomic_write_barrier ();
imap->l_scope[cnt] = &new->l_searchlist;
}
+#if USE_TLS
/* Only add TLS memory if this object is loaded now and
therefore is not yet initialized. */
else if (! imap->l_init_called
@@ -453,11 +495,11 @@ dl_open_worker (void *a)
if (imap->l_need_tls_init)
{
imap->l_need_tls_init = 0;
-#ifdef SHARED
+# ifdef SHARED
/* Update the slot information data for at least the
generation of the DSO we are allocating data for. */
_dl_update_slotinfo (imap->l_tls_modid);
-#endif
+# endif
GL(dl_init_static_tls) (imap);
assert (imap->l_need_tls_init == 0);
@@ -466,12 +508,15 @@ dl_open_worker (void *a)
/* We have to bump the generation counter. */
any_tls = true;
}
+#endif
}
+#if USE_TLS
/* Bump the generation number if necessary. */
if (any_tls && __builtin_expect (++GL(dl_tls_generation) == 0, 0))
_dl_fatal_printf (N_("\
TLS generation counter wrapped! Please report this."));
+#endif
/* Run the initializer functions of new objects. */
_dl_init (new, args->argc, args->argv, args->env);
@@ -568,6 +613,7 @@ no more namespaces available for dlmopen()"));
state if relocation failed, for example. */
if (args.map)
{
+#ifdef USE_TLS
/* Maybe some of the modules which were loaded use TLS.
Since it will be removed in the following _dl_close call
we have to mark the dtv array as having gaps to fill the
@@ -577,6 +623,7 @@ no more namespaces available for dlmopen()"));
up. */
if ((mode & __RTLD_AUDIT) == 0)
GL(dl_tls_dtv_gaps) = true;
+#endif
_dl_close_worker (args.map);
}
@@ -650,3 +697,21 @@ show_scope (struct link_map *new)
}
}
#endif
+
+#ifdef IS_IN_rtld
+/* Return non-zero if ADDR lies within one of L's segments. */
+int
+internal_function
+_dl_addr_inside_object (struct link_map *l, const ElfW(Addr) addr)
+{
+ int n = l->l_phnum;
+ const ElfW(Addr) reladdr = addr - l->l_addr;
+
+ while (--n >= 0)
+ if (l->l_phdr[n].p_type == PT_LOAD
+ && reladdr - l->l_phdr[n].p_vaddr >= 0
+ && reladdr - l->l_phdr[n].p_vaddr < l->l_phdr[n].p_memsz)
+ return 1;
+ return 0;
+}
+#endif
diff --git a/elf/dl-profile.c b/elf/dl-profile.c
index 47033f32eff..41214c1b082 100644
--- a/elf/dl-profile.c
+++ b/elf/dl-profile.c
@@ -1,5 +1,5 @@
/* Profiling of shared libraries.
- Copyright (C) 1997-2002, 2003, 2004, 2006 Free Software Foundation, Inc.
+ Copyright (C) 1997-2002, 2003, 2004 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
Based on the BSD mcount implementation.
@@ -509,24 +509,24 @@ _dl_mcount (ElfW(Addr) frompc, ElfW(Addr) selfpc)
size_t newfromidx;
to_index = (data[narcs].self_pc
/ (HASHFRACTION * sizeof (*tos)));
- newfromidx = catomic_exchange_and_add (&fromidx, 1) + 1;
+ newfromidx = atomic_exchange_and_add (&fromidx, 1) + 1;
froms[newfromidx].here = &data[narcs];
froms[newfromidx].link = tos[to_index];
tos[to_index] = newfromidx;
- catomic_increment (&narcs);
+ atomic_increment (&narcs);
}
/* If we still have no entry stop searching and insert. */
if (*topcindex == 0)
{
- uint_fast32_t newarc = catomic_exchange_and_add (narcsp, 1);
+ uint_fast32_t newarc = atomic_exchange_and_add (narcsp, 1);
/* In rare cases it could happen that all entries in FROMS are
occupied. So we cannot count this anymore. */
if (newarc >= fromlimit)
goto done;
- *topcindex = catomic_exchange_and_add (&fromidx, 1) + 1;
+ *topcindex = atomic_exchange_and_add (&fromidx, 1) + 1;
fromp = &froms[*topcindex];
fromp->here = &data[newarc];
@@ -534,7 +534,7 @@ _dl_mcount (ElfW(Addr) frompc, ElfW(Addr) selfpc)
data[newarc].self_pc = selfpc;
data[newarc].count = 0;
fromp->link = 0;
- catomic_increment (&narcs);
+ atomic_increment (&narcs);
break;
}
@@ -547,7 +547,7 @@ _dl_mcount (ElfW(Addr) frompc, ElfW(Addr) selfpc)
}
/* Increment the counter. */
- catomic_increment (&fromp->here->count);
+ atomic_increment (&fromp->here->count);
done:
;
diff --git a/elf/dl-reloc.c b/elf/dl-reloc.c
index c315b5d972f..117410e9241 100644
--- a/elf/dl-reloc.c
+++ b/elf/dl-reloc.c
@@ -1,5 +1,5 @@
/* Relocate a shared object and resolve its references to other loaded objects.
- Copyright (C) 1995-2004, 2005, 2006 Free Software Foundation, Inc.
+ Copyright (C) 1995-2004, 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -35,6 +35,7 @@
#endif
+#ifdef USE_TLS
/* We are trying to perform a static TLS relocation in MAP, but it was
dynamically loaded. This can only work if there is enough surplus in
the static TLS area already allocated for each running thread. If this
@@ -55,7 +56,7 @@ _dl_allocate_static_tls (struct link_map *map)
cannot allocate memory in static TLS block"));
}
-#if TLS_TCB_AT_TP
+# if TLS_TCB_AT_TP
size_t freebytes;
size_t n;
size_t blsize;
@@ -72,7 +73,7 @@ cannot allocate memory in static TLS block"));
- map->l_tls_firstbyte_offset);
map->l_tls_offset = GL(dl_tls_static_used) = offset;
-#elif TLS_DTV_AT_TP
+# elif TLS_DTV_AT_TP
size_t used;
size_t check;
@@ -86,9 +87,9 @@ cannot allocate memory in static TLS block"));
map->l_tls_offset = offset;
GL(dl_tls_static_used) = used;
-#else
-# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
-#endif
+# else
+# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
+# endif
/* If the object is not yet relocated we cannot initialize the
static TLS region. Delay it. */
@@ -114,13 +115,13 @@ cannot allocate memory in static TLS block"));
void
_dl_nothread_init_static_tls (struct link_map *map)
{
-#if TLS_TCB_AT_TP
+# if TLS_TCB_AT_TP
void *dest = (char *) THREAD_SELF - map->l_tls_offset;
-#elif TLS_DTV_AT_TP
+# elif TLS_DTV_AT_TP
void *dest = (char *) THREAD_SELF + map->l_tls_offset + TLS_PRE_TCB_SIZE;
-#else
-# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
-#endif
+# else
+# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
+# endif
/* Fill in the DTV slot so that a later LD/GD access will find it. */
dtv_t *dtv = THREAD_DTV ();
@@ -132,6 +133,7 @@ _dl_nothread_init_static_tls (struct link_map *map)
memset (__mempcpy (dest, map->l_tls_initimage, map->l_tls_initimage_size),
'\0', map->l_tls_blocksize - map->l_tls_initimage_size);
}
+#endif
void
diff --git a/elf/dl-runtime.c b/elf/dl-runtime.c
index afc99f6150a..ee2b8b5f6c8 100644
--- a/elf/dl-runtime.c
+++ b/elf/dl-runtime.c
@@ -1,5 +1,5 @@
/* On-demand PLT fixup for shared objects.
- Copyright (C) 1995-2002,2003,2004,2005,2006 Free Software Foundation, Inc.
+ Copyright (C) 1995-2006, 2007 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -26,6 +26,8 @@
#include <ldsodefs.h>
#include <sysdep-cancel.h>
#include "dynamic-link.h"
+#include <tls.h>
+
#if (!defined ELF_MACHINE_NO_RELA && !defined ELF_MACHINE_PLT_REL) \
|| ELF_MACHINE_NO_REL
@@ -93,15 +95,19 @@ _dl_fixup (
version = NULL;
}
- if (l->l_type == lt_loaded && !RTLD_SINGLE_THREAD_P)
- __rtld_mrlock_lock (l->l_scope_lock);
+ /* We need to keep the scope around so do some locking. This is
+ not necessary for objects which cannot be unloaded or when
+ we are not using any threads (yet). */
+ int flags = DL_LOOKUP_ADD_DEPENDENCY;
+ if (!RTLD_SINGLE_THREAD_P)
+ THREAD_GSCOPE_SET_FLAG ();
- result = _dl_lookup_symbol_x (strtab + sym->st_name, l, &sym,
- l->l_scope, version, ELF_RTYPE_CLASS_PLT,
- DL_LOOKUP_ADD_DEPENDENCY, NULL);
+ result = _dl_lookup_symbol_x (strtab + sym->st_name, l, &sym, l->l_scope,
+ version, ELF_RTYPE_CLASS_PLT, flags, NULL);
- if (l->l_type == lt_loaded && !RTLD_SINGLE_THREAD_P)
- __rtld_mrlock_unlock (l->l_scope_lock);
+ /* We are done with the global scope. */
+ if (!RTLD_SINGLE_THREAD_P)
+ THREAD_GSCOPE_RESET_FLAG ();
/* Currently result contains the base load address (or link map)
of the object that defines sym. Now add in the symbol
@@ -181,16 +187,20 @@ _dl_profile_fixup (
version = NULL;
}
- if (l->l_type == lt_loaded && !RTLD_SINGLE_THREAD_P)
- __rtld_mrlock_lock (l->l_scope_lock);
+ /* We need to keep the scope around so do some locking. This is
+ not necessary for objects which cannot be unloaded or when
+ we are not using any threads (yet). */
+ int flags = DL_LOOKUP_ADD_DEPENDENCY;
+ if (!RTLD_SINGLE_THREAD_P)
+ THREAD_GSCOPE_SET_FLAG ();
- result = _dl_lookup_symbol_x (strtab + refsym->st_name, l, &defsym,
- l->l_scope, version,
- ELF_RTYPE_CLASS_PLT,
- DL_LOOKUP_ADD_DEPENDENCY, NULL);
+ result = _dl_lookup_symbol_x (strtab + refsym->st_name, l,
+ &defsym, l->l_scope, version,
+ ELF_RTYPE_CLASS_PLT, flags, NULL);
- if (l->l_type == lt_loaded && !RTLD_SINGLE_THREAD_P)
- __rtld_mrlock_unlock (l->l_scope_lock);
+ /* We are done with the global scope. */
+ if (!RTLD_SINGLE_THREAD_P)
+ THREAD_GSCOPE_RESET_FLAG ();
/* Currently result contains the base load address (or link map)
of the object that defines sym. Now add in the symbol
diff --git a/elf/dl-support.c b/elf/dl-support.c
index c1cfc0df41e..4b7be6bc273 100644
--- a/elf/dl-support.c
+++ b/elf/dl-support.c
@@ -1,5 +1,5 @@
/* Support for dynamic linking code in static libc.
- Copyright (C) 1996-2005, 2006 Free Software Foundation, Inc.
+ Copyright (C) 1996-2005, 2006, 2007 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -98,7 +98,9 @@ int _dl_starting_up = 1;
hp_timing_t _dl_cpuclock_offset;
#endif
+#ifdef USE_TLS
void (*_dl_init_static_tls) (struct link_map *) = &_dl_nothread_init_static_tls;
+#endif
size_t _dl_pagesize;
@@ -132,6 +134,11 @@ int (*_dl_make_stack_executable_hook) (void **) internal_function
= _dl_make_stack_executable;
+/* Function in libpthread to wait for termination of lookups. */
+void (*_dl_wait_lookup_done) (void);
+
+struct dl_scope_free_list *_dl_scope_free_list;
+
#ifdef NEED_DL_SYSINFO
/* Needed for improved syscall handling on at least x86/Linux. */
uintptr_t _dl_sysinfo = DL_SYSINFO_DEFAULT;
diff --git a/elf/dl-sym.c b/elf/dl-sym.c
index 88a5adb0d56..fa0e3a67fc7 100644
--- a/elf/dl-sym.c
+++ b/elf/dl-sym.c
@@ -1,5 +1,5 @@
/* Look up a symbol in a shared object loaded by `dlopen'.
- Copyright (C) 1999,2000,2001,2002,2004,2006 Free Software Foundation, Inc.
+ Copyright (C) 1999-2002,2004,2006,2007 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -26,10 +26,12 @@
#include <ldsodefs.h>
#include <dl-hash.h>
#include <sysdep-cancel.h>
-#include <dl-tls.h>
+#ifdef USE_TLS
+# include <dl-tls.h>
+#endif
-#ifdef SHARED
+#if defined USE_TLS && defined SHARED
/* Systems which do not have tls_index also probably have to define
DONT_USE_TLS_INDEX. */
@@ -98,10 +100,9 @@ do_sym (void *handle, const char *name, void *who,
for (Lmid_t ns = 0; ns < DL_NNS; ++ns)
for (struct link_map *l = GL(dl_ns)[ns]._ns_loaded; l != NULL;
l = l->l_next)
- if (caller >= l->l_map_start && caller < l->l_map_end)
+ if (caller >= l->l_map_start && caller < l->l_map_end
+ && (l->l_contiguous || _dl_addr_inside_object (l, caller)))
{
- /* There must be exactly one DSO for the range of the virtual
- memory. Otherwise something is really broken. */
match = l;
break;
}
@@ -113,15 +114,13 @@ do_sym (void *handle, const char *name, void *who,
the initial binary. And then the more complex part
where the object is dynamically loaded and the scope
array can change. */
- if (match->l_type != lt_loaded || RTLD_SINGLE_THREAD_P)
+ if (RTLD_SINGLE_THREAD_P)
result = GLRO(dl_lookup_symbol_x) (name, match, &ref,
match->l_scope, vers, 0,
flags | DL_LOOKUP_ADD_DEPENDENCY,
NULL);
else
{
- __rtld_mrlock_lock (match->l_scope_lock);
-
struct call_dl_lookup_args args;
args.name = name;
args.map = match;
@@ -129,13 +128,15 @@ do_sym (void *handle, const char *name, void *who,
args.flags = flags | DL_LOOKUP_ADD_DEPENDENCY;
args.refp = &ref;
+ THREAD_GSCOPE_SET_FLAG ();
+
const char *objname;
const char *errstring = NULL;
bool malloced;
int err = GLRO(dl_catch_error) (&objname, &errstring, &malloced,
call_dl_lookup, &args);
- __rtld_mrlock_unlock (match->l_scope_lock);
+ THREAD_GSCOPE_RESET_FLAG ();
if (__builtin_expect (errstring != NULL, 0))
{
@@ -182,7 +183,7 @@ RTLD_NEXT used in code not dynamically loaded"));
{
void *value;
-#ifdef SHARED
+#if defined USE_TLS && defined SHARED
if (ELFW(ST_TYPE) (ref->st_info) == STT_TLS)
/* The found symbol is a thread-local storage variable.
Return the address for to the current thread. */
diff --git a/elf/dl-sysdep.c b/elf/dl-sysdep.c
index d06ce1754e1..68e08f480a3 100644
--- a/elf/dl-sysdep.c
+++ b/elf/dl-sysdep.c
@@ -1,5 +1,5 @@
/* Operating system support for run-time dynamic linker. Generic Unix version.
- Copyright (C) 1995-1998, 2000-2005, 2006 Free Software Foundation, Inc.
+ Copyright (C) 1995-1998, 2000-2005, 2007 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -405,8 +405,25 @@ _dl_important_hwcaps (const char *platform, size_t platform_len, size_t *sz,
}
#endif
+#ifdef USE_TLS
/* For TLS enabled builds always add 'tls'. */
++cnt;
+#else
+ if (cnt == 0)
+ {
+ /* If we no have platform name and no important capability we only
+ have the base directory to search. */
+ result = (struct r_strlenpair *) malloc (sizeof (*result));
+ if (result == NULL)
+ goto no_memory;
+
+ result[0].str = (char *) result; /* Does not really matter. */
+ result[0].len = 0;
+
+ *sz = 1;
+ return result;
+ }
+#endif
/* Create temporary data structure to generate result table. */
temp = (struct r_strlenpair *) alloca (cnt * sizeof (*temp));
@@ -448,11 +465,11 @@ _dl_important_hwcaps (const char *platform, size_t platform_len, size_t *sz,
temp[m].len = platform_len;
++m;
}
-
+#ifdef USE_TLS
temp[m].str = "tls";
temp[m].len = 3;
++m;
-
+#endif
assert (m == cnt);
/* Determine the total size of all strings together. */
@@ -460,9 +477,21 @@ _dl_important_hwcaps (const char *platform, size_t platform_len, size_t *sz,
total = temp[0].len + 1;
else
{
- total = (1UL << (cnt - 2)) * (temp[0].len + temp[cnt - 1].len + 2);
- for (n = 1; n + 1 < cnt; ++n)
- total += (1UL << (cnt - 3)) * (temp[n].len + 1);
+ total = temp[0].len + temp[cnt - 1].len + 2;
+ if (cnt > 2)
+ {
+ total <<= 1;
+ for (n = 1; n + 1 < cnt; ++n)
+ total += temp[n].len + 1;
+ if (cnt > 3
+ && (cnt >= sizeof (size_t) * 8
+ || total + (sizeof (*result) << 3)
+ >= (1UL << (sizeof (size_t) * 8 - cnt + 3))))
+ _dl_signal_error (ENOMEM, NULL, NULL,
+ N_("cannot create capability list"));
+
+ total <<= cnt - 3;
+ }
}
/* The result structure: we use a very compressed way to store the
@@ -470,8 +499,13 @@ _dl_important_hwcaps (const char *platform, size_t platform_len, size_t *sz,
*sz = 1 << cnt;
result = (struct r_strlenpair *) malloc (*sz * sizeof (*result) + total);
if (result == NULL)
- _dl_signal_error (ENOMEM, NULL, NULL,
- N_("cannot create capability list"));
+ {
+#ifndef USE_TLS
+ no_memory:
+#endif
+ _dl_signal_error (ENOMEM, NULL, NULL,
+ N_("cannot create capability list"));
+ }
if (cnt == 1)
{
diff --git a/elf/dl-tls.c b/elf/dl-tls.c
index d5865ab4092..a0f4f77ffa5 100644
--- a/elf/dl-tls.c
+++ b/elf/dl-tls.c
@@ -26,26 +26,30 @@
#include <sys/param.h>
#include <tls.h>
-#include <dl-tls.h>
-#include <ldsodefs.h>
+
+/* We don't need any of this if TLS is not supported. */
+#ifdef USE_TLS
+
+# include <dl-tls.h>
+# include <ldsodefs.h>
/* Amount of excess space to allocate in the static TLS area
to allow dynamic loading of modules defining IE-model TLS data. */
-#define TLS_STATIC_SURPLUS 64 + DL_NNS * 100
+# define TLS_STATIC_SURPLUS 64 + DL_NNS * 100
/* Value used for dtv entries for which the allocation is delayed. */
-#define TLS_DTV_UNALLOCATED ((void *) -1l)
+# define TLS_DTV_UNALLOCATED ((void *) -1l)
/* Out-of-memory handler. */
-#ifdef SHARED
+# ifdef SHARED
static void
__attribute__ ((__noreturn__))
oom (void)
{
_dl_fatal_printf ("cannot allocate memory for thread-local data: ABORT\n");
}
-#endif
+# endif
size_t
@@ -109,7 +113,7 @@ _dl_next_tls_modid (void)
}
-#ifdef SHARED
+# ifdef SHARED
void
internal_function
_dl_determine_tlsoffset (void)
@@ -154,7 +158,7 @@ _dl_determine_tlsoffset (void)
memory requirement for the next TLS block is smaller than the
gap. */
-#if TLS_TCB_AT_TP
+# if TLS_TCB_AT_TP
/* We simply start with zero. */
size_t offset = 0;
@@ -201,7 +205,7 @@ _dl_determine_tlsoffset (void)
GL(dl_tls_static_used) = offset;
GL(dl_tls_static_size) = (roundup (offset + TLS_STATIC_SURPLUS, max_align)
+ TLS_TCB_SIZE);
-#elif TLS_DTV_AT_TP
+# elif TLS_DTV_AT_TP
/* The TLS blocks start right after the TCB. */
size_t offset = TLS_TCB_SIZE;
@@ -245,9 +249,9 @@ _dl_determine_tlsoffset (void)
GL(dl_tls_static_used) = offset;
GL(dl_tls_static_size) = roundup (offset + TLS_STATIC_SURPLUS,
TLS_TCB_ALIGN);
-#else
-# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
-#endif
+# else
+# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
+# endif
/* The alignment requirement for the static TLS block. */
GL(dl_tls_static_align) = max_align;
@@ -284,7 +288,7 @@ _dl_tls_setup (void)
return 0;
}
rtld_hidden_def (_dl_tls_setup)
-#endif
+# endif
static void *
internal_function
@@ -333,13 +337,13 @@ _dl_allocate_tls_storage (void)
void *result;
size_t size = GL(dl_tls_static_size);
-#if TLS_DTV_AT_TP
+# if TLS_DTV_AT_TP
/* Memory layout is:
[ TLS_PRE_TCB_SIZE ] [ TLS_TCB_SIZE ] [ TLS blocks ]
^ This should be returned. */
size += (TLS_PRE_TCB_SIZE + GL(dl_tls_static_align) - 1)
& ~(GL(dl_tls_static_align) - 1);
-#endif
+# endif
/* Allocate a correctly aligned chunk of memory. */
result = __libc_memalign (GL(dl_tls_static_align), size);
@@ -348,14 +352,14 @@ _dl_allocate_tls_storage (void)
/* Allocate the DTV. */
void *allocated = result;
-#if TLS_TCB_AT_TP
+# if TLS_TCB_AT_TP
/* The TCB follows the TLS blocks. */
result = (char *) result + size - TLS_TCB_SIZE;
/* Clear the TCB data structure. We can't ask the caller (i.e.
libpthread) to do it, because we will initialize the DTV et al. */
memset (result, '\0', TLS_TCB_SIZE);
-#elif TLS_DTV_AT_TP
+# elif TLS_DTV_AT_TP
result = (char *) result + size - GL(dl_tls_static_size);
/* Clear the TCB data structure and TLS_PRE_TCB_SIZE bytes before it.
@@ -363,7 +367,7 @@ _dl_allocate_tls_storage (void)
initialize the DTV et al. */
memset ((char *) result - TLS_PRE_TCB_SIZE, '\0',
TLS_PRE_TCB_SIZE + TLS_TCB_SIZE);
-#endif
+# endif
result = allocate_dtv (result);
if (result == NULL)
@@ -424,14 +428,14 @@ _dl_allocate_tls_init (void *result)
assert (map->l_tls_modid == cnt);
assert (map->l_tls_blocksize >= map->l_tls_initimage_size);
-#if TLS_TCB_AT_TP
+# if TLS_TCB_AT_TP
assert ((size_t) map->l_tls_offset >= map->l_tls_blocksize);
dest = (char *) result - map->l_tls_offset;
-#elif TLS_DTV_AT_TP
+# elif TLS_DTV_AT_TP
dest = (char *) result + map->l_tls_offset;
-#else
-# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
-#endif
+# else
+# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
+# endif
/* Copy the initialization image and clear the BSS part. */
dtv[map->l_tls_modid].pointer.val = dest;
@@ -487,21 +491,21 @@ _dl_deallocate_tls (void *tcb, bool dealloc_tcb)
if (dealloc_tcb)
{
-#if TLS_TCB_AT_TP
+# if TLS_TCB_AT_TP
/* The TCB follows the TLS blocks. Back up to free the whole block. */
tcb -= GL(dl_tls_static_size) - TLS_TCB_SIZE;
-#elif TLS_DTV_AT_TP
+# elif TLS_DTV_AT_TP
/* Back up the TLS_PRE_TCB_SIZE bytes. */
tcb -= (TLS_PRE_TCB_SIZE + GL(dl_tls_static_align) - 1)
& ~(GL(dl_tls_static_align) - 1);
-#endif
+# endif
free (tcb);
}
}
rtld_hidden_def (_dl_deallocate_tls)
-#ifdef SHARED
+# ifdef SHARED
/* The __tls_get_addr function has two basic forms which differ in the
arguments. The IA-64 form takes two parameters, the module ID and
offset. The form used, among others, on IA-32 takes a reference to
@@ -509,15 +513,15 @@ rtld_hidden_def (_dl_deallocate_tls)
form seems to be more often used (in the moment) so we default to
it. Users of the IA-64 form have to provide adequate definitions
of the following macros. */
-# ifndef GET_ADDR_ARGS
-# define GET_ADDR_ARGS tls_index *ti
-# endif
-# ifndef GET_ADDR_MODULE
-# define GET_ADDR_MODULE ti->ti_module
-# endif
-# ifndef GET_ADDR_OFFSET
-# define GET_ADDR_OFFSET ti->ti_offset
-# endif
+# ifndef GET_ADDR_ARGS
+# define GET_ADDR_ARGS tls_index *ti
+# endif
+# ifndef GET_ADDR_MODULE
+# define GET_ADDR_MODULE ti->ti_module
+# endif
+# ifndef GET_ADDR_OFFSET
+# define GET_ADDR_OFFSET ti->ti_offset
+# endif
static void *
@@ -728,7 +732,7 @@ __tls_get_addr (GET_ADDR_ARGS)
return (char *) p + GET_ADDR_OFFSET;
}
-#endif
+# endif
/* Look up the module's TLS block as for __tls_get_addr,
@@ -836,3 +840,4 @@ cannot create TLS data structures"));
listp->slotinfo[idx].map = l;
listp->slotinfo[idx].gen = GL(dl_tls_generation) + 1;
}
+#endif /* use TLS */
diff --git a/elf/do-lookup.h b/elf/do-lookup.h
index 2585d830054..ab9a510ba18 100644
--- a/elf/do-lookup.h
+++ b/elf/do-lookup.h
@@ -1,5 +1,5 @@
/* Look up a symbol in the loaded objects.
- Copyright (C) 1995-2004, 2005, 2006 Free Software Foundation, Inc.
+ Copyright (C) 1995-2004, 2005, 2006, 2007 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -29,8 +29,13 @@ do_lookup_x (const char *undef_name, uint_fast32_t new_hash,
const struct r_found_version *const version, int flags,
struct link_map *skip, int type_class)
{
- struct link_map **list = scope->r_list;
size_t n = scope->r_nlist;
+ /* Make sure we read the value before proceeding. Otherwise we
+ might use r_list pointing to the initial scope and r_nlist being
+ the value after a resize. That is the only path in dl-open.c not
+ protected by GSCOPE. A read barrier here might be to expensive. */
+ __asm volatile ("" : "+r" (n), "+m" (scope->r_list));
+ struct link_map **list = scope->r_list;
do
{
diff --git a/elf/elf.h b/elf/elf.h
index d27e5f085d7..dae359778be 100644
--- a/elf/elf.h
+++ b/elf/elf.h
@@ -1,5 +1,5 @@
/* This file defines standard ELF types, structures, and macros.
- Copyright (C) 1995-2003,2004,2005,2006,2007 Free Software Foundation, Inc.
+ Copyright (C) 1995-2003,2004,2005,2006 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -1511,9 +1511,8 @@ typedef struct
#define R_MIPS_TLS_TPREL64 48 /* TP-relative offset, 64 bit */
#define R_MIPS_TLS_TPREL_HI16 49 /* TP-relative offset, high 16 bits */
#define R_MIPS_TLS_TPREL_LO16 50 /* TP-relative offset, low 16 bits */
-#define R_MIPS_GLOB_DAT 51
/* Keep this the last entry. */
-#define R_MIPS_NUM 52
+#define R_MIPS_NUM 51
/* Legal values for p_type field of Elf32_Phdr. */
diff --git a/elf/ldconfig.c b/elf/ldconfig.c
index ec81cbb8179..4a088af1ed7 100644
--- a/elf/ldconfig.c
+++ b/elf/ldconfig.c
@@ -24,7 +24,6 @@
#include <errno.h>
#include <inttypes.h>
#include <libintl.h>
-#include <locale.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdio_ext.h>
@@ -287,7 +286,7 @@ print_version (FILE *stream, struct argp_state *state)
Copyright (C) %s Free Software Foundation, Inc.\n\
This is free software; see the source for copying conditions. There is NO\n\
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
-"), "2007");
+"), "2006");
fprintf (stream, gettext ("Written by %s.\n"),
"Andreas Jaeger");
}
@@ -559,7 +558,7 @@ manual_link (char *library)
/* Do some sanity checks first. */
if (lstat64 (real_library, &stat_buf))
{
- error (0, errno, _("Cannot lstat %s"), library);
+ error (0, errno, _("Can't lstat %s"), library);
free (path);
return;
}
@@ -707,10 +706,10 @@ search_dir (const struct dir_entry *entry)
+ 1, ".#prelink#.", sizeof (".#prelink#.") - 1) == 0)
continue;
}
- len += strlen (entry->path);
+ len += strlen (entry->path) + 2;
if (len > file_name_len)
{
- file_name_len = len + 1;
+ file_name_len = len;
file_name = alloca (file_name_len);
if (!opt_chroot)
real_file_name = file_name;
@@ -718,10 +717,10 @@ search_dir (const struct dir_entry *entry)
sprintf (file_name, "%s/%s", entry->path, direntry->d_name);
if (opt_chroot)
{
- len = strlen (dir_name) + strlen (direntry->d_name);
+ len = strlen (dir_name) + strlen (direntry->d_name) + 2;
if (len > real_file_name_len)
{
- real_file_name_len = len + 1;
+ real_file_name_len = len;
real_file_name = alloca (real_file_name_len);
}
sprintf (real_file_name, "%s/%s", dir_name, direntry->d_name);
@@ -1167,14 +1166,9 @@ set_hwcap (void)
int
main (int argc, char **argv)
{
- /* Set locale via LC_ALL. */
- setlocale (LC_ALL, "");
-
- /* Set the text message domain. */
- textdomain (_libc_intl_domainname);
+ int remaining;
/* Parse and process arguments. */
- int remaining;
argp_parse (&argp, argc, argv, 0, &remaining, NULL);
/* Remaining arguments are additional directories if opt_manual_link
@@ -1191,7 +1185,9 @@ main (int argc, char **argv)
add_dir (argv[i]);
}
+#ifdef USE_TLS
hwcap_extra[63 - _DL_FIRST_EXTRA] = "tls";
+#endif
set_hwcap ();
diff --git a/elf/ldd.bash.in b/elf/ldd.bash.in
index 05282fe99be..d1591a57852 100644
--- a/elf/ldd.bash.in
+++ b/elf/ldd.bash.in
@@ -1,5 +1,5 @@
#! @BASH@
-# Copyright (C) 1996-2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+# Copyright (C) 1996-2004, 2005, 2006 Free Software Foundation, Inc.
# This file is part of the GNU C Library.
# The GNU C Library is free software; you can redistribute it and/or
@@ -39,7 +39,7 @@ while test $# -gt 0; do
printf $"Copyright (C) %s Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-" "2007"
+" "2006"
printf $"Written by %s and %s.
" "Roland McGrath" "Ulrich Drepper"
exit 0
diff --git a/elf/rtld.c b/elf/rtld.c
index 5e6ee516039..a357a46987b 100644
--- a/elf/rtld.c
+++ b/elf/rtld.c
@@ -1,5 +1,5 @@
/* Run time dynamic linker.
- Copyright (C) 1995-2002,2003,2004,2005,2006 Free Software Foundation, Inc.
+ Copyright (C) 1995-2006, 2007 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -207,7 +207,8 @@ DL_SYSINFO_IMPLEMENTATION
is fine, too. The latter is important here. We can avoid setting
up a temporary link map for ld.so if we can mark _rtld_global as
hidden. */
-#ifdef PI_STATIC_AND_HIDDEN
+#if defined PI_STATIC_AND_HIDDEN && defined HAVE_HIDDEN \
+ && defined HAVE_VISIBILITY_ATTRIBUTE
# define DONT_USE_BOOTSTRAP_MAP 1
#endif
@@ -291,7 +292,7 @@ _dl_start_final (void *arg, struct dl_start_final_info *info)
GL(dl_rtld_map).l_map_end = (ElfW(Addr)) _end;
GL(dl_rtld_map).l_text_end = (ElfW(Addr)) _etext;
/* Copy the TLS related data if necessary. */
-#ifndef DONT_USE_BOOTSTRAP_MAP
+#if USE_TLS && !defined DONT_USE_BOOTSTRAP_MAP
# if USE___THREAD
assert (info->l.l_tls_modid != 0);
GL(dl_rtld_map).l_tls_blocksize = info->l.l_tls_blocksize;
@@ -399,7 +400,7 @@ _dl_start (void *arg)
bootstrap_map.l_ld = (void *) bootstrap_map.l_addr + elf_machine_dynamic ();
elf_get_dynamic_info (&bootstrap_map, NULL);
-#if NO_TLS_OFFSET != 0
+#if defined USE_TLS && NO_TLS_OFFSET != 0
bootstrap_map.l_tls_offset = NO_TLS_OFFSET;
#endif
@@ -700,6 +701,7 @@ match_version (const char *string, struct link_map *map)
return 0;
}
+#ifdef USE_TLS
static bool tls_init_tp_called;
static void *
@@ -771,6 +773,7 @@ cannot allocate TLS data structures for initial thread");
return tcbp;
}
+#endif
#ifdef _LIBC_REENTRANT
/* _dl_error_catch_tsd points to this for the single-threaded case.
@@ -858,14 +861,18 @@ dl_main (const ElfW(Phdr) *phdr,
hp_timing_t stop;
hp_timing_t diff;
#endif
+#ifdef USE_TLS
void *tcbp = NULL;
+#endif
#ifdef _LIBC_REENTRANT
/* Explicit initialization since the reloc would just be more work. */
GL(dl_error_catch_tsd) = &_dl_initial_error_catch_tsd;
#endif
+#ifdef USE_TLS
GL(dl_init_static_tls) = &_dl_nothread_init_static_tls;
+#endif
#if defined SHARED && defined _LIBC_REENTRANT \
&& defined __rtld_lock_default_lock_recursive
@@ -1150,6 +1157,7 @@ of this helper program; chances are you did not intend to run this program.\n\
break;
case PT_TLS:
+#ifdef USE_TLS
if (ph->p_memsz > 0)
{
/* Note that in the case the dynamic linker we duplicate work
@@ -1169,6 +1177,10 @@ of this helper program; chances are you did not intend to run this program.\n\
/* This image gets the ID one. */
GL(dl_tls_max_dtv_idx) = main_map->l_tls_modid = 1;
}
+#else
+ _dl_fatal_printf ("\
+ld.so does not support TLS, but program uses it!\n");
+#endif
break;
case PT_GNU_STACK:
@@ -1180,12 +1192,13 @@ of this helper program; chances are you did not intend to run this program.\n\
main_map->l_relro_size = ph->p_memsz;
break;
}
-
- /* Adjust the address of the TLS initialization image in case
- the executable is actually an ET_DYN object. */
- if (main_map->l_tls_initimage != NULL)
- main_map->l_tls_initimage
- = (char *) main_map->l_tls_initimage + main_map->l_addr;
+#ifdef USE_TLS
+ /* Adjust the address of the TLS initialization image in case
+ the executable is actually an ET_DYN object. */
+ if (main_map->l_tls_initimage != NULL)
+ main_map->l_tls_initimage
+ = (char *) main_map->l_tls_initimage + main_map->l_addr;
+#endif
if (! main_map->l_map_end)
main_map->l_map_end = ~0;
if (! main_map->l_text_end)
@@ -1388,10 +1401,12 @@ of this helper program; chances are you did not intend to run this program.\n\
break;
}
+#ifdef USE_TLS
/* Add the dynamic linker to the TLS list if it also uses TLS. */
if (GL(dl_rtld_map).l_tls_blocksize != 0)
/* Assign a module ID. Do this before loading any audit modules. */
GL(dl_rtld_map).l_tls_modid = _dl_next_tls_modid ();
+#endif
/* If we have auditing DSOs to load, do it now. */
if (__builtin_expect (audit_list != NULL, 0))
@@ -1399,8 +1414,15 @@ of this helper program; chances are you did not intend to run this program.\n\
/* Iterate over all entries in the list. The order is important. */
struct audit_ifaces *last_audit = NULL;
struct audit_list *al = audit_list->next;
+
+#ifdef USE_TLS
+ /* Since we start using the auditing DSOs right away we need to
+ initialize the data structures now. */
+ tcbp = init_tls ();
+#endif
do
{
+#ifdef USE_TLS
int tls_idx = GL(dl_tls_max_dtv_idx);
/* Now it is time to determine the layout of the static TLS
@@ -1408,11 +1430,7 @@ of this helper program; chances are you did not intend to run this program.\n\
always allocate the static block, we never defer it even if
no DF_STATIC_TLS bit is set. The reason is that we know
glibc will use the static model. */
-
- /* Since we start using the auditing DSOs right away we need to
- initialize the data structures now. */
- tcbp = init_tls ();
-
+#endif
struct dlmopen_args dlmargs;
dlmargs.fname = al->name;
dlmargs.map = NULL;
@@ -1527,7 +1545,9 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n",
assert (GL(dl_ns)[ns]._ns_loaded == NULL);
assert (GL(dl_ns)[ns]._ns_nloaded == 0);
+#ifdef USE_TLS
GL(dl_tls_max_dtv_idx) = tls_idx;
+#endif
goto not_loaded;
}
}
@@ -1803,6 +1823,7 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n",
_dl_receive_error (print_missing_version, version_check_doit, &args);
}
+#ifdef USE_TLS
/* We do not initialize any of the TLS functionality unless any of the
initial modules uses TLS. This makes dynamic loading of modules with
TLS impossible, but to support it requires either eagerly doing setup
@@ -1813,6 +1834,7 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n",
bool was_tls_init_tp_called = tls_init_tp_called;
if (tcbp == NULL)
tcbp = init_tls ();
+#endif
/* Set up the stack checker's canary. */
uintptr_t stack_chk_guard = _dl_setup_stack_chk_guard ();
@@ -1869,12 +1891,13 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n",
(size_t) l->l_map_start,
(int) sizeof l->l_addr * 2,
(size_t) l->l_addr);
-
+#ifdef USE_TLS
if (l->l_tls_modid)
_dl_printf (" TLS(0x%Zx, 0x%0*Zx)\n", l->l_tls_modid,
(int) sizeof l->l_tls_offset * 2,
(size_t) l->l_tls_offset);
else
+#endif
_dl_printf ("\n");
}
}
@@ -1942,8 +1965,8 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n",
lookup_t result;
result = _dl_lookup_symbol_x (INTUSE(_dl_argv)[i], main_map,
- &ref, main_map->l_scope,
- NULL, ELF_RTYPE_CLASS_PLT,
+ &ref, main_map->l_scope, NULL,
+ ELF_RTYPE_CLASS_PLT,
DL_LOOKUP_ADD_DEPENDENCY, NULL);
loadbase = LOOKUP_VALUE_ADDRESS (result);
@@ -1985,8 +2008,8 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n",
{
/* Mark the link map as not yet relocated again. */
GL(dl_rtld_map).l_relocated = 0;
- _dl_relocate_object (&GL(dl_rtld_map),
- main_map->l_scope, 0, 0);
+ _dl_relocate_object (&GL(dl_rtld_map), main_map->l_scope,
+ 0, 0);
}
}
#define VERNEEDTAG (DT_NUM + DT_THISPROCNUM + DT_VERSIONTAGIDX (DT_VERNEED))
@@ -2157,9 +2180,11 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n",
if (l->l_relro_size)
_dl_protect_relro (l);
+#ifdef USE_TLS
/* Add object to slot information data if necessasy. */
if (l->l_tls_blocksize != 0 && tls_init_tp_called)
_dl_add_to_slotinfo (l);
+#endif
}
_dl_sysdep_start_cleanup ();
@@ -2206,9 +2231,11 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n",
_dl_relocate_object (l, l->l_scope, GLRO(dl_lazy),
consider_profiling);
+#ifdef USE_TLS
/* Add object to slot information data if necessasy. */
if (l->l_tls_blocksize != 0 && tls_init_tp_called)
_dl_add_to_slotinfo (l);
+#endif
l = l->l_prev;
}
@@ -2237,6 +2264,7 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n",
# define NONTLS_INIT_TP do { } while (0)
#endif
+#ifdef USE_TLS
if (!was_tls_init_tp_called && GL(dl_tls_max_dtv_idx) > 0)
++GL(dl_tls_generation);
@@ -2254,6 +2282,9 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n",
_dl_fatal_printf ("cannot set up thread-local storage: %s\n",
lossage);
}
+#else
+ NONTLS_INIT_TP;
+#endif
if (! prelinked && rtld_multiple_ref)
{
diff --git a/elf/sprof.c b/elf/sprof.c
index 01d27e1efff..e53a7ba7a36 100644
--- a/elf/sprof.c
+++ b/elf/sprof.c
@@ -1,5 +1,5 @@
/* Read and display shared object profiling data.
- Copyright (C) 1997-2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+ Copyright (C) 1997-2004, 2005, 2006 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
@@ -357,7 +357,7 @@ Copyright (C) %s Free Software Foundation, Inc.\n\
This is free software; see the source for copying conditions. There is NO\n\
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
"),
- "2007");
+ "2006");
fprintf (stream, gettext ("Written by %s.\n"), "Ulrich Drepper");
}
diff --git a/elf/tst-thrlock.c b/elf/tst-thrlock.c
index fe72eba141e..71f1fbb35d1 100644
--- a/elf/tst-thrlock.c
+++ b/elf/tst-thrlock.c
@@ -27,9 +27,8 @@ tf (void *arg)
return NULL;
}
-
-static int
-do_test (void)
+int
+main (void)
{
#define N 10
pthread_t th[N];
@@ -54,6 +53,3 @@ do_test (void)
}
return 0;
}
-
-#define TEST_FUNCTION do_test ()
-#include "../test-skeleton.c"
diff --git a/elf/tst-tls-dlinfo.c b/elf/tst-tls-dlinfo.c
index 26c2811178f..e97b5081fdc 100644
--- a/elf/tst-tls-dlinfo.c
+++ b/elf/tst-tls-dlinfo.c
@@ -9,6 +9,7 @@
static int
do_test (void)
{
+#ifdef USE_TLS
static const char modname[] = "tst-tlsmod2.so";
int result = 0;
int *foop;
@@ -82,6 +83,9 @@ do_test (void)
dlclose (h);
return result;
+#else
+ return 0;
+#endif
}
diff --git a/elf/tst-tls1.c b/elf/tst-tls1.c
index 3b9b10f9aaa..478f5bbdcdf 100644
--- a/elf/tst-tls1.c
+++ b/elf/tst-tls1.c
@@ -3,18 +3,21 @@
#include <tls.h>
-#include "tls-macros.h"
+#ifdef USE_TLS
+# include "tls-macros.h"
/* Two common 'int' variables in TLS. */
COMMON_INT_DEF(foo);
COMMON_INT_DEF(bar);
+#endif
#define TEST_FUNCTION do_test ()
static int
do_test (void)
{
+#ifdef USE_TLS
int result = 0;
int *ap, *bp;
@@ -79,6 +82,9 @@ do_test (void)
}
return result;
+#else
+ return 0;
+#endif
}
diff --git a/elf/tst-tls10.h b/elf/tst-tls10.h
index bffc332a0aa..1be6adc2937 100644
--- a/elf/tst-tls10.h
+++ b/elf/tst-tls10.h
@@ -1,7 +1,8 @@
#include <tls.h>
#include <stdlib.h>
-#if defined HAVE___THREAD && defined HAVE_TLS_MODEL_ATTRIBUTE
+#if defined USE_TLS && defined HAVE___THREAD \
+ && defined HAVE_TLS_MODEL_ATTRIBUTE
# define USE_TLS__THREAD
struct A
diff --git a/elf/tst-tls14.c b/elf/tst-tls14.c
index c1e6ba7e2cb..428fd5293eb 100644
--- a/elf/tst-tls14.c
+++ b/elf/tst-tls14.c
@@ -6,9 +6,9 @@
#include <tls.h>
-#if HAVE___THREAD
+#if USE_TLS && HAVE___THREAD
-# define AL 4096
+#define AL 4096
struct foo
{
int i;
@@ -55,11 +55,11 @@ do_test (void)
return result;
}
-# define TEST_FUNCTION do_test ()
+#define TEST_FUNCTION do_test ()
#else
-# define TEST_FUNCTION 0
+#define TEST_FUNCTION 0
#endif
diff --git a/elf/tst-tls2.c b/elf/tst-tls2.c
index 3d13272c08a..417489968ec 100644
--- a/elf/tst-tls2.c
+++ b/elf/tst-tls2.c
@@ -3,18 +3,21 @@
#include <tls.h>
-#include "tls-macros.h"
+#ifdef USE_TLS
+# include "tls-macros.h"
/* Two 'int' variables in TLS. */
VAR_INT_DEF(foo);
VAR_INT_DEF(bar);
+#endif
#define TEST_FUNCTION do_test ()
static int
do_test (void)
{
+#ifdef USE_TLS
int result = 0;
int *ap, *bp;
@@ -79,6 +82,9 @@ do_test (void)
}
return result;
+#else
+ return 0;
+#endif
}
diff --git a/elf/tst-tls3.c b/elf/tst-tls3.c
index c5e501eb4ee..84be43575b6 100644
--- a/elf/tst-tls3.c
+++ b/elf/tst-tls3.c
@@ -3,13 +3,15 @@
#include <tls.h>
-#include "tls-macros.h"
+#ifdef USE_TLS
+# include "tls-macros.h"
/* One define int variable, two externs. */
COMMON_INT_DECL(foo);
VAR_INT_DECL(bar);
VAR_INT_DEF(baz);
+#endif
extern int in_dso (void);
@@ -19,6 +21,7 @@ extern int in_dso (void);
static int
do_test (void)
{
+#ifdef USE_TLS
int result = 0;
int *ap, *bp, *cp;
@@ -64,6 +67,9 @@ do_test (void)
result |= in_dso ();
return result;
+#else
+ return 0;
+#endif
}
diff --git a/elf/tst-tls4.c b/elf/tst-tls4.c
index 4ae33db24d9..f92ee53ce55 100644
--- a/elf/tst-tls4.c
+++ b/elf/tst-tls4.c
@@ -9,6 +9,7 @@
static int
do_test (void)
{
+#ifdef USE_TLS
static const char modname[] = "tst-tlsmod2.so";
int result = 0;
int *foop;
@@ -46,6 +47,9 @@ do_test (void)
dlclose (h);
return result;
+#else
+ return 0;
+#endif
}
diff --git a/elf/tst-tls5.c b/elf/tst-tls5.c
index 27b18294fb2..a571d2cd3fa 100644
--- a/elf/tst-tls5.c
+++ b/elf/tst-tls5.c
@@ -9,6 +9,7 @@
static int
do_test (void)
{
+#ifdef USE_TLS
static const char modname[] = "tst-tlsmod2.so";
int result = 0;
int *foop;
@@ -62,6 +63,9 @@ do_test (void)
dlclose (h);
return result;
+#else
+ return 0;
+#endif
}
diff --git a/elf/tst-tls6.c b/elf/tst-tls6.c
index 021622d9c7c..68d706538f4 100644
--- a/elf/tst-tls6.c
+++ b/elf/tst-tls6.c
@@ -10,6 +10,7 @@
static int
do_test (void)
{
+#ifdef USE_TLS
static const char modname[] = "tst-tlsmod2.so";
int result = 0;
int *foop;
@@ -80,6 +81,9 @@ do_test (void)
}
return result;
+#else
+ return 0;
+#endif
}
diff --git a/elf/tst-tls7.c b/elf/tst-tls7.c
index 1edc2b63568..37f1a63e164 100644
--- a/elf/tst-tls7.c
+++ b/elf/tst-tls7.c
@@ -10,6 +10,7 @@
static int
do_test (void)
{
+#ifdef USE_TLS
static const char modname[] = "tst-tlsmod3.so";
int result = 0;
int (*fp) (void);
@@ -51,6 +52,9 @@ do_test (void)
}
return result;
+#else
+ return 0;
+#endif
}
diff --git a/elf/tst-tls8.c b/elf/tst-tls8.c
index 36b1baca636..ccc4e9f6fa4 100644
--- a/elf/tst-tls8.c
+++ b/elf/tst-tls8.c
@@ -10,6 +10,7 @@
static int
do_test (void)
{
+#ifdef USE_TLS
static const char modname1[] = "$ORIGIN/tst-tlsmod3.so";
static const char modname2[] = "$ORIGIN/tst-tlsmod4.so";
int result = 0;
@@ -164,6 +165,9 @@ do_test (void)
}
return result;
+#else
+ return 0;
+#endif
}
diff --git a/elf/tst-tls9.c b/elf/tst-tls9.c
index 12078518fad..e317696dfc3 100644
--- a/elf/tst-tls9.c
+++ b/elf/tst-tls9.c
@@ -9,6 +9,7 @@
static int
do_test (void)
{
+#ifdef USE_TLS
static const char modname1[] = "tst-tlsmod5.so";
static const char modname2[] = "tst-tlsmod6.so";
int result = 0;
@@ -32,6 +33,9 @@ do_test (void)
dlclose (h2);
return result;
+#else
+ return 0;
+#endif
}
diff --git a/elf/tst-tlsmod1.c b/elf/tst-tlsmod1.c
index 4d966c9472c..c74a617b77a 100644
--- a/elf/tst-tlsmod1.c
+++ b/elf/tst-tlsmod1.c
@@ -2,6 +2,7 @@
#include <tls.h>
+#ifdef USE_TLS
#include "tls-macros.h"
@@ -9,6 +10,7 @@
COMMON_INT_DEF(foo);
VAR_INT_DEF(bar);
VAR_INT_DECL(baz);
+#endif
extern int in_dso (void);
@@ -16,6 +18,7 @@ int
in_dso (void)
{
int result = 0;
+#ifdef USE_TLS
int *ap, *bp, *cp;
/* Get variables using initial exec model. */
@@ -59,6 +62,7 @@ in_dso (void)
printf ("baz = %d\n", *cp);
result = 1;
}
+#endif
return result;
}
diff --git a/elf/tst-tlsmod13.c b/elf/tst-tlsmod13.c
index e4e23af2d85..beca89f6fec 100644
--- a/elf/tst-tlsmod13.c
+++ b/elf/tst-tlsmod13.c
@@ -1,6 +1,7 @@
#include <tls.h>
-#if defined HAVE___THREAD && defined HAVE_TLS_MODEL_ATTRIBUTE
+#if defined USE_TLS && defined HAVE___THREAD \
+ && defined HAVE_TLS_MODEL_ATTRIBUTE
__thread int a[2] __attribute__ ((tls_model ("initial-exec")));
#else
int a[2];
diff --git a/elf/tst-tlsmod13a.c b/elf/tst-tlsmod13a.c
index 70a02131ee8..14b12b032b4 100644
--- a/elf/tst-tlsmod13a.c
+++ b/elf/tst-tlsmod13a.c
@@ -1,6 +1,7 @@
#include <tls.h>
-#if defined HAVE___THREAD && defined HAVE_TLS_MODEL_ATTRIBUTE
+#if defined USE_TLS && defined HAVE___THREAD \
+ && defined HAVE_TLS_MODEL_ATTRIBUTE
__thread int b[2] __attribute__ ((tls_model ("initial-exec")));
#else
int b[2];
diff --git a/elf/tst-tlsmod14a.c b/elf/tst-tlsmod14a.c
index ad1d179aac2..0bb393d9c5d 100644
--- a/elf/tst-tlsmod14a.c
+++ b/elf/tst-tlsmod14a.c
@@ -3,9 +3,9 @@
#include <tls.h>
-#if HAVE___THREAD
+#if USE_TLS && HAVE___THREAD
-# define AL 4096
+#define AL 4096
struct foo
{
int i;
@@ -15,9 +15,9 @@ static __thread struct foo f;
static struct foo g;
-# ifndef FCT
-# define FCT in_dso1
-# endif
+#ifndef FCT
+# define FCT in_dso1
+#endif
int
diff --git a/elf/tst-tlsmod2.c b/elf/tst-tlsmod2.c
index 981923313c5..98d9d3e5185 100644
--- a/elf/tst-tlsmod2.c
+++ b/elf/tst-tlsmod2.c
@@ -2,6 +2,7 @@
#include <tls.h>
+#ifdef USE_TLS
#include "tls-macros.h"
@@ -34,3 +35,4 @@ in_dso (int n, int *caller_foop)
return result;
}
+#endif
diff --git a/elf/tst-tlsmod3.c b/elf/tst-tlsmod3.c
index 5c456ee2da4..4a8aad659f6 100644
--- a/elf/tst-tlsmod3.c
+++ b/elf/tst-tlsmod3.c
@@ -2,7 +2,8 @@
#include <tls.h>
-#include "tls-macros.h"
+#ifdef USE_TLS
+# include "tls-macros.h"
extern int in_dso (int n, int *caller_foop);
@@ -37,3 +38,4 @@ in_dso2 (void)
return result;
}
+#endif
diff --git a/elf/tst-tlsmod4.c b/elf/tst-tlsmod4.c
index dd954866186..5285e821b0e 100644
--- a/elf/tst-tlsmod4.c
+++ b/elf/tst-tlsmod4.c
@@ -2,7 +2,8 @@
#include <tls.h>
-#include "tls-macros.h"
+#ifdef USE_TLS
+# include "tls-macros.h"
COMMON_INT_DEF(baz);
@@ -34,3 +35,4 @@ in_dso (int n, int *caller_bazp)
return result;
}
+#endif
diff --git a/elf/tst-tlsmod5.c b/elf/tst-tlsmod5.c
index 00d3a9d9203..2ec69e13b3f 100644
--- a/elf/tst-tlsmod5.c
+++ b/elf/tst-tlsmod5.c
@@ -1,5 +1,7 @@
#include <tls.h>
+#ifdef USE_TLS
#include "tls-macros.h"
COMMON_INT_DEF(foo);
+#endif
diff --git a/elf/tst-tlsmod6.c b/elf/tst-tlsmod6.c
index 244d9ae485a..0fda51b226f 100644
--- a/elf/tst-tlsmod6.c
+++ b/elf/tst-tlsmod6.c
@@ -1,5 +1,7 @@
#include <tls.h>
+#ifdef USE_TLS
#include "tls-macros.h"
COMMON_INT_DEF(bar);
+#endif
diff --git a/gmon/mcount.c b/gmon/mcount.c
index 5a4a2499d46..32a5f1ea0fc 100644
--- a/gmon/mcount.c
+++ b/gmon/mcount.c
@@ -69,8 +69,8 @@ _MCOUNT_DECL(frompc, selfpc) /* _mcount; may be static, inline, etc */
* check that we are profiling
* and that we aren't recursively invoked.
*/
- if (catomic_compare_and_exchange_bool_acq (&p->state, GMON_PROF_BUSY,
- GMON_PROF_ON))
+ if (atomic_compare_and_exchange_bool_acq (&p->state, GMON_PROF_BUSY,
+ GMON_PROF_ON))
return;
/*
diff --git a/iconv/gconv_charset.h b/iconv/gconv_charset.h
index c18abec5787..8882f4319ff 100644
--- a/iconv/gconv_charset.h
+++ b/iconv/gconv_charset.h
@@ -1,5 +1,5 @@
/* Charset name normalization.
- Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2001,2002,2003,2004,2005,2007 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 2001.
@@ -30,7 +30,7 @@ strip (char *wp, const char *s)
while (*s != '\0')
{
if (__isalnum_l (*s, _nl_C_locobj_ptr)
- || *s == '_' || *s == '-' || *s == '.' || *s == ',')
+ || *s == '_' || *s == '-' || *s == '.' || *s == ',' || *s == ':')
*wp++ = __toupper_l (*s, _nl_C_locobj_ptr);
else if (*s == '/')
{
diff --git a/iconv/iconv_open.c b/iconv/iconv_open.c
index e0f61355751..fc94fa5fe0f 100644
--- a/iconv/iconv_open.c
+++ b/iconv/iconv_open.c
@@ -1,5 +1,5 @@
/* Get descriptor for character set conversion.
- Copyright (C) 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+ Copyright (C) 1997,1998,1999,2000,2001,2007 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
@@ -38,7 +38,7 @@ iconv_open (const char *tocode, const char *fromcode)
int res;
/* Normalize the name. We remove all characters beside alpha-numeric,
- '_', '-', '/', and '.'. */
+ '_', '-', '/', '.', and ':'. */
tocode_len = strlen (tocode);
tocode_conv = (char *) alloca (tocode_len + 3);
strip (tocode_conv, tocode);
diff --git a/iconv/iconv_prog.c b/iconv/iconv_prog.c
index 84493af68ff..77829971ad9 100644
--- a/iconv/iconv_prog.c
+++ b/iconv/iconv_prog.c
@@ -1,5 +1,5 @@
/* Convert text in given files from the specified from-set to the to-set.
- Copyright (C) 1998-2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+ Copyright (C) 1998-2004, 2005, 2006 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
@@ -426,7 +426,7 @@ print_version (FILE *stream, struct argp_state *state)
Copyright (C) %s Free Software Foundation, Inc.\n\
This is free software; see the source for copying conditions. There is NO\n\
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
-"), "2007");
+"), "2006");
fprintf (stream, gettext ("Written by %s.\n"), "Ulrich Drepper");
}
diff --git a/iconv/iconvconfig.c b/iconv/iconvconfig.c
index 405ee98a913..dc3f0084579 100644
--- a/iconv/iconvconfig.c
+++ b/iconv/iconvconfig.c
@@ -1,5 +1,5 @@
/* Generate fastloading iconv module configuration files.
- Copyright (C) 2000-2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+ Copyright (C) 2000-2004, 2005, 2006 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2000.
@@ -395,7 +395,7 @@ print_version (FILE *stream, struct argp_state *state)
Copyright (C) %s Free Software Foundation, Inc.\n\
This is free software; see the source for copying conditions. There is NO\n\
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
-"), "2007");
+"), "2006");
fprintf (stream, gettext ("Written by %s.\n"), "Ulrich Drepper");
}
diff --git a/iconvdata/gconv-modules b/iconvdata/gconv-modules
index 852c7b94a61..a33645d41fe 100644
--- a/iconvdata/gconv-modules
+++ b/iconvdata/gconv-modules
@@ -1,5 +1,5 @@
# GNU libc iconv configuration.
-# Copyright (C) 1997-2004, 2005 Free Software Foundation, Inc.
+# Copyright (C) 1997-2004, 2005, 2007 Free Software Foundation, Inc.
# This file is part of the GNU C Library.
# The GNU C Library is free software; you can redistribute it and/or
@@ -1376,7 +1376,7 @@ module INTERNAL INIS-CYRILLIC// INIS-CYRILLIC 1
# from to module cost
alias ISO-IR-98// ISO_2033//
alias ISO_2033-1983// ISO_2033//
-alias E13B/ ISO_2033//
+alias E13B// ISO_2033//
alias CSISO2033// ISO_2033//
module ISO_2033// INTERNAL ISO_2033 1
module INTERNAL ISO_2033// ISO_2033 1
diff --git a/iconvdata/johab.c b/iconvdata/johab.c
index 6d6f92235cf..58cb5bcc0d0 100644
--- a/iconvdata/johab.c
+++ b/iconvdata/johab.c
@@ -1,5 +1,5 @@
/* Mapping tables for JOHAB handling.
- Copyright (C) 1998, 1999, 2000-2002 Free Software Foundation, Inc.
+ Copyright (C) 1998, 1999, 2000-2002, 2007 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Jungshik Shin <jshin@pantheon.yale.edu>
and Ulrich Drepper <drepper@cygnus.com>, 1998.
@@ -239,7 +239,7 @@ johab_sym_hanja_to_ucs (uint_fast32_t idx, uint_fast32_t c1, uint_fast32_t c2)
if (__builtin_expect (ch2 < 0x31, 0) \
|| (__builtin_expect (ch2 > 0x7e, 0) && ch2 < 0x91) \
|| __builtin_expect (ch2, 0) == 0xff \
- || (__builtin_expect (ch, 0) == 0xd9 && ch2 > 0xe5) \
+ || (__builtin_expect (ch, 0) == 0xd9 && ch2 > 0xe8) \
|| (__builtin_expect (ch, 0) == 0xda \
&& ch2 > 0xa0 && ch2 < 0xd4) \
|| (__builtin_expect (ch, 0) == 0xde && ch2 > 0xf1)) \
@@ -386,7 +386,7 @@ johab_sym_hanja_to_ucs (uint_fast32_t idx, uint_fast32_t c1, uint_fast32_t c2)
break; \
} \
if (__builtin_expect (written == __UNKNOWN_10646_CHAR, 0) \
- || (outptr[0] == 0x22 && outptr[1] > 0x65)) \
+ || (outptr[0] == 0x22 && outptr[1] > 0x68)) \
{ \
UNICODE_TAG_HANDLER (ch, 4); \
STANDARD_TO_LOOP_ERR_HANDLER (4); \
diff --git a/iconvdata/ksc5601.c b/iconvdata/ksc5601.c
index bf8ce35cc6c..30e468150d3 100644
--- a/iconvdata/ksc5601.c
+++ b/iconvdata/ksc5601.c
@@ -1,5 +1,5 @@
/* Conversion tables for KS C 5601-1992 based encoding conversion.
- Copyright (C) 1998, 2000 Free Software Foundation, Inc.
+ Copyright (C) 1998, 2000, 2007 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Jungshik Shin <jshin@pantheon.yale.edu>, 1998.
@@ -412,7 +412,8 @@ const uint16_t __ksc5601_sym_to_ucs[] =
[0x0098] = 0x2669, [0x0099] = 0x266a, [0x009a] = 0x266c, [0x009b] = 0x327f,
[0x009c] = 0x321c, [0x009d] = 0x2116, [0x009e] = 0x33c7, [0x009f] = 0x2122,
[0x00a0] = 0x33c2, [0x00a1] = 0x33d8, [0x00a2] = 0x2121, [0x00a3] = 0x20ac,
- [0x00a4] = 0x00ae, [0x00bc] = 0xff01, [0x00bd] = 0xff02, [0x00be] = 0xff03,
+ [0x00a4] = 0x00ae, [0x00a5] = 0x327e,
+ [0x00bc] = 0xff01, [0x00bd] = 0xff02, [0x00be] = 0xff03,
[0x00bf] = 0xff04, [0x00c0] = 0xff05, [0x00c1] = 0xff06, [0x00c2] = 0xff07,
[0x00c3] = 0xff08, [0x00c4] = 0xff09, [0x00c5] = 0xff0a, [0x00c6] = 0xff0b,
[0x00c7] = 0xff0c, [0x00c8] = 0xff0d, [0x00c9] = 0xff0e, [0x00ca] = 0xff0f,
@@ -917,6 +918,7 @@ const struct map __ksc5601_sym_from_ucs[KSC5601_SYMBOL] =
{0x3273, "\x28\x44"}, {0x3274, "\x28\x45"}, {0x3275, "\x28\x46"},
{0x3276, "\x28\x47"}, {0x3277, "\x28\x48"}, {0x3278, "\x28\x49"},
{0x3279, "\x28\x4a"}, {0x327a, "\x28\x4b"}, {0x327b, "\x28\x4c"},
+ {0x327e, "\x22\x68"},
{0x327f, "\x22\x5e"}, {0x3380, "\x27\x49"}, {0x3381, "\x27\x4a"},
{0x3382, "\x27\x4b"}, {0x3383, "\x27\x4c"}, {0x3384, "\x27\x4d"},
{0x3388, "\x27\x3a"}, {0x3389, "\x27\x3b"}, {0x338a, "\x27\x5c"},
diff --git a/iconvdata/ksc5601.h b/iconvdata/ksc5601.h
index 603a337f891..77f47ca834e 100644
--- a/iconvdata/ksc5601.h
+++ b/iconvdata/ksc5601.h
@@ -1,5 +1,5 @@
/* Access functions for KS C 5601-1992 based encoding conversion.
- Copyright (C) 1998, 1999, 2000, 2003 Free Software Foundation, Inc.
+ Copyright (C) 1998, 1999, 2000, 2003, 2007 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -22,7 +22,7 @@
#define KSC5601_HANGUL 2350
#define KSC5601_HANJA 4888
-#define KSC5601_SYMBOL 988
+#define KSC5601_SYMBOL 989
#include <gconv.h>
#include <stdint.h>
diff --git a/iconvdata/uhc.c b/iconvdata/uhc.c
index 5d25b863eea..1234346c8d8 100644
--- a/iconvdata/uhc.c
+++ b/iconvdata/uhc.c
@@ -1,5 +1,5 @@
/* Mapping tables for UHC handling.
- Copyright (C) 1998, 1999, 2000-2002 Free Software Foundation, Inc.
+ Copyright (C) 1998, 1999, 2000-2002, 2007 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Jungshik Shin <jshin@pantheon.yale.edu>, 1998.
@@ -3135,7 +3135,8 @@ static const char uhc_hangul_from_ucs[11172][2] =
else \
{ \
ch = ksc5601_to_ucs4 (&inptr, 2, 0x80); \
- if (__builtin_expect (ch == __UNKNOWN_10646_CHAR, 0)) \
+ if (__builtin_expect (ch == __UNKNOWN_10646_CHAR, 0) \
+ || __builtin_expect (ch == 0x327e, 0)) \
{ \
/* Illegal. */ \
STANDARD_FROM_LOOP_ERR_HANDLER (2); \
@@ -3207,16 +3208,17 @@ static const char uhc_hangul_from_ucs[11172][2] =
{ \
size_t written = ucs4_to_ksc5601_sym (ch, outptr, outend - outptr); \
\
+ if (__builtin_expect (ch == 0x327e, 0) \
+ || __builtin_expect (written == __UNKNOWN_10646_CHAR, 0)) \
+ { \
+ UNICODE_TAG_HANDLER (ch, 4); \
+ STANDARD_TO_LOOP_ERR_HANDLER (4); \
+ } \
if (__builtin_expect (written == 0, 0)) \
{ \
result = __GCONV_FULL_OUTPUT; \
break; \
} \
- if (__builtin_expect (written == __UNKNOWN_10646_CHAR, 0)) \
- { \
- UNICODE_TAG_HANDLER (ch, 4); \
- STANDARD_TO_LOOP_ERR_HANDLER (4); \
- } \
\
*outptr++ |= 0x80; \
*outptr++ |= 0x80; \
diff --git a/include/atomic.h b/include/atomic.h
index 2ad8b5fcb7b..d44728b215c 100644
--- a/include/atomic.h
+++ b/include/atomic.h
@@ -21,31 +21,6 @@
#ifndef _ATOMIC_H
#define _ATOMIC_H 1
-/* This header defines three types of macros:
-
- - atomic arithmetic and logic operation on memory. They all
- have the prefix "atomic_".
-
- - conditionally atomic operations of the same kinds. These
- always behave identical but can be faster when atomicity
- is not really needed since only one thread has access to
- the memory location. In that case the code is slower in
- the multi-thread case. The interfaces have the prefix
- "catomic_".
-
- - support functions like barriers. They also have the preifx
- "atomic_".
-
- Architectures must provide a few lowlevel macros (the compare
- and exchange definitions). All others are optional. They
- should only be provided if the architecture has specific
- support for the operation.
-
- As <atomic.h> macros are usually heavily nested and often use local
- variables to make sure side-effects are evaluated properly, use for
- macro local variables a per-macro unique prefix. This file uses
- __atgN_ prefix where N is different in each macro. */
-
#include <stdlib.h>
#include <bits/atomic.h>
@@ -55,33 +30,33 @@
and following args. */
#define __atomic_val_bysize(pre, post, mem, ...) \
({ \
- __typeof (*mem) __atg1_result; \
+ __typeof (*mem) __result; \
if (sizeof (*mem) == 1) \
- __atg1_result = pre##_8_##post (mem, __VA_ARGS__); \
+ __result = pre##_8_##post (mem, __VA_ARGS__); \
else if (sizeof (*mem) == 2) \
- __atg1_result = pre##_16_##post (mem, __VA_ARGS__); \
+ __result = pre##_16_##post (mem, __VA_ARGS__); \
else if (sizeof (*mem) == 4) \
- __atg1_result = pre##_32_##post (mem, __VA_ARGS__); \
+ __result = pre##_32_##post (mem, __VA_ARGS__); \
else if (sizeof (*mem) == 8) \
- __atg1_result = pre##_64_##post (mem, __VA_ARGS__); \
+ __result = pre##_64_##post (mem, __VA_ARGS__); \
else \
abort (); \
- __atg1_result; \
+ __result; \
})
#define __atomic_bool_bysize(pre, post, mem, ...) \
({ \
- int __atg2_result; \
+ int __result; \
if (sizeof (*mem) == 1) \
- __atg2_result = pre##_8_##post (mem, __VA_ARGS__); \
+ __result = pre##_8_##post (mem, __VA_ARGS__); \
else if (sizeof (*mem) == 2) \
- __atg2_result = pre##_16_##post (mem, __VA_ARGS__); \
+ __result = pre##_16_##post (mem, __VA_ARGS__); \
else if (sizeof (*mem) == 4) \
- __atg2_result = pre##_32_##post (mem, __VA_ARGS__); \
+ __result = pre##_32_##post (mem, __VA_ARGS__); \
else if (sizeof (*mem) == 8) \
- __atg2_result = pre##_64_##post (mem, __VA_ARGS__); \
+ __result = pre##_64_##post (mem, __VA_ARGS__); \
else \
abort (); \
- __atg2_result; \
+ __result; \
})
@@ -95,29 +70,12 @@
#endif
-#if !defined catomic_compare_and_exchange_val_acq \
- && defined __arch_c_compare_and_exchange_val_32_acq
-# define catomic_compare_and_exchange_val_acq(mem, newval, oldval) \
- __atomic_val_bysize (__arch_c_compare_and_exchange_val,acq, \
- mem, newval, oldval)
-#else
-# define catomic_compare_and_exchange_val_acq(mem, newval, oldval) \
- atomic_compare_and_exchange_val_acq (mem, newval, oldval)
-#endif
-
-
#ifndef atomic_compare_and_exchange_val_rel
# define atomic_compare_and_exchange_val_rel(mem, newval, oldval) \
atomic_compare_and_exchange_val_acq (mem, newval, oldval)
#endif
-#ifndef catomic_compare_and_exchange_val_rel
-# define catomic_compare_and_exchange_val_rel(mem, newval, oldval) \
- atomic_compare_and_exchange_val_acq (mem, newval, oldval)
-#endif
-
-
/* Atomically store NEWVAL in *MEM if *MEM is equal to OLDVAL.
Return zero if *MEM was changed or non-zero if no exchange happened. */
#ifndef atomic_compare_and_exchange_bool_acq
@@ -129,26 +87,8 @@
# define atomic_compare_and_exchange_bool_acq(mem, newval, oldval) \
({ /* Cannot use __oldval here, because macros later in this file might \
call this macro with __oldval argument. */ \
- __typeof (oldval) __atg3_old = (oldval); \
- atomic_compare_and_exchange_val_acq (mem, newval, __atg3_old) \
- != __atg3_old; \
- })
-# endif
-#endif
-
-
-#ifndef catomic_compare_and_exchange_bool_acq
-# ifdef __arch_c_compare_and_exchange_bool_32_acq
-# define catomic_compare_and_exchange_bool_acq(mem, newval, oldval) \
- __atomic_bool_bysize (__arch_c_compare_and_exchange_bool,acq, \
- mem, newval, oldval)
-# else
-# define catomic_compare_and_exchange_bool_acq(mem, newval, oldval) \
- ({ /* Cannot use __oldval here, because macros later in this file might \
- call this macro with __oldval argument. */ \
- __typeof (oldval) __atg4_old = (oldval); \
- catomic_compare_and_exchange_val_acq (mem, newval, __atg4_old) \
- != __atg4_old; \
+ __typeof (oldval) __old = (oldval); \
+ atomic_compare_and_exchange_val_acq (mem, newval, __old) != __old; \
})
# endif
#endif
@@ -160,26 +100,21 @@
#endif
-#ifndef catomic_compare_and_exchange_bool_rel
-# define catomic_compare_and_exchange_bool_rel(mem, newval, oldval) \
- catomic_compare_and_exchange_bool_acq (mem, newval, oldval)
-#endif
-
-
/* Store NEWVALUE in *MEM and return the old value. */
#ifndef atomic_exchange_acq
# define atomic_exchange_acq(mem, newvalue) \
- ({ __typeof (*(mem)) __atg5_oldval; \
- __typeof (mem) __atg5_memp = (mem); \
- __typeof (*(mem)) __atg5_value = (newvalue); \
+ ({ __typeof (*(mem)) __oldval; \
+ __typeof (mem) __memp = (mem); \
+ __typeof (*(mem)) __value = (newvalue); \
\
do \
- __atg5_oldval = *__atg5_memp; \
- while (__builtin_expect \
- (atomic_compare_and_exchange_bool_acq (__atg5_memp, __atg5_value, \
- __atg5_oldval), 0)); \
+ __oldval = *__memp; \
+ while (__builtin_expect (atomic_compare_and_exchange_bool_acq (__memp, \
+ __value, \
+ __oldval),\
+ 0)); \
\
- __atg5_oldval; })
+ __oldval; })
#endif
#ifndef atomic_exchange_rel
@@ -190,124 +125,72 @@
/* Add VALUE to *MEM and return the old value of *MEM. */
#ifndef atomic_exchange_and_add
# define atomic_exchange_and_add(mem, value) \
- ({ __typeof (*(mem)) __atg6_oldval; \
- __typeof (mem) __atg6_memp = (mem); \
- __typeof (*(mem)) __atg6_value = (value); \
+ ({ __typeof (*(mem)) __oldval; \
+ __typeof (mem) __memp = (mem); \
+ __typeof (*(mem)) __value = (value); \
\
do \
- __atg6_oldval = *__atg6_memp; \
- while (__builtin_expect \
- (atomic_compare_and_exchange_bool_acq (__atg6_memp, \
- __atg6_oldval \
- + __atg6_value, \
- __atg6_oldval), 0)); \
+ __oldval = *__memp; \
+ while (__builtin_expect (atomic_compare_and_exchange_bool_acq (__memp, \
+ __oldval \
+ + __value,\
+ __oldval),\
+ 0)); \
\
- __atg6_oldval; })
+ __oldval; })
#endif
-#ifndef catomic_exchange_and_add
-# define catomic_exchange_and_add(mem, value) \
- ({ __typeof (*(mem)) __atg7_oldv; \
- __typeof (mem) __atg7_memp = (mem); \
- __typeof (*(mem)) __atg7_value = (value); \
- \
- do \
- __atg7_oldv = *__atg7_memp; \
- while (__builtin_expect \
- (catomic_compare_and_exchange_bool_acq (__atg7_memp, \
- __atg7_oldv \
- + __atg7_value, \
- __atg7_oldv), 0)); \
- \
- __atg7_oldv; })
-#endif
-
#ifndef atomic_max
# define atomic_max(mem, value) \
do { \
- __typeof (*(mem)) __atg8_oldval; \
- __typeof (mem) __atg8_memp = (mem); \
- __typeof (*(mem)) __atg8_value = (value); \
- do { \
- __atg8_oldval = *__atg8_memp; \
- if (__atg8_oldval >= __atg8_value) \
- break; \
- } while (__builtin_expect \
- (atomic_compare_and_exchange_bool_acq (__atg8_memp, __atg8_value,\
- __atg8_oldval), 0)); \
- } while (0)
-#endif
-
-
-#ifndef catomic_max
-# define catomic_max(mem, value) \
- do { \
- __typeof (*(mem)) __atg9_oldv; \
- __typeof (mem) __atg9_memp = (mem); \
- __typeof (*(mem)) __atg9_value = (value); \
+ __typeof (*(mem)) __oldval; \
+ __typeof (mem) __memp = (mem); \
+ __typeof (*(mem)) __value = (value); \
do { \
- __atg9_oldv = *__atg9_memp; \
- if (__atg9_oldv >= __atg9_value) \
+ __oldval = *__memp; \
+ if (__oldval >= __value) \
break; \
- } while (__builtin_expect \
- (catomic_compare_and_exchange_bool_acq (__atg9_memp, \
- __atg9_value, \
- __atg9_oldv), 0)); \
+ } while (__builtin_expect (atomic_compare_and_exchange_bool_acq (__memp, \
+ __value, \
+ __oldval),\
+ 0)); \
} while (0)
#endif
-
#ifndef atomic_min
# define atomic_min(mem, value) \
do { \
- __typeof (*(mem)) __atg10_oldval; \
- __typeof (mem) __atg10_memp = (mem); \
- __typeof (*(mem)) __atg10_value = (value); \
+ __typeof (*(mem)) __oldval; \
+ __typeof (mem) __memp = (mem); \
+ __typeof (*(mem)) __value = (value); \
do { \
- __atg10_oldval = *__atg10_memp; \
- if (__atg10_oldval <= __atg10_value) \
+ __oldval = *__memp; \
+ if (__oldval <= __value) \
break; \
- } while (__builtin_expect \
- (atomic_compare_and_exchange_bool_acq (__atg10_memp, \
- __atg10_value, \
- __atg10_oldval), 0)); \
+ } while (__builtin_expect (atomic_compare_and_exchange_bool_acq (__memp, \
+ __value, \
+ __oldval),\
+ 0)); \
} while (0)
#endif
-
#ifndef atomic_add
# define atomic_add(mem, value) (void) atomic_exchange_and_add ((mem), (value))
#endif
-#ifndef catomic_add
-# define catomic_add(mem, value) \
- (void) catomic_exchange_and_add ((mem), (value))
-#endif
-
-
#ifndef atomic_increment
# define atomic_increment(mem) atomic_add ((mem), 1)
#endif
-#ifndef catomic_increment
-# define catomic_increment(mem) catomic_add ((mem), 1)
-#endif
-
-
#ifndef atomic_increment_val
# define atomic_increment_val(mem) (atomic_exchange_and_add ((mem), 1) + 1)
#endif
-#ifndef catomic_increment_val
-# define catomic_increment_val(mem) (catomic_exchange_and_add ((mem), 1) + 1)
-#endif
-
-
/* Add one to *MEM and return true iff it's now zero. */
#ifndef atomic_increment_and_test
# define atomic_increment_and_test(mem) \
@@ -320,21 +203,11 @@
#endif
-#ifndef catomic_decrement
-# define catomic_decrement(mem) catomic_add ((mem), -1)
-#endif
-
-
#ifndef atomic_decrement_val
# define atomic_decrement_val(mem) (atomic_exchange_and_add ((mem), -1) - 1)
#endif
-#ifndef catomic_decrement_val
-# define catomic_decrement_val(mem) (catomic_exchange_and_add ((mem), -1) - 1)
-#endif
-
-
/* Subtract 1 from *MEM and return true iff it's now zero. */
#ifndef atomic_decrement_and_test
# define atomic_decrement_and_test(mem) \
@@ -345,34 +218,35 @@
/* Decrement *MEM if it is > 0, and return the old value. */
#ifndef atomic_decrement_if_positive
# define atomic_decrement_if_positive(mem) \
- ({ __typeof (*(mem)) __atg11_oldval; \
- __typeof (mem) __atg11_memp = (mem); \
+ ({ __typeof (*(mem)) __oldval; \
+ __typeof (mem) __memp = (mem); \
\
do \
{ \
- __atg11_oldval = *__atg11_memp; \
- if (__builtin_expect (__atg11_oldval <= 0, 0)) \
+ __oldval = *__memp; \
+ if (__builtin_expect (__oldval <= 0, 0)) \
break; \
} \
- while (__builtin_expect \
- (atomic_compare_and_exchange_bool_acq (__atg11_memp, \
- __atg11_oldval - 1, \
- __atg11_oldval), 0)); \
- __atg11_oldval; })
+ while (__builtin_expect (atomic_compare_and_exchange_bool_acq (__memp, \
+ __oldval \
+ - 1, \
+ __oldval),\
+ 0));\
+ __oldval; })
#endif
#ifndef atomic_add_negative
# define atomic_add_negative(mem, value) \
- ({ __typeof (value) __atg12_value = (value); \
- atomic_exchange_and_add (mem, __atg12_value) < -__atg12_value; })
+ ({ __typeof (value) __aan_value = (value); \
+ atomic_exchange_and_add (mem, __aan_value) < -__aan_value; })
#endif
#ifndef atomic_add_zero
# define atomic_add_zero(mem, value) \
- ({ __typeof (value) __atg13_value = (value); \
- atomic_exchange_and_add (mem, __atg13_value) == -__atg13_value; })
+ ({ __typeof (value) __aaz_value = (value); \
+ atomic_exchange_and_add (mem, __aaz_value) == -__aaz_value; })
#endif
@@ -384,102 +258,55 @@
#ifndef atomic_bit_test_set
# define atomic_bit_test_set(mem, bit) \
- ({ __typeof (*(mem)) __atg14_old; \
- __typeof (mem) __atg14_memp = (mem); \
- __typeof (*(mem)) __atg14_mask = ((__typeof (*(mem))) 1 << (bit)); \
+ ({ __typeof (*(mem)) __oldval; \
+ __typeof (mem) __memp = (mem); \
+ __typeof (*(mem)) __mask = ((__typeof (*(mem))) 1 << (bit)); \
\
do \
- __atg14_old = (*__atg14_memp); \
- while (__builtin_expect \
- (atomic_compare_and_exchange_bool_acq (__atg14_memp, \
- __atg14_old | __atg14_mask,\
- __atg14_old), 0)); \
+ __oldval = (*__memp); \
+ while (__builtin_expect (atomic_compare_and_exchange_bool_acq (__memp, \
+ __oldval \
+ | __mask, \
+ __oldval),\
+ 0)); \
\
- __atg14_old & __atg14_mask; })
+ __oldval & __mask; })
#endif
-/* Atomically *mem &= mask. */
+/* Atomically *mem &= mask and return the old value of *mem. */
#ifndef atomic_and
# define atomic_and(mem, mask) \
- do { \
- __typeof (*(mem)) __atg15_old; \
- __typeof (mem) __atg15_memp = (mem); \
- __typeof (*(mem)) __atg15_mask = (mask); \
- \
- do \
- __atg15_old = (*__atg15_memp); \
- while (__builtin_expect \
- (atomic_compare_and_exchange_bool_acq (__atg15_memp, \
- __atg15_old & __atg15_mask, \
- __atg15_old), 0)); \
- } while (0)
-#endif
-
-/* Atomically *mem &= mask and return the old value of *mem. */
-#ifndef atomic_and_val
-# define atomic_and_val(mem, mask) \
- ({ __typeof (*(mem)) __atg16_old; \
- __typeof (mem) __atg16_memp = (mem); \
- __typeof (*(mem)) __atg16_mask = (mask); \
+ ({ __typeof (*(mem)) __oldval; \
+ __typeof (mem) __memp = (mem); \
+ __typeof (*(mem)) __mask = (mask); \
\
do \
- __atg16_old = (*__atg16_memp); \
- while (__builtin_expect \
- (atomic_compare_and_exchange_bool_acq (__atg16_memp, \
- __atg16_old & __atg16_mask,\
- __atg16_old), 0)); \
+ __oldval = (*__memp); \
+ while (__builtin_expect (atomic_compare_and_exchange_bool_acq (__memp, \
+ __oldval \
+ & __mask, \
+ __oldval),\
+ 0)); \
\
- __atg16_old; })
+ __oldval; })
#endif
/* Atomically *mem |= mask and return the old value of *mem. */
#ifndef atomic_or
# define atomic_or(mem, mask) \
- do { \
- __typeof (*(mem)) __atg17_old; \
- __typeof (mem) __atg17_memp = (mem); \
- __typeof (*(mem)) __atg17_mask = (mask); \
- \
- do \
- __atg17_old = (*__atg17_memp); \
- while (__builtin_expect \
- (atomic_compare_and_exchange_bool_acq (__atg17_memp, \
- __atg17_old | __atg17_mask, \
- __atg17_old), 0)); \
- } while (0)
-#endif
-
-#ifndef catomic_or
-# define catomic_or(mem, mask) \
- do { \
- __typeof (*(mem)) __atg18_old; \
- __typeof (mem) __atg18_memp = (mem); \
- __typeof (*(mem)) __atg18_mask = (mask); \
- \
- do \
- __atg18_old = (*__atg18_memp); \
- while (__builtin_expect \
- (catomic_compare_and_exchange_bool_acq (__atg18_memp, \
- __atg18_old | __atg18_mask,\
- __atg18_old), 0)); \
- } while (0)
-#endif
-
-/* Atomically *mem |= mask and return the old value of *mem. */
-#ifndef atomic_or_val
-# define atomic_or_val(mem, mask) \
- ({ __typeof (*(mem)) __atg19_old; \
- __typeof (mem) __atg19_memp = (mem); \
- __typeof (*(mem)) __atg19_mask = (mask); \
+ ({ __typeof (*(mem)) __oldval; \
+ __typeof (mem) __memp = (mem); \
+ __typeof (*(mem)) __mask = (mask); \
\
do \
- __atg19_old = (*__atg19_memp); \
- while (__builtin_expect \
- (atomic_compare_and_exchange_bool_acq (__atg19_memp, \
- __atg19_old | __atg19_mask,\
- __atg19_old), 0)); \
+ __oldval = (*__memp); \
+ while (__builtin_expect (atomic_compare_and_exchange_bool_acq (__memp, \
+ __oldval \
+ | __mask, \
+ __oldval),\
+ 0)); \
\
- __atg19_old; })
+ __oldval; })
#endif
#ifndef atomic_full_barrier
diff --git a/include/dlfcn.h b/include/dlfcn.h
index 79c8f7d31bb..9144dd2f3fb 100644
--- a/include/dlfcn.h
+++ b/include/dlfcn.h
@@ -47,9 +47,6 @@ libc_hidden_proto (_dl_addr)
/* Close an object previously opened by _dl_open. */
extern void _dl_close (void *map) attribute_hidden;
-/* Same as above, but without locking and safety checks for user
- provided map arguments. */
-extern void _dl_close_worker (struct link_map *map) attribute_hidden;
/* Look up NAME in shared object HANDLE (which may be RTLD_DEFAULT or
RTLD_NEXT). WHO is the calling function, for RTLD_NEXT. Returns
diff --git a/include/errno.h b/include/errno.h
index 80c7b6ec132..fe8bca44c5d 100644
--- a/include/errno.h
+++ b/include/errno.h
@@ -19,7 +19,7 @@ extern int rtld_errno attribute_hidden;
# else
-# include <tls.h>
+# include <tls.h> /* Defines USE_TLS. */
# if USE___THREAD
# undef errno
diff --git a/include/libc-symbols.h b/include/libc-symbols.h
index a2faeafb32a..da46f5e8040 100644
--- a/include/libc-symbols.h
+++ b/include/libc-symbols.h
@@ -114,13 +114,6 @@
# define _weak_alias(name, aliasname) \
extern __typeof (name) aliasname __attribute__ ((weak, alias (#name)));
-/* Same as WEAK_ALIAS, but mark symbol as hidden. */
-# define weak_hidden_alias(name, aliasname) \
- _weak_hidden_alias (name, aliasname)
-# define _weak_hidden_alias(name, aliasname) \
- extern __typeof (name) aliasname \
- __attribute__ ((weak, alias (#name), __visibility__ ("hidden")));
-
/* Declare SYMBOL as weak undefined symbol (resolved to 0 if not defined). */
# define weak_extern(symbol) _weak_extern (weak symbol)
# define _weak_extern(expr) _Pragma (#expr)
@@ -128,7 +121,6 @@
# else
# define weak_alias(name, aliasname) strong_alias(name, aliasname)
-# define weak_hidden_alias(name, aliasname) strong_alias(name, aliasname)
# define weak_extern(symbol) /* Nothing. */
# endif
@@ -294,42 +286,27 @@ requires at runtime the shared libraries from the glibc version used \
for linking")
#endif
-/* Declare SYMBOL to be TYPE (`function' or `object') of SIZE bytes
- alias to ORIGINAL, when the assembler supports such declarations
- (such as in ELF).
+/* Declare SYMBOL to be TYPE (`function' or `object') and of SIZE bytes,
+ when the assembler supports such declarations (such as in ELF).
This is only necessary when defining something in assembly, or playing
funny alias games where the size should be other than what the compiler
thinks it is. */
-#define declare_symbol_alias(symbol, original, type, size) \
- declare_symbol_alias_1 (symbol, original, type, size)
+#define declare_symbol(symbol, type, size) \
+ declare_symbol_1 (symbol, type, size)
#ifdef ASM_TYPE_DIRECTIVE_PREFIX
# ifdef __ASSEMBLER__
-# define declare_symbol_alias_1(symbol, original, type, size) \
- strong_alias (original, symbol); \
+# define declare_symbol_1(symbol, type, size) \
.type C_SYMBOL_NAME (symbol), \
- declare_symbol_alias_1_paste (ASM_TYPE_DIRECTIVE_PREFIX, type); \
- .size C_SYMBOL_NAME (symbol), size
-# define declare_symbol_alias_1_paste(a, b) \
- declare_symbol_alias_1_paste_1 (a,b)
-# define declare_symbol_alias_1_paste_1(a,b) a##b
+ declare_symbol_1_paste (ASM_TYPE_DIRECTIVE_PREFIX, type), size
+# define declare_symbol_1_paste(a, b) declare_symbol_1_paste_1 (a,b)
+# define declare_symbol_1_paste_1(a,b) a##b
# else /* Not __ASSEMBLER__. */
-# define declare_symbol_alias_1(symbol, original, type, size) \
- asm (declare_symbol_alias_1_stringify (ASM_GLOBAL_DIRECTIVE) \
- " " __SYMBOL_PREFIX #symbol \
- "\n\t" declare_symbol_alias_1_alias (symbol, original) \
- "\n\t.type " __SYMBOL_PREFIX #symbol ", " \
- declare_symbol_alias_1_stringify (ASM_TYPE_DIRECTIVE_PREFIX) #type \
+# define declare_symbol_1(symbol, type, size) \
+ asm (".type " __SYMBOL_PREFIX #symbol ", " \
+ declare_symbol_1_stringify (ASM_TYPE_DIRECTIVE_PREFIX) #type \
"\n\t.size " __SYMBOL_PREFIX #symbol ", " #size);
-# define declare_symbol_alias_1_stringify(x) \
- declare_symbol_alias_1_stringify_1 (x)
-# define declare_symbol_alias_1_stringify_1(x) #x
-# ifdef HAVE_ASM_SET_DIRECTIVE
-# define declare_symbol_alias_1_alias(symbol, original) \
- ".set " __SYMBOL_PREFIX #symbol ", " __SYMBOL_PREFIX #original
-# else
-# define declare_symbol_alias_1_alias(symbol, original) \
- __SYMBOL_PREFIX #symbol " = " __SYMBOL_PREFIX #original
-# endif /* HAVE_ASM_SET_DIRECTIVE */
+# define declare_symbol_1_stringify(x) declare_symbol_1_stringify_1 (x)
+# define declare_symbol_1_stringify_1(x) #x
# endif /* __ASSEMBLER__ */
#else
# define declare_symbol_1(symbol, type, size) /* Nothing. */
@@ -454,7 +431,8 @@ for linking")
strong_alias(real, name)
#endif
-#if defined SHARED || defined LIBC_NONSHARED
+#if defined HAVE_VISIBILITY_ATTRIBUTE \
+ && (defined SHARED || defined LIBC_NONSHARED)
# define attribute_hidden __attribute__ ((visibility ("hidden")))
#else
# define attribute_hidden
@@ -466,7 +444,11 @@ for linking")
# define attribute_tls_model_ie
#endif
-#define attribute_relro __attribute__ ((section (".data.rel.ro")))
+#ifdef HAVE_Z_RELRO
+# define attribute_relro __attribute__ ((section (".data.rel.ro")))
+#else
+# define attribute_relro
+#endif
/* Handling on non-exported internal names. We have to do this only
for shared code. */
@@ -475,9 +457,14 @@ for linking")
# define INTDEF(name) strong_alias (name, name##_internal)
# define INTVARDEF(name) \
_INTVARDEF (name, name##_internal)
-# define _INTVARDEF(name, aliasname) \
+# if defined HAVE_VISIBILITY_ATTRIBUTE
+# define _INTVARDEF(name, aliasname) \
extern __typeof (name) aliasname __attribute__ ((alias (#name), \
visibility ("hidden")));
+# else
+# define _INTVARDEF(name, aliasname) \
+ extern __typeof (name) aliasname __attribute__ ((alias (#name)));
+# endif
# define INTDEF2(name, newname) strong_alias (name, newname##_internal)
# define INTVARDEF2(name, newname) _INTVARDEF (name, newname##_internal)
#else
@@ -562,10 +549,16 @@ for linking")
versioned_symbol (libc, __real_foo, foo, GLIBC_2_1);
libc_hidden_ver (__real_foo, foo) */
-#if defined SHARED && defined DO_VERSIONING && !defined NO_HIDDEN
+#if defined SHARED && defined DO_VERSIONING \
+ && !defined HAVE_BROKEN_ALIAS_ATTRIBUTE && !defined NO_HIDDEN
# ifndef __ASSEMBLER__
-# define __hidden_proto_hiddenattr(attrs...) \
+# if !defined HAVE_VISIBILITY_ATTRIBUTE \
+ || defined HAVE_BROKEN_VISIBILITY_ATTRIBUTE
+# define __hidden_proto_hiddenattr(attrs...)
+# else
+# define __hidden_proto_hiddenattr(attrs...) \
__attribute__ ((visibility ("hidden"), ##attrs))
+# endif
# define hidden_proto(name, attrs...) \
__hidden_proto (name, __GI_##name, ##attrs)
# define __hidden_proto(name, internal, attrs...) \
diff --git a/include/link.h b/include/link.h
index b45deabf7f6..9311256aff1 100644
--- a/include/link.h
+++ b/include/link.h
@@ -1,6 +1,6 @@
/* Data structure for communication from the run-time dynamic linker for
loaded ELF shared objects.
- Copyright (C) 1995-2002,2003,2004,2005,2006 Free Software Foundation, Inc.
+ Copyright (C) 1995-2006, 2007 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -44,7 +44,6 @@ extern unsigned int la_objopen (struct link_map *__map, Lmid_t __lmid,
#include <dl-lookupcfg.h>
#include <tls.h>
#include <bits/libc-lock.h>
-#include <rtld-lowlevel.h>
/* Some internal data structures of the dynamic linker used in the
@@ -122,7 +121,7 @@ struct link_map
are indexed by DT_ADDRTAGIDX(tagvalue), see <elf.h>. */
ElfW(Dyn) *l_info[DT_NUM + DT_THISPROCNUM + DT_VERSIONTAGNUM
- + DT_EXTRANUM + DT_VALNUM + DT_ADDRNUM];
+ + DT_EXTRANUM + DT_VALNUM + DT_ADDRNUM];
const ElfW(Phdr) *l_phdr; /* Pointer to program header table in core. */
ElfW(Addr) l_entry; /* Entry point location. */
ElfW(Half) l_phnum; /* Number of program header entries. */
@@ -183,6 +182,9 @@ struct link_map
is interested in the PLT interception.*/
unsigned int l_removed:1; /* Nozero if the object cannot be used anymore
since it is removed. */
+ unsigned int l_contiguous:1; /* Nonzero if inter-segment holes are
+ mprotected or if no holes are present at
+ all. */
/* Array with version names. */
unsigned int l_nversions;
@@ -220,8 +222,6 @@ struct link_map
/* This is an array defining the lookup scope for this link map.
There are initially at most three different scope lists. */
struct r_scope_elem **l_scope;
- /* We need to protect using the SCOPEREC. */
- __rtld_mrlock_define (, l_scope_lock)
/* A similar array, this time only with the local scope. This is
used occasionally. */
@@ -261,6 +261,7 @@ struct link_map
const ElfW(Sym) *ret;
} l_lookup_cache;
+#ifdef USE_TLS
/* Thread-local storage related info. */
/* Start of the initialization image. */
@@ -273,13 +274,14 @@ struct link_map
size_t l_tls_align;
/* Offset of first byte module alignment. */
size_t l_tls_firstbyte_offset;
-#ifndef NO_TLS_OFFSET
-# define NO_TLS_OFFSET 0
-#endif
+# ifndef NO_TLS_OFFSET
+# define NO_TLS_OFFSET 0
+# endif
/* For objects present at startup time: offset in the static TLS block. */
ptrdiff_t l_tls_offset;
/* Index of the module in the dtv array. */
size_t l_tls_modid;
+#endif
/* Information used to change permission after the relocations are
done. */
diff --git a/include/rpcsvc/nislib.h b/include/rpcsvc/nislib.h
index 9c2be0e811a..635c513e4dc 100644
--- a/include/rpcsvc/nislib.h
+++ b/include/rpcsvc/nislib.h
@@ -42,4 +42,6 @@ libnsl_hidden_proto (__nis_default_group)
libnsl_hidden_proto (__nis_default_access)
libnsl_hidden_proto (nis_clone_object)
+extern const_nis_name __nis_domain_of (const_nis_name) __THROW;
+
#endif
diff --git a/include/shlib-compat.h b/include/shlib-compat.h
index 79246dff25c..1e6d1782d92 100644
--- a/include/shlib-compat.h
+++ b/include/shlib-compat.h
@@ -1,5 +1,5 @@
/* Macros for managing ABI-compatibility definitions using ELF symbol versions.
- Copyright (C) 2000, 2002, 2006 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -44,8 +44,6 @@
in the GLIBC_2.0 version and obsoleted in the GLIBC_2.2 version. */
# define SHLIB_COMPAT(lib, introduced, obsoleted) \
- _SHLIB_COMPAT (lib, introduced, obsoleted)
-# define _SHLIB_COMPAT(lib, introduced, obsoleted) \
((IS_IN_##lib - 0) \
&& (!(ABI_##lib##_##obsoleted - 0) \
|| ((ABI_##lib##_##introduced - 0) < (ABI_##lib##_##obsoleted - 0))))
@@ -64,17 +62,13 @@
shlib-versions if that is newer. */
# define versioned_symbol(lib, local, symbol, version) \
- versioned_symbol_1 (lib, local, symbol, version)
-# define versioned_symbol_1(lib, local, symbol, version) \
- versioned_symbol_2 (local, symbol, VERSION_##lib##_##version)
-# define versioned_symbol_2(local, symbol, name) \
+ versioned_symbol_1 (local, symbol, VERSION_##lib##_##version)
+# define versioned_symbol_1(local, symbol, name) \
default_symbol_version (local, symbol, name)
# define compat_symbol(lib, local, symbol, version) \
- compat_symbol_1 (lib, local, symbol, version)
-# define compat_symbol_1(lib, local, symbol, version) \
- compat_symbol_2 (local, symbol, VERSION_##lib##_##version)
-# define compat_symbol_2(local, symbol, name) \
+ compat_symbol_1 (local, symbol, VERSION_##lib##_##version)
+# define compat_symbol_1(local, symbol, name) \
symbol_version (local, symbol, name)
#else
diff --git a/include/stdio.h b/include/stdio.h
index b293b8f1c73..e040380d792 100644
--- a/include/stdio.h
+++ b/include/stdio.h
@@ -131,6 +131,7 @@ libc_hidden_proto (__vsnprintf_chk)
libc_hidden_proto (__vfprintf_chk)
# if !defined NOT_IN_libc && defined SHARED && defined DO_VERSIONING \
+ && defined HAVE_VISIBILITY_ATTRIBUTE && !defined HAVE_BROKEN_ALIAS_ATTRIBUTE\
&& !defined NO_HIDDEN
/* Special gcc builtins. */
extern size_t __builtin_fwrite (const void *, size_t, size_t, void *)
diff --git a/include/sys/cdefs.h b/include/sys/cdefs.h
index 8ba980477d3..cd0750b4524 100644
--- a/include/sys/cdefs.h
+++ b/include/sys/cdefs.h
@@ -2,6 +2,12 @@
#include <misc/sys/cdefs.h>
+/* The compiler will optimize based on the knowledge the parameter is
+ not NULL. This will omit tests. A robust implementation cannot allow
+ this so when compiling glibc itself we ignore this attribute. */
+#undef __nonnull
+#define __nonnull(params)
+
extern void __chk_fail (void) __attribute__ ((__noreturn__));
libc_hidden_proto (__chk_fail)
rtld_hidden_proto (__chk_fail)
diff --git a/include/sys/mman.h b/include/sys/mman.h
index 8c07a4e2c61..a4687b30f79 100644
--- a/include/sys/mman.h
+++ b/include/sys/mman.h
@@ -12,4 +12,7 @@ extern int __mprotect (void *__addr, size_t __len, int __prot);
/* This one is Linux specific. */
extern void *__mremap (void *__addr, size_t __old_len,
size_t __new_len, int __flags, ...);
+
+libc_hidden_proto (madvise);
+
#endif
diff --git a/include/tls.h b/include/tls.h
index 1642456a73e..ffd3e4e70c8 100644
--- a/include/tls.h
+++ b/include/tls.h
@@ -5,7 +5,8 @@
#include_next <tls.h>
-#if HAVE___THREAD && (!defined NOT_IN_libc || defined IS_IN_libpthread)
+#if USE_TLS && HAVE___THREAD \
+ && (!defined NOT_IN_libc || defined IS_IN_libpthread)
# define USE___THREAD 1
diff --git a/inet/Makefile b/inet/Makefile
index 075716fbebb..3f796e4487e 100644
--- a/inet/Makefile
+++ b/inet/Makefile
@@ -1,4 +1,4 @@
-# Copyright (C) 1991-2002, 2003, 2004, 2006 Free Software Foundation, Inc.
+# Copyright (C) 1991-2006, 2007 Free Software Foundation, Inc.
# This file is part of the GNU C Library.
# The GNU C Library is free software; you can redistribute it and/or
@@ -52,7 +52,7 @@ routines := htonl htons \
aux := check_pf ifreq
tests := htontest test_ifindex tst-ntoa tst-ether_aton tst-network \
- tst-gethnm test-ifaddrs bug-if1
+ tst-gethnm test-ifaddrs bug-if1 test-inet6_opt
include ../Rules
diff --git a/inet/inet6_opt.c b/inet/inet6_opt.c
index bddb85182b3..17d3fee2136 100644
--- a/inet/inet6_opt.c
+++ b/inet/inet6_opt.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 Free Software Foundation, Inc.
+/* Copyright (C) 2006, 2007 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2006.
@@ -51,7 +51,7 @@ add_padding (uint8_t *extbuf, int offset, int npad)
{
if (npad == 1)
extbuf[offset] = IP6OPT_PAD1;
- else
+ else if (npad > 0)
{
struct ip6_opt *pad_opt = (struct ip6_opt *) (extbuf + offset);
@@ -102,21 +102,17 @@ inet6_opt_append (void *extbuf, socklen_t extlen, int offset, uint8_t type,
int data_offset = offset + sizeof (struct ip6_opt);
int npad = (align - data_offset % align) & (align - 1);
- /* Now we can check whether the buffer is large enough. */
- if (data_offset + npad + len > extlen)
- return -1;
-
- if (npad != 0)
+ if (extbuf != NULL)
{
- if (extbuf != NULL)
- add_padding (extbuf, offset, npad);
+ /* Now we can check whether the buffer is large enough. */
+ if (data_offset + npad + len > extlen)
+ return -1;
+
+ add_padding (extbuf, offset, npad);
offset += npad;
- }
- /* Now prepare the option itself. */
- if (extbuf != NULL)
- {
+ /* Now prepare the option itself. */
struct ip6_opt *opt = (struct ip6_opt *) ((uint8_t *) extbuf + offset);
opt->ip6o_type = type;
@@ -124,6 +120,8 @@ inet6_opt_append (void *extbuf, socklen_t extlen, int offset, uint8_t type,
*databufp = opt + 1;
}
+ else
+ offset += npad;
return offset + sizeof (struct ip6_opt) + len;
}
@@ -145,12 +143,14 @@ inet6_opt_finish (void *extbuf, socklen_t extlen, int offset)
/* Required padding at the end. */
int npad = (8 - (offset & 7)) & 7;
- /* Make sure the buffer is large enough. */
- if (offset + npad > extlen)
- return -1;
-
if (extbuf != NULL)
- add_padding (extbuf, offset, npad);
+ {
+ /* Make sure the buffer is large enough. */
+ if (offset + npad > extlen)
+ return -1;
+
+ add_padding (extbuf, offset, npad);
+ }
return offset + npad;
}
diff --git a/inet/test-inet6_opt.c b/inet/test-inet6_opt.c
new file mode 100644
index 00000000000..4db9b593898
--- /dev/null
+++ b/inet/test-inet6_opt.c
@@ -0,0 +1,207 @@
+#include <netinet/in.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define OPT_X 42
+#define OPT_Y 43
+#define OPT_Z 44
+
+static void *
+encode_inet6_opt (socklen_t *elp)
+{
+ void *eb = NULL;
+ socklen_t el;
+ int cl;
+ void *db;
+ int offset;
+ uint8_t val1;
+ uint16_t val2;
+ uint32_t val4;
+ uint64_t val8;
+
+ *elp = 0;
+#define CHECK() \
+ if (cl == -1) \
+ { \
+ printf ("cl == -1 on line %d\n", __LINE__); \
+ free (eb); \
+ return NULL; \
+ }
+
+ /* Estimate the length */
+ cl = inet6_opt_init (NULL, 0);
+ CHECK ();
+ cl = inet6_opt_append (NULL, 0, cl, OPT_X, 12, 8, NULL);
+ CHECK ();
+ cl = inet6_opt_append (NULL, 0, cl, OPT_Y, 7, 4, NULL);
+ CHECK ();
+ cl = inet6_opt_append (NULL, 0, cl, OPT_Z, 7, 1, NULL);
+ CHECK ();
+ cl = inet6_opt_finish (NULL, 0, cl);
+ CHECK ();
+ el = cl;
+
+ eb = malloc (el + 8);
+ if (eb == NULL)
+ {
+ puts ("malloc failed");
+ return NULL;
+ }
+ /* Canary. */
+ memcpy (eb + el, "deadbeef", 8);
+
+ cl = inet6_opt_init (eb, el);
+ CHECK ();
+
+ cl = inet6_opt_append (eb, el, cl, OPT_X, 12, 8, &db);
+ CHECK ();
+ val4 = 0x12345678;
+ offset = inet6_opt_set_val (db, 0, &val4, sizeof (val4));
+ val8 = 0x0102030405060708LL;
+ inet6_opt_set_val (db, offset, &val8, sizeof (val8));
+
+ cl = inet6_opt_append (eb, el, cl, OPT_Y, 7, 4, &db);
+ CHECK ();
+ val1 = 0x01;
+ offset = inet6_opt_set_val (db, 0, &val1, sizeof (val1));
+ val2 = 0x1331;
+ offset = inet6_opt_set_val (db, offset, &val2, sizeof (val2));
+ val4 = 0x01020304;
+ inet6_opt_set_val (db, offset, &val4, sizeof (val4));
+
+ cl = inet6_opt_append (eb, el, cl, OPT_Z, 7, 1, &db);
+ CHECK ();
+ inet6_opt_set_val (db, 0, (void *) "abcdefg", 7);
+
+ cl = inet6_opt_finish (eb, el, cl);
+ CHECK ();
+
+ if (memcmp (eb + el, "deadbeef", 8) != 0)
+ {
+ puts ("Canary corrupted");
+ free (eb);
+ return NULL;
+ }
+ *elp = el;
+ return eb;
+}
+
+int
+decode_inet6_opt (void *eb, socklen_t el)
+{
+ int ret = 0;
+ int seq = 0;
+ int cl = 0;
+ int offset;
+ uint8_t type;
+ socklen_t len;
+ uint8_t val1;
+ uint16_t val2;
+ uint32_t val4;
+ uint64_t val8;
+ void *db;
+ char buf[8];
+
+ while ((cl = inet6_opt_next (eb, el, cl, &type, &len, &db)) != -1)
+ switch (type)
+ {
+ case OPT_X:
+ if (seq++ != 0)
+ {
+ puts ("OPT_X is not first");
+ ret = 1;
+ }
+ if (len != 12)
+ {
+ printf ("OPT_X's length %d != 12\n", len);
+ ret = 1;
+ }
+ offset = inet6_opt_get_val (db, 0, &val4, sizeof (val4));
+ if (val4 != 0x12345678)
+ {
+ printf ("OPT_X's val4 %x != 0x12345678\n", val4);
+ ret = 1;
+ }
+ offset = inet6_opt_get_val (db, offset, &val8, sizeof (val8));
+ if (offset != len || val8 != 0x0102030405060708LL)
+ {
+ printf ("OPT_X's val8 %llx != 0x0102030405060708\n",
+ (long long) val8);
+ ret = 1;
+ }
+ break;
+ case OPT_Y:
+ if (seq++ != 1)
+ {
+ puts ("OPT_Y is not second");
+ ret = 1;
+ }
+ if (len != 7)
+ {
+ printf ("OPT_Y's length %d != 7\n", len);
+ ret = 1;
+ }
+ offset = inet6_opt_get_val (db, 0, &val1, sizeof (val1));
+ if (val1 != 0x01)
+ {
+ printf ("OPT_Y's val1 %x != 0x01\n", val1);
+ ret = 1;
+ }
+ offset = inet6_opt_get_val (db, offset, &val2, sizeof (val2));
+ if (val2 != 0x1331)
+ {
+ printf ("OPT_Y's val2 %x != 0x1331\n", val2);
+ ret = 1;
+ }
+ offset = inet6_opt_get_val (db, offset, &val4, sizeof (val4));
+ if (offset != len || val4 != 0x01020304)
+ {
+ printf ("OPT_Y's val4 %x != 0x01020304\n", val4);
+ ret = 1;
+ }
+ break;
+ case OPT_Z:
+ if (seq++ != 2)
+ {
+ puts ("OPT_Z is not third");
+ ret = 1;
+ }
+ if (len != 7)
+ {
+ printf ("OPT_Z's length %d != 7\n", len);
+ ret = 1;
+ }
+ offset = inet6_opt_get_val (db, 0, buf, 7);
+ if (offset != len || memcmp (buf, "abcdefg", 7) != 0)
+ {
+ buf[7] = '\0';
+ printf ("OPT_Z's buf \"%s\" != \"abcdefg\"\n", buf);
+ ret = 1;
+ }
+ break;
+ default:
+ printf ("Unknown option %d\n", type);
+ ret = 1;
+ break;
+ }
+ if (seq != 3)
+ {
+ puts ("Didn't see all of OPT_X, OPT_Y and OPT_Z");
+ ret = 1;
+ }
+ return ret;
+}
+
+int
+main (void)
+{
+ void *eb;
+ socklen_t el;
+ eb = encode_inet6_opt (&el);
+ if (eb == NULL)
+ return 1;
+ if (decode_inet6_opt (eb, el))
+ return 1;
+ return 0;
+}
diff --git a/io/Makefile b/io/Makefile
index 18287b201ac..66235517694 100644
--- a/io/Makefile
+++ b/io/Makefile
@@ -1,4 +1,4 @@
-# Copyright (C) 1992-2002,2003,2005,2006 Free Software Foundation, Inc.
+# Copyright (C) 1992-2002,2003,2005,2006, 2007 Free Software Foundation, Inc.
# This file is part of the GNU C Library.
# The GNU C Library is free software; you can redistribute it and/or
@@ -66,7 +66,7 @@ tests := test-utime test-stat test-stat2 test-lfs tst-getcwd \
tst-openat tst-unlinkat tst-fstatat tst-futimesat \
tst-renameat tst-fchownat tst-fchmodat tst-faccessat \
tst-symlinkat tst-linkat tst-readlinkat tst-mkdirat \
- tst-mknodat tst-mkfifoat tst-ttyname_r
+ tst-mknodat tst-mkfifoat tst-ttyname_r bug-ftw5
distribute := ftwtest-sh
@@ -90,6 +90,19 @@ CFLAGS-posix_fallocate64.c = -fexceptions
CFLAGS-test-stat.c = -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE
CFLAGS-test-lfs.c = -D_LARGEFILE64_SOURCE
+ifeq (yes,$(have-protected))
+CFLAGS-stat.c = -DHAVE_DOT_HIDDEN
+CFLAGS-fstat.c = -DHAVE_DOT_HIDDEN
+CFLAGS-lstat.c = -DHAVE_DOT_HIDDEN
+CFLAGS-mknod.c = -DHAVE_DOT_HIDDEN
+CFLAGS-stat64.c = -DHAVE_DOT_HIDDEN
+CFLAGS-fstat64.c = -DHAVE_DOT_HIDDEN
+CFLAGS-lstat64.c = -DHAVE_DOT_HIDDEN
+CFLAGS-fstatat.c = -DHAVE_DOT_HIDDEN
+CFLAGS-fstatat64.c = -DHAVE_DOT_HIDDEN
+CFLAGS-mknodat.c = -DHAVE_DOT_HIDDEN
+endif
+
test-stat2-ARGS = Makefile . $(objpfx)test-stat2
tst-statvfs-ARGS = $(objpfx)tst-statvfs tst-statvfs.c /tmp
diff --git a/io/bug-ftw5.c b/io/bug-ftw5.c
new file mode 100644
index 00000000000..c1cd81d30ee
--- /dev/null
+++ b/io/bug-ftw5.c
@@ -0,0 +1,25 @@
+#include <errno.h>
+#include <ftw.h>
+#include <stdio.h>
+
+static int
+fn (const char *file, const struct stat *sb, int flag, struct FTW *s)
+{
+ puts (file);
+ return FTW_STOP;
+}
+
+static int
+do_test (void)
+{
+ if (nftw ("/", fn, 0, FTW_CHDIR | FTW_ACTIONRETVAL) < 0)
+ {
+ printf ("nftw / FTW_CHDIR: %m\n");
+ return 1;
+ }
+
+ return 0;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
diff --git a/io/fstat.c b/io/fstat.c
index e2f9abd384b..0f95c1a6e23 100644
--- a/io/fstat.c
+++ b/io/fstat.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996, 1997, 1998, 2001, 2006 Free Software Foundation, Inc.
+/* Copyright (C) 1996, 1997, 1998, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -47,10 +47,16 @@
#undef fstat
#undef __fstat
int
-attribute_hidden
__fstat (int fd, struct stat *buf)
{
return __fxstat (_STAT_VER, fd, buf);
}
-weak_hidden_alias (__fstat, fstat)
+weak_alias (__fstat, fstat)
+
+/* Hide the symbol so that no definition but the one locally in the
+ executable or DSO is used. */
+#ifdef HAVE_DOT_HIDDEN
+asm (".hidden\tfstat");
+asm (".hidden\t__fstat");
+#endif
diff --git a/io/fstat64.c b/io/fstat64.c
index fe655444b2c..79bd967d8fc 100644
--- a/io/fstat64.c
+++ b/io/fstat64.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996, 1997, 2001, 2006 Free Software Foundation, Inc.
+/* Copyright (C) 1996, 1997, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -46,8 +46,13 @@
#undef fstat64
int
-attribute_hidden
fstat64 (int fd, struct stat64 *buf)
{
return __fxstat64 (_STAT_VER, fd, buf);
}
+
+/* Hide the symbol so that no definition but the one locally in the
+ executable or DSO is used. */
+#ifdef HAVE_DOT_HIDDEN
+asm (".hidden\tfstat64");
+#endif
diff --git a/io/fstatat.c b/io/fstatat.c
index abf083c72e1..1ac80597a0e 100644
--- a/io/fstatat.c
+++ b/io/fstatat.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 2005, 2006 Free Software Foundation, Inc.
+/* Copyright (C) 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -46,8 +46,13 @@
#undef fstatat
int
-attribute_hidden
fstatat (int fd, const char *file, struct stat *buf, int flag)
{
return __fxstatat (_STAT_VER, fd, file, buf, flag);
}
+
+/* Hide the symbol so that no definition but the one locally in the
+ executable or DSO is used. */
+#ifdef HAVE_DOT_HIDDEN
+asm (".hidden\tfstatat");
+#endif
diff --git a/io/fstatat64.c b/io/fstatat64.c
index 6fdf709af51..a14b42d42e4 100644
--- a/io/fstatat64.c
+++ b/io/fstatat64.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 2005, 2006 Free Software Foundation, Inc.
+/* Copyright (C) 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -46,8 +46,13 @@
#undef fstatat64
int
-attribute_hidden
fstatat64 (int fd, const char *file, struct stat64 *buf, int flag)
{
return __fxstatat64 (_STAT_VER, fd, file, buf, flag);
}
+
+/* Hide the symbol so that no definition but the one locally in the
+ executable or DSO is used. */
+#ifdef HAVE_DOT_HIDDEN
+asm (".hidden\tfstatat64");
+#endif
diff --git a/io/ftw.c b/io/ftw.c
index 413871744ea..5495bc7ecc4 100644
--- a/io/ftw.c
+++ b/io/ftw.c
@@ -1,5 +1,5 @@
/* File tree walker functions.
- Copyright (C) 1996-2003, 2004, 2006 Free Software Foundation, Inc.
+ Copyright (C) 1996-2003, 2004, 2006, 2007 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
@@ -348,8 +348,17 @@ open_dir_stream (int *dfdp, struct ftw_data *data, struct dir_data *dirp)
}
else
{
- const char *name = ((data->flags & FTW_CHDIR)
- ? data->dirbuf + data->ftw.base: data->dirbuf);
+ const char *name;
+
+ if (data->flags & FTW_CHDIR)
+ {
+ name = data->dirbuf + data->ftw.base;
+ if (name[0] == '\0')
+ name = ".";
+ }
+ else
+ name = data->dirbuf;
+
dirp->stream = __opendir (name);
}
@@ -721,9 +730,16 @@ ftw_startup (const char *dir, int is_nftw, void *func, int descriptors,
/* Get stat info for start directory. */
if (result == 0)
{
- const char *name = ((data.flags & FTW_CHDIR)
- ? data.dirbuf + data.ftw.base
- : data.dirbuf);
+ const char *name;
+
+ if (data.flags & FTW_CHDIR)
+ {
+ name = data.dirbuf + data.ftw.base;
+ if (name[0] == '\0')
+ name = ".";
+ }
+ else
+ name = data.dirbuf;
if (((flags & FTW_PHYS)
? LXSTAT (_STAT_VER, name, &st)
diff --git a/io/lstat.c b/io/lstat.c
index 620e47877aa..c4d7abe2c28 100644
--- a/io/lstat.c
+++ b/io/lstat.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996, 1997, 2001, 2006 Free Software Foundation, Inc.
+/* Copyright (C) 1996, 1997, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -47,10 +47,16 @@
#undef lstat
#undef __lstat
int
-attribute_hidden
__lstat (const char *file, struct stat *buf)
{
return __lxstat (_STAT_VER, file, buf);
}
-weak_hidden_alias (__lstat, lstat)
+weak_alias (__lstat, lstat)
+
+/* Hide the symbol so that no definition but the one locally in the
+ executable or DSO is used. */
+#ifdef HAVE_DOT_HIDDEN
+asm (".hidden\tlstat");
+asm (".hidden\t__lstat");
+#endif
diff --git a/io/lstat64.c b/io/lstat64.c
index 3e4ba2d9727..8a994e4867c 100644
--- a/io/lstat64.c
+++ b/io/lstat64.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996, 1997, 2001, 2006 Free Software Foundation, Inc.
+/* Copyright (C) 1996, 1997, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -46,8 +46,13 @@
#undef lstat64
int
-attribute_hidden
lstat64 (const char *file, struct stat64 *buf)
{
return __lxstat64 (_STAT_VER, file, buf);
}
+
+/* Hide the symbol so that no definition but the one locally in the
+ executable or DSO is used. */
+#ifdef HAVE_DOT_HIDDEN
+asm (".hidden\tlstat64");
+#endif
diff --git a/io/mknod.c b/io/mknod.c
index cc5fd26105a..7d43593a256 100644
--- a/io/mknod.c
+++ b/io/mknod.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1995, 1996, 2001, 2006 Free Software Foundation, Inc.
+/* Copyright (C) 1995, 1996, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -47,10 +47,16 @@
all callers. */
int
-attribute_hidden
__mknod (const char *path, mode_t mode, dev_t dev)
{
return __xmknod (_MKNOD_VER, path, mode, &dev);
}
-weak_hidden_alias (__mknod, mknod)
+weak_alias (__mknod, mknod)
+
+/* Hide the symbol so that no definition but the one locally in the
+ executable or DSO is used. */
+#ifdef HAVE_DOT_HIDDEN
+asm (".hidden\tmknod");
+asm (".hidden\t__mknod");
+#endif
diff --git a/io/mknodat.c b/io/mknodat.c
index b02ba695f96..ac515b5b483 100644
--- a/io/mknodat.c
+++ b/io/mknodat.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1995, 1996, 2001, 2005, 2006 Free Software Foundation, Inc.
+/* Copyright (C) 1995, 1996, 2001, 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -47,8 +47,14 @@
all callers. */
int
-attribute_hidden
mknodat (int fd, const char *path, mode_t mode, dev_t dev)
{
return __xmknodat (_MKNOD_VER, fd, path, mode, &dev);
}
+
+
+/* Hide the symbol so that no definition but the one locally in the
+ executable or DSO is used. */
+#ifdef HAVE_DOT_HIDDEN
+asm (".hidden\tmknodat");
+#endif
diff --git a/io/stat.c b/io/stat.c
index 6f1c28fc567..6af604957e1 100644
--- a/io/stat.c
+++ b/io/stat.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996, 1997, 2001, 2006 Free Software Foundation, Inc.
+/* Copyright (C) 1996, 1997, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -46,10 +46,16 @@
#undef stat
int
-attribute_hidden
__stat (const char *file, struct stat *buf)
{
return __xstat (_STAT_VER, file, buf);
}
-weak_hidden_alias (__stat, stat)
+weak_alias (__stat, stat)
+
+/* Hide the symbol so that no definition but the one locally in the
+ executable or DSO is used. */
+#ifdef HAVE_DOT_HIDDEN
+asm (".hidden\tstat");
+asm (".hidden\t__stat");
+#endif
diff --git a/io/stat64.c b/io/stat64.c
index 14e036a700c..cadf1e1f1da 100644
--- a/io/stat64.c
+++ b/io/stat64.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996, 1997, 2001, 2006 Free Software Foundation, Inc.
+/* Copyright (C) 1996, 1997, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -46,8 +46,13 @@
#undef stat64
int
-attribute_hidden
stat64 (const char *file, struct stat64 *buf)
{
return __xstat64 (_STAT_VER, file, buf);
}
+
+/* Hide the symbol so that no definition but the one locally in the
+ executable or DSO is used. */
+#ifdef HAVE_DOT_HIDDEN
+asm (".hidden\tstat64");
+#endif
diff --git a/libio/Banner b/libio/Banner
new file mode 100644
index 00000000000..8ec31419276
--- /dev/null
+++ b/libio/Banner
@@ -0,0 +1 @@
+GNU libio by Per Bothner
diff --git a/libio/bits/stdio.h b/libio/bits/stdio.h
index 9e951ad8e4a..2d44fad1f5a 100644
--- a/libio/bits/stdio.h
+++ b/libio/bits/stdio.h
@@ -1,5 +1,5 @@
/* Optimizing macros and inline functions for stdio functions.
- Copyright (C) 1998, 2000, 2001, 2004 Free Software Foundation, Inc.
+ Copyright (C) 1998, 2000, 2001, 2004, 2007 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -44,6 +44,16 @@ getchar (void)
}
+# ifdef __USE_MISC
+/* Faster version when locking is not necessary. */
+__STDIO_INLINE int
+fgetc_unlocked (FILE *__fp)
+{
+ return _IO_getc_unlocked (__fp);
+}
+# endif /* misc */
+
+
# if defined __USE_POSIX || defined __USE_MISC
/* This is defined in POSIX.1:1996. */
__STDIO_INLINE int
diff --git a/libio/fileops.c b/libio/fileops.c
index dbd7a7a8f2e..886b3729c3a 100644
--- a/libio/fileops.c
+++ b/libio/fileops.c
@@ -1,4 +1,5 @@
-/* Copyright (C) 1993, 1995, 1997-2005, 2006 Free Software Foundation, Inc.
+/* Copyright (C) 1993, 1995, 1997-2005, 2006, 2007
+ Free Software Foundation, Inc.
This file is part of the GNU C Library.
Written by Per Bothner <bothner@cygnus.com>.
@@ -472,7 +473,7 @@ _IO_file_setbuf_mmap (fp, p, len)
return result;
}
-static _IO_size_t new_do_write (_IO_FILE *, const char *, _IO_size_t) __THROW;
+static _IO_size_t new_do_write (_IO_FILE *, const char *, _IO_size_t);
/* Write TO_DO bytes from DATA to FP.
Then mark FP as having empty buffers. */
@@ -1468,8 +1469,7 @@ _IO_file_xsgetn (fp, data, n)
}
INTDEF(_IO_file_xsgetn)
-static _IO_size_t _IO_file_xsgetn_mmap (_IO_FILE *, void *, _IO_size_t)
- __THROW;
+static _IO_size_t _IO_file_xsgetn_mmap (_IO_FILE *, void *, _IO_size_t);
static _IO_size_t
_IO_file_xsgetn_mmap (fp, data, n)
_IO_FILE *fp;
@@ -1528,8 +1528,7 @@ _IO_file_xsgetn_mmap (fp, data, n)
return s - (char *) data;
}
-static _IO_size_t _IO_file_xsgetn_maybe_mmap (_IO_FILE *, void *, _IO_size_t)
- __THROW;
+static _IO_size_t _IO_file_xsgetn_maybe_mmap (_IO_FILE *, void *, _IO_size_t);
static _IO_size_t
_IO_file_xsgetn_maybe_mmap (fp, data, n)
_IO_FILE *fp;
diff --git a/libio/libio.h b/libio/libio.h
index 428e0355404..9df08614eec 100644
--- a/libio/libio.h
+++ b/libio/libio.h
@@ -410,12 +410,12 @@ extern void _IO_cookie_init (struct _IO_cookie_file *__cfile, int __read_write,
extern "C" {
#endif
-extern int __underflow (_IO_FILE *) __THROW;
-extern int __uflow (_IO_FILE *) __THROW;
-extern int __overflow (_IO_FILE *, int) __THROW;
-extern _IO_wint_t __wunderflow (_IO_FILE *) __THROW;
-extern _IO_wint_t __wuflow (_IO_FILE *) __THROW;
-extern _IO_wint_t __woverflow (_IO_FILE *, _IO_wint_t) __THROW;
+extern int __underflow (_IO_FILE *);
+extern int __uflow (_IO_FILE *);
+extern int __overflow (_IO_FILE *, int);
+extern _IO_wint_t __wunderflow (_IO_FILE *);
+extern _IO_wint_t __wuflow (_IO_FILE *);
+extern _IO_wint_t __woverflow (_IO_FILE *, _IO_wint_t);
#if __GNUC__ >= 3
# define _IO_BE(expr, res) __builtin_expect ((expr), res)
@@ -448,12 +448,12 @@ extern _IO_wint_t __woverflow (_IO_FILE *, _IO_wint_t) __THROW;
#define _IO_feof_unlocked(__fp) (((__fp)->_flags & _IO_EOF_SEEN) != 0)
#define _IO_ferror_unlocked(__fp) (((__fp)->_flags & _IO_ERR_SEEN) != 0)
-extern int _IO_getc (_IO_FILE *__fp) __THROW;
-extern int _IO_putc (int __c, _IO_FILE *__fp) __THROW;
+extern int _IO_getc (_IO_FILE *__fp);
+extern int _IO_putc (int __c, _IO_FILE *__fp);
extern int _IO_feof (_IO_FILE *__fp) __THROW;
extern int _IO_ferror (_IO_FILE *__fp) __THROW;
-extern int _IO_peekc_locked (_IO_FILE *__fp) __THROW;
+extern int _IO_peekc_locked (_IO_FILE *__fp);
/* This one is for Emacs. */
#define _IO_PENDING_OUTPUT_COUNT(_fp) \
@@ -482,17 +482,17 @@ extern int _IO_vfscanf (_IO_FILE * __restrict, const char * __restrict,
_IO_va_list, int *__restrict);
extern int _IO_vfprintf (_IO_FILE *__restrict, const char *__restrict,
_IO_va_list);
-extern _IO_ssize_t _IO_padn (_IO_FILE *, int, _IO_ssize_t) __THROW;
-extern _IO_size_t _IO_sgetn (_IO_FILE *, void *, _IO_size_t) __THROW;
+extern _IO_ssize_t _IO_padn (_IO_FILE *, int, _IO_ssize_t);
+extern _IO_size_t _IO_sgetn (_IO_FILE *, void *, _IO_size_t);
-extern _IO_off64_t _IO_seekoff (_IO_FILE *, _IO_off64_t, int, int) __THROW;
-extern _IO_off64_t _IO_seekpos (_IO_FILE *, _IO_off64_t, int) __THROW;
+extern _IO_off64_t _IO_seekoff (_IO_FILE *, _IO_off64_t, int, int);
+extern _IO_off64_t _IO_seekpos (_IO_FILE *, _IO_off64_t, int);
extern void _IO_free_backup_area (_IO_FILE *) __THROW;
#if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T
-extern _IO_wint_t _IO_getwc (_IO_FILE *__fp) __THROW;
-extern _IO_wint_t _IO_putwc (wchar_t __wc, _IO_FILE *__fp) __THROW;
+extern _IO_wint_t _IO_getwc (_IO_FILE *__fp);
+extern _IO_wint_t _IO_putwc (wchar_t __wc, _IO_FILE *__fp);
extern int _IO_fwide (_IO_FILE *__fp, int __mode) __THROW;
# if __GNUC__ >= 2
/* While compiling glibc we have to handle compatibility with very old
@@ -531,7 +531,7 @@ extern int _IO_vfwscanf (_IO_FILE * __restrict, const wchar_t * __restrict,
_IO_va_list, int *__restrict);
extern int _IO_vfwprintf (_IO_FILE *__restrict, const wchar_t *__restrict,
_IO_va_list);
-extern _IO_ssize_t _IO_wpadn (_IO_FILE *, wint_t, _IO_ssize_t) __THROW;
+extern _IO_ssize_t _IO_wpadn (_IO_FILE *, wint_t, _IO_ssize_t);
extern void _IO_free_wbackup_area (_IO_FILE *) __THROW;
#endif
diff --git a/libio/libioP.h b/libio/libioP.h
index a2cd4c2202d..a574b40f777 100644
--- a/libio/libioP.h
+++ b/libio/libioP.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 1993, 1997-2003,2004,2005,2006
+/* Copyright (C) 1993, 1997-2003,2004,2005,2006,2007
Free Software Foundation, Inc.
This file is part of the GNU C Library.
@@ -380,7 +380,7 @@ typedef struct _IO_FILE *_IO_ITER;
extern void _IO_switch_to_main_get_area (_IO_FILE *) __THROW;
extern void _IO_switch_to_backup_area (_IO_FILE *) __THROW;
-extern int _IO_switch_to_get_mode (_IO_FILE *) __THROW;
+extern int _IO_switch_to_get_mode (_IO_FILE *);
extern void _IO_init (_IO_FILE *, int) __THROW;
extern int _IO_sputbackc (_IO_FILE *, int) __THROW;
extern int _IO_sungetc (_IO_FILE *) __THROW;
@@ -394,7 +394,7 @@ extern unsigned _IO_adjust_column (unsigned, const char *, int) __THROW;
extern void _IO_switch_to_main_wget_area (_IO_FILE *) __THROW;
extern void _IO_switch_to_wbackup_area (_IO_FILE *) __THROW;
-extern int _IO_switch_to_wget_mode (_IO_FILE *) __THROW;
+extern int _IO_switch_to_wget_mode (_IO_FILE *);
extern void _IO_wsetb (_IO_FILE *, wchar_t *, wchar_t *, int) __THROW;
extern wint_t _IO_sputbackwc (_IO_FILE *, wint_t) __THROW;
extern wint_t _IO_sungetwc (_IO_FILE *) __THROW;
@@ -404,8 +404,8 @@ extern unsigned _IO_adjust_wcolumn (unsigned, const wchar_t *, int) __THROW;
/* Marker-related function. */
-extern void _IO_init_marker (struct _IO_marker *, _IO_FILE *) __THROW;
-extern void _IO_init_wmarker (struct _IO_marker *, _IO_FILE *) __THROW;
+extern void _IO_init_marker (struct _IO_marker *, _IO_FILE *);
+extern void _IO_init_wmarker (struct _IO_marker *, _IO_FILE *);
extern void _IO_remove_marker (struct _IO_marker *) __THROW;
extern int _IO_marker_difference (struct _IO_marker *, struct _IO_marker *)
__THROW;
@@ -434,22 +434,22 @@ libc_hidden_proto (_IO_list_resetlock)
/* Default jumptable functions. */
extern int _IO_default_underflow (_IO_FILE *) __THROW;
-extern int _IO_default_uflow (_IO_FILE *) __THROW;
-extern wint_t _IO_wdefault_uflow (_IO_FILE *) __THROW;
+extern int _IO_default_uflow (_IO_FILE *);
+extern wint_t _IO_wdefault_uflow (_IO_FILE *);
extern int _IO_default_doallocate (_IO_FILE *) __THROW;
extern int _IO_wdefault_doallocate (_IO_FILE *) __THROW;
extern void _IO_default_finish (_IO_FILE *, int) __THROW;
extern void _IO_wdefault_finish (_IO_FILE *, int) __THROW;
extern int _IO_default_pbackfail (_IO_FILE *, int) __THROW;
extern wint_t _IO_wdefault_pbackfail (_IO_FILE *, wint_t) __THROW;
-extern _IO_FILE* _IO_default_setbuf (_IO_FILE *, char *, _IO_ssize_t) __THROW;
+extern _IO_FILE* _IO_default_setbuf (_IO_FILE *, char *, _IO_ssize_t);
extern _IO_size_t _IO_default_xsputn (_IO_FILE *, const void *, _IO_size_t);
extern _IO_size_t _IO_wdefault_xsputn (_IO_FILE *, const void *, _IO_size_t);
extern _IO_size_t _IO_default_xsgetn (_IO_FILE *, void *, _IO_size_t);
extern _IO_size_t _IO_wdefault_xsgetn (_IO_FILE *, void *, _IO_size_t);
extern _IO_off64_t _IO_default_seekoff (_IO_FILE *, _IO_off64_t, int, int)
__THROW;
-extern _IO_off64_t _IO_default_seekpos (_IO_FILE *, _IO_off64_t, int) __THROW;
+extern _IO_off64_t _IO_default_seekpos (_IO_FILE *, _IO_off64_t, int);
extern _IO_ssize_t _IO_default_write (_IO_FILE *, const void *, _IO_ssize_t);
extern _IO_ssize_t _IO_default_read (_IO_FILE *, void *, _IO_ssize_t);
extern int _IO_default_stat (_IO_FILE *, void *) __THROW;
@@ -473,22 +473,22 @@ extern const struct _IO_jump_t _IO_old_proc_jumps attribute_hidden;
extern const struct _IO_jump_t _IO_str_jumps attribute_hidden;
extern const struct _IO_jump_t _IO_wstr_jumps attribute_hidden;
extern const struct _IO_codecvt __libio_codecvt attribute_hidden;
-extern int _IO_do_write (_IO_FILE *, const char *, _IO_size_t) __THROW;
-extern int _IO_new_do_write (_IO_FILE *, const char *, _IO_size_t) __THROW;
-extern int _IO_old_do_write (_IO_FILE *, const char *, _IO_size_t) __THROW;
-extern int _IO_wdo_write (_IO_FILE *, const wchar_t *, _IO_size_t) __THROW;
-extern int _IO_flush_all_lockp (int) __THROW;
-extern int _IO_flush_all (void) __THROW;
-extern int _IO_cleanup (void) __THROW;
-extern void _IO_flush_all_linebuffered (void) __THROW;
-extern int _IO_new_fgetpos (_IO_FILE *, _IO_fpos_t *) __THROW;
-extern int _IO_old_fgetpos (_IO_FILE *, _IO_fpos_t *) __THROW;
-extern int _IO_new_fsetpos (_IO_FILE *, const _IO_fpos_t *) __THROW;
-extern int _IO_old_fsetpos (_IO_FILE *, const _IO_fpos_t *) __THROW;
-extern int _IO_new_fgetpos64 (_IO_FILE *, _IO_fpos64_t *) __THROW;
-extern int _IO_old_fgetpos64 (_IO_FILE *, _IO_fpos64_t *) __THROW;
-extern int _IO_new_fsetpos64 (_IO_FILE *, const _IO_fpos64_t *) __THROW;
-extern int _IO_old_fsetpos64 (_IO_FILE *, const _IO_fpos64_t *) __THROW;
+extern int _IO_do_write (_IO_FILE *, const char *, _IO_size_t);
+extern int _IO_new_do_write (_IO_FILE *, const char *, _IO_size_t);
+extern int _IO_old_do_write (_IO_FILE *, const char *, _IO_size_t);
+extern int _IO_wdo_write (_IO_FILE *, const wchar_t *, _IO_size_t);
+extern int _IO_flush_all_lockp (int);
+extern int _IO_flush_all (void);
+extern int _IO_cleanup (void);
+extern void _IO_flush_all_linebuffered (void);
+extern int _IO_new_fgetpos (_IO_FILE *, _IO_fpos_t *);
+extern int _IO_old_fgetpos (_IO_FILE *, _IO_fpos_t *);
+extern int _IO_new_fsetpos (_IO_FILE *, const _IO_fpos_t *);
+extern int _IO_old_fsetpos (_IO_FILE *, const _IO_fpos_t *);
+extern int _IO_new_fgetpos64 (_IO_FILE *, _IO_fpos64_t *);
+extern int _IO_old_fgetpos64 (_IO_FILE *, _IO_fpos64_t *);
+extern int _IO_new_fsetpos64 (_IO_FILE *, const _IO_fpos64_t *);
+extern int _IO_old_fsetpos64 (_IO_FILE *, const _IO_fpos64_t *);
extern void _IO_old_init (_IO_FILE *fp, int flags) __THROW;
@@ -534,95 +534,79 @@ extern void _IO_old_init (_IO_FILE *fp, int flags) __THROW;
/* Jumptable functions for files. */
extern int _IO_file_doallocate (_IO_FILE *) __THROW;
-extern _IO_FILE* _IO_file_setbuf (_IO_FILE *, char *, _IO_ssize_t) __THROW;
-extern _IO_off64_t _IO_file_seekoff (_IO_FILE *, _IO_off64_t, int, int)
- __THROW;
+extern _IO_FILE* _IO_file_setbuf (_IO_FILE *, char *, _IO_ssize_t);
+extern _IO_off64_t _IO_file_seekoff (_IO_FILE *, _IO_off64_t, int, int);
extern _IO_off64_t _IO_file_seekoff_mmap (_IO_FILE *, _IO_off64_t, int, int)
__THROW;
-extern _IO_size_t _IO_file_xsputn (_IO_FILE *, const void *, _IO_size_t)
- __THROW;
-extern _IO_size_t _IO_file_xsgetn (_IO_FILE *, void *, _IO_size_t) __THROW;
+extern _IO_size_t _IO_file_xsputn (_IO_FILE *, const void *, _IO_size_t);
+extern _IO_size_t _IO_file_xsgetn (_IO_FILE *, void *, _IO_size_t);
extern int _IO_file_stat (_IO_FILE *, void *) __THROW;
extern int _IO_file_close (_IO_FILE *) __THROW;
extern int _IO_file_close_mmap (_IO_FILE *) __THROW;
-extern int _IO_file_underflow (_IO_FILE *) __THROW;
-extern int _IO_file_underflow_mmap (_IO_FILE *) __THROW;
-extern int _IO_file_underflow_maybe_mmap (_IO_FILE *) __THROW;
-extern int _IO_file_overflow (_IO_FILE *, int) __THROW;
+extern int _IO_file_underflow (_IO_FILE *);
+extern int _IO_file_underflow_mmap (_IO_FILE *);
+extern int _IO_file_underflow_maybe_mmap (_IO_FILE *);
+extern int _IO_file_overflow (_IO_FILE *, int);
#define _IO_file_is_open(__fp) ((__fp)->_fileno != -1)
extern void _IO_file_init (struct _IO_FILE_plus *) __THROW;
-extern _IO_FILE* _IO_file_attach (_IO_FILE *, int) __THROW;
-extern _IO_FILE* _IO_file_open (_IO_FILE *, const char *, int, int, int, int)
- __THROW;
+extern _IO_FILE* _IO_file_attach (_IO_FILE *, int);
+extern _IO_FILE* _IO_file_open (_IO_FILE *, const char *, int, int, int, int);
libc_hidden_proto (_IO_file_open)
-extern _IO_FILE* _IO_file_fopen (_IO_FILE *, const char *, const char *, int)
- __THROW;
-extern _IO_ssize_t _IO_file_write (_IO_FILE *, const void *, _IO_ssize_t)
- __THROW;
-extern _IO_ssize_t _IO_file_read (_IO_FILE *, void *, _IO_ssize_t) __THROW;
-extern int _IO_file_sync (_IO_FILE *) __THROW;
-extern int _IO_file_close_it (_IO_FILE *) __THROW;
+extern _IO_FILE* _IO_file_fopen (_IO_FILE *, const char *, const char *, int);
+extern _IO_ssize_t _IO_file_write (_IO_FILE *, const void *, _IO_ssize_t);
+extern _IO_ssize_t _IO_file_read (_IO_FILE *, void *, _IO_ssize_t);
+extern int _IO_file_sync (_IO_FILE *);
+extern int _IO_file_close_it (_IO_FILE *);
extern _IO_off64_t _IO_file_seek (_IO_FILE *, _IO_off64_t, int) __THROW;
-extern void _IO_file_finish (_IO_FILE *, int) __THROW;
+extern void _IO_file_finish (_IO_FILE *, int);
-extern _IO_FILE* _IO_new_file_attach (_IO_FILE *, int) __THROW;
-extern int _IO_new_file_close_it (_IO_FILE *) __THROW;
-extern void _IO_new_file_finish (_IO_FILE *, int) __THROW;
+extern _IO_FILE* _IO_new_file_attach (_IO_FILE *, int);
+extern int _IO_new_file_close_it (_IO_FILE *);
+extern void _IO_new_file_finish (_IO_FILE *, int);
extern _IO_FILE* _IO_new_file_fopen (_IO_FILE *, const char *, const char *,
- int) __THROW;
+ int);
extern void _IO_no_init (_IO_FILE *, int, int, struct _IO_wide_data *,
const struct _IO_jump_t *) __THROW;
extern void _IO_new_file_init (struct _IO_FILE_plus *) __THROW;
-extern _IO_FILE* _IO_new_file_setbuf (_IO_FILE *, char *, _IO_ssize_t) __THROW;
-extern _IO_FILE* _IO_file_setbuf_mmap (_IO_FILE *, char *, _IO_ssize_t)
- __THROW;
-extern int _IO_new_file_sync (_IO_FILE *) __THROW;
-extern int _IO_new_file_underflow (_IO_FILE *) __THROW;
-extern int _IO_new_file_overflow (_IO_FILE *, int) __THROW;
-extern _IO_off64_t _IO_new_file_seekoff (_IO_FILE *, _IO_off64_t, int, int)
- __THROW;
-extern _IO_ssize_t _IO_new_file_write (_IO_FILE *, const void *, _IO_ssize_t)
- __THROW;
-extern _IO_size_t _IO_new_file_xsputn (_IO_FILE *, const void *, _IO_size_t)
- __THROW;
-
-extern _IO_FILE* _IO_old_file_setbuf (_IO_FILE *, char *, _IO_ssize_t) __THROW;
-extern _IO_off64_t _IO_old_file_seekoff (_IO_FILE *, _IO_off64_t, int, int)
- __THROW;
-extern _IO_size_t _IO_old_file_xsputn (_IO_FILE *, const void *, _IO_size_t)
- __THROW;
-extern int _IO_old_file_underflow (_IO_FILE *) __THROW;
-extern int _IO_old_file_overflow (_IO_FILE *, int) __THROW;
+extern _IO_FILE* _IO_new_file_setbuf (_IO_FILE *, char *, _IO_ssize_t);
+extern _IO_FILE* _IO_file_setbuf_mmap (_IO_FILE *, char *, _IO_ssize_t);
+extern int _IO_new_file_sync (_IO_FILE *);
+extern int _IO_new_file_underflow (_IO_FILE *);
+extern int _IO_new_file_overflow (_IO_FILE *, int);
+extern _IO_off64_t _IO_new_file_seekoff (_IO_FILE *, _IO_off64_t, int, int);
+extern _IO_ssize_t _IO_new_file_write (_IO_FILE *, const void *, _IO_ssize_t);
+extern _IO_size_t _IO_new_file_xsputn (_IO_FILE *, const void *, _IO_size_t);
+
+extern _IO_FILE* _IO_old_file_setbuf (_IO_FILE *, char *, _IO_ssize_t);
+extern _IO_off64_t _IO_old_file_seekoff (_IO_FILE *, _IO_off64_t, int, int);
+extern _IO_size_t _IO_old_file_xsputn (_IO_FILE *, const void *, _IO_size_t);
+extern int _IO_old_file_underflow (_IO_FILE *);
+extern int _IO_old_file_overflow (_IO_FILE *, int);
extern void _IO_old_file_init (struct _IO_FILE_plus *) __THROW;
-extern _IO_FILE* _IO_old_file_attach (_IO_FILE *, int) __THROW;
-extern _IO_FILE* _IO_old_file_fopen (_IO_FILE *, const char *, const char *)
- __THROW;
-extern _IO_ssize_t _IO_old_file_write (_IO_FILE *, const void *, _IO_ssize_t)
- __THROW;
-extern int _IO_old_file_sync (_IO_FILE *) __THROW;
-extern int _IO_old_file_close_it (_IO_FILE *) __THROW;
-extern void _IO_old_file_finish (_IO_FILE *, int) __THROW;
+extern _IO_FILE* _IO_old_file_attach (_IO_FILE *, int);
+extern _IO_FILE* _IO_old_file_fopen (_IO_FILE *, const char *, const char *);
+extern _IO_ssize_t _IO_old_file_write (_IO_FILE *, const void *, _IO_ssize_t);
+extern int _IO_old_file_sync (_IO_FILE *);
+extern int _IO_old_file_close_it (_IO_FILE *);
+extern void _IO_old_file_finish (_IO_FILE *, int);
extern int _IO_wfile_doallocate (_IO_FILE *) __THROW;
-extern _IO_size_t _IO_wfile_xsputn (_IO_FILE *, const void *, _IO_size_t)
- __THROW;
-extern _IO_FILE* _IO_wfile_setbuf (_IO_FILE *, wchar_t *, _IO_ssize_t) __THROW;
-extern wint_t _IO_wfile_sync (_IO_FILE *) __THROW;
-extern wint_t _IO_wfile_underflow (_IO_FILE *) __THROW;
-extern wint_t _IO_wfile_overflow (_IO_FILE *, wint_t) __THROW;
-extern _IO_off64_t _IO_wfile_seekoff (_IO_FILE *, _IO_off64_t, int, int)
- __THROW;
+extern _IO_size_t _IO_wfile_xsputn (_IO_FILE *, const void *, _IO_size_t);
+extern _IO_FILE* _IO_wfile_setbuf (_IO_FILE *, wchar_t *, _IO_ssize_t);
+extern wint_t _IO_wfile_sync (_IO_FILE *);
+extern wint_t _IO_wfile_underflow (_IO_FILE *);
+extern wint_t _IO_wfile_overflow (_IO_FILE *, wint_t);
+extern _IO_off64_t _IO_wfile_seekoff (_IO_FILE *, _IO_off64_t, int, int);
/* Jumptable functions for proc_files. */
extern _IO_FILE* _IO_proc_open (_IO_FILE *, const char *, const char *)
__THROW;
extern _IO_FILE* _IO_new_proc_open (_IO_FILE *, const char *, const char *)
__THROW;
-extern _IO_FILE* _IO_old_proc_open (_IO_FILE *, const char *, const char *)
- __THROW;
+extern _IO_FILE* _IO_old_proc_open (_IO_FILE *, const char *, const char *);
extern int _IO_proc_close (_IO_FILE *) __THROW;
extern int _IO_new_proc_close (_IO_FILE *) __THROW;
-extern int _IO_old_proc_close (_IO_FILE *) __THROW;
+extern int _IO_old_proc_close (_IO_FILE *);
/* Jumptable functions for strfiles. */
extern int _IO_str_underflow (_IO_FILE *) __THROW;
@@ -660,73 +644,62 @@ extern int _IO_vsnprintf (char *string, _IO_size_t maxlen,
extern _IO_size_t _IO_getline (_IO_FILE *,char *, _IO_size_t, int, int);
extern _IO_size_t _IO_getline_info (_IO_FILE *,char *, _IO_size_t,
int, int, int *);
-extern _IO_ssize_t _IO_getdelim (char **, _IO_size_t *, int, _IO_FILE *)
- __THROW;
+extern _IO_ssize_t _IO_getdelim (char **, _IO_size_t *, int, _IO_FILE *);
extern _IO_size_t _IO_getwline (_IO_FILE *,wchar_t *, _IO_size_t, wint_t, int);
extern _IO_size_t _IO_getwline_info (_IO_FILE *,wchar_t *, _IO_size_t,
wint_t, int, wint_t *);
-extern double _IO_strtod (const char *, char **) __THROW;
-extern char *_IO_dtoa (double __d, int __mode, int __ndigits,
- int *__decpt, int *__sign, char **__rve) __THROW;
-extern int _IO_outfloat (double __value, _IO_FILE *__sb, int __type,
- int __width, int __precision, int __flags,
- int __sign_mode, int __fill) __THROW;
extern struct _IO_FILE_plus *_IO_list_all;
extern void (*_IO_cleanup_registration_needed) (void);
/* Prototype for functions with alternative entry point. */
-extern int _IO_flush_all_internal (void) __THROW;
-extern unsigned _IO_adjust_column_internal (unsigned, const char *, int)
- __THROW;
+extern int _IO_flush_all_internal (void);
+extern unsigned _IO_adjust_column_internal (unsigned, const char *, int);
-extern int _IO_default_uflow_internal (_IO_FILE *) __THROW;
+extern int _IO_default_uflow_internal (_IO_FILE *);
extern void _IO_default_finish_internal (_IO_FILE *, int) __THROW;
extern int _IO_default_pbackfail_internal (_IO_FILE *, int) __THROW;
extern _IO_size_t _IO_default_xsputn_internal (_IO_FILE *, const void *,
- _IO_size_t) __THROW;
-extern _IO_size_t _IO_default_xsgetn_internal (_IO_FILE *, void *, _IO_size_t)
- __THROW;
+ _IO_size_t);
+extern _IO_size_t _IO_default_xsgetn_internal (_IO_FILE *, void *, _IO_size_t);
extern int _IO_default_doallocate_internal (_IO_FILE *) __THROW;
extern void _IO_wdefault_finish_internal (_IO_FILE *, int) __THROW;
extern wint_t _IO_wdefault_pbackfail_internal (_IO_FILE *, wint_t) __THROW;
extern _IO_size_t _IO_wdefault_xsputn_internal (_IO_FILE *, const void *,
- _IO_size_t) __THROW;
+ _IO_size_t);
extern _IO_size_t _IO_wdefault_xsgetn_internal (_IO_FILE *, void *,
- _IO_size_t) __THROW;
+ _IO_size_t);
extern int _IO_wdefault_doallocate_internal (_IO_FILE *) __THROW;
-extern wint_t _IO_wdefault_uflow_internal (_IO_FILE *) __THROW;
+extern wint_t _IO_wdefault_uflow_internal (_IO_FILE *);
extern int _IO_file_doallocate_internal (_IO_FILE *) __THROW;
-extern _IO_FILE* _IO_file_setbuf_internal (_IO_FILE *, char *, _IO_ssize_t)
- __THROW;
+extern _IO_FILE* _IO_file_setbuf_internal (_IO_FILE *, char *, _IO_ssize_t);
extern _IO_off64_t _IO_file_seekoff_internal (_IO_FILE *, _IO_off64_t,
- int, int) __THROW;
+ int, int);
extern _IO_size_t _IO_file_xsputn_internal (_IO_FILE *, const void *,
- _IO_size_t) __THROW;
-extern _IO_size_t _IO_file_xsgetn_internal (_IO_FILE *, void *, _IO_size_t)
- __THROW;
+ _IO_size_t);
+extern _IO_size_t _IO_file_xsgetn_internal (_IO_FILE *, void *, _IO_size_t);
extern int _IO_file_stat_internal (_IO_FILE *, void *) __THROW;
extern int _IO_file_close_internal (_IO_FILE *) __THROW;
-extern int _IO_file_close_it_internal (_IO_FILE *) __THROW;
-extern int _IO_file_underflow_internal (_IO_FILE *) __THROW;
-extern int _IO_file_overflow_internal (_IO_FILE *, int) __THROW;
+extern int _IO_file_close_it_internal (_IO_FILE *);
+extern int _IO_file_underflow_internal (_IO_FILE *);
+extern int _IO_file_overflow_internal (_IO_FILE *, int);
extern void _IO_file_init_internal (struct _IO_FILE_plus *) __THROW;
-extern _IO_FILE* _IO_file_attach_internal (_IO_FILE *, int) __THROW;
+extern _IO_FILE* _IO_file_attach_internal (_IO_FILE *, int);
extern _IO_FILE* _IO_file_fopen_internal (_IO_FILE *, const char *,
- const char *, int) __THROW;
+ const char *, int);
extern _IO_ssize_t _IO_file_read_internal (_IO_FILE *, void *,
_IO_ssize_t);
-extern int _IO_file_sync_internal (_IO_FILE *) __THROW;
+extern int _IO_file_sync_internal (_IO_FILE *);
extern _IO_off64_t _IO_file_seek_internal (_IO_FILE *, _IO_off64_t, int)
__THROW;
-extern void _IO_file_finish_internal (_IO_FILE *, int) __THROW;
+extern void _IO_file_finish_internal (_IO_FILE *, int);
extern _IO_size_t _IO_wfile_xsputn_internal (_IO_FILE *, const void *,
- _IO_size_t) __THROW;
+ _IO_size_t);
extern _IO_off64_t _IO_wfile_seekoff_internal (_IO_FILE *, _IO_off64_t,
- int, int) __THROW;
-extern wint_t _IO_wfile_sync_internal (_IO_FILE *) __THROW;
+ int, int);
+extern wint_t _IO_wfile_sync_internal (_IO_FILE *);
extern int _IO_str_underflow_internal (_IO_FILE *) __THROW;
extern int _IO_str_overflow_internal (_IO_FILE *, int) __THROW;
@@ -747,12 +720,12 @@ extern void _IO_wdoallocbuf_internal (_IO_FILE *) __THROW;
extern _IO_size_t _IO_sgetn_internal (_IO_FILE *, void *, _IO_size_t);
extern void _IO_flush_all_linebuffered_internal (void) __THROW;
-extern int _IO_switch_to_wget_mode_internal (_IO_FILE *) __THROW;
+extern int _IO_switch_to_wget_mode_internal (_IO_FILE *);
extern void _IO_unsave_markers_internal (_IO_FILE *) __THROW;
extern void _IO_switch_to_main_wget_area_internal (_IO_FILE *) __THROW;
extern int _IO_wdo_write_internal (_IO_FILE *, const wchar_t *, _IO_size_t);
extern int _IO_do_write_internal (_IO_FILE *, const char *, _IO_size_t);
-extern _IO_ssize_t _IO_padn_internal (_IO_FILE *, int, _IO_ssize_t) __THROW;
+extern _IO_ssize_t _IO_padn_internal (_IO_FILE *, int, _IO_ssize_t);
extern _IO_size_t _IO_getline_info_internal (_IO_FILE *,char *, _IO_size_t,
int, int, int *);
extern _IO_size_t _IO_getline_internal (_IO_FILE *, char *, _IO_size_t, int,
@@ -762,7 +735,7 @@ extern void _IO_free_backup_area_internal (_IO_FILE *) __THROW;
extern void _IO_switch_to_wbackup_area_internal (_IO_FILE *) __THROW;
extern void _IO_setb_internal (_IO_FILE *, char *, char *, int) __THROW;
extern wint_t _IO_sputbackwc_internal (_IO_FILE *, wint_t) __THROW;
-extern int _IO_switch_to_get_mode_internal (_IO_FILE *) __THROW;
+extern int _IO_switch_to_get_mode_internal (_IO_FILE *);
extern int _IO_vfscanf_internal (_IO_FILE * __restrict,
const char * __restrict,
_IO_va_list, int *__restrict);
@@ -772,9 +745,9 @@ extern void _IO_doallocbuf_internal (_IO_FILE *) __THROW;
extern void _IO_wsetb_internal (_IO_FILE *, wchar_t *, wchar_t *, int)
__THROW;
extern _IO_off64_t _IO_seekoff_unlocked (_IO_FILE *, _IO_off64_t, int, int)
- attribute_hidden __THROW;
+ attribute_hidden;
extern _IO_off64_t _IO_seekpos_unlocked (_IO_FILE *, _IO_off64_t, int)
- attribute_hidden __THROW;
+ attribute_hidden;
extern int _IO_putc_internal (int __c, _IO_FILE *__fp);
extern void _IO_init_internal (_IO_FILE *, int) __THROW;
extern void _IO_un_link_internal (struct _IO_FILE_plus *) __THROW;
@@ -866,12 +839,6 @@ extern void _IO_un_link_internal (struct _IO_FILE_plus *) __THROW;
#ifndef OS_FSTAT
# define OS_FSTAT fstat
#endif
-struct stat;
-extern _IO_ssize_t _IO_read (int, void *, _IO_size_t);
-extern _IO_ssize_t _IO_write (int, const void *, _IO_size_t);
-extern _IO_off64_t _IO_lseek (int, _IO_off64_t, int) __THROW;
-extern int _IO_close (int);
-extern int _IO_fstat (int, struct stat *) __THROW;
extern int _IO_vscanf (const char *, _IO_va_list) __THROW;
/* _IO_pos_BAD is an _IO_off64_t value indicating error, unknown, or EOF. */
diff --git a/libio/oldfileops.c b/libio/oldfileops.c
index a69c87e8b8a..3bd0aa175b9 100644
--- a/libio/oldfileops.c
+++ b/libio/oldfileops.c
@@ -1,4 +1,5 @@
-/* Copyright (C) 1993, 1995, 1997-2004, 2005 Free Software Foundation, Inc.
+/* Copyright (C) 1993, 1995, 1997-2004, 2005, 2007
+ Free Software Foundation, Inc.
This file is part of the GNU C Library.
Written by Per Bothner <bothner@cygnus.com>.
@@ -271,7 +272,7 @@ _IO_old_file_setbuf (fp, p, len)
return fp;
}
-static int old_do_write (_IO_FILE *, const char *, _IO_size_t) __THROW;
+static int old_do_write (_IO_FILE *, const char *, _IO_size_t);
/* Write TO_DO bytes from DATA to FP.
Then mark FP as having empty buffers. */
diff --git a/libio/stdio.c b/libio/stdio.c
index b2baf65be3f..8dc24ed98f5 100644
--- a/libio/stdio.c
+++ b/libio/stdio.c
@@ -1,5 +1,4 @@
-/* Copyright (C) 1993,1994,1996,1997,2000,2002,2006
- Free Software Foundation, Inc.
+/* Copyright (C) 1993,1994,1996,1997,2000,2002 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -41,9 +40,14 @@ _IO_FILE *stderr = (FILE *) &_IO_2_1_stderr_;
#undef _IO_stderr
#ifdef _LIBC
# define AL(name) AL2 (name, _IO_##name)
-# define AL2(name, al) \
+# if defined HAVE_VISIBILITY_ATTRIBUTE
+# define AL2(name, al) \
extern __typeof (name) al __attribute__ ((alias (#name), \
visibility ("hidden")))
+# else
+# define AL2(name, al) \
+ extern __typeof (name) al __attribute__ ((alias (#name)))
+# endif
AL(stdin);
AL(stdout);
AL(stderr);
diff --git a/libio/stdio.h b/libio/stdio.h
index 3738e6d3b62..5e743056383 100644
--- a/libio/stdio.h
+++ b/libio/stdio.h
@@ -166,27 +166,27 @@ __BEGIN_NAMESPACE_STD
This function is a possible cancellation points and therefore not
marked with __THROW. */
#ifndef __USE_FILE_OFFSET64
-extern FILE *tmpfile (void) __wur;
+extern FILE *tmpfile (void);
#else
# ifdef __REDIRECT
-extern FILE *__REDIRECT (tmpfile, (void), tmpfile64) __wur;
+extern FILE *__REDIRECT (tmpfile, (void), tmpfile64);
# else
# define tmpfile tmpfile64
# endif
#endif
#ifdef __USE_LARGEFILE64
-extern FILE *tmpfile64 (void) __wur;
+extern FILE *tmpfile64 (void);
#endif
/* Generate a temporary filename. */
-extern char *tmpnam (char *__s) __THROW __wur;
+extern char *tmpnam (char *__s) __THROW;
__END_NAMESPACE_STD
#ifdef __USE_MISC
/* This is the reentrant variant of `tmpnam'. The only difference is
that it does not allow S to be NULL. */
-extern char *tmpnam_r (char *__s) __THROW __wur;
+extern char *tmpnam_r (char *__s) __THROW;
#endif
@@ -199,7 +199,7 @@ extern char *tmpnam_r (char *__s) __THROW __wur;
P_tmpdir is tried and finally "/tmp". The storage for the filename
is allocated by `malloc'. */
extern char *tempnam (__const char *__dir, __const char *__pfx)
- __THROW __attribute_malloc__ __wur;
+ __THROW __attribute_malloc__;
#endif
@@ -244,23 +244,21 @@ __BEGIN_NAMESPACE_STD
This function is a possible cancellation point and therefore not
marked with __THROW. */
extern FILE *fopen (__const char *__restrict __filename,
- __const char *__restrict __modes) __wur;
+ __const char *__restrict __modes);
/* Open a file, replacing an existing stream with it.
This function is a possible cancellation point and therefore not
marked with __THROW. */
extern FILE *freopen (__const char *__restrict __filename,
__const char *__restrict __modes,
- FILE *__restrict __stream) __wur;
+ FILE *__restrict __stream);
#else
# ifdef __REDIRECT
extern FILE *__REDIRECT (fopen, (__const char *__restrict __filename,
- __const char *__restrict __modes), fopen64)
- __wur;
+ __const char *__restrict __modes), fopen64);
extern FILE *__REDIRECT (freopen, (__const char *__restrict __filename,
__const char *__restrict __modes,
- FILE *__restrict __stream), freopen64)
- __wur;
+ FILE *__restrict __stream), freopen64);
# else
# define fopen fopen64
# define freopen freopen64
@@ -269,15 +267,15 @@ extern FILE *__REDIRECT (freopen, (__const char *__restrict __filename,
__END_NAMESPACE_STD
#ifdef __USE_LARGEFILE64
extern FILE *fopen64 (__const char *__restrict __filename,
- __const char *__restrict __modes) __wur;
+ __const char *__restrict __modes);
extern FILE *freopen64 (__const char *__restrict __filename,
__const char *__restrict __modes,
- FILE *__restrict __stream) __wur;
+ FILE *__restrict __stream);
#endif
#ifdef __USE_POSIX
/* Create a new stream that refers to an existing system file descriptor. */
-extern FILE *fdopen (int __fd, __const char *__modes) __THROW __wur;
+extern FILE *fdopen (int __fd, __const char *__modes) __THROW;
#endif
#ifdef __USE_GNU
@@ -285,16 +283,15 @@ extern FILE *fdopen (int __fd, __const char *__modes) __THROW __wur;
and uses the given functions for input and output. */
extern FILE *fopencookie (void *__restrict __magic_cookie,
__const char *__restrict __modes,
- _IO_cookie_io_functions_t __io_funcs) __THROW __wur;
+ _IO_cookie_io_functions_t __io_funcs) __THROW;
/* Create a new stream that refers to a memory buffer. */
-extern FILE *fmemopen (void *__s, size_t __len, __const char *__modes)
- __THROW __wur;
+extern FILE *fmemopen (void *__s, size_t __len, __const char *__modes) __THROW;
/* Open a stream that writes into a malloc'd buffer that is expanded as
necessary. *BUFLOC and *SIZELOC are updated with the buffer's location
and the number of characters written on fflush or fclose. */
-extern FILE *open_memstream (char **__bufloc, size_t *__sizeloc) __THROW __wur;
+extern FILE *open_memstream (char **__bufloc, size_t *__sizeloc) __THROW;
#endif
@@ -370,13 +367,13 @@ __END_NAMESPACE_C99
Store the address of the string in *PTR. */
extern int vasprintf (char **__restrict __ptr, __const char *__restrict __f,
_G_va_list __arg)
- __THROW __attribute__ ((__format__ (__printf__, 2, 0))) __wur;
+ __THROW __attribute__ ((__format__ (__printf__, 2, 0)));
extern int __asprintf (char **__restrict __ptr,
__const char *__restrict __fmt, ...)
- __THROW __attribute__ ((__format__ (__printf__, 2, 3))) __wur;
+ __THROW __attribute__ ((__format__ (__printf__, 2, 3)));
extern int asprintf (char **__restrict __ptr,
__const char *__restrict __fmt, ...)
- __THROW __attribute__ ((__format__ (__printf__, 2, 3))) __wur;
+ __THROW __attribute__ ((__format__ (__printf__, 2, 3)));
/* Write formatted output to a file descriptor.
diff --git a/libio/vswprintf.c b/libio/vswprintf.c
index e9a316a01c1..5bbd20227b1 100644
--- a/libio/vswprintf.c
+++ b/libio/vswprintf.c
@@ -119,7 +119,7 @@ _IO_vswprintf (string, maxlen, format, args)
if (sf.f._sbf._f._wide_data->_IO_buf_base == sf.overflow_buf)
/* ISO C99 requires swprintf/vswprintf to return an error if the
- output does not fit in the provided buffer. */
+ output does not fit int he provided buffer. */
return -1;
/* Terminate the string. */
diff --git a/locale/C-translit.h b/locale/C-translit.h
index 568db4866f9..adb009ba564 100644
--- a/locale/C-translit.h
+++ b/locale/C-translit.h
@@ -1,4 +1,4 @@
-#define NTRANSLIT 1352
+#define NTRANSLIT 1353
static const uint32_t translit_from_idx[] =
{
0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22,
@@ -113,7 +113,7 @@ static const uint32_t translit_from_idx[] =
2616, 2618, 2620, 2622, 2624, 2626, 2628, 2630, 2632, 2634, 2636, 2638,
2640, 2642, 2644, 2646, 2648, 2650, 2652, 2654, 2656, 2658, 2660, 2662,
2664, 2666, 2668, 2670, 2672, 2674, 2676, 2678, 2680, 2682, 2684, 2686,
- 2688, 2690, 2692, 2694, 2696, 2698, 2700, 2702
+ 2688, 2690, 2692, 2694, 2696, 2698, 2700, 2702, 2704
};
static const wchar_t translit_from_tbl[] =
L"\x00a0" L"\0" L"\x00a9" L"\0" L"\x00ab" L"\0" L"\x00ad" L"\0" L"\x00ae"
@@ -132,335 +132,336 @@ static const wchar_t translit_from_tbl[] =
L"\0" L"\x201d" L"\0" L"\x201e" L"\0" L"\x201f" L"\0" L"\x2020" L"\0"
L"\x2022" L"\0" L"\x2024" L"\0" L"\x2025" L"\0" L"\x2026" L"\0" L"\x202f"
L"\0" L"\x2035" L"\0" L"\x2036" L"\0" L"\x2037" L"\0" L"\x2039" L"\0"
- L"\x203a" L"\0" L"\x203c" L"\0" L"\x2047" L"\0" L"\x2048" L"\0" L"\x2049"
- L"\0" L"\x205f" L"\0" L"\x2060" L"\0" L"\x2061" L"\0" L"\x2062" L"\0"
- L"\x2063" L"\0" L"\x20a8" L"\0" L"\x20ac" L"\0" L"\x2100" L"\0" L"\x2101"
- L"\0" L"\x2102" L"\0" L"\x2105" L"\0" L"\x2106" L"\0" L"\x210a" L"\0"
- L"\x210b" L"\0" L"\x210c" L"\0" L"\x210d" L"\0" L"\x210e" L"\0" L"\x2110"
- L"\0" L"\x2111" L"\0" L"\x2112" L"\0" L"\x2113" L"\0" L"\x2115" L"\0"
- L"\x2116" L"\0" L"\x2119" L"\0" L"\x211a" L"\0" L"\x211b" L"\0" L"\x211c"
- L"\0" L"\x211d" L"\0" L"\x2121" L"\0" L"\x2122" L"\0" L"\x2124" L"\0"
- L"\x2126" L"\0" L"\x2128" L"\0" L"\x212c" L"\0" L"\x212d" L"\0" L"\x212e"
- L"\0" L"\x212f" L"\0" L"\x2130" L"\0" L"\x2131" L"\0" L"\x2133" L"\0"
- L"\x2134" L"\0" L"\x2139" L"\0" L"\x2145" L"\0" L"\x2146" L"\0" L"\x2147"
- L"\0" L"\x2148" L"\0" L"\x2149" L"\0" L"\x2153" L"\0" L"\x2154" L"\0"
- L"\x2155" L"\0" L"\x2156" L"\0" L"\x2157" L"\0" L"\x2158" L"\0" L"\x2159"
- L"\0" L"\x215a" L"\0" L"\x215b" L"\0" L"\x215c" L"\0" L"\x215d" L"\0"
- L"\x215e" L"\0" L"\x215f" L"\0" L"\x2160" L"\0" L"\x2161" L"\0" L"\x2162"
- L"\0" L"\x2163" L"\0" L"\x2164" L"\0" L"\x2165" L"\0" L"\x2166" L"\0"
- L"\x2167" L"\0" L"\x2168" L"\0" L"\x2169" L"\0" L"\x216a" L"\0" L"\x216b"
- L"\0" L"\x216c" L"\0" L"\x216d" L"\0" L"\x216e" L"\0" L"\x216f" L"\0"
- L"\x2170" L"\0" L"\x2171" L"\0" L"\x2172" L"\0" L"\x2173" L"\0" L"\x2174"
- L"\0" L"\x2175" L"\0" L"\x2176" L"\0" L"\x2177" L"\0" L"\x2178" L"\0"
- L"\x2179" L"\0" L"\x217a" L"\0" L"\x217b" L"\0" L"\x217c" L"\0" L"\x217d"
- L"\0" L"\x217e" L"\0" L"\x217f" L"\0" L"\x2190" L"\0" L"\x2192" L"\0"
- L"\x2194" L"\0" L"\x21d0" L"\0" L"\x21d2" L"\0" L"\x21d4" L"\0" L"\x2212"
- L"\0" L"\x2215" L"\0" L"\x2216" L"\0" L"\x2217" L"\0" L"\x2223" L"\0"
- L"\x2236" L"\0" L"\x223c" L"\0" L"\x2264" L"\0" L"\x2265" L"\0" L"\x226a"
- L"\0" L"\x226b" L"\0" L"\x22d8" L"\0" L"\x22d9" L"\0" L"\x2400" L"\0"
- L"\x2401" L"\0" L"\x2402" L"\0" L"\x2403" L"\0" L"\x2404" L"\0" L"\x2405"
- L"\0" L"\x2406" L"\0" L"\x2407" L"\0" L"\x2408" L"\0" L"\x2409" L"\0"
- L"\x240a" L"\0" L"\x240b" L"\0" L"\x240c" L"\0" L"\x240d" L"\0" L"\x240e"
- L"\0" L"\x240f" L"\0" L"\x2410" L"\0" L"\x2411" L"\0" L"\x2412" L"\0"
- L"\x2413" L"\0" L"\x2414" L"\0" L"\x2415" L"\0" L"\x2416" L"\0" L"\x2417"
- L"\0" L"\x2418" L"\0" L"\x2419" L"\0" L"\x241a" L"\0" L"\x241b" L"\0"
- L"\x241c" L"\0" L"\x241d" L"\0" L"\x241e" L"\0" L"\x241f" L"\0" L"\x2420"
- L"\0" L"\x2421" L"\0" L"\x2423" L"\0" L"\x2424" L"\0" L"\x2460" L"\0"
- L"\x2461" L"\0" L"\x2462" L"\0" L"\x2463" L"\0" L"\x2464" L"\0" L"\x2465"
- L"\0" L"\x2466" L"\0" L"\x2467" L"\0" L"\x2468" L"\0" L"\x2469" L"\0"
- L"\x246a" L"\0" L"\x246b" L"\0" L"\x246c" L"\0" L"\x246d" L"\0" L"\x246e"
- L"\0" L"\x246f" L"\0" L"\x2470" L"\0" L"\x2471" L"\0" L"\x2472" L"\0"
- L"\x2473" L"\0" L"\x2474" L"\0" L"\x2475" L"\0" L"\x2476" L"\0" L"\x2477"
- L"\0" L"\x2478" L"\0" L"\x2479" L"\0" L"\x247a" L"\0" L"\x247b" L"\0"
- L"\x247c" L"\0" L"\x247d" L"\0" L"\x247e" L"\0" L"\x247f" L"\0" L"\x2480"
- L"\0" L"\x2481" L"\0" L"\x2482" L"\0" L"\x2483" L"\0" L"\x2484" L"\0"
- L"\x2485" L"\0" L"\x2486" L"\0" L"\x2487" L"\0" L"\x2488" L"\0" L"\x2489"
- L"\0" L"\x248a" L"\0" L"\x248b" L"\0" L"\x248c" L"\0" L"\x248d" L"\0"
- L"\x248e" L"\0" L"\x248f" L"\0" L"\x2490" L"\0" L"\x2491" L"\0" L"\x2492"
- L"\0" L"\x2493" L"\0" L"\x2494" L"\0" L"\x2495" L"\0" L"\x2496" L"\0"
- L"\x2497" L"\0" L"\x2498" L"\0" L"\x2499" L"\0" L"\x249a" L"\0" L"\x249b"
- L"\0" L"\x249c" L"\0" L"\x249d" L"\0" L"\x249e" L"\0" L"\x249f" L"\0"
- L"\x24a0" L"\0" L"\x24a1" L"\0" L"\x24a2" L"\0" L"\x24a3" L"\0" L"\x24a4"
- L"\0" L"\x24a5" L"\0" L"\x24a6" L"\0" L"\x24a7" L"\0" L"\x24a8" L"\0"
- L"\x24a9" L"\0" L"\x24aa" L"\0" L"\x24ab" L"\0" L"\x24ac" L"\0" L"\x24ad"
- L"\0" L"\x24ae" L"\0" L"\x24af" L"\0" L"\x24b0" L"\0" L"\x24b1" L"\0"
- L"\x24b2" L"\0" L"\x24b3" L"\0" L"\x24b4" L"\0" L"\x24b5" L"\0" L"\x24b6"
- L"\0" L"\x24b7" L"\0" L"\x24b8" L"\0" L"\x24b9" L"\0" L"\x24ba" L"\0"
- L"\x24bb" L"\0" L"\x24bc" L"\0" L"\x24bd" L"\0" L"\x24be" L"\0" L"\x24bf"
- L"\0" L"\x24c0" L"\0" L"\x24c1" L"\0" L"\x24c2" L"\0" L"\x24c3" L"\0"
- L"\x24c4" L"\0" L"\x24c5" L"\0" L"\x24c6" L"\0" L"\x24c7" L"\0" L"\x24c8"
- L"\0" L"\x24c9" L"\0" L"\x24ca" L"\0" L"\x24cb" L"\0" L"\x24cc" L"\0"
- L"\x24cd" L"\0" L"\x24ce" L"\0" L"\x24cf" L"\0" L"\x24d0" L"\0" L"\x24d1"
- L"\0" L"\x24d2" L"\0" L"\x24d3" L"\0" L"\x24d4" L"\0" L"\x24d5" L"\0"
- L"\x24d6" L"\0" L"\x24d7" L"\0" L"\x24d8" L"\0" L"\x24d9" L"\0" L"\x24da"
- L"\0" L"\x24db" L"\0" L"\x24dc" L"\0" L"\x24dd" L"\0" L"\x24de" L"\0"
- L"\x24df" L"\0" L"\x24e0" L"\0" L"\x24e1" L"\0" L"\x24e2" L"\0" L"\x24e3"
- L"\0" L"\x24e4" L"\0" L"\x24e5" L"\0" L"\x24e6" L"\0" L"\x24e7" L"\0"
- L"\x24e8" L"\0" L"\x24e9" L"\0" L"\x24ea" L"\0" L"\x2500" L"\0" L"\x2502"
- L"\0" L"\x250c" L"\0" L"\x2510" L"\0" L"\x2514" L"\0" L"\x2518" L"\0"
- L"\x251c" L"\0" L"\x2524" L"\0" L"\x252c" L"\0" L"\x2534" L"\0" L"\x253c"
- L"\0" L"\x25e6" L"\0" L"\x2a74" L"\0" L"\x2a75" L"\0" L"\x2a76" L"\0"
- L"\x3000" L"\0" L"\x30a0" L"\0" L"\x3251" L"\0" L"\x3252" L"\0" L"\x3253"
- L"\0" L"\x3254" L"\0" L"\x3255" L"\0" L"\x3256" L"\0" L"\x3257" L"\0"
- L"\x3258" L"\0" L"\x3259" L"\0" L"\x325a" L"\0" L"\x325b" L"\0" L"\x325c"
- L"\0" L"\x325d" L"\0" L"\x325e" L"\0" L"\x325f" L"\0" L"\x32b1" L"\0"
- L"\x32b2" L"\0" L"\x32b3" L"\0" L"\x32b4" L"\0" L"\x32b5" L"\0" L"\x32b6"
- L"\0" L"\x32b7" L"\0" L"\x32b8" L"\0" L"\x32b9" L"\0" L"\x32ba" L"\0"
- L"\x32bb" L"\0" L"\x32bc" L"\0" L"\x32bd" L"\0" L"\x32be" L"\0" L"\x32bf"
- L"\0" L"\x3371" L"\0" L"\x3372" L"\0" L"\x3373" L"\0" L"\x3374" L"\0"
- L"\x3375" L"\0" L"\x3376" L"\0" L"\x3380" L"\0" L"\x3381" L"\0" L"\x3382"
- L"\0" L"\x3383" L"\0" L"\x3384" L"\0" L"\x3385" L"\0" L"\x3386" L"\0"
- L"\x3387" L"\0" L"\x3388" L"\0" L"\x3389" L"\0" L"\x338a" L"\0" L"\x338b"
- L"\0" L"\x338c" L"\0" L"\x338d" L"\0" L"\x338e" L"\0" L"\x338f" L"\0"
- L"\x3390" L"\0" L"\x3391" L"\0" L"\x3392" L"\0" L"\x3393" L"\0" L"\x3394"
- L"\0" L"\x3395" L"\0" L"\x3396" L"\0" L"\x3397" L"\0" L"\x3398" L"\0"
- L"\x3399" L"\0" L"\x339a" L"\0" L"\x339b" L"\0" L"\x339c" L"\0" L"\x339d"
- L"\0" L"\x339e" L"\0" L"\x339f" L"\0" L"\x33a0" L"\0" L"\x33a1" L"\0"
- L"\x33a2" L"\0" L"\x33a3" L"\0" L"\x33a4" L"\0" L"\x33a5" L"\0" L"\x33a6"
- L"\0" L"\x33a7" L"\0" L"\x33a8" L"\0" L"\x33a9" L"\0" L"\x33aa" L"\0"
- L"\x33ab" L"\0" L"\x33ac" L"\0" L"\x33ad" L"\0" L"\x33ae" L"\0" L"\x33af"
- L"\0" L"\x33b0" L"\0" L"\x33b1" L"\0" L"\x33b2" L"\0" L"\x33b3" L"\0"
- L"\x33b4" L"\0" L"\x33b5" L"\0" L"\x33b6" L"\0" L"\x33b7" L"\0" L"\x33b8"
- L"\0" L"\x33b9" L"\0" L"\x33ba" L"\0" L"\x33bb" L"\0" L"\x33bc" L"\0"
- L"\x33bd" L"\0" L"\x33be" L"\0" L"\x33bf" L"\0" L"\x33c2" L"\0" L"\x33c3"
- L"\0" L"\x33c4" L"\0" L"\x33c5" L"\0" L"\x33c6" L"\0" L"\x33c7" L"\0"
- L"\x33c8" L"\0" L"\x33c9" L"\0" L"\x33ca" L"\0" L"\x33cb" L"\0" L"\x33cc"
- L"\0" L"\x33cd" L"\0" L"\x33ce" L"\0" L"\x33cf" L"\0" L"\x33d0" L"\0"
- L"\x33d1" L"\0" L"\x33d2" L"\0" L"\x33d3" L"\0" L"\x33d4" L"\0" L"\x33d5"
- L"\0" L"\x33d6" L"\0" L"\x33d7" L"\0" L"\x33d8" L"\0" L"\x33d9" L"\0"
- L"\x33da" L"\0" L"\x33db" L"\0" L"\x33dc" L"\0" L"\x33dd" L"\0" L"\xfb00"
- L"\0" L"\xfb01" L"\0" L"\xfb02" L"\0" L"\xfb03" L"\0" L"\xfb04" L"\0"
- L"\xfb06" L"\0" L"\xfb29" L"\0" L"\xfe00" L"\0" L"\xfe01" L"\0" L"\xfe02"
- L"\0" L"\xfe03" L"\0" L"\xfe04" L"\0" L"\xfe05" L"\0" L"\xfe06" L"\0"
- L"\xfe07" L"\0" L"\xfe08" L"\0" L"\xfe09" L"\0" L"\xfe0a" L"\0" L"\xfe0b"
- L"\0" L"\xfe0c" L"\0" L"\xfe0d" L"\0" L"\xfe0e" L"\0" L"\xfe0f" L"\0"
- L"\xfe4d" L"\0" L"\xfe4e" L"\0" L"\xfe4f" L"\0" L"\xfe50" L"\0" L"\xfe52"
- L"\0" L"\xfe54" L"\0" L"\xfe55" L"\0" L"\xfe56" L"\0" L"\xfe57" L"\0"
- L"\xfe59" L"\0" L"\xfe5a" L"\0" L"\xfe5b" L"\0" L"\xfe5c" L"\0" L"\xfe5f"
- L"\0" L"\xfe60" L"\0" L"\xfe61" L"\0" L"\xfe62" L"\0" L"\xfe63" L"\0"
- L"\xfe64" L"\0" L"\xfe65" L"\0" L"\xfe66" L"\0" L"\xfe68" L"\0" L"\xfe69"
- L"\0" L"\xfe6a" L"\0" L"\xfe6b" L"\0" L"\xfeff" L"\0" L"\xff01" L"\0"
- L"\xff02" L"\0" L"\xff03" L"\0" L"\xff04" L"\0" L"\xff05" L"\0" L"\xff06"
- L"\0" L"\xff07" L"\0" L"\xff08" L"\0" L"\xff09" L"\0" L"\xff0a" L"\0"
- L"\xff0b" L"\0" L"\xff0c" L"\0" L"\xff0d" L"\0" L"\xff0e" L"\0" L"\xff0f"
- L"\0" L"\xff10" L"\0" L"\xff11" L"\0" L"\xff12" L"\0" L"\xff13" L"\0"
- L"\xff14" L"\0" L"\xff15" L"\0" L"\xff16" L"\0" L"\xff17" L"\0" L"\xff18"
- L"\0" L"\xff19" L"\0" L"\xff1a" L"\0" L"\xff1b" L"\0" L"\xff1c" L"\0"
- L"\xff1d" L"\0" L"\xff1e" L"\0" L"\xff1f" L"\0" L"\xff20" L"\0" L"\xff21"
- L"\0" L"\xff22" L"\0" L"\xff23" L"\0" L"\xff24" L"\0" L"\xff25" L"\0"
- L"\xff26" L"\0" L"\xff27" L"\0" L"\xff28" L"\0" L"\xff29" L"\0" L"\xff2a"
- L"\0" L"\xff2b" L"\0" L"\xff2c" L"\0" L"\xff2d" L"\0" L"\xff2e" L"\0"
- L"\xff2f" L"\0" L"\xff30" L"\0" L"\xff31" L"\0" L"\xff32" L"\0" L"\xff33"
- L"\0" L"\xff34" L"\0" L"\xff35" L"\0" L"\xff36" L"\0" L"\xff37" L"\0"
- L"\xff38" L"\0" L"\xff39" L"\0" L"\xff3a" L"\0" L"\xff3b" L"\0" L"\xff3c"
- L"\0" L"\xff3d" L"\0" L"\xff3e" L"\0" L"\xff3f" L"\0" L"\xff40" L"\0"
- L"\xff41" L"\0" L"\xff42" L"\0" L"\xff43" L"\0" L"\xff44" L"\0" L"\xff45"
- L"\0" L"\xff46" L"\0" L"\xff47" L"\0" L"\xff48" L"\0" L"\xff49" L"\0"
- L"\xff4a" L"\0" L"\xff4b" L"\0" L"\xff4c" L"\0" L"\xff4d" L"\0" L"\xff4e"
- L"\0" L"\xff4f" L"\0" L"\xff50" L"\0" L"\xff51" L"\0" L"\xff52" L"\0"
- L"\xff53" L"\0" L"\xff54" L"\0" L"\xff55" L"\0" L"\xff56" L"\0" L"\xff57"
- L"\0" L"\xff58" L"\0" L"\xff59" L"\0" L"\xff5a" L"\0" L"\xff5b" L"\0"
- L"\xff5c" L"\0" L"\xff5d" L"\0" L"\xff5e" L"\0" L"\x0001d400" L"\0"
- L"\x0001d401" L"\0" L"\x0001d402" L"\0" L"\x0001d403" L"\0" L"\x0001d404"
- L"\0" L"\x0001d405" L"\0" L"\x0001d406" L"\0" L"\x0001d407" L"\0"
- L"\x0001d408" L"\0" L"\x0001d409" L"\0" L"\x0001d40a" L"\0" L"\x0001d40b"
- L"\0" L"\x0001d40c" L"\0" L"\x0001d40d" L"\0" L"\x0001d40e" L"\0"
- L"\x0001d40f" L"\0" L"\x0001d410" L"\0" L"\x0001d411" L"\0" L"\x0001d412"
- L"\0" L"\x0001d413" L"\0" L"\x0001d414" L"\0" L"\x0001d415" L"\0"
- L"\x0001d416" L"\0" L"\x0001d417" L"\0" L"\x0001d418" L"\0" L"\x0001d419"
- L"\0" L"\x0001d41a" L"\0" L"\x0001d41b" L"\0" L"\x0001d41c" L"\0"
- L"\x0001d41d" L"\0" L"\x0001d41e" L"\0" L"\x0001d41f" L"\0" L"\x0001d420"
- L"\0" L"\x0001d421" L"\0" L"\x0001d422" L"\0" L"\x0001d423" L"\0"
- L"\x0001d424" L"\0" L"\x0001d425" L"\0" L"\x0001d426" L"\0" L"\x0001d427"
- L"\0" L"\x0001d428" L"\0" L"\x0001d429" L"\0" L"\x0001d42a" L"\0"
- L"\x0001d42b" L"\0" L"\x0001d42c" L"\0" L"\x0001d42d" L"\0" L"\x0001d42e"
- L"\0" L"\x0001d42f" L"\0" L"\x0001d430" L"\0" L"\x0001d431" L"\0"
- L"\x0001d432" L"\0" L"\x0001d433" L"\0" L"\x0001d434" L"\0" L"\x0001d435"
- L"\0" L"\x0001d436" L"\0" L"\x0001d437" L"\0" L"\x0001d438" L"\0"
- L"\x0001d439" L"\0" L"\x0001d43a" L"\0" L"\x0001d43b" L"\0" L"\x0001d43c"
- L"\0" L"\x0001d43d" L"\0" L"\x0001d43e" L"\0" L"\x0001d43f" L"\0"
- L"\x0001d440" L"\0" L"\x0001d441" L"\0" L"\x0001d442" L"\0" L"\x0001d443"
- L"\0" L"\x0001d444" L"\0" L"\x0001d445" L"\0" L"\x0001d446" L"\0"
- L"\x0001d447" L"\0" L"\x0001d448" L"\0" L"\x0001d449" L"\0" L"\x0001d44a"
- L"\0" L"\x0001d44b" L"\0" L"\x0001d44c" L"\0" L"\x0001d44d" L"\0"
- L"\x0001d44e" L"\0" L"\x0001d44f" L"\0" L"\x0001d450" L"\0" L"\x0001d451"
- L"\0" L"\x0001d452" L"\0" L"\x0001d453" L"\0" L"\x0001d454" L"\0"
- L"\x0001d456" L"\0" L"\x0001d457" L"\0" L"\x0001d458" L"\0" L"\x0001d459"
- L"\0" L"\x0001d45a" L"\0" L"\x0001d45b" L"\0" L"\x0001d45c" L"\0"
- L"\x0001d45d" L"\0" L"\x0001d45e" L"\0" L"\x0001d45f" L"\0" L"\x0001d460"
- L"\0" L"\x0001d461" L"\0" L"\x0001d462" L"\0" L"\x0001d463" L"\0"
- L"\x0001d464" L"\0" L"\x0001d465" L"\0" L"\x0001d466" L"\0" L"\x0001d467"
- L"\0" L"\x0001d468" L"\0" L"\x0001d469" L"\0" L"\x0001d46a" L"\0"
- L"\x0001d46b" L"\0" L"\x0001d46c" L"\0" L"\x0001d46d" L"\0" L"\x0001d46e"
- L"\0" L"\x0001d46f" L"\0" L"\x0001d470" L"\0" L"\x0001d471" L"\0"
- L"\x0001d472" L"\0" L"\x0001d473" L"\0" L"\x0001d474" L"\0" L"\x0001d475"
- L"\0" L"\x0001d476" L"\0" L"\x0001d477" L"\0" L"\x0001d478" L"\0"
- L"\x0001d479" L"\0" L"\x0001d47a" L"\0" L"\x0001d47b" L"\0" L"\x0001d47c"
- L"\0" L"\x0001d47d" L"\0" L"\x0001d47e" L"\0" L"\x0001d47f" L"\0"
- L"\x0001d480" L"\0" L"\x0001d481" L"\0" L"\x0001d482" L"\0" L"\x0001d483"
- L"\0" L"\x0001d484" L"\0" L"\x0001d485" L"\0" L"\x0001d486" L"\0"
- L"\x0001d487" L"\0" L"\x0001d488" L"\0" L"\x0001d489" L"\0" L"\x0001d48a"
- L"\0" L"\x0001d48b" L"\0" L"\x0001d48c" L"\0" L"\x0001d48d" L"\0"
- L"\x0001d48e" L"\0" L"\x0001d48f" L"\0" L"\x0001d490" L"\0" L"\x0001d491"
- L"\0" L"\x0001d492" L"\0" L"\x0001d493" L"\0" L"\x0001d494" L"\0"
- L"\x0001d495" L"\0" L"\x0001d496" L"\0" L"\x0001d497" L"\0" L"\x0001d498"
- L"\0" L"\x0001d499" L"\0" L"\x0001d49a" L"\0" L"\x0001d49b" L"\0"
- L"\x0001d49c" L"\0" L"\x0001d49e" L"\0" L"\x0001d49f" L"\0" L"\x0001d4a2"
- L"\0" L"\x0001d4a5" L"\0" L"\x0001d4a6" L"\0" L"\x0001d4a9" L"\0"
- L"\x0001d4aa" L"\0" L"\x0001d4ab" L"\0" L"\x0001d4ac" L"\0" L"\x0001d4ae"
- L"\0" L"\x0001d4af" L"\0" L"\x0001d4b0" L"\0" L"\x0001d4b1" L"\0"
- L"\x0001d4b2" L"\0" L"\x0001d4b3" L"\0" L"\x0001d4b4" L"\0" L"\x0001d4b5"
- L"\0" L"\x0001d4b6" L"\0" L"\x0001d4b7" L"\0" L"\x0001d4b8" L"\0"
- L"\x0001d4b9" L"\0" L"\x0001d4bb" L"\0" L"\x0001d4bd" L"\0" L"\x0001d4be"
- L"\0" L"\x0001d4bf" L"\0" L"\x0001d4c0" L"\0" L"\x0001d4c2" L"\0"
- L"\x0001d4c3" L"\0" L"\x0001d4c5" L"\0" L"\x0001d4c6" L"\0" L"\x0001d4c7"
- L"\0" L"\x0001d4c8" L"\0" L"\x0001d4c9" L"\0" L"\x0001d4ca" L"\0"
- L"\x0001d4cb" L"\0" L"\x0001d4cc" L"\0" L"\x0001d4cd" L"\0" L"\x0001d4ce"
- L"\0" L"\x0001d4cf" L"\0" L"\x0001d4d0" L"\0" L"\x0001d4d1" L"\0"
- L"\x0001d4d2" L"\0" L"\x0001d4d3" L"\0" L"\x0001d4d4" L"\0" L"\x0001d4d5"
- L"\0" L"\x0001d4d6" L"\0" L"\x0001d4d7" L"\0" L"\x0001d4d8" L"\0"
- L"\x0001d4d9" L"\0" L"\x0001d4da" L"\0" L"\x0001d4db" L"\0" L"\x0001d4dc"
- L"\0" L"\x0001d4dd" L"\0" L"\x0001d4de" L"\0" L"\x0001d4df" L"\0"
- L"\x0001d4e0" L"\0" L"\x0001d4e1" L"\0" L"\x0001d4e2" L"\0" L"\x0001d4e3"
- L"\0" L"\x0001d4e4" L"\0" L"\x0001d4e5" L"\0" L"\x0001d4e6" L"\0"
- L"\x0001d4e7" L"\0" L"\x0001d4e8" L"\0" L"\x0001d4e9" L"\0" L"\x0001d4ea"
- L"\0" L"\x0001d4eb" L"\0" L"\x0001d4ec" L"\0" L"\x0001d4ed" L"\0"
- L"\x0001d4ee" L"\0" L"\x0001d4ef" L"\0" L"\x0001d4f0" L"\0" L"\x0001d4f1"
- L"\0" L"\x0001d4f2" L"\0" L"\x0001d4f3" L"\0" L"\x0001d4f4" L"\0"
- L"\x0001d4f5" L"\0" L"\x0001d4f6" L"\0" L"\x0001d4f7" L"\0" L"\x0001d4f8"
- L"\0" L"\x0001d4f9" L"\0" L"\x0001d4fa" L"\0" L"\x0001d4fb" L"\0"
- L"\x0001d4fc" L"\0" L"\x0001d4fd" L"\0" L"\x0001d4fe" L"\0" L"\x0001d4ff"
- L"\0" L"\x0001d500" L"\0" L"\x0001d501" L"\0" L"\x0001d502" L"\0"
- L"\x0001d503" L"\0" L"\x0001d504" L"\0" L"\x0001d505" L"\0" L"\x0001d507"
- L"\0" L"\x0001d508" L"\0" L"\x0001d509" L"\0" L"\x0001d50a" L"\0"
- L"\x0001d50d" L"\0" L"\x0001d50e" L"\0" L"\x0001d50f" L"\0" L"\x0001d510"
- L"\0" L"\x0001d511" L"\0" L"\x0001d512" L"\0" L"\x0001d513" L"\0"
- L"\x0001d514" L"\0" L"\x0001d516" L"\0" L"\x0001d517" L"\0" L"\x0001d518"
- L"\0" L"\x0001d519" L"\0" L"\x0001d51a" L"\0" L"\x0001d51b" L"\0"
- L"\x0001d51c" L"\0" L"\x0001d51e" L"\0" L"\x0001d51f" L"\0" L"\x0001d520"
- L"\0" L"\x0001d521" L"\0" L"\x0001d522" L"\0" L"\x0001d523" L"\0"
- L"\x0001d524" L"\0" L"\x0001d525" L"\0" L"\x0001d526" L"\0" L"\x0001d527"
- L"\0" L"\x0001d528" L"\0" L"\x0001d529" L"\0" L"\x0001d52a" L"\0"
- L"\x0001d52b" L"\0" L"\x0001d52c" L"\0" L"\x0001d52d" L"\0" L"\x0001d52e"
- L"\0" L"\x0001d52f" L"\0" L"\x0001d530" L"\0" L"\x0001d531" L"\0"
- L"\x0001d532" L"\0" L"\x0001d533" L"\0" L"\x0001d534" L"\0" L"\x0001d535"
- L"\0" L"\x0001d536" L"\0" L"\x0001d537" L"\0" L"\x0001d538" L"\0"
- L"\x0001d539" L"\0" L"\x0001d53b" L"\0" L"\x0001d53c" L"\0" L"\x0001d53d"
- L"\0" L"\x0001d53e" L"\0" L"\x0001d540" L"\0" L"\x0001d541" L"\0"
- L"\x0001d542" L"\0" L"\x0001d543" L"\0" L"\x0001d544" L"\0" L"\x0001d546"
- L"\0" L"\x0001d54a" L"\0" L"\x0001d54b" L"\0" L"\x0001d54c" L"\0"
- L"\x0001d54d" L"\0" L"\x0001d54e" L"\0" L"\x0001d54f" L"\0" L"\x0001d550"
- L"\0" L"\x0001d552" L"\0" L"\x0001d553" L"\0" L"\x0001d554" L"\0"
- L"\x0001d555" L"\0" L"\x0001d556" L"\0" L"\x0001d557" L"\0" L"\x0001d558"
- L"\0" L"\x0001d559" L"\0" L"\x0001d55a" L"\0" L"\x0001d55b" L"\0"
- L"\x0001d55c" L"\0" L"\x0001d55d" L"\0" L"\x0001d55e" L"\0" L"\x0001d55f"
- L"\0" L"\x0001d560" L"\0" L"\x0001d561" L"\0" L"\x0001d562" L"\0"
- L"\x0001d563" L"\0" L"\x0001d564" L"\0" L"\x0001d565" L"\0" L"\x0001d566"
- L"\0" L"\x0001d567" L"\0" L"\x0001d568" L"\0" L"\x0001d569" L"\0"
- L"\x0001d56a" L"\0" L"\x0001d56b" L"\0" L"\x0001d56c" L"\0" L"\x0001d56d"
- L"\0" L"\x0001d56e" L"\0" L"\x0001d56f" L"\0" L"\x0001d570" L"\0"
- L"\x0001d571" L"\0" L"\x0001d572" L"\0" L"\x0001d573" L"\0" L"\x0001d574"
- L"\0" L"\x0001d575" L"\0" L"\x0001d576" L"\0" L"\x0001d577" L"\0"
- L"\x0001d578" L"\0" L"\x0001d579" L"\0" L"\x0001d57a" L"\0" L"\x0001d57b"
- L"\0" L"\x0001d57c" L"\0" L"\x0001d57d" L"\0" L"\x0001d57e" L"\0"
- L"\x0001d57f" L"\0" L"\x0001d580" L"\0" L"\x0001d581" L"\0" L"\x0001d582"
- L"\0" L"\x0001d583" L"\0" L"\x0001d584" L"\0" L"\x0001d585" L"\0"
- L"\x0001d586" L"\0" L"\x0001d587" L"\0" L"\x0001d588" L"\0" L"\x0001d589"
- L"\0" L"\x0001d58a" L"\0" L"\x0001d58b" L"\0" L"\x0001d58c" L"\0"
- L"\x0001d58d" L"\0" L"\x0001d58e" L"\0" L"\x0001d58f" L"\0" L"\x0001d590"
- L"\0" L"\x0001d591" L"\0" L"\x0001d592" L"\0" L"\x0001d593" L"\0"
- L"\x0001d594" L"\0" L"\x0001d595" L"\0" L"\x0001d596" L"\0" L"\x0001d597"
- L"\0" L"\x0001d598" L"\0" L"\x0001d599" L"\0" L"\x0001d59a" L"\0"
- L"\x0001d59b" L"\0" L"\x0001d59c" L"\0" L"\x0001d59d" L"\0" L"\x0001d59e"
- L"\0" L"\x0001d59f" L"\0" L"\x0001d5a0" L"\0" L"\x0001d5a1" L"\0"
- L"\x0001d5a2" L"\0" L"\x0001d5a3" L"\0" L"\x0001d5a4" L"\0" L"\x0001d5a5"
- L"\0" L"\x0001d5a6" L"\0" L"\x0001d5a7" L"\0" L"\x0001d5a8" L"\0"
- L"\x0001d5a9" L"\0" L"\x0001d5aa" L"\0" L"\x0001d5ab" L"\0" L"\x0001d5ac"
- L"\0" L"\x0001d5ad" L"\0" L"\x0001d5ae" L"\0" L"\x0001d5af" L"\0"
- L"\x0001d5b0" L"\0" L"\x0001d5b1" L"\0" L"\x0001d5b2" L"\0" L"\x0001d5b3"
- L"\0" L"\x0001d5b4" L"\0" L"\x0001d5b5" L"\0" L"\x0001d5b6" L"\0"
- L"\x0001d5b7" L"\0" L"\x0001d5b8" L"\0" L"\x0001d5b9" L"\0" L"\x0001d5ba"
- L"\0" L"\x0001d5bb" L"\0" L"\x0001d5bc" L"\0" L"\x0001d5bd" L"\0"
- L"\x0001d5be" L"\0" L"\x0001d5bf" L"\0" L"\x0001d5c0" L"\0" L"\x0001d5c1"
- L"\0" L"\x0001d5c2" L"\0" L"\x0001d5c3" L"\0" L"\x0001d5c4" L"\0"
- L"\x0001d5c5" L"\0" L"\x0001d5c6" L"\0" L"\x0001d5c7" L"\0" L"\x0001d5c8"
- L"\0" L"\x0001d5c9" L"\0" L"\x0001d5ca" L"\0" L"\x0001d5cb" L"\0"
- L"\x0001d5cc" L"\0" L"\x0001d5cd" L"\0" L"\x0001d5ce" L"\0" L"\x0001d5cf"
- L"\0" L"\x0001d5d0" L"\0" L"\x0001d5d1" L"\0" L"\x0001d5d2" L"\0"
- L"\x0001d5d3" L"\0" L"\x0001d5d4" L"\0" L"\x0001d5d5" L"\0" L"\x0001d5d6"
- L"\0" L"\x0001d5d7" L"\0" L"\x0001d5d8" L"\0" L"\x0001d5d9" L"\0"
- L"\x0001d5da" L"\0" L"\x0001d5db" L"\0" L"\x0001d5dc" L"\0" L"\x0001d5dd"
- L"\0" L"\x0001d5de" L"\0" L"\x0001d5df" L"\0" L"\x0001d5e0" L"\0"
- L"\x0001d5e1" L"\0" L"\x0001d5e2" L"\0" L"\x0001d5e3" L"\0" L"\x0001d5e4"
- L"\0" L"\x0001d5e5" L"\0" L"\x0001d5e6" L"\0" L"\x0001d5e7" L"\0"
- L"\x0001d5e8" L"\0" L"\x0001d5e9" L"\0" L"\x0001d5ea" L"\0" L"\x0001d5eb"
- L"\0" L"\x0001d5ec" L"\0" L"\x0001d5ed" L"\0" L"\x0001d5ee" L"\0"
- L"\x0001d5ef" L"\0" L"\x0001d5f0" L"\0" L"\x0001d5f1" L"\0" L"\x0001d5f2"
- L"\0" L"\x0001d5f3" L"\0" L"\x0001d5f4" L"\0" L"\x0001d5f5" L"\0"
- L"\x0001d5f6" L"\0" L"\x0001d5f7" L"\0" L"\x0001d5f8" L"\0" L"\x0001d5f9"
- L"\0" L"\x0001d5fa" L"\0" L"\x0001d5fb" L"\0" L"\x0001d5fc" L"\0"
- L"\x0001d5fd" L"\0" L"\x0001d5fe" L"\0" L"\x0001d5ff" L"\0" L"\x0001d600"
- L"\0" L"\x0001d601" L"\0" L"\x0001d602" L"\0" L"\x0001d603" L"\0"
- L"\x0001d604" L"\0" L"\x0001d605" L"\0" L"\x0001d606" L"\0" L"\x0001d607"
- L"\0" L"\x0001d608" L"\0" L"\x0001d609" L"\0" L"\x0001d60a" L"\0"
- L"\x0001d60b" L"\0" L"\x0001d60c" L"\0" L"\x0001d60d" L"\0" L"\x0001d60e"
- L"\0" L"\x0001d60f" L"\0" L"\x0001d610" L"\0" L"\x0001d611" L"\0"
- L"\x0001d612" L"\0" L"\x0001d613" L"\0" L"\x0001d614" L"\0" L"\x0001d615"
- L"\0" L"\x0001d616" L"\0" L"\x0001d617" L"\0" L"\x0001d618" L"\0"
- L"\x0001d619" L"\0" L"\x0001d61a" L"\0" L"\x0001d61b" L"\0" L"\x0001d61c"
- L"\0" L"\x0001d61d" L"\0" L"\x0001d61e" L"\0" L"\x0001d61f" L"\0"
- L"\x0001d620" L"\0" L"\x0001d621" L"\0" L"\x0001d622" L"\0" L"\x0001d623"
- L"\0" L"\x0001d624" L"\0" L"\x0001d625" L"\0" L"\x0001d626" L"\0"
- L"\x0001d627" L"\0" L"\x0001d628" L"\0" L"\x0001d629" L"\0" L"\x0001d62a"
- L"\0" L"\x0001d62b" L"\0" L"\x0001d62c" L"\0" L"\x0001d62d" L"\0"
- L"\x0001d62e" L"\0" L"\x0001d62f" L"\0" L"\x0001d630" L"\0" L"\x0001d631"
- L"\0" L"\x0001d632" L"\0" L"\x0001d633" L"\0" L"\x0001d634" L"\0"
- L"\x0001d635" L"\0" L"\x0001d636" L"\0" L"\x0001d637" L"\0" L"\x0001d638"
- L"\0" L"\x0001d639" L"\0" L"\x0001d63a" L"\0" L"\x0001d63b" L"\0"
- L"\x0001d63c" L"\0" L"\x0001d63d" L"\0" L"\x0001d63e" L"\0" L"\x0001d63f"
- L"\0" L"\x0001d640" L"\0" L"\x0001d641" L"\0" L"\x0001d642" L"\0"
- L"\x0001d643" L"\0" L"\x0001d644" L"\0" L"\x0001d645" L"\0" L"\x0001d646"
- L"\0" L"\x0001d647" L"\0" L"\x0001d648" L"\0" L"\x0001d649" L"\0"
- L"\x0001d64a" L"\0" L"\x0001d64b" L"\0" L"\x0001d64c" L"\0" L"\x0001d64d"
- L"\0" L"\x0001d64e" L"\0" L"\x0001d64f" L"\0" L"\x0001d650" L"\0"
- L"\x0001d651" L"\0" L"\x0001d652" L"\0" L"\x0001d653" L"\0" L"\x0001d654"
- L"\0" L"\x0001d655" L"\0" L"\x0001d656" L"\0" L"\x0001d657" L"\0"
- L"\x0001d658" L"\0" L"\x0001d659" L"\0" L"\x0001d65a" L"\0" L"\x0001d65b"
- L"\0" L"\x0001d65c" L"\0" L"\x0001d65d" L"\0" L"\x0001d65e" L"\0"
- L"\x0001d65f" L"\0" L"\x0001d660" L"\0" L"\x0001d661" L"\0" L"\x0001d662"
- L"\0" L"\x0001d663" L"\0" L"\x0001d664" L"\0" L"\x0001d665" L"\0"
- L"\x0001d666" L"\0" L"\x0001d667" L"\0" L"\x0001d668" L"\0" L"\x0001d669"
- L"\0" L"\x0001d66a" L"\0" L"\x0001d66b" L"\0" L"\x0001d66c" L"\0"
- L"\x0001d66d" L"\0" L"\x0001d66e" L"\0" L"\x0001d66f" L"\0" L"\x0001d670"
- L"\0" L"\x0001d671" L"\0" L"\x0001d672" L"\0" L"\x0001d673" L"\0"
- L"\x0001d674" L"\0" L"\x0001d675" L"\0" L"\x0001d676" L"\0" L"\x0001d677"
- L"\0" L"\x0001d678" L"\0" L"\x0001d679" L"\0" L"\x0001d67a" L"\0"
- L"\x0001d67b" L"\0" L"\x0001d67c" L"\0" L"\x0001d67d" L"\0" L"\x0001d67e"
- L"\0" L"\x0001d67f" L"\0" L"\x0001d680" L"\0" L"\x0001d681" L"\0"
- L"\x0001d682" L"\0" L"\x0001d683" L"\0" L"\x0001d684" L"\0" L"\x0001d685"
- L"\0" L"\x0001d686" L"\0" L"\x0001d687" L"\0" L"\x0001d688" L"\0"
- L"\x0001d689" L"\0" L"\x0001d68a" L"\0" L"\x0001d68b" L"\0" L"\x0001d68c"
- L"\0" L"\x0001d68d" L"\0" L"\x0001d68e" L"\0" L"\x0001d68f" L"\0"
- L"\x0001d690" L"\0" L"\x0001d691" L"\0" L"\x0001d692" L"\0" L"\x0001d693"
- L"\0" L"\x0001d694" L"\0" L"\x0001d695" L"\0" L"\x0001d696" L"\0"
- L"\x0001d697" L"\0" L"\x0001d698" L"\0" L"\x0001d699" L"\0" L"\x0001d69a"
- L"\0" L"\x0001d69b" L"\0" L"\x0001d69c" L"\0" L"\x0001d69d" L"\0"
- L"\x0001d69e" L"\0" L"\x0001d69f" L"\0" L"\x0001d6a0" L"\0" L"\x0001d6a1"
- L"\0" L"\x0001d6a2" L"\0" L"\x0001d6a3" L"\0" L"\x0001d7ce" L"\0"
- L"\x0001d7cf" L"\0" L"\x0001d7d0" L"\0" L"\x0001d7d1" L"\0" L"\x0001d7d2"
- L"\0" L"\x0001d7d3" L"\0" L"\x0001d7d4" L"\0" L"\x0001d7d5" L"\0"
- L"\x0001d7d6" L"\0" L"\x0001d7d7" L"\0" L"\x0001d7d8" L"\0" L"\x0001d7d9"
- L"\0" L"\x0001d7da" L"\0" L"\x0001d7db" L"\0" L"\x0001d7dc" L"\0"
- L"\x0001d7dd" L"\0" L"\x0001d7de" L"\0" L"\x0001d7df" L"\0" L"\x0001d7e0"
- L"\0" L"\x0001d7e1" L"\0" L"\x0001d7e2" L"\0" L"\x0001d7e3" L"\0"
- L"\x0001d7e4" L"\0" L"\x0001d7e5" L"\0" L"\x0001d7e6" L"\0" L"\x0001d7e7"
- L"\0" L"\x0001d7e8" L"\0" L"\x0001d7e9" L"\0" L"\x0001d7ea" L"\0"
- L"\x0001d7eb" L"\0" L"\x0001d7ec" L"\0" L"\x0001d7ed" L"\0" L"\x0001d7ee"
- L"\0" L"\x0001d7ef" L"\0" L"\x0001d7f0" L"\0" L"\x0001d7f1" L"\0"
- L"\x0001d7f2" L"\0" L"\x0001d7f3" L"\0" L"\x0001d7f4" L"\0" L"\x0001d7f5"
- L"\0" L"\x0001d7f6" L"\0" L"\x0001d7f7" L"\0" L"\x0001d7f8" L"\0"
- L"\x0001d7f9" L"\0" L"\x0001d7fa" L"\0" L"\x0001d7fb" L"\0" L"\x0001d7fc"
- L"\0" L"\x0001d7fd" L"\0" L"\x0001d7fe" L"\0" L"\x0001d7ff";
+ L"\x203a" L"\0" L"\x203c" L"\0" L"\x2044" L"\0" L"\x2047" L"\0" L"\x2048"
+ L"\0" L"\x2049" L"\0" L"\x205f" L"\0" L"\x2060" L"\0" L"\x2061" L"\0"
+ L"\x2062" L"\0" L"\x2063" L"\0" L"\x20a8" L"\0" L"\x20ac" L"\0" L"\x2100"
+ L"\0" L"\x2101" L"\0" L"\x2102" L"\0" L"\x2105" L"\0" L"\x2106" L"\0"
+ L"\x210a" L"\0" L"\x210b" L"\0" L"\x210c" L"\0" L"\x210d" L"\0" L"\x210e"
+ L"\0" L"\x2110" L"\0" L"\x2111" L"\0" L"\x2112" L"\0" L"\x2113" L"\0"
+ L"\x2115" L"\0" L"\x2116" L"\0" L"\x2119" L"\0" L"\x211a" L"\0" L"\x211b"
+ L"\0" L"\x211c" L"\0" L"\x211d" L"\0" L"\x2121" L"\0" L"\x2122" L"\0"
+ L"\x2124" L"\0" L"\x2126" L"\0" L"\x2128" L"\0" L"\x212c" L"\0" L"\x212d"
+ L"\0" L"\x212e" L"\0" L"\x212f" L"\0" L"\x2130" L"\0" L"\x2131" L"\0"
+ L"\x2133" L"\0" L"\x2134" L"\0" L"\x2139" L"\0" L"\x2145" L"\0" L"\x2146"
+ L"\0" L"\x2147" L"\0" L"\x2148" L"\0" L"\x2149" L"\0" L"\x2153" L"\0"
+ L"\x2154" L"\0" L"\x2155" L"\0" L"\x2156" L"\0" L"\x2157" L"\0" L"\x2158"
+ L"\0" L"\x2159" L"\0" L"\x215a" L"\0" L"\x215b" L"\0" L"\x215c" L"\0"
+ L"\x215d" L"\0" L"\x215e" L"\0" L"\x215f" L"\0" L"\x2160" L"\0" L"\x2161"
+ L"\0" L"\x2162" L"\0" L"\x2163" L"\0" L"\x2164" L"\0" L"\x2165" L"\0"
+ L"\x2166" L"\0" L"\x2167" L"\0" L"\x2168" L"\0" L"\x2169" L"\0" L"\x216a"
+ L"\0" L"\x216b" L"\0" L"\x216c" L"\0" L"\x216d" L"\0" L"\x216e" L"\0"
+ L"\x216f" L"\0" L"\x2170" L"\0" L"\x2171" L"\0" L"\x2172" L"\0" L"\x2173"
+ L"\0" L"\x2174" L"\0" L"\x2175" L"\0" L"\x2176" L"\0" L"\x2177" L"\0"
+ L"\x2178" L"\0" L"\x2179" L"\0" L"\x217a" L"\0" L"\x217b" L"\0" L"\x217c"
+ L"\0" L"\x217d" L"\0" L"\x217e" L"\0" L"\x217f" L"\0" L"\x2190" L"\0"
+ L"\x2192" L"\0" L"\x2194" L"\0" L"\x21d0" L"\0" L"\x21d2" L"\0" L"\x21d4"
+ L"\0" L"\x2212" L"\0" L"\x2215" L"\0" L"\x2216" L"\0" L"\x2217" L"\0"
+ L"\x2223" L"\0" L"\x2236" L"\0" L"\x223c" L"\0" L"\x2264" L"\0" L"\x2265"
+ L"\0" L"\x226a" L"\0" L"\x226b" L"\0" L"\x22d8" L"\0" L"\x22d9" L"\0"
+ L"\x2400" L"\0" L"\x2401" L"\0" L"\x2402" L"\0" L"\x2403" L"\0" L"\x2404"
+ L"\0" L"\x2405" L"\0" L"\x2406" L"\0" L"\x2407" L"\0" L"\x2408" L"\0"
+ L"\x2409" L"\0" L"\x240a" L"\0" L"\x240b" L"\0" L"\x240c" L"\0" L"\x240d"
+ L"\0" L"\x240e" L"\0" L"\x240f" L"\0" L"\x2410" L"\0" L"\x2411" L"\0"
+ L"\x2412" L"\0" L"\x2413" L"\0" L"\x2414" L"\0" L"\x2415" L"\0" L"\x2416"
+ L"\0" L"\x2417" L"\0" L"\x2418" L"\0" L"\x2419" L"\0" L"\x241a" L"\0"
+ L"\x241b" L"\0" L"\x241c" L"\0" L"\x241d" L"\0" L"\x241e" L"\0" L"\x241f"
+ L"\0" L"\x2420" L"\0" L"\x2421" L"\0" L"\x2423" L"\0" L"\x2424" L"\0"
+ L"\x2460" L"\0" L"\x2461" L"\0" L"\x2462" L"\0" L"\x2463" L"\0" L"\x2464"
+ L"\0" L"\x2465" L"\0" L"\x2466" L"\0" L"\x2467" L"\0" L"\x2468" L"\0"
+ L"\x2469" L"\0" L"\x246a" L"\0" L"\x246b" L"\0" L"\x246c" L"\0" L"\x246d"
+ L"\0" L"\x246e" L"\0" L"\x246f" L"\0" L"\x2470" L"\0" L"\x2471" L"\0"
+ L"\x2472" L"\0" L"\x2473" L"\0" L"\x2474" L"\0" L"\x2475" L"\0" L"\x2476"
+ L"\0" L"\x2477" L"\0" L"\x2478" L"\0" L"\x2479" L"\0" L"\x247a" L"\0"
+ L"\x247b" L"\0" L"\x247c" L"\0" L"\x247d" L"\0" L"\x247e" L"\0" L"\x247f"
+ L"\0" L"\x2480" L"\0" L"\x2481" L"\0" L"\x2482" L"\0" L"\x2483" L"\0"
+ L"\x2484" L"\0" L"\x2485" L"\0" L"\x2486" L"\0" L"\x2487" L"\0" L"\x2488"
+ L"\0" L"\x2489" L"\0" L"\x248a" L"\0" L"\x248b" L"\0" L"\x248c" L"\0"
+ L"\x248d" L"\0" L"\x248e" L"\0" L"\x248f" L"\0" L"\x2490" L"\0" L"\x2491"
+ L"\0" L"\x2492" L"\0" L"\x2493" L"\0" L"\x2494" L"\0" L"\x2495" L"\0"
+ L"\x2496" L"\0" L"\x2497" L"\0" L"\x2498" L"\0" L"\x2499" L"\0" L"\x249a"
+ L"\0" L"\x249b" L"\0" L"\x249c" L"\0" L"\x249d" L"\0" L"\x249e" L"\0"
+ L"\x249f" L"\0" L"\x24a0" L"\0" L"\x24a1" L"\0" L"\x24a2" L"\0" L"\x24a3"
+ L"\0" L"\x24a4" L"\0" L"\x24a5" L"\0" L"\x24a6" L"\0" L"\x24a7" L"\0"
+ L"\x24a8" L"\0" L"\x24a9" L"\0" L"\x24aa" L"\0" L"\x24ab" L"\0" L"\x24ac"
+ L"\0" L"\x24ad" L"\0" L"\x24ae" L"\0" L"\x24af" L"\0" L"\x24b0" L"\0"
+ L"\x24b1" L"\0" L"\x24b2" L"\0" L"\x24b3" L"\0" L"\x24b4" L"\0" L"\x24b5"
+ L"\0" L"\x24b6" L"\0" L"\x24b7" L"\0" L"\x24b8" L"\0" L"\x24b9" L"\0"
+ L"\x24ba" L"\0" L"\x24bb" L"\0" L"\x24bc" L"\0" L"\x24bd" L"\0" L"\x24be"
+ L"\0" L"\x24bf" L"\0" L"\x24c0" L"\0" L"\x24c1" L"\0" L"\x24c2" L"\0"
+ L"\x24c3" L"\0" L"\x24c4" L"\0" L"\x24c5" L"\0" L"\x24c6" L"\0" L"\x24c7"
+ L"\0" L"\x24c8" L"\0" L"\x24c9" L"\0" L"\x24ca" L"\0" L"\x24cb" L"\0"
+ L"\x24cc" L"\0" L"\x24cd" L"\0" L"\x24ce" L"\0" L"\x24cf" L"\0" L"\x24d0"
+ L"\0" L"\x24d1" L"\0" L"\x24d2" L"\0" L"\x24d3" L"\0" L"\x24d4" L"\0"
+ L"\x24d5" L"\0" L"\x24d6" L"\0" L"\x24d7" L"\0" L"\x24d8" L"\0" L"\x24d9"
+ L"\0" L"\x24da" L"\0" L"\x24db" L"\0" L"\x24dc" L"\0" L"\x24dd" L"\0"
+ L"\x24de" L"\0" L"\x24df" L"\0" L"\x24e0" L"\0" L"\x24e1" L"\0" L"\x24e2"
+ L"\0" L"\x24e3" L"\0" L"\x24e4" L"\0" L"\x24e5" L"\0" L"\x24e6" L"\0"
+ L"\x24e7" L"\0" L"\x24e8" L"\0" L"\x24e9" L"\0" L"\x24ea" L"\0" L"\x2500"
+ L"\0" L"\x2502" L"\0" L"\x250c" L"\0" L"\x2510" L"\0" L"\x2514" L"\0"
+ L"\x2518" L"\0" L"\x251c" L"\0" L"\x2524" L"\0" L"\x252c" L"\0" L"\x2534"
+ L"\0" L"\x253c" L"\0" L"\x25e6" L"\0" L"\x2a74" L"\0" L"\x2a75" L"\0"
+ L"\x2a76" L"\0" L"\x3000" L"\0" L"\x30a0" L"\0" L"\x3251" L"\0" L"\x3252"
+ L"\0" L"\x3253" L"\0" L"\x3254" L"\0" L"\x3255" L"\0" L"\x3256" L"\0"
+ L"\x3257" L"\0" L"\x3258" L"\0" L"\x3259" L"\0" L"\x325a" L"\0" L"\x325b"
+ L"\0" L"\x325c" L"\0" L"\x325d" L"\0" L"\x325e" L"\0" L"\x325f" L"\0"
+ L"\x32b1" L"\0" L"\x32b2" L"\0" L"\x32b3" L"\0" L"\x32b4" L"\0" L"\x32b5"
+ L"\0" L"\x32b6" L"\0" L"\x32b7" L"\0" L"\x32b8" L"\0" L"\x32b9" L"\0"
+ L"\x32ba" L"\0" L"\x32bb" L"\0" L"\x32bc" L"\0" L"\x32bd" L"\0" L"\x32be"
+ L"\0" L"\x32bf" L"\0" L"\x3371" L"\0" L"\x3372" L"\0" L"\x3373" L"\0"
+ L"\x3374" L"\0" L"\x3375" L"\0" L"\x3376" L"\0" L"\x3380" L"\0" L"\x3381"
+ L"\0" L"\x3382" L"\0" L"\x3383" L"\0" L"\x3384" L"\0" L"\x3385" L"\0"
+ L"\x3386" L"\0" L"\x3387" L"\0" L"\x3388" L"\0" L"\x3389" L"\0" L"\x338a"
+ L"\0" L"\x338b" L"\0" L"\x338c" L"\0" L"\x338d" L"\0" L"\x338e" L"\0"
+ L"\x338f" L"\0" L"\x3390" L"\0" L"\x3391" L"\0" L"\x3392" L"\0" L"\x3393"
+ L"\0" L"\x3394" L"\0" L"\x3395" L"\0" L"\x3396" L"\0" L"\x3397" L"\0"
+ L"\x3398" L"\0" L"\x3399" L"\0" L"\x339a" L"\0" L"\x339b" L"\0" L"\x339c"
+ L"\0" L"\x339d" L"\0" L"\x339e" L"\0" L"\x339f" L"\0" L"\x33a0" L"\0"
+ L"\x33a1" L"\0" L"\x33a2" L"\0" L"\x33a3" L"\0" L"\x33a4" L"\0" L"\x33a5"
+ L"\0" L"\x33a6" L"\0" L"\x33a7" L"\0" L"\x33a8" L"\0" L"\x33a9" L"\0"
+ L"\x33aa" L"\0" L"\x33ab" L"\0" L"\x33ac" L"\0" L"\x33ad" L"\0" L"\x33ae"
+ L"\0" L"\x33af" L"\0" L"\x33b0" L"\0" L"\x33b1" L"\0" L"\x33b2" L"\0"
+ L"\x33b3" L"\0" L"\x33b4" L"\0" L"\x33b5" L"\0" L"\x33b6" L"\0" L"\x33b7"
+ L"\0" L"\x33b8" L"\0" L"\x33b9" L"\0" L"\x33ba" L"\0" L"\x33bb" L"\0"
+ L"\x33bc" L"\0" L"\x33bd" L"\0" L"\x33be" L"\0" L"\x33bf" L"\0" L"\x33c2"
+ L"\0" L"\x33c3" L"\0" L"\x33c4" L"\0" L"\x33c5" L"\0" L"\x33c6" L"\0"
+ L"\x33c7" L"\0" L"\x33c8" L"\0" L"\x33c9" L"\0" L"\x33ca" L"\0" L"\x33cb"
+ L"\0" L"\x33cc" L"\0" L"\x33cd" L"\0" L"\x33ce" L"\0" L"\x33cf" L"\0"
+ L"\x33d0" L"\0" L"\x33d1" L"\0" L"\x33d2" L"\0" L"\x33d3" L"\0" L"\x33d4"
+ L"\0" L"\x33d5" L"\0" L"\x33d6" L"\0" L"\x33d7" L"\0" L"\x33d8" L"\0"
+ L"\x33d9" L"\0" L"\x33da" L"\0" L"\x33db" L"\0" L"\x33dc" L"\0" L"\x33dd"
+ L"\0" L"\xfb00" L"\0" L"\xfb01" L"\0" L"\xfb02" L"\0" L"\xfb03" L"\0"
+ L"\xfb04" L"\0" L"\xfb06" L"\0" L"\xfb29" L"\0" L"\xfe00" L"\0" L"\xfe01"
+ L"\0" L"\xfe02" L"\0" L"\xfe03" L"\0" L"\xfe04" L"\0" L"\xfe05" L"\0"
+ L"\xfe06" L"\0" L"\xfe07" L"\0" L"\xfe08" L"\0" L"\xfe09" L"\0" L"\xfe0a"
+ L"\0" L"\xfe0b" L"\0" L"\xfe0c" L"\0" L"\xfe0d" L"\0" L"\xfe0e" L"\0"
+ L"\xfe0f" L"\0" L"\xfe4d" L"\0" L"\xfe4e" L"\0" L"\xfe4f" L"\0" L"\xfe50"
+ L"\0" L"\xfe52" L"\0" L"\xfe54" L"\0" L"\xfe55" L"\0" L"\xfe56" L"\0"
+ L"\xfe57" L"\0" L"\xfe59" L"\0" L"\xfe5a" L"\0" L"\xfe5b" L"\0" L"\xfe5c"
+ L"\0" L"\xfe5f" L"\0" L"\xfe60" L"\0" L"\xfe61" L"\0" L"\xfe62" L"\0"
+ L"\xfe63" L"\0" L"\xfe64" L"\0" L"\xfe65" L"\0" L"\xfe66" L"\0" L"\xfe68"
+ L"\0" L"\xfe69" L"\0" L"\xfe6a" L"\0" L"\xfe6b" L"\0" L"\xfeff" L"\0"
+ L"\xff01" L"\0" L"\xff02" L"\0" L"\xff03" L"\0" L"\xff04" L"\0" L"\xff05"
+ L"\0" L"\xff06" L"\0" L"\xff07" L"\0" L"\xff08" L"\0" L"\xff09" L"\0"
+ L"\xff0a" L"\0" L"\xff0b" L"\0" L"\xff0c" L"\0" L"\xff0d" L"\0" L"\xff0e"
+ L"\0" L"\xff0f" L"\0" L"\xff10" L"\0" L"\xff11" L"\0" L"\xff12" L"\0"
+ L"\xff13" L"\0" L"\xff14" L"\0" L"\xff15" L"\0" L"\xff16" L"\0" L"\xff17"
+ L"\0" L"\xff18" L"\0" L"\xff19" L"\0" L"\xff1a" L"\0" L"\xff1b" L"\0"
+ L"\xff1c" L"\0" L"\xff1d" L"\0" L"\xff1e" L"\0" L"\xff1f" L"\0" L"\xff20"
+ L"\0" L"\xff21" L"\0" L"\xff22" L"\0" L"\xff23" L"\0" L"\xff24" L"\0"
+ L"\xff25" L"\0" L"\xff26" L"\0" L"\xff27" L"\0" L"\xff28" L"\0" L"\xff29"
+ L"\0" L"\xff2a" L"\0" L"\xff2b" L"\0" L"\xff2c" L"\0" L"\xff2d" L"\0"
+ L"\xff2e" L"\0" L"\xff2f" L"\0" L"\xff30" L"\0" L"\xff31" L"\0" L"\xff32"
+ L"\0" L"\xff33" L"\0" L"\xff34" L"\0" L"\xff35" L"\0" L"\xff36" L"\0"
+ L"\xff37" L"\0" L"\xff38" L"\0" L"\xff39" L"\0" L"\xff3a" L"\0" L"\xff3b"
+ L"\0" L"\xff3c" L"\0" L"\xff3d" L"\0" L"\xff3e" L"\0" L"\xff3f" L"\0"
+ L"\xff40" L"\0" L"\xff41" L"\0" L"\xff42" L"\0" L"\xff43" L"\0" L"\xff44"
+ L"\0" L"\xff45" L"\0" L"\xff46" L"\0" L"\xff47" L"\0" L"\xff48" L"\0"
+ L"\xff49" L"\0" L"\xff4a" L"\0" L"\xff4b" L"\0" L"\xff4c" L"\0" L"\xff4d"
+ L"\0" L"\xff4e" L"\0" L"\xff4f" L"\0" L"\xff50" L"\0" L"\xff51" L"\0"
+ L"\xff52" L"\0" L"\xff53" L"\0" L"\xff54" L"\0" L"\xff55" L"\0" L"\xff56"
+ L"\0" L"\xff57" L"\0" L"\xff58" L"\0" L"\xff59" L"\0" L"\xff5a" L"\0"
+ L"\xff5b" L"\0" L"\xff5c" L"\0" L"\xff5d" L"\0" L"\xff5e" L"\0"
+ L"\x0001d400" L"\0" L"\x0001d401" L"\0" L"\x0001d402" L"\0" L"\x0001d403"
+ L"\0" L"\x0001d404" L"\0" L"\x0001d405" L"\0" L"\x0001d406" L"\0"
+ L"\x0001d407" L"\0" L"\x0001d408" L"\0" L"\x0001d409" L"\0" L"\x0001d40a"
+ L"\0" L"\x0001d40b" L"\0" L"\x0001d40c" L"\0" L"\x0001d40d" L"\0"
+ L"\x0001d40e" L"\0" L"\x0001d40f" L"\0" L"\x0001d410" L"\0" L"\x0001d411"
+ L"\0" L"\x0001d412" L"\0" L"\x0001d413" L"\0" L"\x0001d414" L"\0"
+ L"\x0001d415" L"\0" L"\x0001d416" L"\0" L"\x0001d417" L"\0" L"\x0001d418"
+ L"\0" L"\x0001d419" L"\0" L"\x0001d41a" L"\0" L"\x0001d41b" L"\0"
+ L"\x0001d41c" L"\0" L"\x0001d41d" L"\0" L"\x0001d41e" L"\0" L"\x0001d41f"
+ L"\0" L"\x0001d420" L"\0" L"\x0001d421" L"\0" L"\x0001d422" L"\0"
+ L"\x0001d423" L"\0" L"\x0001d424" L"\0" L"\x0001d425" L"\0" L"\x0001d426"
+ L"\0" L"\x0001d427" L"\0" L"\x0001d428" L"\0" L"\x0001d429" L"\0"
+ L"\x0001d42a" L"\0" L"\x0001d42b" L"\0" L"\x0001d42c" L"\0" L"\x0001d42d"
+ L"\0" L"\x0001d42e" L"\0" L"\x0001d42f" L"\0" L"\x0001d430" L"\0"
+ L"\x0001d431" L"\0" L"\x0001d432" L"\0" L"\x0001d433" L"\0" L"\x0001d434"
+ L"\0" L"\x0001d435" L"\0" L"\x0001d436" L"\0" L"\x0001d437" L"\0"
+ L"\x0001d438" L"\0" L"\x0001d439" L"\0" L"\x0001d43a" L"\0" L"\x0001d43b"
+ L"\0" L"\x0001d43c" L"\0" L"\x0001d43d" L"\0" L"\x0001d43e" L"\0"
+ L"\x0001d43f" L"\0" L"\x0001d440" L"\0" L"\x0001d441" L"\0" L"\x0001d442"
+ L"\0" L"\x0001d443" L"\0" L"\x0001d444" L"\0" L"\x0001d445" L"\0"
+ L"\x0001d446" L"\0" L"\x0001d447" L"\0" L"\x0001d448" L"\0" L"\x0001d449"
+ L"\0" L"\x0001d44a" L"\0" L"\x0001d44b" L"\0" L"\x0001d44c" L"\0"
+ L"\x0001d44d" L"\0" L"\x0001d44e" L"\0" L"\x0001d44f" L"\0" L"\x0001d450"
+ L"\0" L"\x0001d451" L"\0" L"\x0001d452" L"\0" L"\x0001d453" L"\0"
+ L"\x0001d454" L"\0" L"\x0001d456" L"\0" L"\x0001d457" L"\0" L"\x0001d458"
+ L"\0" L"\x0001d459" L"\0" L"\x0001d45a" L"\0" L"\x0001d45b" L"\0"
+ L"\x0001d45c" L"\0" L"\x0001d45d" L"\0" L"\x0001d45e" L"\0" L"\x0001d45f"
+ L"\0" L"\x0001d460" L"\0" L"\x0001d461" L"\0" L"\x0001d462" L"\0"
+ L"\x0001d463" L"\0" L"\x0001d464" L"\0" L"\x0001d465" L"\0" L"\x0001d466"
+ L"\0" L"\x0001d467" L"\0" L"\x0001d468" L"\0" L"\x0001d469" L"\0"
+ L"\x0001d46a" L"\0" L"\x0001d46b" L"\0" L"\x0001d46c" L"\0" L"\x0001d46d"
+ L"\0" L"\x0001d46e" L"\0" L"\x0001d46f" L"\0" L"\x0001d470" L"\0"
+ L"\x0001d471" L"\0" L"\x0001d472" L"\0" L"\x0001d473" L"\0" L"\x0001d474"
+ L"\0" L"\x0001d475" L"\0" L"\x0001d476" L"\0" L"\x0001d477" L"\0"
+ L"\x0001d478" L"\0" L"\x0001d479" L"\0" L"\x0001d47a" L"\0" L"\x0001d47b"
+ L"\0" L"\x0001d47c" L"\0" L"\x0001d47d" L"\0" L"\x0001d47e" L"\0"
+ L"\x0001d47f" L"\0" L"\x0001d480" L"\0" L"\x0001d481" L"\0" L"\x0001d482"
+ L"\0" L"\x0001d483" L"\0" L"\x0001d484" L"\0" L"\x0001d485" L"\0"
+ L"\x0001d486" L"\0" L"\x0001d487" L"\0" L"\x0001d488" L"\0" L"\x0001d489"
+ L"\0" L"\x0001d48a" L"\0" L"\x0001d48b" L"\0" L"\x0001d48c" L"\0"
+ L"\x0001d48d" L"\0" L"\x0001d48e" L"\0" L"\x0001d48f" L"\0" L"\x0001d490"
+ L"\0" L"\x0001d491" L"\0" L"\x0001d492" L"\0" L"\x0001d493" L"\0"
+ L"\x0001d494" L"\0" L"\x0001d495" L"\0" L"\x0001d496" L"\0" L"\x0001d497"
+ L"\0" L"\x0001d498" L"\0" L"\x0001d499" L"\0" L"\x0001d49a" L"\0"
+ L"\x0001d49b" L"\0" L"\x0001d49c" L"\0" L"\x0001d49e" L"\0" L"\x0001d49f"
+ L"\0" L"\x0001d4a2" L"\0" L"\x0001d4a5" L"\0" L"\x0001d4a6" L"\0"
+ L"\x0001d4a9" L"\0" L"\x0001d4aa" L"\0" L"\x0001d4ab" L"\0" L"\x0001d4ac"
+ L"\0" L"\x0001d4ae" L"\0" L"\x0001d4af" L"\0" L"\x0001d4b0" L"\0"
+ L"\x0001d4b1" L"\0" L"\x0001d4b2" L"\0" L"\x0001d4b3" L"\0" L"\x0001d4b4"
+ L"\0" L"\x0001d4b5" L"\0" L"\x0001d4b6" L"\0" L"\x0001d4b7" L"\0"
+ L"\x0001d4b8" L"\0" L"\x0001d4b9" L"\0" L"\x0001d4bb" L"\0" L"\x0001d4bd"
+ L"\0" L"\x0001d4be" L"\0" L"\x0001d4bf" L"\0" L"\x0001d4c0" L"\0"
+ L"\x0001d4c2" L"\0" L"\x0001d4c3" L"\0" L"\x0001d4c5" L"\0" L"\x0001d4c6"
+ L"\0" L"\x0001d4c7" L"\0" L"\x0001d4c8" L"\0" L"\x0001d4c9" L"\0"
+ L"\x0001d4ca" L"\0" L"\x0001d4cb" L"\0" L"\x0001d4cc" L"\0" L"\x0001d4cd"
+ L"\0" L"\x0001d4ce" L"\0" L"\x0001d4cf" L"\0" L"\x0001d4d0" L"\0"
+ L"\x0001d4d1" L"\0" L"\x0001d4d2" L"\0" L"\x0001d4d3" L"\0" L"\x0001d4d4"
+ L"\0" L"\x0001d4d5" L"\0" L"\x0001d4d6" L"\0" L"\x0001d4d7" L"\0"
+ L"\x0001d4d8" L"\0" L"\x0001d4d9" L"\0" L"\x0001d4da" L"\0" L"\x0001d4db"
+ L"\0" L"\x0001d4dc" L"\0" L"\x0001d4dd" L"\0" L"\x0001d4de" L"\0"
+ L"\x0001d4df" L"\0" L"\x0001d4e0" L"\0" L"\x0001d4e1" L"\0" L"\x0001d4e2"
+ L"\0" L"\x0001d4e3" L"\0" L"\x0001d4e4" L"\0" L"\x0001d4e5" L"\0"
+ L"\x0001d4e6" L"\0" L"\x0001d4e7" L"\0" L"\x0001d4e8" L"\0" L"\x0001d4e9"
+ L"\0" L"\x0001d4ea" L"\0" L"\x0001d4eb" L"\0" L"\x0001d4ec" L"\0"
+ L"\x0001d4ed" L"\0" L"\x0001d4ee" L"\0" L"\x0001d4ef" L"\0" L"\x0001d4f0"
+ L"\0" L"\x0001d4f1" L"\0" L"\x0001d4f2" L"\0" L"\x0001d4f3" L"\0"
+ L"\x0001d4f4" L"\0" L"\x0001d4f5" L"\0" L"\x0001d4f6" L"\0" L"\x0001d4f7"
+ L"\0" L"\x0001d4f8" L"\0" L"\x0001d4f9" L"\0" L"\x0001d4fa" L"\0"
+ L"\x0001d4fb" L"\0" L"\x0001d4fc" L"\0" L"\x0001d4fd" L"\0" L"\x0001d4fe"
+ L"\0" L"\x0001d4ff" L"\0" L"\x0001d500" L"\0" L"\x0001d501" L"\0"
+ L"\x0001d502" L"\0" L"\x0001d503" L"\0" L"\x0001d504" L"\0" L"\x0001d505"
+ L"\0" L"\x0001d507" L"\0" L"\x0001d508" L"\0" L"\x0001d509" L"\0"
+ L"\x0001d50a" L"\0" L"\x0001d50d" L"\0" L"\x0001d50e" L"\0" L"\x0001d50f"
+ L"\0" L"\x0001d510" L"\0" L"\x0001d511" L"\0" L"\x0001d512" L"\0"
+ L"\x0001d513" L"\0" L"\x0001d514" L"\0" L"\x0001d516" L"\0" L"\x0001d517"
+ L"\0" L"\x0001d518" L"\0" L"\x0001d519" L"\0" L"\x0001d51a" L"\0"
+ L"\x0001d51b" L"\0" L"\x0001d51c" L"\0" L"\x0001d51e" L"\0" L"\x0001d51f"
+ L"\0" L"\x0001d520" L"\0" L"\x0001d521" L"\0" L"\x0001d522" L"\0"
+ L"\x0001d523" L"\0" L"\x0001d524" L"\0" L"\x0001d525" L"\0" L"\x0001d526"
+ L"\0" L"\x0001d527" L"\0" L"\x0001d528" L"\0" L"\x0001d529" L"\0"
+ L"\x0001d52a" L"\0" L"\x0001d52b" L"\0" L"\x0001d52c" L"\0" L"\x0001d52d"
+ L"\0" L"\x0001d52e" L"\0" L"\x0001d52f" L"\0" L"\x0001d530" L"\0"
+ L"\x0001d531" L"\0" L"\x0001d532" L"\0" L"\x0001d533" L"\0" L"\x0001d534"
+ L"\0" L"\x0001d535" L"\0" L"\x0001d536" L"\0" L"\x0001d537" L"\0"
+ L"\x0001d538" L"\0" L"\x0001d539" L"\0" L"\x0001d53b" L"\0" L"\x0001d53c"
+ L"\0" L"\x0001d53d" L"\0" L"\x0001d53e" L"\0" L"\x0001d540" L"\0"
+ L"\x0001d541" L"\0" L"\x0001d542" L"\0" L"\x0001d543" L"\0" L"\x0001d544"
+ L"\0" L"\x0001d546" L"\0" L"\x0001d54a" L"\0" L"\x0001d54b" L"\0"
+ L"\x0001d54c" L"\0" L"\x0001d54d" L"\0" L"\x0001d54e" L"\0" L"\x0001d54f"
+ L"\0" L"\x0001d550" L"\0" L"\x0001d552" L"\0" L"\x0001d553" L"\0"
+ L"\x0001d554" L"\0" L"\x0001d555" L"\0" L"\x0001d556" L"\0" L"\x0001d557"
+ L"\0" L"\x0001d558" L"\0" L"\x0001d559" L"\0" L"\x0001d55a" L"\0"
+ L"\x0001d55b" L"\0" L"\x0001d55c" L"\0" L"\x0001d55d" L"\0" L"\x0001d55e"
+ L"\0" L"\x0001d55f" L"\0" L"\x0001d560" L"\0" L"\x0001d561" L"\0"
+ L"\x0001d562" L"\0" L"\x0001d563" L"\0" L"\x0001d564" L"\0" L"\x0001d565"
+ L"\0" L"\x0001d566" L"\0" L"\x0001d567" L"\0" L"\x0001d568" L"\0"
+ L"\x0001d569" L"\0" L"\x0001d56a" L"\0" L"\x0001d56b" L"\0" L"\x0001d56c"
+ L"\0" L"\x0001d56d" L"\0" L"\x0001d56e" L"\0" L"\x0001d56f" L"\0"
+ L"\x0001d570" L"\0" L"\x0001d571" L"\0" L"\x0001d572" L"\0" L"\x0001d573"
+ L"\0" L"\x0001d574" L"\0" L"\x0001d575" L"\0" L"\x0001d576" L"\0"
+ L"\x0001d577" L"\0" L"\x0001d578" L"\0" L"\x0001d579" L"\0" L"\x0001d57a"
+ L"\0" L"\x0001d57b" L"\0" L"\x0001d57c" L"\0" L"\x0001d57d" L"\0"
+ L"\x0001d57e" L"\0" L"\x0001d57f" L"\0" L"\x0001d580" L"\0" L"\x0001d581"
+ L"\0" L"\x0001d582" L"\0" L"\x0001d583" L"\0" L"\x0001d584" L"\0"
+ L"\x0001d585" L"\0" L"\x0001d586" L"\0" L"\x0001d587" L"\0" L"\x0001d588"
+ L"\0" L"\x0001d589" L"\0" L"\x0001d58a" L"\0" L"\x0001d58b" L"\0"
+ L"\x0001d58c" L"\0" L"\x0001d58d" L"\0" L"\x0001d58e" L"\0" L"\x0001d58f"
+ L"\0" L"\x0001d590" L"\0" L"\x0001d591" L"\0" L"\x0001d592" L"\0"
+ L"\x0001d593" L"\0" L"\x0001d594" L"\0" L"\x0001d595" L"\0" L"\x0001d596"
+ L"\0" L"\x0001d597" L"\0" L"\x0001d598" L"\0" L"\x0001d599" L"\0"
+ L"\x0001d59a" L"\0" L"\x0001d59b" L"\0" L"\x0001d59c" L"\0" L"\x0001d59d"
+ L"\0" L"\x0001d59e" L"\0" L"\x0001d59f" L"\0" L"\x0001d5a0" L"\0"
+ L"\x0001d5a1" L"\0" L"\x0001d5a2" L"\0" L"\x0001d5a3" L"\0" L"\x0001d5a4"
+ L"\0" L"\x0001d5a5" L"\0" L"\x0001d5a6" L"\0" L"\x0001d5a7" L"\0"
+ L"\x0001d5a8" L"\0" L"\x0001d5a9" L"\0" L"\x0001d5aa" L"\0" L"\x0001d5ab"
+ L"\0" L"\x0001d5ac" L"\0" L"\x0001d5ad" L"\0" L"\x0001d5ae" L"\0"
+ L"\x0001d5af" L"\0" L"\x0001d5b0" L"\0" L"\x0001d5b1" L"\0" L"\x0001d5b2"
+ L"\0" L"\x0001d5b3" L"\0" L"\x0001d5b4" L"\0" L"\x0001d5b5" L"\0"
+ L"\x0001d5b6" L"\0" L"\x0001d5b7" L"\0" L"\x0001d5b8" L"\0" L"\x0001d5b9"
+ L"\0" L"\x0001d5ba" L"\0" L"\x0001d5bb" L"\0" L"\x0001d5bc" L"\0"
+ L"\x0001d5bd" L"\0" L"\x0001d5be" L"\0" L"\x0001d5bf" L"\0" L"\x0001d5c0"
+ L"\0" L"\x0001d5c1" L"\0" L"\x0001d5c2" L"\0" L"\x0001d5c3" L"\0"
+ L"\x0001d5c4" L"\0" L"\x0001d5c5" L"\0" L"\x0001d5c6" L"\0" L"\x0001d5c7"
+ L"\0" L"\x0001d5c8" L"\0" L"\x0001d5c9" L"\0" L"\x0001d5ca" L"\0"
+ L"\x0001d5cb" L"\0" L"\x0001d5cc" L"\0" L"\x0001d5cd" L"\0" L"\x0001d5ce"
+ L"\0" L"\x0001d5cf" L"\0" L"\x0001d5d0" L"\0" L"\x0001d5d1" L"\0"
+ L"\x0001d5d2" L"\0" L"\x0001d5d3" L"\0" L"\x0001d5d4" L"\0" L"\x0001d5d5"
+ L"\0" L"\x0001d5d6" L"\0" L"\x0001d5d7" L"\0" L"\x0001d5d8" L"\0"
+ L"\x0001d5d9" L"\0" L"\x0001d5da" L"\0" L"\x0001d5db" L"\0" L"\x0001d5dc"
+ L"\0" L"\x0001d5dd" L"\0" L"\x0001d5de" L"\0" L"\x0001d5df" L"\0"
+ L"\x0001d5e0" L"\0" L"\x0001d5e1" L"\0" L"\x0001d5e2" L"\0" L"\x0001d5e3"
+ L"\0" L"\x0001d5e4" L"\0" L"\x0001d5e5" L"\0" L"\x0001d5e6" L"\0"
+ L"\x0001d5e7" L"\0" L"\x0001d5e8" L"\0" L"\x0001d5e9" L"\0" L"\x0001d5ea"
+ L"\0" L"\x0001d5eb" L"\0" L"\x0001d5ec" L"\0" L"\x0001d5ed" L"\0"
+ L"\x0001d5ee" L"\0" L"\x0001d5ef" L"\0" L"\x0001d5f0" L"\0" L"\x0001d5f1"
+ L"\0" L"\x0001d5f2" L"\0" L"\x0001d5f3" L"\0" L"\x0001d5f4" L"\0"
+ L"\x0001d5f5" L"\0" L"\x0001d5f6" L"\0" L"\x0001d5f7" L"\0" L"\x0001d5f8"
+ L"\0" L"\x0001d5f9" L"\0" L"\x0001d5fa" L"\0" L"\x0001d5fb" L"\0"
+ L"\x0001d5fc" L"\0" L"\x0001d5fd" L"\0" L"\x0001d5fe" L"\0" L"\x0001d5ff"
+ L"\0" L"\x0001d600" L"\0" L"\x0001d601" L"\0" L"\x0001d602" L"\0"
+ L"\x0001d603" L"\0" L"\x0001d604" L"\0" L"\x0001d605" L"\0" L"\x0001d606"
+ L"\0" L"\x0001d607" L"\0" L"\x0001d608" L"\0" L"\x0001d609" L"\0"
+ L"\x0001d60a" L"\0" L"\x0001d60b" L"\0" L"\x0001d60c" L"\0" L"\x0001d60d"
+ L"\0" L"\x0001d60e" L"\0" L"\x0001d60f" L"\0" L"\x0001d610" L"\0"
+ L"\x0001d611" L"\0" L"\x0001d612" L"\0" L"\x0001d613" L"\0" L"\x0001d614"
+ L"\0" L"\x0001d615" L"\0" L"\x0001d616" L"\0" L"\x0001d617" L"\0"
+ L"\x0001d618" L"\0" L"\x0001d619" L"\0" L"\x0001d61a" L"\0" L"\x0001d61b"
+ L"\0" L"\x0001d61c" L"\0" L"\x0001d61d" L"\0" L"\x0001d61e" L"\0"
+ L"\x0001d61f" L"\0" L"\x0001d620" L"\0" L"\x0001d621" L"\0" L"\x0001d622"
+ L"\0" L"\x0001d623" L"\0" L"\x0001d624" L"\0" L"\x0001d625" L"\0"
+ L"\x0001d626" L"\0" L"\x0001d627" L"\0" L"\x0001d628" L"\0" L"\x0001d629"
+ L"\0" L"\x0001d62a" L"\0" L"\x0001d62b" L"\0" L"\x0001d62c" L"\0"
+ L"\x0001d62d" L"\0" L"\x0001d62e" L"\0" L"\x0001d62f" L"\0" L"\x0001d630"
+ L"\0" L"\x0001d631" L"\0" L"\x0001d632" L"\0" L"\x0001d633" L"\0"
+ L"\x0001d634" L"\0" L"\x0001d635" L"\0" L"\x0001d636" L"\0" L"\x0001d637"
+ L"\0" L"\x0001d638" L"\0" L"\x0001d639" L"\0" L"\x0001d63a" L"\0"
+ L"\x0001d63b" L"\0" L"\x0001d63c" L"\0" L"\x0001d63d" L"\0" L"\x0001d63e"
+ L"\0" L"\x0001d63f" L"\0" L"\x0001d640" L"\0" L"\x0001d641" L"\0"
+ L"\x0001d642" L"\0" L"\x0001d643" L"\0" L"\x0001d644" L"\0" L"\x0001d645"
+ L"\0" L"\x0001d646" L"\0" L"\x0001d647" L"\0" L"\x0001d648" L"\0"
+ L"\x0001d649" L"\0" L"\x0001d64a" L"\0" L"\x0001d64b" L"\0" L"\x0001d64c"
+ L"\0" L"\x0001d64d" L"\0" L"\x0001d64e" L"\0" L"\x0001d64f" L"\0"
+ L"\x0001d650" L"\0" L"\x0001d651" L"\0" L"\x0001d652" L"\0" L"\x0001d653"
+ L"\0" L"\x0001d654" L"\0" L"\x0001d655" L"\0" L"\x0001d656" L"\0"
+ L"\x0001d657" L"\0" L"\x0001d658" L"\0" L"\x0001d659" L"\0" L"\x0001d65a"
+ L"\0" L"\x0001d65b" L"\0" L"\x0001d65c" L"\0" L"\x0001d65d" L"\0"
+ L"\x0001d65e" L"\0" L"\x0001d65f" L"\0" L"\x0001d660" L"\0" L"\x0001d661"
+ L"\0" L"\x0001d662" L"\0" L"\x0001d663" L"\0" L"\x0001d664" L"\0"
+ L"\x0001d665" L"\0" L"\x0001d666" L"\0" L"\x0001d667" L"\0" L"\x0001d668"
+ L"\0" L"\x0001d669" L"\0" L"\x0001d66a" L"\0" L"\x0001d66b" L"\0"
+ L"\x0001d66c" L"\0" L"\x0001d66d" L"\0" L"\x0001d66e" L"\0" L"\x0001d66f"
+ L"\0" L"\x0001d670" L"\0" L"\x0001d671" L"\0" L"\x0001d672" L"\0"
+ L"\x0001d673" L"\0" L"\x0001d674" L"\0" L"\x0001d675" L"\0" L"\x0001d676"
+ L"\0" L"\x0001d677" L"\0" L"\x0001d678" L"\0" L"\x0001d679" L"\0"
+ L"\x0001d67a" L"\0" L"\x0001d67b" L"\0" L"\x0001d67c" L"\0" L"\x0001d67d"
+ L"\0" L"\x0001d67e" L"\0" L"\x0001d67f" L"\0" L"\x0001d680" L"\0"
+ L"\x0001d681" L"\0" L"\x0001d682" L"\0" L"\x0001d683" L"\0" L"\x0001d684"
+ L"\0" L"\x0001d685" L"\0" L"\x0001d686" L"\0" L"\x0001d687" L"\0"
+ L"\x0001d688" L"\0" L"\x0001d689" L"\0" L"\x0001d68a" L"\0" L"\x0001d68b"
+ L"\0" L"\x0001d68c" L"\0" L"\x0001d68d" L"\0" L"\x0001d68e" L"\0"
+ L"\x0001d68f" L"\0" L"\x0001d690" L"\0" L"\x0001d691" L"\0" L"\x0001d692"
+ L"\0" L"\x0001d693" L"\0" L"\x0001d694" L"\0" L"\x0001d695" L"\0"
+ L"\x0001d696" L"\0" L"\x0001d697" L"\0" L"\x0001d698" L"\0" L"\x0001d699"
+ L"\0" L"\x0001d69a" L"\0" L"\x0001d69b" L"\0" L"\x0001d69c" L"\0"
+ L"\x0001d69d" L"\0" L"\x0001d69e" L"\0" L"\x0001d69f" L"\0" L"\x0001d6a0"
+ L"\0" L"\x0001d6a1" L"\0" L"\x0001d6a2" L"\0" L"\x0001d6a3" L"\0"
+ L"\x0001d7ce" L"\0" L"\x0001d7cf" L"\0" L"\x0001d7d0" L"\0" L"\x0001d7d1"
+ L"\0" L"\x0001d7d2" L"\0" L"\x0001d7d3" L"\0" L"\x0001d7d4" L"\0"
+ L"\x0001d7d5" L"\0" L"\x0001d7d6" L"\0" L"\x0001d7d7" L"\0" L"\x0001d7d8"
+ L"\0" L"\x0001d7d9" L"\0" L"\x0001d7da" L"\0" L"\x0001d7db" L"\0"
+ L"\x0001d7dc" L"\0" L"\x0001d7dd" L"\0" L"\x0001d7de" L"\0" L"\x0001d7df"
+ L"\0" L"\x0001d7e0" L"\0" L"\x0001d7e1" L"\0" L"\x0001d7e2" L"\0"
+ L"\x0001d7e3" L"\0" L"\x0001d7e4" L"\0" L"\x0001d7e5" L"\0" L"\x0001d7e6"
+ L"\0" L"\x0001d7e7" L"\0" L"\x0001d7e8" L"\0" L"\x0001d7e9" L"\0"
+ L"\x0001d7ea" L"\0" L"\x0001d7eb" L"\0" L"\x0001d7ec" L"\0" L"\x0001d7ed"
+ L"\0" L"\x0001d7ee" L"\0" L"\x0001d7ef" L"\0" L"\x0001d7f0" L"\0"
+ L"\x0001d7f1" L"\0" L"\x0001d7f2" L"\0" L"\x0001d7f3" L"\0" L"\x0001d7f4"
+ L"\0" L"\x0001d7f5" L"\0" L"\x0001d7f6" L"\0" L"\x0001d7f7" L"\0"
+ L"\x0001d7f8" L"\0" L"\x0001d7f9" L"\0" L"\x0001d7fa" L"\0" L"\x0001d7fb"
+ L"\0" L"\x0001d7fc" L"\0" L"\x0001d7fd" L"\0" L"\x0001d7fe" L"\0"
+ L"\x0001d7ff";
static const uint32_t translit_to_idx[] =
{
0, 3, 8, 12, 15, 20, 23, 26, 30, 37, 44, 51,
@@ -469,47 +470,47 @@ static const uint32_t translit_to_idx[] =
145, 148, 151, 154, 157, 160, 163, 166, 169, 172, 175, 178,
180, 183, 186, 189, 192, 196, 199, 202, 205, 208, 211, 214,
217, 221, 224, 227, 230, 233, 237, 242, 245, 248, 252, 257,
- 260, 263, 267, 271, 275, 279, 282, 284, 286, 288, 290, 294,
- 299, 304, 309, 312, 317, 322, 325, 328, 331, 334, 337, 340,
- 343, 346, 349, 352, 356, 359, 362, 365, 368, 371, 376, 382,
- 385, 390, 393, 396, 399, 402, 405, 408, 411, 414, 417, 420,
- 423, 426, 429, 432, 435, 442, 449, 456, 463, 470, 477, 484,
- 491, 498, 505, 512, 519, 524, 527, 531, 536, 540, 543, 547,
- 552, 558, 562, 565, 569, 574, 577, 580, 583, 586, 589, 593,
- 598, 602, 605, 609, 614, 620, 624, 627, 631, 636, 639, 642,
- 645, 648, 652, 656, 661, 665, 669, 674, 677, 680, 683, 686,
- 689, 692, 695, 699, 703, 707, 711, 716, 721, 726, 731, 736,
- 741, 746, 751, 756, 761, 765, 769, 773, 777, 781, 785, 789,
- 793, 798, 803, 808, 813, 818, 823, 828, 833, 838, 842, 847,
- 852, 856, 860, 864, 868, 872, 877, 880, 884, 889, 894, 899,
- 904, 909, 914, 919, 924, 929, 935, 941, 947, 953, 959, 965,
- 971, 977, 983, 989, 995, 1000, 1005, 1010, 1015, 1020, 1025, 1030,
- 1035, 1040, 1046, 1052, 1058, 1064, 1070, 1076, 1082, 1088, 1094, 1100,
- 1106, 1110, 1114, 1118, 1122, 1126, 1130, 1134, 1138, 1142, 1147, 1152,
- 1157, 1162, 1167, 1172, 1177, 1182, 1187, 1192, 1197, 1202, 1207, 1212,
- 1217, 1222, 1227, 1232, 1237, 1242, 1247, 1252, 1257, 1262, 1267, 1272,
- 1277, 1282, 1287, 1292, 1297, 1302, 1307, 1312, 1317, 1322, 1327, 1332,
- 1337, 1342, 1347, 1352, 1357, 1362, 1367, 1372, 1377, 1382, 1387, 1392,
- 1397, 1402, 1407, 1412, 1417, 1422, 1427, 1432, 1437, 1442, 1447, 1452,
- 1457, 1462, 1467, 1472, 1477, 1482, 1487, 1492, 1497, 1502, 1507, 1512,
- 1517, 1522, 1527, 1532, 1537, 1542, 1547, 1552, 1557, 1562, 1567, 1572,
- 1577, 1582, 1587, 1592, 1595, 1598, 1601, 1604, 1607, 1610, 1613, 1616,
- 1619, 1622, 1625, 1628, 1633, 1637, 1642, 1645, 1648, 1654, 1660, 1666,
- 1672, 1678, 1684, 1690, 1696, 1702, 1708, 1714, 1720, 1726, 1732, 1738,
- 1744, 1750, 1756, 1762, 1768, 1774, 1780, 1786, 1792, 1798, 1804, 1810,
- 1816, 1822, 1828, 1833, 1837, 1841, 1846, 1850, 1854, 1858, 1862, 1866,
- 1870, 1874, 1878, 1882, 1886, 1891, 1897, 1901, 1905, 1909, 1913, 1917,
- 1921, 1925, 1930, 1935, 1940, 1945, 1949, 1953, 1957, 1961, 1965, 1969,
- 1973, 1977, 1981, 1985, 1991, 1997, 2002, 2008, 2014, 2020, 2025, 2031,
- 2036, 2043, 2047, 2052, 2057, 2062, 2067, 2074, 2083, 2087, 2091, 2095,
- 2099, 2103, 2107, 2111, 2115, 2119, 2123, 2127, 2131, 2135, 2139, 2143,
- 2147, 2153, 2157, 2161, 2165, 2171, 2176, 2180, 2184, 2188, 2192, 2196,
- 2200, 2204, 2208, 2212, 2216, 2221, 2225, 2229, 2234, 2239, 2243, 2249,
- 2254, 2258, 2262, 2266, 2270, 2274, 2278, 2282, 2287, 2292, 2296, 2299,
- 2301, 2303, 2305, 2307, 2309, 2311, 2313, 2315, 2317, 2319, 2321, 2323,
- 2325, 2327, 2329, 2331, 2334, 2337, 2340, 2343, 2346, 2349, 2352, 2355,
+ 260, 263, 267, 270, 274, 278, 282, 285, 287, 289, 291, 293,
+ 297, 302, 307, 312, 315, 320, 325, 328, 331, 334, 337, 340,
+ 343, 346, 349, 352, 355, 359, 362, 365, 368, 371, 374, 379,
+ 385, 388, 393, 396, 399, 402, 405, 408, 411, 414, 417, 420,
+ 423, 426, 429, 432, 435, 438, 445, 452, 459, 466, 473, 480,
+ 487, 494, 501, 508, 515, 522, 527, 530, 534, 539, 543, 546,
+ 550, 555, 561, 565, 568, 572, 577, 580, 583, 586, 589, 592,
+ 596, 601, 605, 608, 612, 617, 623, 627, 630, 634, 639, 642,
+ 645, 648, 651, 655, 659, 664, 668, 672, 677, 680, 683, 686,
+ 689, 692, 695, 698, 702, 706, 710, 714, 719, 724, 729, 734,
+ 739, 744, 749, 754, 759, 764, 768, 772, 776, 780, 784, 788,
+ 792, 796, 801, 806, 811, 816, 821, 826, 831, 836, 841, 845,
+ 850, 855, 859, 863, 867, 871, 875, 880, 883, 887, 892, 897,
+ 902, 907, 912, 917, 922, 927, 932, 938, 944, 950, 956, 962,
+ 968, 974, 980, 986, 992, 998, 1003, 1008, 1013, 1018, 1023, 1028,
+ 1033, 1038, 1043, 1049, 1055, 1061, 1067, 1073, 1079, 1085, 1091, 1097,
+ 1103, 1109, 1113, 1117, 1121, 1125, 1129, 1133, 1137, 1141, 1145, 1150,
+ 1155, 1160, 1165, 1170, 1175, 1180, 1185, 1190, 1195, 1200, 1205, 1210,
+ 1215, 1220, 1225, 1230, 1235, 1240, 1245, 1250, 1255, 1260, 1265, 1270,
+ 1275, 1280, 1285, 1290, 1295, 1300, 1305, 1310, 1315, 1320, 1325, 1330,
+ 1335, 1340, 1345, 1350, 1355, 1360, 1365, 1370, 1375, 1380, 1385, 1390,
+ 1395, 1400, 1405, 1410, 1415, 1420, 1425, 1430, 1435, 1440, 1445, 1450,
+ 1455, 1460, 1465, 1470, 1475, 1480, 1485, 1490, 1495, 1500, 1505, 1510,
+ 1515, 1520, 1525, 1530, 1535, 1540, 1545, 1550, 1555, 1560, 1565, 1570,
+ 1575, 1580, 1585, 1590, 1595, 1598, 1601, 1604, 1607, 1610, 1613, 1616,
+ 1619, 1622, 1625, 1628, 1631, 1636, 1640, 1645, 1648, 1651, 1657, 1663,
+ 1669, 1675, 1681, 1687, 1693, 1699, 1705, 1711, 1717, 1723, 1729, 1735,
+ 1741, 1747, 1753, 1759, 1765, 1771, 1777, 1783, 1789, 1795, 1801, 1807,
+ 1813, 1819, 1825, 1831, 1836, 1840, 1844, 1849, 1853, 1857, 1861, 1865,
+ 1869, 1873, 1877, 1881, 1885, 1889, 1894, 1900, 1904, 1908, 1912, 1916,
+ 1920, 1924, 1928, 1933, 1938, 1943, 1948, 1952, 1956, 1960, 1964, 1968,
+ 1972, 1976, 1980, 1984, 1988, 1994, 2000, 2005, 2011, 2017, 2023, 2028,
+ 2034, 2039, 2046, 2050, 2055, 2060, 2065, 2070, 2077, 2086, 2090, 2094,
+ 2098, 2102, 2106, 2110, 2114, 2118, 2122, 2126, 2130, 2134, 2138, 2142,
+ 2146, 2150, 2156, 2160, 2164, 2168, 2174, 2179, 2183, 2187, 2191, 2195,
+ 2199, 2203, 2207, 2211, 2215, 2219, 2224, 2228, 2232, 2237, 2242, 2246,
+ 2252, 2257, 2261, 2265, 2269, 2273, 2277, 2281, 2285, 2290, 2295, 2299,
+ 2302, 2304, 2306, 2308, 2310, 2312, 2314, 2316, 2318, 2320, 2322, 2324,
+ 2326, 2328, 2330, 2332, 2334, 2337, 2340, 2343, 2346, 2349, 2352, 2355,
2358, 2361, 2364, 2367, 2370, 2373, 2376, 2379, 2382, 2385, 2388, 2391,
- 2394, 2397, 2400, 2403, 2406, 2408, 2411, 2414, 2417, 2420, 2423, 2426,
+ 2394, 2397, 2400, 2403, 2406, 2409, 2411, 2414, 2417, 2420, 2423, 2426,
2429, 2432, 2435, 2438, 2441, 2444, 2447, 2450, 2453, 2456, 2459, 2462,
2465, 2468, 2471, 2474, 2477, 2480, 2483, 2486, 2489, 2492, 2495, 2498,
2501, 2504, 2507, 2510, 2513, 2516, 2519, 2522, 2525, 2528, 2531, 2534,
@@ -575,7 +576,7 @@ static const uint32_t translit_to_idx[] =
4661, 4664, 4667, 4670, 4673, 4676, 4679, 4682, 4685, 4688, 4691, 4694,
4697, 4700, 4703, 4706, 4709, 4712, 4715, 4718, 4721, 4724, 4727, 4730,
4733, 4736, 4739, 4742, 4745, 4748, 4751, 4754, 4757, 4760, 4763, 4766,
- 4769, 4772, 4775, 4778, 4781, 4784, 4787, 4790
+ 4769, 4772, 4775, 4778, 4781, 4784, 4787, 4790, 4793
};
static const wchar_t translit_to_tbl[] =
L" \0" L"\0" L"(C)\0" L"\0" L"<<\0" L"\0" L"-\0" L"\0" L"(R)\0" L"\0" L"u\0"
@@ -591,13 +592,13 @@ static const wchar_t translit_to_tbl[] =
L"\0" L"'\0" L"\0" L"'\0" L"\0" L",\0" L"\0" L"'\0" L"\0" L"\"\0" L"\0"
L"\"\0" L"\0" L",,\0" L"\0" L"\"\0" L"\0" L"+\0" L"\0" L"o\0" L"\0" L".\0"
L"\0" L"..\0" L"\0" L"...\0" L"\0" L" \0" L"\0" L"`\0" L"\0" L"``\0" L"\0"
- L"```\0" L"\0" L"<\0" L"\0" L">\0" L"\0" L"!!\0" L"\0" L"??\0" L"\0" L"?!\0"
- L"\0" L"!?\0" L"\0" L" \0" L"\0" L"\0" L"\0" L"\0" L"\0" L"\0" L"\0" L"\0"
- L"\0" L"Rs\0" L"\0" L"EUR\0" L"\0" L"a/c\0" L"\0" L"a/s\0" L"\0" L"C\0"
- L"\0" L"c/o\0" L"\0" L"c/u\0" L"\0" L"g\0" L"\0" L"H\0" L"\0" L"H\0" L"\0"
- L"H\0" L"\0" L"h\0" L"\0" L"I\0" L"\0" L"I\0" L"\0" L"L\0" L"\0" L"l\0"
- L"\0" L"N\0" L"\0" L"No\0" L"\0" L"P\0" L"\0" L"Q\0" L"\0" L"R\0" L"\0"
- L"R\0" L"\0" L"R\0" L"\0" L"TEL\0" L"\0" L"(TM)\0" L"\0" L"Z\0" L"\0"
+ L"```\0" L"\0" L"<\0" L"\0" L">\0" L"\0" L"!!\0" L"\0" L"/\0" L"\0" L"??\0"
+ L"\0" L"?!\0" L"\0" L"!?\0" L"\0" L" \0" L"\0" L"\0" L"\0" L"\0" L"\0" L"\0"
+ L"\0" L"\0" L"\0" L"Rs\0" L"\0" L"EUR\0" L"\0" L"a/c\0" L"\0" L"a/s\0" L"\0"
+ L"C\0" L"\0" L"c/o\0" L"\0" L"c/u\0" L"\0" L"g\0" L"\0" L"H\0" L"\0" L"H\0"
+ L"\0" L"H\0" L"\0" L"h\0" L"\0" L"I\0" L"\0" L"I\0" L"\0" L"L\0" L"\0"
+ L"l\0" L"\0" L"N\0" L"\0" L"No\0" L"\0" L"P\0" L"\0" L"Q\0" L"\0" L"R\0"
+ L"\0" L"R\0" L"\0" L"R\0" L"\0" L"TEL\0" L"\0" L"(TM)\0" L"\0" L"Z\0" L"\0"
L"Ohm\0" L"\0" L"Z\0" L"\0" L"B\0" L"\0" L"C\0" L"\0" L"e\0" L"\0" L"e\0"
L"\0" L"E\0" L"\0" L"F\0" L"\0" L"M\0" L"\0" L"o\0" L"\0" L"i\0" L"\0"
L"D\0" L"\0" L"d\0" L"\0" L"e\0" L"\0" L"i\0" L"\0" L"j\0" L"\0" L" 1/3 \0"
diff --git a/locale/C-translit.h.in b/locale/C-translit.h.in
index d440c9b9ab2..ab0b1309831 100644
--- a/locale/C-translit.h.in
+++ b/locale/C-translit.h.in
@@ -1,5 +1,5 @@
/* Transliteration for the C locale. -*-C-*-
- Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001, 2002, 2007 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2000.
@@ -94,6 +94,7 @@
"\x2039" "<" /* <U2039> SINGLE LEFT-POINTING ANGLE QUOTATION MARK */
"\x203a" ">" /* <U203A> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK */
"\x203c" "!!" /* <U203C> DOUBLE EXCLAMATION MARK */
+"\x2044" "/" /* <U2044> FRACTION SLASH */
"\x2047" "??" /* <U2047> DOUBLE QUESTION MARK */
"\x2048" "?!" /* <U2048> QUESTION EXCLAMATION MARK */
"\x2049" "!?" /* <U2049> EXCLAMATION QUESTION MARK */
diff --git a/locale/global-locale.c b/locale/global-locale.c
index 2280f68df47..a5cae3c5d17 100644
--- a/locale/global-locale.c
+++ b/locale/global-locale.c
@@ -1,5 +1,5 @@
/* Locale object representing the global locale controlled by setlocale.
- Copyright (C) 2002, 2006 Free Software Foundation, Inc.
+ Copyright (C) 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -60,7 +60,7 @@ struct __locale_struct _nl_global_locale attribute_hidden =
};
#include <tls.h>
-#if HAVE___THREAD
+#if USE_TLS && HAVE___THREAD
/* The tsd macros don't permit an initializer. */
__thread void *__libc_tsd_LOCALE = &_nl_global_locale;
#else
diff --git a/locale/iso-3166.def b/locale/iso-3166.def
index bae42caed2b..a0dd56385ac 100644
--- a/locale/iso-3166.def
+++ b/locale/iso-3166.def
@@ -198,6 +198,7 @@ DEFINE_COUNTRY_CODE ("SAO TOME AND PRINCIPE", ST, STP, 678)
DEFINE_COUNTRY_CODE ("SAUDI ARABIA", SA, SAU, 682)
DEFINE_COUNTRY_CODE ("SENEGAL", SN, SEN, 686)
DEFINE_COUNTRY_CODE ("SERBIA AND MONTENEGRO", CS, SCG, 891)
+DEFINE_COUNTRY_CODE ("SERBIA", RS, SRB, 688)
DEFINE_COUNTRY_CODE ("SEYCHELLES", SC, SYC, 690)
DEFINE_COUNTRY_CODE ("SIERRA LEONE", SL, SLE, 694)
DEFINE_COUNTRY_CODE ("SINGAPORE", SG, SGP, 702)
diff --git a/locale/iso-4217.def b/locale/iso-4217.def
index 1af6ef44967..8f2c9acaf5d 100644
--- a/locale/iso-4217.def
+++ b/locale/iso-4217.def
@@ -129,6 +129,7 @@ DEFINE_INT_CURR("PYG") /* Paraguay Guarani */
DEFINE_INT_CURR("QAR") /* Qatar Rial */
DEFINE_INT_CURR("ROL") /* Romanian Leu */
DEFINE_INT_CURR("RON") /* Romanian New Leu */
+DEFINE_INT_CURR("RSD") /* Serbian Dinars */
DEFINE_INT_CURR("RUB") /* Russian Ruble */
DEFINE_INT_CURR("RWF") /* Rwanda Franc */
DEFINE_INT_CURR("SAR") /* Saudi Arabia Riyal */
diff --git a/locale/localeinfo.h b/locale/localeinfo.h
index 5c1f27f7e17..4f746a298d1 100644
--- a/locale/localeinfo.h
+++ b/locale/localeinfo.h
@@ -215,7 +215,9 @@ __libc_tsd_define (extern, LOCALE)
we can use __thread variables. So only in that case do we attempt this. */
#if !defined SHARED && defined HAVE___THREAD && defined HAVE_WEAK_SYMBOLS
# include <tls.h>
-# define NL_CURRENT_INDIRECT 1
+# if USE_TLS
+# define NL_CURRENT_INDIRECT 1
+# endif
#endif
#ifdef NL_CURRENT_INDIRECT
diff --git a/locale/programs/charmap.c b/locale/programs/charmap.c
index dbc1101fd07..52a69de4b04 100644
--- a/locale/programs/charmap.c
+++ b/locale/programs/charmap.c
@@ -607,7 +607,7 @@ character sets with locking states are not supported"));
case 90:
if (nowtok != expected_tok)
lr_error (cmfile, _("\
-%1$s: definition does not end with `END %1$s'"), expected_str);
+`%1$s' definition does not end with `END %1$s'"), expected_str);
lr_ignore_rest (cmfile, nowtok == expected_tok);
state = 91;
@@ -1019,13 +1019,13 @@ hexadecimal range format should use only capital characters"));
&& errno == ERANGE)
|| *to_end != '\0')
{
- lr_error (lr, _("<%s> and <%s> are invalid names for range"), from, to);
+ lr_error (lr, _("<%s> and <%s> are illegal names for range"), from, to);
return;
}
if (from_nr > to_nr)
{
- lr_error (lr, _("upper limit in range is smaller than lower limit"));
+ lr_error (lr, _("upper limit in range is not higher then lower limit"));
return;
}
diff --git a/locale/programs/ld-collate.c b/locale/programs/ld-collate.c
index af472799585..cf1bff130f2 100644
--- a/locale/programs/ld-collate.c
+++ b/locale/programs/ld-collate.c
@@ -1146,7 +1146,7 @@ handle_ellipsis (struct linereader *ldfile, const char *symstr, size_t symlen,
{
if (ret > 0)
lr_error (ldfile, _("%s: byte sequence of first character of \
-range is not lower than that of the last character"), "LC_COLLATE");
+sequence is not lower than that of the last character"), "LC_COLLATE");
return;
}
@@ -1164,7 +1164,7 @@ range is not lower than that of the last character"), "LC_COLLATE");
struct element_t *elem;
size_t namelen;
- /* I don't think this can ever happen. */
+ /* I don't this this can ever happen. */
assert (seq->name != NULL);
namelen = strlen (seq->name);
diff --git a/locale/programs/ld-ctype.c b/locale/programs/ld-ctype.c
index 69fc05f4ee8..40d5e4b17f3 100644
--- a/locale/programs/ld-ctype.c
+++ b/locale/programs/ld-ctype.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1995-2005, 2006 Free Software Foundation, Inc.
+/* Copyright (C) 1995-2006, 2007 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.org>, 1995.
@@ -1866,6 +1866,9 @@ find_translit (struct localedef_t *locale, const struct charmap_t *charmap,
assert (locale != NULL);
ctype = locale->categories[LC_CTYPE].ctype;
+ if (ctype == NULL)
+ return NULL;
+
if (ctype->translit != NULL)
result = find_translit2 (ctype, charmap, wch);
@@ -3036,7 +3039,7 @@ set_class_defaults (struct locale_ctype_t *ctype,
{
if (!be_quiet)
WITH_CUR_LOCALE (error (0, 0, _("\
-%s: character `%s' not defined while needed as default value"),
+%s: character `%s' not defined in charmap while needed as default value"),
"LC_CTYPE", tmp));
}
else if (seq->nbytes != 1)
@@ -3161,8 +3164,8 @@ set_class_defaults (struct locale_ctype_t *ctype,
{
if (!be_quiet)
WITH_CUR_LOCALE (error (0, 0, _("\
-%s: character `%s' not defined while needed as default value"),
- "LC_CTYPE", "<newline>"));
+character `%s' not defined while needed as default value"),
+ "<newline>"));
}
else if (seq->nbytes != 1)
WITH_CUR_LOCALE (error (0, 0, _("\
diff --git a/locale/programs/ld-monetary.c b/locale/programs/ld-monetary.c
index d493a142b56..27636d64981 100644
--- a/locale/programs/ld-monetary.c
+++ b/locale/programs/ld-monetary.c
@@ -252,7 +252,7 @@ not correspond to a valid name in ISO 4217"),
else if (monetary->mon_decimal_point[0] == '\0' && ! be_quiet && ! nothing)
{
WITH_CUR_LOCALE (error (0, 0, _("\
-%s: value for field `%s' must not be an empty string"),
+%s: value for field `%s' must not be the empty string"),
"LC_MONETARY", "mon_decimal_point"));
}
if (monetary->mon_decimal_point_wc == L'\0')
diff --git a/locale/programs/ld-numeric.c b/locale/programs/ld-numeric.c
index d7ffe75beef..a901c4d9850 100644
--- a/locale/programs/ld-numeric.c
+++ b/locale/programs/ld-numeric.c
@@ -115,7 +115,7 @@ No definition for %s category found"), "LC_NUMERIC"));
else if (numeric->decimal_point[0] == '\0' && ! be_quiet && ! nothing)
{
WITH_CUR_LOCALE (error (0, 0, _("\
-%s: value for field `%s' must not be an empty string"),
+%s: value for field `%s' must not be the empty string"),
"LC_NUMERIC", "decimal_point"));
}
if (numeric->decimal_point_wc == L'\0')
diff --git a/locale/programs/ld-time.c b/locale/programs/ld-time.c
index 0d193503718..bf5151858a7 100644
--- a/locale/programs/ld-time.c
+++ b/locale/programs/ld-time.c
@@ -502,7 +502,7 @@ No definition for %s category found"), "LC_TIME"));
time->first_weekday = 1;
else if (time->first_weekday > time->week_ndays)
WITH_CUR_LOCALE (error (0, 0, _("\
-%s: values for field `%s' must not be larger than %d"),
+%s: values of field `%s' must not be larger than %d"),
"LC_TIME", "first_weekday", 7));
if (time->first_workday == '\0')
@@ -510,7 +510,7 @@ No definition for %s category found"), "LC_TIME"));
time->first_workday = 1;
else if (time->first_workday > time->week_ndays)
WITH_CUR_LOCALE (error (0, 0, _("\
-%s: values for field `%s' must not be larger than %d"),
+%s: values of field `%s' must not be larger than %d"),
"LC_TIME", "first_workday", 7));
if (time->cal_direction == '\0')
diff --git a/locale/programs/locale.c b/locale/programs/locale.c
index cc3082d48a7..a03974e8a13 100644
--- a/locale/programs/locale.c
+++ b/locale/programs/locale.c
@@ -1,5 +1,5 @@
/* Implementation of the locale program according to POSIX 9945-2.
- Copyright (C) 1995-1997, 1999-2006, 2007 Free Software Foundation, Inc.
+ Copyright (C) 1995-1997, 1999-2005, 2006 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1995.
@@ -275,7 +275,7 @@ print_version (FILE *stream, struct argp_state *state)
Copyright (C) %s Free Software Foundation, Inc.\n\
This is free software; see the source for copying conditions. There is NO\n\
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
-"), "2007");
+"), "2006");
fprintf (stream, gettext ("Written by %s.\n"), "Ulrich Drepper");
}
diff --git a/locale/programs/localedef.c b/locale/programs/localedef.c
index 04dcf8ee0d6..9c3acbebcc1 100644
--- a/locale/programs/localedef.c
+++ b/locale/programs/localedef.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1995-2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+/* Copyright (C) 1995-2004, 2005, 2006 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1995.
@@ -387,7 +387,7 @@ print_version (FILE *stream, struct argp_state *state)
Copyright (C) %s Free Software Foundation, Inc.\n\
This is free software; see the source for copying conditions. There is NO\n\
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
-"), "2007");
+"), "2006");
fprintf (stream, gettext ("Written by %s.\n"), "Ulrich Drepper");
}
diff --git a/locale/programs/repertoire.c b/locale/programs/repertoire.c
index b6c0a6ad58b..e9bdf9e7baa 100644
--- a/locale/programs/repertoire.c
+++ b/locale/programs/repertoire.c
@@ -311,7 +311,7 @@ argument to <%s> must be a single character"),
case 90:
if (nowtok != tok_charids)
lr_error (repfile, _("\
-%1$s: definition does not end with `END %1$s'"), "CHARIDS");
+`%1$s' definition does not end with `END %1$s'"), "CHARIDS");
lr_ignore_rest (repfile, nowtok == tok_charids);
break;
@@ -453,7 +453,7 @@ hexadecimal range format should use only capital characters"));
if (from_nr > to_nr)
{
- lr_error (lr, _("upper limit in range is smaller than lower limit"));
+ lr_error (lr, _("upper limit in range is not smaller then lower limit"));
return;
}
diff --git a/localedata/ChangeLog b/localedata/ChangeLog
index 85b2d7948db..db9b1ef921c 100644
--- a/localedata/ChangeLog
+++ b/localedata/ChangeLog
@@ -1,8 +1,58 @@
-2006-12-05 Jakub Jelinek <jakub@redhat.com>
+2007-05-07 Ulrich Drepper <drepper@redhat.com>
- * locales/cs_CZ (LC_TIME): Change d_fmt to %e.%m.%Y from %-d.%-m.%Y.
- Change d_t_fmt to %a %-d. %B %Y, %H:%M:%S %Z from
- %a %e. %B %Y, %H:%M:%S %Z.
+ * locales/as_IN: Fix currency_symbol, abday for Sunday, abmon for
+ January, February, and September to December, mon for January,
+ February, September, and December, am_pm, and name_*.
+ Patch by Amitakhya Phukan <aphukan@redhat.com>.
+
+2007-04-27 Ulrich Drepper <drepper@redhat.com>
+
+ [BZ #3213]
+ * locales/translit_neutral: Add entry for U2044.
+
+2007-04-24 Ulrich Drepper <drepper@redhat.com>
+
+ [BZ #4411]
+ * locales/en_ZA: Update int_select.
+ Patch by Dwayne Bailey <dwayne@translate.org.za>.
+
+2007-02-16 Ulrich Drepper <drepper@redhat.com>
+
+ [BZ #3995]
+ * locales/ru_RU (LC_TIME): Set first_weekday and first_workday.
+
+2007-02-16 Ulrich Drepper <drepper@redhat.com>
+
+ [BZ #3851]
+ * locales/bn_BD: Fix full name of January and February.
+ Patch by Jamil Ahmed <jamil@bengalinux.org>.
+
+2007-02-17 Ulrich Drepper <drepper@redhat.com>
+
+ [BZ #3334]
+ * locales/sr_ME: Update from maintainer.
+
+2007-02-16 Ulrich Drepper <drepper@redhat.com>
+
+ [BZ #3322]
+ * SUPPORTED (SUPPORTED-LOCALES): Add sr_RS and sr_RS@latin.
+ * locales/sr_RS: New file.
+ * locales/sr_RS@latin: New file.
+
+2007-02-02 Bruno Haible <bruno@clisp.org>
+
+ * charmaps/EUC-KR: Add mapping for 0xA2 0xE8.
+ * charmaps/JOHAB: Add mapping for 0xD9 0xE8.
+ Reported by Jungshik Shin <jungshik@google.com>.
+
+ * charmaps/JOHAB: Add mappings for 0xD9 0xE6 and 0xD9 0xE7.
+ Reported by Jungshik Shin <jungshik@google.com>.
+
+2007-01-12 Gwenole Beauchesne <gbeauchesne@mandriva.com>
+
+ [BZ #3884]
+ * locales/sl_SI: Slovenia joined the Euro zone.
+ Fix negative number format.
2006-11-02 Ulrich Drepper <drepper@redhat.com>
diff --git a/localedata/SUPPORTED b/localedata/SUPPORTED
index dff286997ee..4eff7115ec7 100644
--- a/localedata/SUPPORTED
+++ b/localedata/SUPPORTED
@@ -321,6 +321,8 @@ sq_AL/ISO-8859-1 \
sr_CS.UTF-8/UTF-8 \
sr_CS/ISO-8859-5 \
sr_ME/UTF-8 \
+sr_RS/UTF-8 \
+sr_RS@latin/UTF-8 \
ss_ZA/UTF-8 \
st_ZA.UTF-8/UTF-8 \
st_ZA/ISO-8859-1 \
diff --git a/localedata/charmaps/EUC-KR b/localedata/charmaps/EUC-KR
index 9957c44d69d..9c48668b722 100644
--- a/localedata/charmaps/EUC-KR
+++ b/localedata/charmaps/EUC-KR
@@ -341,6 +341,7 @@ CHARMAP
<U2121> /xa2/xe5 TELEPHONE SIGN
<U20AC> /xa2/xe6 EURO SIGN
<U00AE> /xa2/xe7 REGISTERED SIGN
+<U327E> /xa2/xe8 CIRCLED HANGUL IEUNG U
<UFF01> /xa3/xa1 FULLWIDTH EXCLAMATION MARK
<UFF02> /xa3/xa2 FULLWIDTH QUOTATION MARK
<UFF03> /xa3/xa3 FULLWIDTH NUMBER SIGN
diff --git a/localedata/charmaps/JOHAB b/localedata/charmaps/JOHAB
index e0e6f5751d8..b088b230427 100644
--- a/localedata/charmaps/JOHAB
+++ b/localedata/charmaps/JOHAB
@@ -11520,6 +11520,9 @@ CHARMAP
<U33C2> /xd9/xe3 SQUARE AM
<U33D8> /xd9/xe4 SQUARE PM
<U2121> /xd9/xe5 TELEPHONE SIGN
+<U20AC> /xd9/xe6 EURO SIGN
+<U00AE> /xd9/xe7 REGISTERED SIGN
+<U327E> /xd9/xe8 CIRCLED HANGUL IEUNG U
<UFF01> /xda/x31 FULLWIDTH EXCLAMATION MARK
<UFF02> /xda/x32 FULLWIDTH QUOTATION MARK
<UFF03> /xda/x33 FULLWIDTH NUMBER SIGN
diff --git a/localedata/locales/as_IN b/localedata/locales/as_IN
index 2ab76f8477d..d3c779b7a6f 100644
--- a/localedata/locales/as_IN
+++ b/localedata/locales/as_IN
@@ -610,7 +610,7 @@ END LC_NUMERIC
%%%%%%%%%%%%%
LC_MONETARY
int_curr_symbol "<U0049><U004E><U0052><U0020>"
-currency_symbol "<U0052><U0073><U002E>"
+currency_symbol "<U099F><U0995><U09BE>"
mon_decimal_point "<U002E>"
mon_thousands_sep "<U002C>"
mon_grouping 3;2
@@ -634,7 +634,7 @@ END LC_MONETARY
%%%%%%%%%%%%%
LC_TIME
-abday "<U09F0><U09AC><U09BF>";/
+abday "<U09A6><U09C7><U0993>";/
"<U09B8><U09CB><U09AE>";/
"<U09AE><U0999><U09CD><U0997><U09B2>";/
"<U09AC><U09C1><U09A7>";/
@@ -648,37 +648,37 @@ day "<U09A6><U09C7><U0993><U09AC><U09BE><U09F0>";/
"<U09AC><U09C3><U09B9><U09B7><U09CD><U09AA><U09A4><U09BF><U09AC><U09BE><U09F0>";/
"<U09B6><U09C1><U0995><U09CD><U09F0><U09AC><U09BE><U09F0>";/
"<U09B6><U09A8><U09BF><U09AC><U09BE><U09F0>"
-abmon "<U099C><U09BE><U09A8><U09C1>";/
- "<U09AB><U09C7><U09AC><U09CD><U09F0><U09C1>";/
+abmon "<U099C><U09BE><U09A8><U09C1><U09F1><U09BE><U09F0><U09C0>";/
+ "<U09AB><U09C7><U09AC><U09CD><U09F0><U09C1><U09F1><U09BE><U09F0><U09C0>";/
"<U09AE><U09BE><U09F0><U09CD><U099A>";/
"<U098F><U09AA><U09CD><U09F0><U09BF><U09B2>";/
"<U09AE><U09C7>";/
"<U099C><U09C1><U09A8>";/
"<U099C><U09C1><U09B2><U09BE><U0987>";/
"<U0986><U0997>";/
- "<U09B8><U09C7><U09AA><U09CD><U099F>";/
- "<U0985><U0995><U09CD><U099F><U09CB>";/
- "<U09A8><U09AD><U09C7>";/
- "<U09A1><U09BF><U09B8><U09C7>"
-mon "<U099C><U09BE><U09A8><U09C1><U09DF><U09BE><U09F0><U09C0>";/
- "<U09AB><U09C7><U09AC><U09CD><U09F0><U09C1><U09DF><U09BE><U09F0><U09C0>";/
+ "<U099A><U09C7><U09AA><U09CD><U09A4><U09C7><U09AE><U09CD><U09AC><U09F0>";/
+ "<U0985><U0995><U09CD><U099F><U09CB><U09AC><U09F0>";/
+ "<U09A8><U09AD><U09C7><U09AE><U09CD><U09AC><U09F0>";/
+ "<U09A1><U09BF><U099A><U09C7><U09AE><U09CD><U09AC><U09F0>"
+mon "<U099C><U09BE><U09A8><U09C1><U09F1><U09BE><U09F0><U09C0>";/
+ "<U09AB><U09C7><U09AC><U09CD><U09F0><U09C1><U09F1><U09BE><U09F0><U09C0>";/
"<U09AE><U09BE><U09F0><U09CD><U099A>";/
"<U098F><U09AA><U09CD><U09F0><U09BF><U09B2>";/
"<U09AE><U09C7>";/
"<U099C><U09C1><U09A8>";/
"<U099C><U09C1><U09B2><U09BE><U0987>";/
"<U0986><U0997><U09B7><U09CD><U099F>";/
- "<U09B8><U09C7><U09AA><U09CD><U099F><U09C7><U09AE><U09CD><U09AC><U09F0>";/
+ "<U099A><U09C7><U09AA><U09CD><U09A4><U09C7><U09AE><U09CD><U09AC><U09F0>";/
"<U0985><U0995><U09CD><U099F><U09CB><U09AC><U09F0>";/
"<U09A8><U09AD><U09C7><U09AE><U09CD><U09AC><U09F0>";/
- "<U09A1><U09BF><U09B8><U09C7><U09AE><U09CD><U09AC><U09F0>"
+ "<U09A1><U09BF><U099A><U09C7><U09AE><U09CD><U09AC><U09F0>"
% d_fmt "%e-%m-%Y"
d_fmt "<U0025><U0065><U002D><U0025><U006D><U002D><U0025><U0059>"
% t_fmt "%I.%M.%S %p"
t_fmt "<U0025><U0049><U002E><U0025><U004D><U002E><U0025><U0053><U0020><U0025><U0070>"
% d_t_fmt"%e %B, %Y %I.%M.%S %p %Z"
d_t_fmt "<U0025><U0065><U0020><U0025><U0042><U002C><U0020><U0025><U0059><U0020><U0025><U0049><U002E><U0025><U004D><U002E><U0025><U0053><U0020><U0025><U0070><U0020><U0025><U005A>"
-am_pm "<U09AA><U09C2><U09F0><U09CD><U09AC><U09BE>";"<U0985><U09AA>"
+am_pm "<U09AA><U09C2><U09F0><U09CD><U09AC><U09CD><U09AC><U09BE><U09B9><U09CD><U09A8>";"<U0985><U09AA><U09F0><U09BE><U09B9><U09CD><U09A8>"
% t_fmt_ampm "%I.%M.%S %p"
t_fmt_ampm "<U0025><U0049><U002E><U0025><U004D><U002E><U0025><U0053><U0020><U0025><U0070>"
END LC_TIME
@@ -704,10 +704,10 @@ LC_NAME
name_fmt "<U0025><U0070><U0025><U0074><U0025><U0066><U0025><U0074>/
<U0025><U0067>"
name_gen ""
-name_mr "<U004D><U0072><U002E>"
-name_mrs "<U004D><U0072><U0073><U002E>"
-name_miss "<U004D><U0069><U0073><U0073><U002E>"
-name_ms "<U004D><U0073><U002E>"
+name_mr "<U09B6><U09CD><U09F0><U09C0>"
+name_mrs "<U09B6><U09CD><U09F0><U09C0><U09AE><U09A4><U09C0>"
+name_miss "<U0995><U09C1><U09AE><U09BE><U09F0><U09C0>"
+name_ms "<U0995><U09C1><U09AE><U09BE><U09F0><U09C0>"
END LC_NAME
%%%%%%%%%%%%%
diff --git a/localedata/locales/bn_BD b/localedata/locales/bn_BD
index 23f821ad6ec..dfbe47f0500 100644
--- a/localedata/locales/bn_BD
+++ b/localedata/locales/bn_BD
@@ -13,8 +13,8 @@ tel ""
fax ""
language "Bengali/Bangla"
territory "Bangladesh"
-revision "0.3"
-date "2005-01-18"
+revision "0.5"
+date "2007-01-10"
category "bn_BD:2001";LC_IDENTIFICATION
category "bn_BD:2001";LC_COLLATE
@@ -101,8 +101,8 @@ abmon "<U099C><U09BE><U09A8><U09C1>";/
"<U09A8><U09AD><U09C7>";/
"<U09A1><U09BF><U09B8><U09C7>"
-mon "<U099C><U09BE><U09A8><U09C1><U09DF><U09BE><U09B0><U098F>";/
- "<U09AB><U09C7><U09AC><U09CD><U09B0><U09C1><U09DF><U09BE><U09B0><U098F>";/
+mon "<U099C><U09BE><U09A8><U09C1><U09DF><U09BE><U09B0><U09BF>";/
+ "<U09AB><U09C7><U09AC><U09CD><U09B0><U09C1><U09DF><U09BE><U09B0><U09BF>";/
"<U09AE><U09BE><U09B0><U09CD><U099A>";/
"<U098F><U09AA><U09CD><U09B0><U09BF><U09B2>";/
"<U09AE><U09C7>";/
diff --git a/localedata/locales/cs_CZ b/localedata/locales/cs_CZ
index 5d279187eb5..9667700a936 100644
--- a/localedata/locales/cs_CZ
+++ b/localedata/locales/cs_CZ
@@ -2440,9 +2440,9 @@ abmon "<U006C><U0065><U0064>";/
week 7;19971201;4
-d_t_fmt "<U0025><U0061><U00A0><U0025><U002D><U0064><U002E><U00A0><U0025><U0042><U00A0><U0025><U0059><U002C><U00A0><U0025><U0048><U003A><U0025><U004D><U003A><U0025><U0053><U00A0><U0025><U005A>"
+d_t_fmt "<U0025><U0061><U00A0><U0025><U0065><U002E><U00A0><U0025><U0042><U00A0><U0025><U0059><U002C><U00A0><U0025><U0048><U003A><U0025><U004D><U003A><U0025><U0053><U00A0><U0025><U005A>"
-d_fmt "<U0025><U002D><U0064><U002E><U0025><U002D><U006D><U002E><U0025><U0059>"
+d_fmt "<U0025><U0064><U002E><U0025><U006D><U002E><U0025><U0059>"
t_fmt "<U0025><U0048><U003A><U0025><U004D><U003A><U0025><U0053>"
diff --git a/localedata/locales/en_ZA b/localedata/locales/en_ZA
index 4f13a96237b..f5476da6e6b 100644
--- a/localedata/locales/en_ZA
+++ b/localedata/locales/en_ZA
@@ -8,8 +8,8 @@ comment_char %
% Fax: +27 12 3430389
% Language: en
% Territory: ZA
-% Revision: 1.2.1
-% Date: 2005-10-13
+% Revision: 1.3
+% Date: 2007-04-19
% Users: general
% Repertoiremap: mnemonic,ds
% Charset: ISO-8859-1
@@ -17,6 +17,9 @@ comment_char %
% for commercial purposes.
%
% Changelog
+% 1.3 (2007-04-19):
+% 2007-04-19 Dwayne Bailey <dwayne@translate.org.za>
+% - Change int_select from 09 to 00
% 1.2.1 (2005-10-13):
% 2005-10-12 Dwayne Bailey <dwayne@translate.org.za>
% - Update contact information
@@ -55,8 +58,8 @@ territory "South Africa"
% audience ""
% application ""
abbreviation "Translate.org.za"
-revision "1.2.1"
-date "2005-10-13"
+revision "1.3"
+date "2007-04-19"
%
category "en_ZA:2003";LC_IDENTIFICATION
category "en_ZA:2000";LC_CTYPE
@@ -235,8 +238,8 @@ tel_int_fmt "<U002B><U0025><U0063><U0020><U0025><U0061><U0020><U0025>/
tel_dom_fmt "<U0028><U0025><U0041><U0029><U0020><U0025><U006C>"
% Prefix for making international calls
-% "09"
-int_select "<U0030><U0039>"
+% "00"
+int_select "<U0030><U0030>"
% International dialing code
% "27"
diff --git a/localedata/locales/ru_RU b/localedata/locales/ru_RU
index 279eaab1ea4..d00f3451db8 100644
--- a/localedata/locales/ru_RU
+++ b/localedata/locales/ru_RU
@@ -149,6 +149,8 @@ t_fmt_ampm ""
date_fmt "<U0025><U0061><U0020><U0025><U0062><U0020><U0025><U0065>/
<U0020><U0025><U0048><U003A><U0025><U004D><U003A><U0025><U0053><U0020>/
<U0025><U005A><U0020><U0025><U0059>"
+first_weekday 2
+first_workday 2
END LC_TIME
LC_PAPER
diff --git a/localedata/locales/sl_SI b/localedata/locales/sl_SI
index 8f7230d4684..b7e119443fa 100644
--- a/localedata/locales/sl_SI
+++ b/localedata/locales/sl_SI
@@ -2126,8 +2126,8 @@ noexpr "<U005E><U005B><U004E><U006E><U005D><U002E><U002A>"
END LC_MESSAGES
LC_MONETARY
-int_curr_symbol "<U0053><U0049><U0054><U0020>"
-currency_symbol "<U0053><U0049><U0054>"
+int_curr_symbol "<U0045><U0055><U0052><U0020>"
+currency_symbol "<U20AC>"
mon_decimal_point "<U002C>"
mon_thousands_sep "<U0020>"
mon_grouping 3;3
@@ -2136,11 +2136,11 @@ negative_sign "<U002D>"
int_frac_digits 2
frac_digits 2
p_cs_precedes 0
-p_sep_by_space 2
+p_sep_by_space 1
n_cs_precedes 0
-n_sep_by_space 2
-p_sign_posn 2
-n_sign_posn 2
+n_sep_by_space 1
+p_sign_posn 1
+n_sign_posn 1
END LC_MONETARY
LC_NUMERIC
diff --git a/localedata/locales/sr_ME b/localedata/locales/sr_ME
index 30afe44b61a..5c0961f60c9 100644
--- a/localedata/locales/sr_ME
+++ b/localedata/locales/sr_ME
@@ -1,42 +1,38 @@
comment_char %
escape_char /
%
-% Serbian Language in Jekavian dialect Locale for Serbia and Montenegro
-% Source: sr_YU locale
+% Serbian Language locale for Montenegro
+% Source: sr_YU, sr_CS locale
% Address:
%
% Contact: Danilo Segan
-% Email: dsegan@gmx.net
-% Tel: +381 63 8626082
+% Email: danilo@gnome.org
+% Tel: +381 63 323456
% Fax: none
% Language: sr
-% Territory: CS
-% Revision: 1.0
-% Date: 2003-08-13
+% Territory: ME
+% Revision: 1.2
+% Date: 2006-10-11
% Application: general
% Users: general
% Charset: UTF-8, ISO-8859-5
% Distribution and use is free, also
% for commercial purposes.
-%
-% TODO:
-% -- fix LC_COLLATE to work correctly for latin alphabet too
-%
LC_IDENTIFICATION
-title "Serbian locale for Serbia and Montenegro"
-source "sr_YU locale"
+title "Serbian locale for Montenegro"
+source "sr_YU, sr_CS locale"
address ""
contact "Danilo Segan"
email "bug-glibc@gnu.org"
tel ""
fax ""
language "Serbian"
-territory "Serbia and Montenegro"
-revision "1.1"
-date "2004-01-10"
+territory "Montenegro"
+revision "1.2"
+date "2006-10-11"
audience "general"
-application ""
+application "GNU locale"
abbreviation ""
%
category i18n:1997;LC_IDENTIFICATION
@@ -54,19 +50,33 @@ category i18n:1997;LC_MEASUREMENT
END LC_IDENTIFICATION
LC_CTYPE
-copy "sr_CS"
+copy "i18n"
END LC_CTYPE
LC_COLLATE
-copy "sr_CS"
+copy "sr_RS"
END LC_COLLATE
LC_MONETARY
-copy "sr_CS"
+int_curr_symbol "<U0045><U0055><U0052><U0020>"
+currency_symbol "<U20AC>"
+mon_decimal_point "<U002C>"
+mon_thousands_sep "<U002E>"
+mon_grouping 3;3
+positive_sign ""
+negative_sign "<U002D>"
+int_frac_digits 2
+frac_digits 2
+p_cs_precedes 0
+p_sep_by_space 1
+n_cs_precedes 0
+n_sep_by_space 1
+p_sign_posn 1
+n_sign_posn 1
END LC_MONETARY
LC_NUMERIC
-copy "sr_CS"
+copy "sr_RS"
END LC_NUMERIC
LC_TIME
@@ -110,31 +120,46 @@ t_fmt_ampm "<U0025><U0054>"
date_fmt "<U0025><U0061><U002c><U0020><U0025><U0065><U002E><U0020>/
<U0025><U0062><U0020><U0025><U0059><U002E><U0020><U0020><U0025><U0048>/
<U003A><U0025><U004D><U003A><U0025><U0053><U0020><U0025><U005A><U000A>"
-week 7;19971201;4
+% week 7;19971201;4
first_weekday 2
first_workday 2
END LC_TIME
LC_MESSAGES
-copy "sr_CS"
+copy "sr_RS"
END LC_MESSAGES
LC_PAPER
-copy "sr_CS"
+copy "sr_RS"
END LC_PAPER
LC_NAME
-copy "sr_CS"
+copy "sr_RS"
END LC_NAME
LC_ADDRESS
-copy "sr_CS"
+postal_fmt "<U0025><U0066><U0025><U004E><U0025><U0061><U0025><U004E>/
+<U0025><U0064><U0025><U004E><U0025><U0062><U0025><U004E><U0025><U0073>/
+<U0020><U0025><U0068><U0020><U0025><U0065><U0020><U0025><U0072><U0025>/
+<U004E><U0025><U0025><U007A><U0020><U0025><U0054><U0025>/
+<U004E><U0025><U0063><U0025><U004E>"
+country_ab2 "<U004D><U0045>"
+country_ab3 "<U004D><U004E><U0045>"
+country_post "<U004D><U004E><U0045>"
+country_name "<U0426><U0440><U043D><U0430><U0020><U0413><U043E><U0440><U0430>"
+country_num 499
+country_car "<U004D><U004E><U0045>"
+country_isbn "<U0038><U0036>"
+lang_name "<U0441><U0440><U043F><U0441><U043A><U0438>"
+lang_term "<U0073><U0072><U0070>"
+lang_lib "<U0073><U0063><U0063>"
+lang_ab "<U0073><U0072>"
END LC_ADDRESS
LC_TELEPHONE
-copy "sr_CS"
+copy "sr_RS"
END LC_TELEPHONE
LC_MEASUREMENT
-copy "sr_CS"
+copy "sr_RS"
END LC_MEASUREMENT
diff --git a/localedata/locales/sr_RS b/localedata/locales/sr_RS
new file mode 100644
index 00000000000..b818592c0e4
--- /dev/null
+++ b/localedata/locales/sr_RS
@@ -0,0 +1,360 @@
+comment_char %
+escape_char /
+%
+% Serbian Language Locale for Serbia
+% Source: sr_YU, sr_CS locales
+% Address:
+%
+% Contact: Danilo Segan
+% Email: danilo@gnome.org
+% Tel: +381 63 323456
+% Fax: none
+% Language: sr
+% Territory: RS
+% Revision: 1.3
+% Date: 2006-10-09
+% Application: general
+% Users: general
+% Charset: UTF-8
+% Distribution and use is free, also
+% for commercial purposes.
+%
+
+LC_IDENTIFICATION
+title "Serbian locale for Serbia"
+source "sr_YU, sr_CS locale"
+address ""
+contact "Danilo Segan"
+email "bug-glibc-locales@gnu.org"
+tel ""
+fax ""
+language "Serbian"
+territory "Serbia"
+revision "1.3"
+date "2006-10-09"
+audience "general"
+application "GNU locale"
+abbreviation ""
+%
+category "i18n:1997";LC_IDENTIFICATION
+category "i18n:1997";LC_CTYPE
+category "i18n:1997";LC_COLLATE
+category "i18n:1997";LC_MONETARY
+category "i18n:1997";LC_NUMERIC
+category "i18n:1997";LC_TIME
+category "i18n:1997";LC_MESSAGES
+category "i18n:1997";LC_PAPER
+category "i18n:1997";LC_NAME
+category "i18n:1997";LC_ADDRESS
+category "i18n:1997";LC_TELEPHONE
+category "i18n:1997";LC_MEASUREMENT
+END LC_IDENTIFICATION
+
+LC_CTYPE
+copy "i18n"
+translit_start
+include "translit_combining";""
+
+% cyrillic -> latin
+<U0452> "<U0111>";"<U0064><U006A>" % d-
+<U0453> "<U0067><U006A>" % gj
+<U0455> "<U0064><U007A>" % dz
+<U0458> "<U006A>" % j
+<U0459> "<U006C><U006A>" % lj
+<U045A> "<U006E><U006A>" % nj
+<U045B> "<U0107>";"<U0063>" % c'
+<U045C> "<U006B><U006A>" % kj
+<U045F> "<U0064><U017E>";"<U0064><U007A>" % dz<
+
+<U0402> "<U0110>";"<U0044><U006A>" % D-
+<U0403> "<U0047><U006A>" % Gj
+<U0405> "<U0044><U007A>" % Dz
+<U0408> "<U004A>" % J
+<U0409> "<U004C><U006A>" % Lj
+<U040A> "<U004E><U006A>" % Nj
+<U040B> "<U0106>";"<U0043>" % C'
+<U040C> "<U004B><U006A>" % Kj
+<U040F> "<U0044><U017E>";"<U0064><U007A>" % Dz<
+
+<U0430> "<U0061>"
+<U0431> "<U0062>"
+<U0446> "<U0063>"
+<U0434> "<U0064>"
+<U0435> "<U0065>"
+<U0444> "<U0066>"
+<U0433> "<U0067>"
+<U0445> "<U0068>"
+<U0438> "<U0069>"
+<U043A> "<U006B>"
+<U043B> "<U006C>"
+<U043C> "<U006D>"
+<U043D> "<U006E>"
+<U043E> "<U006F>"
+<U043F> "<U0070>"
+<U0440> "<U0072>"
+<U0441> "<U0073>"
+<U0442> "<U0074>"
+<U0443> "<U0075>"
+<U0432> "<U0076>"
+<U0437> "<U007A>"
+<U0436> "<U017E>";"<U007A>" % z<
+<U0448> "<U0161>";"<U0073>" % s<
+<U0447> "<U010D>";"<U0063>" % c<
+
+<U0410> "<U0041>"
+<U0411> "<U0042>"
+<U0426> "<U0043>"
+<U0414> "<U0044>"
+<U0415> "<U0045>"
+<U0424> "<U0046>"
+<U0413> "<U0047>"
+<U0425> "<U0048>"
+<U0418> "<U0049>"
+<U041A> "<U004B>"
+<U041B> "<U004C>"
+<U041C> "<U004D>"
+<U041D> "<U004E>"
+<U041E> "<U004F>"
+<U041F> "<U0050>"
+<U0420> "<U0052>"
+<U0421> "<U0053>"
+<U0422> "<U0054>"
+<U0423> "<U0055>"
+<U0412> "<U0056>"
+<U0417> "<U005A>"
+<U0416> "<U017D>";"<U005A>" % z<
+<U0428> "<U0160>";"<U0053>" % s<
+<U0427> "<U010C>";"<U0063>" % c<
+
+translit_end
+END LC_CTYPE
+
+
+LC_COLLATE
+
+copy "iso14651_t1"
+
+collating-element <D-Z<> from "<U0044><U017D>"
+collating-element <D-z<> from "<U0044><U017E>"
+collating-element <d-Z<> from "<U0064><U017D>"
+collating-element <d-z<> from "<U0064><U017E>"
+
+collating-element <L-J> from "<U004C><U004A>"
+collating-element <L-j> from "<U004C><U006A>"
+collating-element <l-J> from "<U006C><U004A>"
+collating-element <l-j> from "<U006C><U006A>"
+
+collating-element <N-J> from "<U004E><U004A>"
+collating-element <N-j> from "<U004E><U006A>"
+collating-element <n-J> from "<U006E><U004A>"
+collating-element <n-j> from "<U006E><U006A>"
+
+collating-symbol <d-z-sh>
+collating-symbol <l-j-sh>
+collating-symbol <n-j-sh>
+
+collating-symbol <cacute>
+collating-symbol <ccaron>
+collating-symbol <d//>
+collating-symbol <scaron>
+collating-symbol <zcaron>
+
+collating-symbol <CAP-MIN>
+collating-symbol <MIN-CAP>
+
+reorder-after <MIN>
+<MIN-CAP>
+reorder-after <CAP>
+<CAP-MIN>
+
+reorder-after <c>
+<cacute>
+<ccaron>
+<d>
+<d-z-sh>
+<d//>
+reorder-after <l>
+<l-j-sh>
+reorder-after <n>
+<n-j-sh>
+reorder-after <s>
+<scaron>
+reorder-after <z>
+<zcaron>
+
+reorder-after <U0063>
+<U0107> <cacute>;<PCT>;<MIN>;IGNORE
+<U010D> <ccaron>;<PCT>;<MIN>;IGNORE
+reorder-after <U0043>
+<U0106> <cacute>;<PCT>;<CAP>;IGNORE
+<U010C> <ccaron>;<PCT>;<CAP>;IGNORE
+
+reorder-after <U0064>
+<d-z<> <d-z-sh>;<PCT>;<MIN>;IGNORE
+<U01C6> <d-z-sh>;<PCT>;<MIN>;IGNORE
+<d-Z<> <d-z-sh>;<PCT>;<MIN-CAP>;IGNORE
+<U0111> <d//>;<PCT>;<MIN>;IGNORE
+reorder-after <U0044>
+<D-Z<> <d-z-sh>;<PCT>;<CAP>;IGNORE
+<U01C4> <d-z-sh>;<PCT>;<CAP>;IGNORE
+<D-z<> <d-z-sh>;<PCT>;<CAP-MIN>;IGNORE
+<U01C5> <d-z-sh>;<PCT>;<CAP-MIN>;IGNORE
+<U0110> <d//>;<PCT>;<CAP>;IGNORE
+
+reorder-after <U006C>
+<l-j> <l-j-sh>;<PCT>;<MIN>;IGNORE
+<U01C9> <l-j-sh>;<PCT>;<MIN>;IGNORE
+<l-J> <l-j-sh>;<PCT>;<MIN-CAP>;IGNORE
+reorder-after <U004C>
+<L-J> <l-j-sh>;<PCT>;<CAP>;IGNORE
+<U01C7> <l-j-sh>;<PCT>;<CAP>;IGNORE
+<L-j> <l-j-sh>;<PCT>;<CAP-MIN>;IGNORE
+<U01C8> <l-j-sh>;<PCT>;<CAP-MIN>;IGNORE
+
+reorder-after <U006E>
+<n-j> <n-j-sh>;<PCT>;<MIN>;IGNORE
+<U01CC> <n-j-sh>;<PCT>;<MIN>;IGNORE
+<n-J> <n-j-sh>;<PCT>;<MIN-CAP>;IGNORE
+reorder-after <U004E>
+<N-J> <n-j-sh>;<PCT>;<CAP>;IGNORE
+<U01CA> <n-j-sh>;<PCT>;<CAP>;IGNORE
+<N-j> <n-j-sh>;<PCT>;<CAP-MIN>;IGNORE
+<U01CB> <n-j-sh>;<PCT>;<CAP-MIN>;IGNORE
+
+reorder-after <U0073>
+<U0161> <scaron>;<PCT>;<MIN>;IGNORE
+reorder-after <U0053>
+<U0160> <scaron>;<PCT>;<CAP>;IGNORE
+
+reorder-after <U007A>
+<U017E> <zcaron>;<PCT>;<MIN>;IGNORE
+reorder-after <U005A>
+<U017D> <zcaron>;<PCT>;<CAP>;IGNORE
+
+reorder-end
+
+END LC_COLLATE
+
+LC_MONETARY
+int_curr_symbol "<U0052><U0053><U0044><U0020>"
+currency_symbol "<U0434><U0438><U043D>"
+mon_decimal_point "<U002C>"
+mon_thousands_sep "<U002E>"
+mon_grouping 3;3
+positive_sign ""
+negative_sign "<U002D>"
+int_frac_digits 2
+frac_digits 2
+p_cs_precedes 0
+p_sep_by_space 1
+n_cs_precedes 0
+n_sep_by_space 1
+p_sign_posn 1
+n_sign_posn 1
+END LC_MONETARY
+
+LC_NUMERIC
+decimal_point "<U002C>"
+thousands_sep ""
+grouping 0;0
+END LC_NUMERIC
+
+LC_TIME
+
+abday "<U043D><U0435><U0434>";"<U043F><U043E><U043D>";/
+ "<U0443><U0442><U043E>";"<U0441><U0440><U0435>";/
+ "<U0447><U0435><U0442>";"<U043F><U0435><U0442>";/
+ "<U0441><U0443><U0431>"
+day "<U043D><U0435><U0434><U0435><U0459><U0430>";/
+ "<U043F><U043E><U043D><U0435><U0434><U0435><U0459><U0430><U043A>";/
+ "<U0443><U0442><U043E><U0440><U0430><U043A>";/
+ "<U0441><U0440><U0435><U0434><U0430>";/
+ "<U0447><U0435><U0442><U0432><U0440><U0442><U0430><U043A>";/
+ "<U043F><U0435><U0442><U0430><U043A>";/
+ "<U0441><U0443><U0431><U043E><U0442><U0430>"
+abmon "<U0458><U0430><U043D>";"<U0444><U0435><U0431>";/
+ "<U043C><U0430><U0440>";"<U0430><U043F><U0440>";/
+ "<U043C><U0430><U0458>";"<U0458><U0443><U043D>";/
+ "<U0458><U0443><U043B>";"<U0430><U0432><U0433>";/
+ "<U0441><U0435><U043F>";"<U043E><U043A><U0442>";/
+ "<U043D><U043E><U0432>";"<U0434><U0435><U0446>"
+mon "<U0458><U0430><U043D><U0443><U0430><U0440>";/
+ "<U0444><U0435><U0431><U0440><U0443><U0430><U0440>";/
+ "<U043C><U0430><U0440><U0442>";/
+ "<U0430><U043F><U0440><U0438><U043B>";/
+ "<U043C><U0430><U0458>";/
+ "<U0458><U0443><U043D>";/
+ "<U0458><U0443><U043B>";/
+ "<U0430><U0432><U0433><U0443><U0441><U0442>";/
+ "<U0441><U0435><U043F><U0442><U0435><U043C><U0431><U0430><U0440>";/
+ "<U043E><U043A><U0442><U043E><U0431><U0430><U0440>";/
+ "<U043D><U043E><U0432><U0435><U043C><U0431><U0430><U0440>";/
+ "<U0434><U0435><U0446><U0435><U043C><U0431><U0430><U0440>"
+
+d_t_fmt "<U0025><U0041><U002C><U0020><U0025><U0064><U002E><U0020>/
+<U0025><U0042><U0020><U0025><U0059><U002E><U0020><U0025><U0054>/
+<U0020><U0025><U005A>"
+d_fmt "<U0025><U0064><U002E><U0025><U006D><U002E><U0025><U0059><U002E>"
+t_fmt "<U0025><U0054>"
+am_pm "";""
+t_fmt_ampm "<U0025><U0054>"
+date_fmt "<U0025><U0061><U002C><U0020><U0025><U0065><U002E><U0020>/
+<U0025><U0062><U0020><U0025><U0059><U002E><U0020><U0020><U0025><U0048>/
+<U003A><U0025><U004D><U003A><U0025><U0053><U0020><U0025><U005A><U000A>"
+% week 7;19971201;4
+first_weekday 2
+first_workday 2
+END LC_TIME
+
+LC_MESSAGES
+yesexpr "<U005E><U005B><U0414><U0434><U0044><U0064><U0059><U0079><U005D>"
+noexpr "<U005E><U005B><U041D><U043D><U004E><U006E><U005D>"
+END LC_MESSAGES
+
+LC_PAPER
+height 297
+width 210
+END LC_PAPER
+
+LC_NAME
+name_fmt "<U0025><U0064><U0025><U0074><U0025><U0067><U0025><U0074>/
+<U0025><U006D><U0025><U0074><U0025><U0066>"
+name_gen ""
+name_mr "<U0433><U002D><U0434><U0438><U043D>"
+name_mrs "<U0433><U002D><U0452><U0430>"
+name_miss "<U0433><U002D><U0452><U0438><U0446><U0430>"
+name_ms "<U0433><U002D><U0452><U0430>"
+END LC_NAME
+
+LC_ADDRESS
+postal_fmt "<U0025><U0066><U0025><U004E><U0025><U0061><U0025><U004E>/
+<U0025><U0064><U0025><U004E><U0025><U0062><U0025><U004E><U0025><U0073>/
+<U0020><U0025><U0068><U0020><U0025><U0065><U0020><U0025><U0072><U0025>/
+<U004E><U0025><U0025><U007A><U0020><U0025><U0054><U0025>/
+<U004E><U0025><U0063><U0025><U004E>"
+country_ab2 "<U0052><U0053>"
+country_ab3 "<U0053><U0052><U0042>"
+% FIXME: country_post is probably incorrect
+country_post "<U0053><U0052><U0042>"
+country_name "<U0421><U0440><U0431><U0438><U0458><U0430>"
+country_num 688
+country_car "<U0053><U0052><U0042>"
+% FIXME: ISBN code is what? "86" that preceedes all the numbers?
+country_isbn "<U0038><U0036>"
+lang_name "<U0441><U0440><U043F><U0441><U043A><U0438>"
+lang_term "<U0073><U0072><U0070>"
+lang_lib "<U0073><U0063><U0063>"
+lang_ab "<U0073><U0072>"
+END LC_ADDRESS
+
+LC_TELEPHONE
+tel_int_fmt "<U002B><U0025><U0063><U0020><U0025><U0061><U0020><U0025>/
+<U006C>"
+tel_dom_fmt "<U0025><U0041><U0020><U0025><U006C>"
+int_prefix "<U0033><U0038><U0031>"
+int_select "<U0039><U0039>"
+END LC_TELEPHONE
+
+LC_MEASUREMENT
+measurement 1
+END LC_MEASUREMENT
diff --git a/localedata/locales/sr_RS@latin b/localedata/locales/sr_RS@latin
new file mode 100644
index 00000000000..d9b9133268f
--- /dev/null
+++ b/localedata/locales/sr_RS@latin
@@ -0,0 +1,174 @@
+comment_char %
+escape_char /
+%
+% Serbian Language Locale for Serbia
+% Source: sr_YU, sr_CS locales
+% Address:
+%
+% Contact: Danilo Segan
+% Email: danilo@gnome.org
+% Tel: +381 63 323456
+% Fax: none
+% Language: sr
+% Territory: RS
+% Revision: 1.3
+% Date: 2006-10-09
+% Application: general
+% Users: general
+% Charset: UTF-8, ISO-8859-2
+% Distribution and use is free, also
+% for commercial purposes.
+%
+
+LC_IDENTIFICATION
+title "Serbian Latin locale for Serbia"
+source "sr_YU, sr_CS locale"
+address ""
+contact "Danilo Segan"
+email "bug-glibc-locales@gnu.org"
+tel ""
+fax ""
+language "Serbian"
+territory "Serbia"
+revision "1.3"
+date "2006-10-09"
+audience "general"
+application "GNU locale"
+abbreviation ""
+%
+category "i18n:1997";LC_IDENTIFICATION
+category "i18n:1997";LC_CTYPE
+category "i18n:1997";LC_COLLATE
+category "i18n:1997";LC_MONETARY
+category "i18n:1997";LC_NUMERIC
+category "i18n:1997";LC_TIME
+category "i18n:1997";LC_MESSAGES
+category "i18n:1997";LC_PAPER
+category "i18n:1997";LC_NAME
+category "i18n:1997";LC_ADDRESS
+category "i18n:1997";LC_TELEPHONE
+category "i18n:1997";LC_MEASUREMENT
+END LC_IDENTIFICATION
+
+LC_CTYPE
+copy "i18n"
+END LC_CTYPE
+
+LC_COLLATE
+copy "sr_RS"
+END LC_COLLATE
+
+LC_MONETARY
+int_curr_symbol "<U0052><U0053><U0044><U0020>"
+currency_symbol "<U0064><U0069><U006E>"
+mon_decimal_point "<U002C>"
+mon_thousands_sep "<U002E>"
+mon_grouping 3;3
+positive_sign ""
+negative_sign "<U002D>"
+int_frac_digits 0
+frac_digits 0
+p_cs_precedes 1
+p_sep_by_space 1
+n_cs_precedes 1
+n_sep_by_space 1
+p_sign_posn 1
+n_sign_posn 1
+END LC_MONETARY
+
+LC_NUMERIC
+copy "sr_RS"
+END LC_NUMERIC
+
+LC_TIME
+abday "<U006E><U0065><U0064>";"<U0070><U006F><U006E>";/
+ "<U0075><U0074><U006F>";"<U0073><U0072><U0065>";/
+ "<U010D><U0065><U0074>";"<U0070><U0065><U0074>";/
+ "<U0073><U0075><U0062>"
+day "<U006E><U0065><U0064><U0065><U006C><U006A><U0061>";/
+ "<U0070><U006F><U006E><U0065><U0064><U0065><U006C><U006A><U0061><U006B>";/
+ "<U0075><U0074><U006F><U0072><U0061><U006B>";/
+ "<U0073><U0072><U0065><U0064><U0061>";/
+ "<U010D><U0065><U0074><U0076><U0072><U0074><U0061><U006B>";/
+ "<U0070><U0065><U0074><U0061><U006B>";/
+ "<U0073><U0075><U0062><U006F><U0074><U0061>"
+abmon "<U006A><U0061><U006E>";"<U0066><U0065><U0062>";/
+ "<U006D><U0061><U0072>";"<U0061><U0070><U0072>";/
+ "<U006D><U0061><U006A>";"<U006A><U0075><U006E>";/
+ "<U006A><U0075><U006C>";"<U0061><U0076><U0067>";/
+ "<U0073><U0065><U0070>";"<U006F><U006B><U0074>";/
+ "<U006E><U006F><U0076>";"<U0064><U0065><U0063>"
+mon "<U006A><U0061><U006E><U0075><U0061><U0072>";/
+ "<U0066><U0065><U0062><U0072><U0075><U0061><U0072>";/
+ "<U006D><U0061><U0072><U0074>";/
+ "<U0061><U0070><U0072><U0069><U006C>";/
+ "<U006D><U0061><U006A>";/
+ "<U006A><U0075><U006E><U0069>";/
+ "<U006A><U0075><U006C><U0069>";/
+ "<U0061><U0076><U0067><U0075><U0073><U0074>";/
+ "<U0073><U0065><U0070><U0074><U0065><U006D><U0062><U0061><U0072>";/
+ "<U006F><U006B><U0074><U006F><U0062><U0061><U0072>";/
+ "<U006E><U006F><U0076><U0065><U006D><U0062><U0061><U0072>";/
+ "<U0064><U0065><U0063><U0065><U006D><U0062><U0061><U0072>"
+
+d_t_fmt "<U0025><U0041><U002C><U0020><U0025><U0064><U002E><U0020>/
+<U0025><U0042><U0020><U0025><U0059><U002E><U0020><U0025><U0054>/
+<U0020><U0025><U005A>"
+d_fmt "<U0025><U0064><U002E><U0025><U006D><U002E><U0025><U0059><U002E>"
+t_fmt "<U0025><U0054>"
+am_pm "";""
+t_fmt_ampm "<U0025><U0054>"
+date_fmt "<U0025><U0061><U002c><U0020><U0025><U0065><U002E><U0020>/
+<U0025><U0062><U0020><U0025><U0059><U002E><U0020><U0020><U0025><U0048>/
+<U003A><U0025><U004D><U003A><U0025><U0053><U0020><U0025><U005A><U000A>"
+% week 7;19971201;4
+first_weekday 2
+first_workday 2
+END LC_TIME
+
+LC_MESSAGES
+yesexpr "<U005E><U005B><U0064><U0044><U0079><U0059><U005D>"
+noexpr "<U005E><U005B><U006E><U004E><U005D>"
+END LC_MESSAGES
+
+LC_PAPER
+copy "sr_RS"
+END LC_PAPER
+
+LC_NAME
+name_fmt "<U0025><U0064><U0025><U0074><U0025><U0067><U0025><U0074>/
+<U0025><U006D><U0025><U0074><U0025><U0066>"
+name_gen ""
+name_mr "<U0067><U002D><U0064><U0069><U006E>"
+name_mrs "<U0067><U002D><U0111><U0061>"
+name_miss "<U0067><U002D><U0111><U0069><U0063><U0061>"
+name_ms "<U0067><U002D><U0111><U0061>"
+END LC_NAME
+
+LC_ADDRESS
+postal_fmt "<U0025><U0066><U0025><U004E><U0025><U0061><U0025><U004E>/
+<U0025><U0064><U0025><U004E><U0025><U0062><U0025><U004E><U0025><U0073>/
+<U0020><U0025><U0068><U0020><U0025><U0065><U0020><U0025><U0072><U0025>/
+<U004E><U0025><U0025><U007A><U0020><U0025><U0054><U0025>/
+<U004E><U0025><U0063><U0025><U004E>"
+country_ab2 "<U0052><U0053>"
+country_ab3 "<U0053><U0052><U0042>"
+country_post "<U0053><U0052><U0042>"
+country_name "<U0053><U0072><U0062><U0069><U006A><U0061><U0020><U0069>/
+<U0020><U0043><U0072><U006E><U0061><U0020><U0047><U006F><U0072><U0061>"
+country_num 688
+country_car "<U0053><U0052><U0042>"
+country_isbn "<U0038><U0036>"
+lang_name "<U0073><U0072><U0070><U0073><U006B><U0069>"
+lang_term "<U0073><U0072><U0070>"
+lang_lib "<U0073><U0063><U0063>"
+lang_ab "<U0073><U0072>"
+END LC_ADDRESS
+
+LC_TELEPHONE
+copy "sr_RS"
+END LC_TELEPHONE
+
+LC_MEASUREMENT
+copy "sr_RS"
+END LC_MEASUREMENT
diff --git a/localedata/locales/translit_neutral b/localedata/locales/translit_neutral
index 413b14d70ea..5883d28004d 100644
--- a/localedata/locales/translit_neutral
+++ b/localedata/locales/translit_neutral
@@ -116,6 +116,8 @@ include "translit_wide";""
<U2039> <U003C>
% SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
<U203A> <U003E>
+% FRACTION SLASH
+<U2044> <U002F>
% WORD JOINER
<U2060> ""
% FUNCTION APPLICATION
diff --git a/login/utmp_file.c b/login/utmp_file.c
index e7743bfac86..871c8560715 100644
--- a/login/utmp_file.c
+++ b/login/utmp_file.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996-2002, 2003, 2004 Free Software Foundation, Inc.
+/* Copyright (C) 1996-2002, 2003, 2004, 2007 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>
and Paul Janzen <pcj@primenet.com>, 1996.
@@ -140,11 +140,11 @@ setutent_file (void)
file_name = TRANSFORM_UTMP_FILE_NAME (__libc_utmp_file_name);
- file_fd = open_not_cancel_2 (file_name, O_RDWR);
+ file_fd = open_not_cancel_2 (file_name, O_RDWR | O_LARGEFILE);
if (file_fd == -1)
{
/* Hhm, read-write access did not work. Try read-only. */
- file_fd = open_not_cancel_2 (file_name, O_RDONLY);
+ file_fd = open_not_cancel_2 (file_name, O_RDONLY | O_LARGEFILE);
if (file_fd == -1)
return 0;
}
@@ -459,7 +459,7 @@ updwtmp_file (const char *file, const struct utmp *utmp)
int fd;
/* Open WTMP file. */
- fd = open_not_cancel_2 (file, O_WRONLY);
+ fd = open_not_cancel_2 (file, O_WRONLY | O_LARGEFILE);
if (fd < 0)
return -1;
diff --git a/malloc/arena.c b/malloc/arena.c
index 1d9f9521125..0dcb7cb9f85 100644
--- a/malloc/arena.c
+++ b/malloc/arena.c
@@ -1,5 +1,6 @@
/* Malloc implementation for multiple threads without lock contention.
- Copyright (C) 2001,2002,2003,2004,2005,2006 Free Software Foundation, Inc.
+ Copyright (C) 2001,2002,2003,2004,2005,2006,2007
+ Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Wolfram Gloger <wg@malloc.de>, 2001.
@@ -59,10 +60,12 @@ typedef struct _heap_info {
mstate ar_ptr; /* Arena for this heap. */
struct _heap_info *prev; /* Previous heap. */
size_t size; /* Current size in bytes. */
+ size_t mprotect_size; /* Size in bytes that has been mprotected
+ PROT_READ|PROT_WRITE. */
/* Make sure the following data is properly aligned, particularly
that sizeof (heap_info) + 2 * SIZE_SZ is a multiple of
- MALLOG_ALIGNMENT. */
- char pad[-5 * SIZE_SZ & MALLOC_ALIGN_MASK];
+ MALLOC_ALIGNMENT. */
+ char pad[-6 * SIZE_SZ & MALLOC_ALIGN_MASK];
} heap_info;
/* Get a compile-time error if the heap_info padding is not correct
@@ -149,7 +152,7 @@ int __malloc_initialized = -1;
static __malloc_ptr_t (*save_malloc_hook) (size_t __size,
__const __malloc_ptr_t);
-# if !defined _LIBC || (defined SHARED && !USE___THREAD)
+# if !defined _LIBC || !defined USE_TLS || (defined SHARED && !USE___THREAD)
static __malloc_ptr_t (*save_memalign_hook) (size_t __align, size_t __size,
__const __malloc_ptr_t);
# endif
@@ -385,7 +388,7 @@ extern struct dl_open_hook *_dl_open_hook;
libc_hidden_proto (_dl_open_hook);
# endif
-# if defined SHARED && !USE___THREAD
+# if defined SHARED && defined USE_TLS && !USE___THREAD
/* This is called by __pthread_initialize_minimal when it needs to use
malloc to set up the TLS state. We cannot do the full work of
ptmalloc_init (below) until __pthread_initialize_minimal has finished,
@@ -428,7 +431,7 @@ ptmalloc_init (void)
__malloc_initialized = 0;
#ifdef _LIBC
-# if defined SHARED && !USE___THREAD
+# if defined SHARED && defined USE_TLS && !USE___THREAD
/* ptmalloc_init_minimal may already have been called via
__libc_malloc_pthread_startup, above. */
if (mp_.pagesize == 0)
@@ -437,7 +440,7 @@ ptmalloc_init (void)
ptmalloc_init_minimal();
#ifndef NO_THREADS
-# if defined _LIBC
+# if defined _LIBC && defined USE_TLS
/* We know __pthread_initialize_minimal has already been called,
and that is enough. */
# define NO_STARTER
@@ -692,6 +695,7 @@ new_heap(size, top_pad) size_t size, top_pad;
}
h = (heap_info *)p2;
h->size = size;
+ h->mprotect_size = size;
THREAD_STAT(stat_n_heaps++);
return h;
}
@@ -714,17 +718,34 @@ grow_heap(h, diff) heap_info *h; long diff;
new_size = (long)h->size + diff;
if((unsigned long) new_size > (unsigned long) HEAP_MAX_SIZE)
return -1;
- if(mprotect((char *)h + h->size, diff, PROT_READ|PROT_WRITE) != 0)
- return -2;
+ if((unsigned long) new_size > h->mprotect_size) {
+ if (mprotect((char *)h + h->mprotect_size,
+ (unsigned long) new_size - h->mprotect_size,
+ PROT_READ|PROT_WRITE) != 0)
+ return -2;
+ h->mprotect_size = new_size;
+ }
} else {
new_size = (long)h->size + diff;
if(new_size < (long)sizeof(*h))
return -1;
/* Try to re-map the extra heap space freshly to save memory, and
make it inaccessible. */
- if((char *)MMAP((char *)h + new_size, -diff, PROT_NONE,
- MAP_PRIVATE|MAP_FIXED) == (char *) MAP_FAILED)
- return -2;
+#ifdef _LIBC
+ if (__builtin_expect (__libc_enable_secure, 0))
+#else
+ if (1)
+#endif
+ {
+ if((char *)MMAP((char *)h + new_size, -diff, PROT_NONE,
+ MAP_PRIVATE|MAP_FIXED) == (char *) MAP_FAILED)
+ return -2;
+ h->mprotect_size = new_size;
+ }
+#ifdef _LIBC
+ else
+ madvise ((char *)h + new_size, -diff, MADV_DONTNEED);
+#endif
/*fprintf(stderr, "shrink %p %08lx\n", h, new_size);*/
}
h->size = new_size;
diff --git a/malloc/hooks.c b/malloc/hooks.c
index 8346e734534..708f0faf831 100644
--- a/malloc/hooks.c
+++ b/malloc/hooks.c
@@ -1,5 +1,5 @@
/* Malloc implementation for multiple threads without lock contention.
- Copyright (C) 2001,2002,2003,2004,2005,2006 Free Software Foundation, Inc.
+ Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Wolfram Gloger <wg@malloc.de>, 2001.
@@ -414,7 +414,7 @@ memalign_check(alignment, bytes, caller)
#ifndef NO_THREADS
# ifdef _LIBC
-# if USE___THREAD || !defined SHARED
+# if USE___THREAD || (defined USE_TLS && !defined SHARED)
/* These routines are never needed in this configuration. */
# define NO_STARTER
# endif
diff --git a/malloc/malloc.c b/malloc/malloc.c
index 6427608a79f..a3690015203 100644
--- a/malloc/malloc.c
+++ b/malloc/malloc.c
@@ -1618,7 +1618,7 @@ static Void_t* memalign_check(size_t alignment, size_t bytes,
const Void_t *caller);
#ifndef NO_THREADS
# ifdef _LIBC
-# if USE___THREAD || !defined SHARED
+# if USE___THREAD || (defined USE_TLS && !defined SHARED)
/* These routines are never needed in this configuration. */
# define NO_STARTER
# endif
@@ -2741,19 +2741,8 @@ static void do_check_malloc_state(mstate av)
for (i = 0; i < NFASTBINS; ++i) {
p = av->fastbins[i];
- /* The following test can only be performed for the main arena.
- While mallopt calls malloc_consolidate to get rid of all fast
- bins (especially those larger than the new maximum) this does
- only happen for the main arena. Trying to do this for any
- other arena would mean those arenas have to be locked and
- malloc_consolidate be called for them. This is excessive. And
- even if this is acceptable to somebody it still cannot solve
- the problem completely since if the arena is locked a
- concurrent malloc call might create a new arena which then
- could use the newly invalid fast bins. */
-
/* all bins past max_fast are empty */
- if (av == &main_arena && i > max_fast_bin)
+ if (i > max_fast_bin)
assert(p == 0);
while (p != 0) {
@@ -2896,13 +2885,7 @@ static Void_t* sYSMALLOc(nb, av) INTERNAL_SIZE_T nb; mstate av;
is one SIZE_SZ unit larger than for normal chunks, because there
is no following chunk whose prev_size field could be used.
*/
-#if 1
- /* See the front_misalign handling below, for glibc there is no
- need for further alignments. */
- size = (nb + SIZE_SZ + pagemask) & ~pagemask;
-#else
size = (nb + SIZE_SZ + MALLOC_ALIGN_MASK + pagemask) & ~pagemask;
-#endif
tried_mmap = true;
/* Don't try if size wraps around 0 */
@@ -2920,12 +2903,6 @@ static Void_t* sYSMALLOc(nb, av) INTERNAL_SIZE_T nb; mstate av;
address argument for later munmap in free() and realloc().
*/
-#if 1
- /* For glibc, chunk2mem increases the address by 2*SIZE_SZ and
- MALLOC_ALIGN_MASK is 2*SIZE_SZ-1. Each mmap'ed area is page
- aligned and therefore definitely MALLOC_ALIGN_MASK-aligned. */
- assert (((INTERNAL_SIZE_T)chunk2mem(mm) & MALLOC_ALIGN_MASK) == 0);
-#else
front_misalign = (INTERNAL_SIZE_T)chunk2mem(mm) & MALLOC_ALIGN_MASK;
if (front_misalign > 0) {
correction = MALLOC_ALIGNMENT - front_misalign;
@@ -2933,12 +2910,10 @@ static Void_t* sYSMALLOc(nb, av) INTERNAL_SIZE_T nb; mstate av;
p->prev_size = correction;
set_head(p, (size - correction) |IS_MMAPPED);
}
- else
-#endif
- {
- p = (mchunkptr)mm;
- set_head(p, size|IS_MMAPPED);
- }
+ else {
+ p = (mchunkptr)mm;
+ set_head(p, size|IS_MMAPPED);
+ }
/* update statistics */
@@ -4122,6 +4097,7 @@ _int_malloc(mstate av, size_t bytes)
for(;;) {
int iters = 0;
+ bool any_larger = false;
while ( (victim = unsorted_chunks(av)->bk) != unsorted_chunks(av)) {
bck = victim->bk;
if (__builtin_expect (victim->size <= 2 * SIZE_SZ, 0)
@@ -4218,6 +4194,8 @@ _int_malloc(mstate av, size_t bytes)
fwd->bk = victim;
bck->fd = victim;
+ if (size >= nb + MINSIZE)
+ any_larger = true;
#define MAX_ITERS 10000
if (++iters >= MAX_ITERS)
break;
@@ -4706,15 +4684,7 @@ static void malloc_consolidate(av) mstate av;
reused anyway.
*/
-#if 0
- /* It is wrong to limit the fast bins to search using get_max_fast
- because, except for the main arena, all the others might have
- blocks in the high fast bins. It's not worth it anyway, just
- search all bins all the time. */
maxfb = &(av->fastbins[fastbin_index(get_max_fast ())]);
-#else
- maxfb = &(av->fastbins[NFASTBINS - 1]);
-#endif
fb = &(av->fastbins[0]);
do {
if ( (p = *fb) != 0) {
diff --git a/malloc/memusage.c b/malloc/memusage.c
index d11e9e6ed52..b5077ffe0b6 100644
--- a/malloc/memusage.c
+++ b/malloc/memusage.c
@@ -80,7 +80,6 @@ static memusage_cntr_t large;
static memusage_cntr_t calls_total;
static memusage_cntr_t inplace;
static memusage_cntr_t decreasing;
-static memusage_cntr_t realloc_free;
static memusage_cntr_t inplace_mremap;
static memusage_cntr_t decreasing_mremap;
static memusage_size_t current_heap;
@@ -104,8 +103,8 @@ extern const char *__progname;
struct entry
{
- uint64_t heap;
- uint64_t stack;
+ size_t heap;
+ size_t stack;
uint32_t time_low;
uint32_t time_high;
};
@@ -129,8 +128,8 @@ update_data (struct header *result, size_t len, size_t old_len)
/* Compute current heap usage and compare it with the maximum value. */
memusage_size_t heap
- = catomic_exchange_and_add (&current_heap, len - old_len) + len - old_len;
- catomic_max (&peak_heap, heap);
+ = atomic_exchange_and_add (&current_heap, len - old_len) + len - old_len;
+ atomic_max (&peak_heap, heap);
/* Compute current stack usage and compare it with the maximum
value. The base stack pointer might not be set if this is not
@@ -153,15 +152,15 @@ update_data (struct header *result, size_t len, size_t old_len)
start_sp = sp;
size_t current_stack = start_sp - sp;
#endif
- catomic_max (&peak_stack, current_stack);
+ atomic_max (&peak_stack, current_stack);
/* Add up heap and stack usage and compare it with the maximum value. */
- catomic_max (&peak_total, heap + current_stack);
+ atomic_max (&peak_total, heap + current_stack);
/* Store the value only if we are writing to a file. */
if (fd != -1)
{
- uatomic32_t idx = catomic_exchange_and_add (&buffer_cnt, 1);
+ uatomic32_t idx = atomic_exchange_and_add (&buffer_cnt, 1);
if (idx >= 2 * buffer_size)
{
/* We try to reset the counter to the correct range. If
@@ -169,7 +168,7 @@ update_data (struct header *result, size_t len, size_t old_len)
counter it does not matter since that thread will take
care of the correction. */
unsigned int reset = idx - 2 * buffer_size;
- catomic_compare_and_exchange_val_acq (&buffer_size, reset, idx);
+ atomic_compare_and_exchange_val_acq (&buffer_size, reset, idx);
idx = reset;
}
@@ -268,7 +267,6 @@ me (void)
GETTIME (first.time_low, first.time_high);
/* Write it two times since we need the starting and end time. */
write (fd, &first, sizeof (first));
- write (fd, &first, sizeof (first));
/* Determine the buffer size. We use the default if the
environment variable is not present. */
@@ -339,24 +337,24 @@ malloc (size_t len)
return (*mallocp) (len);
/* Keep track of number of calls. */
- catomic_increment (&calls[idx_malloc]);
+ atomic_increment (&calls[idx_malloc]);
/* Keep track of total memory consumption for `malloc'. */
- catomic_add (&total[idx_malloc], len);
+ atomic_add (&total[idx_malloc], len);
/* Keep track of total memory requirement. */
- catomic_add (&grand_total, len);
+ atomic_add (&grand_total, len);
/* Remember the size of the request. */
if (len < 65536)
- catomic_increment (&histogram[len / 16]);
+ atomic_increment (&histogram[len / 16]);
else
- catomic_increment (&large);
+ atomic_increment (&large);
/* Total number of calls of any of the functions. */
- catomic_increment (&calls_total);
+ atomic_increment (&calls_total);
/* Do the real work. */
result = (struct header *) (*mallocp) (len + sizeof (struct header));
if (result == NULL)
{
- catomic_increment (&failed[idx_malloc]);
+ atomic_increment (&failed[idx_malloc]);
return NULL;
}
@@ -405,53 +403,36 @@ realloc (void *old, size_t len)
}
/* Keep track of number of calls. */
- catomic_increment (&calls[idx_realloc]);
+ atomic_increment (&calls[idx_realloc]);
if (len > old_len)
{
/* Keep track of total memory consumption for `realloc'. */
- catomic_add (&total[idx_realloc], len - old_len);
+ atomic_add (&total[idx_realloc], len - old_len);
/* Keep track of total memory requirement. */
- catomic_add (&grand_total, len - old_len);
+ atomic_add (&grand_total, len - old_len);
}
-
- if (len == 0 && old != NULL)
- {
- /* Special case. */
- catomic_increment (&realloc_free);
- /* Keep track of total memory freed using `free'. */
- catomic_add (&total[idx_free], real->length);
-
- /* Update the allocation data and write out the records if necessary. */
- update_data (NULL, 0, old_len);
-
- /* Do the real work. */
- (*freep) (real);
-
- return NULL;
- }
-
/* Remember the size of the request. */
if (len < 65536)
- catomic_increment (&histogram[len / 16]);
+ atomic_increment (&histogram[len / 16]);
else
- catomic_increment (&large);
+ atomic_increment (&large);
/* Total number of calls of any of the functions. */
- catomic_increment (&calls_total);
+ atomic_increment (&calls_total);
/* Do the real work. */
result = (struct header *) (*reallocp) (real, len + sizeof (struct header));
if (result == NULL)
{
- catomic_increment (&failed[idx_realloc]);
+ atomic_increment (&failed[idx_realloc]);
return NULL;
}
/* Record whether the reduction/increase happened in place. */
if (real == result)
- catomic_increment (&inplace);
+ atomic_increment (&inplace);
/* Was the buffer increased? */
if (old_len > len)
- catomic_increment (&decreasing);
+ atomic_increment (&decreasing);
/* Update the allocation data and write out the records if necessary. */
update_data (result, len, old_len);
@@ -482,16 +463,16 @@ calloc (size_t n, size_t len)
return (*callocp) (n, len);
/* Keep track of number of calls. */
- catomic_increment (&calls[idx_calloc]);
+ atomic_increment (&calls[idx_calloc]);
/* Keep track of total memory consumption for `calloc'. */
- catomic_add (&total[idx_calloc], size);
+ atomic_add (&total[idx_calloc], size);
/* Keep track of total memory requirement. */
- catomic_add (&grand_total, size);
+ atomic_add (&grand_total, size);
/* Remember the size of the request. */
if (size < 65536)
- catomic_increment (&histogram[size / 16]);
+ atomic_increment (&histogram[size / 16]);
else
- catomic_increment (&large);
+ atomic_increment (&large);
/* Total number of calls of any of the functions. */
++calls_total;
@@ -499,7 +480,7 @@ calloc (size_t n, size_t len)
result = (struct header *) (*mallocp) (size + sizeof (struct header));
if (result == NULL)
{
- catomic_increment (&failed[idx_calloc]);
+ atomic_increment (&failed[idx_calloc]);
return NULL;
}
@@ -536,7 +517,7 @@ free (void *ptr)
/* `free (NULL)' has no effect. */
if (ptr == NULL)
{
- catomic_increment (&calls[idx_free]);
+ atomic_increment (&calls[idx_free]);
return;
}
@@ -550,9 +531,9 @@ free (void *ptr)
}
/* Keep track of number of calls. */
- catomic_increment (&calls[idx_free]);
+ atomic_increment (&calls[idx_free]);
/* Keep track of total memory freed using `free'. */
- catomic_add (&total[idx_free], real->length);
+ atomic_add (&total[idx_free], real->length);
/* Update the allocation data and write out the records if necessary. */
update_data (NULL, 0, real->length);
@@ -586,22 +567,22 @@ mmap (void *start, size_t len, int prot, int flags, int fd, off_t offset)
? idx_mmap_a : prot & PROT_WRITE ? idx_mmap_w : idx_mmap_r);
/* Keep track of number of calls. */
- catomic_increment (&calls[idx]);
+ atomic_increment (&calls[idx]);
/* Keep track of total memory consumption for `malloc'. */
- catomic_add (&total[idx], len);
+ atomic_add (&total[idx], len);
/* Keep track of total memory requirement. */
- catomic_add (&grand_total, len);
+ atomic_add (&grand_total, len);
/* Remember the size of the request. */
if (len < 65536)
- catomic_increment (&histogram[len / 16]);
+ atomic_increment (&histogram[len / 16]);
else
- catomic_increment (&large);
+ atomic_increment (&large);
/* Total number of calls of any of the functions. */
- catomic_increment (&calls_total);
+ atomic_increment (&calls_total);
/* Check for failures. */
if (result == NULL)
- catomic_increment (&failed[idx]);
+ atomic_increment (&failed[idx]);
else if (idx == idx_mmap_w)
/* Update the allocation data and write out the records if
necessary. Note the first parameter is NULL which means
@@ -638,22 +619,22 @@ mmap64 (void *start, size_t len, int prot, int flags, int fd, off64_t offset)
? idx_mmap_a : prot & PROT_WRITE ? idx_mmap_w : idx_mmap_r);
/* Keep track of number of calls. */
- catomic_increment (&calls[idx]);
+ atomic_increment (&calls[idx]);
/* Keep track of total memory consumption for `malloc'. */
- catomic_add (&total[idx], len);
+ atomic_add (&total[idx], len);
/* Keep track of total memory requirement. */
- catomic_add (&grand_total, len);
+ atomic_add (&grand_total, len);
/* Remember the size of the request. */
if (len < 65536)
- catomic_increment (&histogram[len / 16]);
+ atomic_increment (&histogram[len / 16]);
else
- catomic_increment (&large);
+ atomic_increment (&large);
/* Total number of calls of any of the functions. */
- catomic_increment (&calls_total);
+ atomic_increment (&calls_total);
/* Check for failures. */
if (result == NULL)
- catomic_increment (&failed[idx]);
+ atomic_increment (&failed[idx]);
else if (idx == idx_mmap_w)
/* Update the allocation data and write out the records if
necessary. Note the first parameter is NULL which means
@@ -692,33 +673,33 @@ mremap (void *start, size_t old_len, size_t len, int flags, ...)
if (!not_me && trace_mmap)
{
/* Keep track of number of calls. */
- catomic_increment (&calls[idx_mremap]);
+ atomic_increment (&calls[idx_mremap]);
if (len > old_len)
{
/* Keep track of total memory consumption for `malloc'. */
- catomic_add (&total[idx_mremap], len - old_len);
+ atomic_add (&total[idx_mremap], len - old_len);
/* Keep track of total memory requirement. */
- catomic_add (&grand_total, len - old_len);
+ atomic_add (&grand_total, len - old_len);
}
/* Remember the size of the request. */
if (len < 65536)
- catomic_increment (&histogram[len / 16]);
+ atomic_increment (&histogram[len / 16]);
else
- catomic_increment (&large);
+ atomic_increment (&large);
/* Total number of calls of any of the functions. */
- catomic_increment (&calls_total);
+ atomic_increment (&calls_total);
/* Check for failures. */
if (result == NULL)
- catomic_increment (&failed[idx_mremap]);
+ atomic_increment (&failed[idx_mremap]);
else
{
/* Record whether the reduction/increase happened in place. */
if (start == result)
- catomic_increment (&inplace_mremap);
+ atomic_increment (&inplace_mremap);
/* Was the buffer increased? */
if (old_len > len)
- catomic_increment (&decreasing_mremap);
+ atomic_increment (&decreasing_mremap);
/* Update the allocation data and write out the records if
necessary. Note the first parameter is NULL which means
@@ -752,19 +733,19 @@ munmap (void *start, size_t len)
if (!not_me && trace_mmap)
{
/* Keep track of number of calls. */
- catomic_increment (&calls[idx_munmap]);
+ atomic_increment (&calls[idx_munmap]);
if (__builtin_expect (result == 0, 1))
{
/* Keep track of total memory freed using `free'. */
- catomic_add (&total[idx_munmap], len);
+ atomic_add (&total[idx_munmap], len);
/* Update the allocation data and write out the records if
necessary. */
update_data (NULL, 0, len);
}
else
- catomic_increment (&failed[idx_munmap]);
+ atomic_increment (&failed[idx_munmap]);
}
return result;
@@ -789,12 +770,7 @@ dest (void)
if (fd != -1)
{
/* Write the partially filled buffer. */
- if (buffer_cnt > buffer_size)
- write (fd, buffer + buffer_size,
- (buffer_cnt - buffer_size) * sizeof (struct entry));
- else
- write (fd, buffer, buffer_cnt * sizeof (struct entry));
-
+ write (fd, buffer, buffer_cnt * sizeof (struct entry));
/* Go back to the beginning of the file. We allocated two records
here when we opened the file. */
lseek (fd, 0, SEEK_SET);
@@ -818,7 +794,7 @@ dest (void)
\e[01;32mMemory usage summary:\e[0;0m heap total: %llu, heap peak: %lu, stack peak: %lu\n\
\e[04;34m total calls total memory failed calls\e[0m\n\
\e[00;34m malloc|\e[0m %10lu %12llu %s%12lu\e[00;00m\n\
-\e[00;34mrealloc|\e[0m %10lu %12llu %s%12lu\e[00;00m (nomove:%ld, dec:%ld, free:%ld)\n\
+\e[00;34mrealloc|\e[0m %10lu %12llu %s%12lu\e[00;00m (in place: %ld, dec: %ld)\n\
\e[00;34m calloc|\e[0m %10lu %12llu %s%12lu\e[00;00m\n\
\e[00;34m free|\e[0m %10lu %12llu\n",
(unsigned long long int) grand_total, (unsigned long int) peak_heap,
@@ -831,9 +807,7 @@ dest (void)
(unsigned long long int) total[idx_realloc],
failed[idx_realloc] ? "\e[01;41m" : "",
(unsigned long int) failed[idx_realloc],
- (unsigned long int) inplace,
- (unsigned long int) decreasing,
- (unsigned long int) realloc_free,
+ (unsigned long int) inplace, (unsigned long int) decreasing,
(unsigned long int) calls[idx_calloc],
(unsigned long long int) total[idx_calloc],
failed[idx_calloc] ? "\e[01;41m" : "",
@@ -846,7 +820,7 @@ dest (void)
\e[00;34mmmap(r)|\e[0m %10lu %12llu %s%12lu\e[00;00m\n\
\e[00;34mmmap(w)|\e[0m %10lu %12llu %s%12lu\e[00;00m\n\
\e[00;34mmmap(a)|\e[0m %10lu %12llu %s%12lu\e[00;00m\n\
-\e[00;34m mremap|\e[0m %10lu %12llu %s%12lu\e[00;00m (nomove: %ld, dec:%ld)\n\
+\e[00;34m mremap|\e[0m %10lu %12llu %s%12lu\e[00;00m (in place: %ld, dec: %ld)\n\
\e[00;34m munmap|\e[0m %10lu %12llu %s%12lu\e[00;00m\n",
(unsigned long int) calls[idx_mmap_r],
(unsigned long long int) total[idx_mmap_r],
diff --git a/malloc/memusage.sh b/malloc/memusage.sh
index 67af4998ca3..47f8cc22ff4 100755
--- a/malloc/memusage.sh
+++ b/malloc/memusage.sh
@@ -44,7 +44,7 @@ Profile memory usage of PROGRAM.
-d,--data=FILE Generate binary data file and store it in FILE
-u,--unbuffered Don't buffer output
-b,--buffer=SIZE Collect SIZE entries before writing them out
- --no-timer Don't collect additional information through timer
+ --no-timer Don't collect additional information though timer
-m,--mmap Also trace mmap & friends
-?,--help Print this help and exit
@@ -71,12 +71,21 @@ do_version() {
printf $"Copyright (C) %s Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-" "2007"
+" "2006"
printf $"Written by %s.
" "Ulrich Drepper"
exit 0
}
+# These variables are local
+buffer=
+data=
+memusagestat_args=
+notimer=
+png=
+progname=
+tracemmap=
+
# Process arguments. But stop as soon as the program name is found.
while test $# -gt 0; do
case "$1" in
@@ -213,15 +222,8 @@ datafile=
if test -n "$data"; then
datafile="$data"
elif test -n "$png"; then
- datafile=$(mktemp ${TMPDIR:-/tmp}/memusage.XXXXXX 2> /dev/null)
- if test $? -ne 0; then
- # Lame, but if there is no `mktemp' program the user cannot expect more.
- if test "$RANDOM" != "$RANDOM"; then
- datafile=${TMPDIR:-/tmp}/memusage.$RANDOM
- else
- datafile=${TMPDIR:-/tmp}/memusage.$$
- fi
- fi
+ datafile=$(mktemp -t memusage.XXXXXX) || exit
+ trap 'rm -f "$datafile"; exit 1' HUP INT QUIT TERM PIPE
fi
if test -n "$datafile"; then
add_env="$add_env MEMUSAGE_OUTPUT=$datafile"
diff --git a/malloc/memusagestat.c b/malloc/memusagestat.c
index 93ac2cd7442..5d35ee0236e 100644
--- a/malloc/memusagestat.c
+++ b/malloc/memusagestat.c
@@ -55,8 +55,8 @@ static const struct argp_option options[] =
{ "time", 't', NULL, 0, N_("Generate output linear to time (default is linear to number of function calls)") },
{ "total", 'T', NULL, 0,
N_("Also draw graph for total memory consumption") },
- { "x-size", 'x', "VALUE", 0, N_("Make output graphic VALUE pixels wide") },
- { "y-size", 'y', "VALUE", 0, N_("Make output graphic VALUE pixels high") },
+ { "x-size", 'x', "VALUE", 0, N_("make output graphic VALUE pixel wide") },
+ { "y-size", 'y', "VALUE", 0, N_("make output graphic VALUE pixel high") },
{ NULL, 0, NULL, 0, NULL }
};
@@ -81,8 +81,8 @@ static struct argp argp =
struct entry
{
- uint64_t heap;
- uint64_t stack;
+ size_t heap;
+ size_t stack;
uint32_t time_low;
uint32_t time_high;
};
diff --git a/malloc/mtrace.pl b/malloc/mtrace.pl
index 280b469d922..8a0fbc7e95b 100644
--- a/malloc/mtrace.pl
+++ b/malloc/mtrace.pl
@@ -1,7 +1,7 @@
#! @PERL@
eval "exec @PERL@ -S $0 $*"
if 0;
-# Copyright (C) 1997-2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+# Copyright (C) 1997-2004, 2005, 2006 Free Software Foundation, Inc.
# This file is part of the GNU C Library.
# Contributed by Ulrich Drepper <drepper@gnu.org>, 1997.
# Based on the mtrace.awk script.
@@ -45,7 +45,7 @@ arglist: while (@ARGV) {
$ARGV[0] eq "--vers" || $ARGV[0] eq "--versi" ||
$ARGV[0] eq "--versio" || $ARGV[0] eq "--version") {
print "mtrace (GNU $PACKAGE) $VERSION\n";
- print "Copyright (C) 2007 Free Software Foundation, Inc.\n";
+ print "Copyright (C) 2006 Free Software Foundation, Inc.\n";
print "This is free software; see the source for copying conditions. There is NO\n";
print "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n";
print "Written by Ulrich Drepper <drepper\@gnu.org>\n";
diff --git a/manual/argp.texi b/manual/argp.texi
index b37232306ba..090d49f7a57 100644
--- a/manual/argp.texi
+++ b/manual/argp.texi
@@ -832,7 +832,7 @@ Don't exit on errors, although they may still result in error messages.
@item ARGP_LONG_ONLY
Use the gnu getopt `long-only' rules for parsing arguments. This allows
long-options to be recognized with only a single @samp{-}
-(i.e., @samp{-help}). This results in a less useful interface, and its
+(i.e. @samp{-help}). This results in a less useful interface, and its
use is discouraged as it conflicts with the way most GNU programs work
as well as the GNU coding standards.
diff --git a/manual/charset.texi b/manual/charset.texi
index 8b2c09ca79a..5063246d616 100644
--- a/manual/charset.texi
+++ b/manual/charset.texi
@@ -207,7 +207,7 @@ and transmittal. Because each single wide character consists of more
than one byte, they are effected by byte-ordering. Thus, machines with
different endianesses would see different values when accessing the same
data. This byte ordering concern also applies for communication protocols
-that are all byte-based and therefore require that the sender has to
+that are all byte-based and, thereforet require that the sender has to
decide about splitting the wide character in bytes. A last (but not least
important) point is that wide characters often require more storage space
than a customized byte-oriented character set.
@@ -737,7 +737,7 @@ the return value is @math{0}. If the next @var{n} bytes form a valid
multibyte character, the number of bytes belonging to this multibyte
character byte sequence is returned.
-If the first @var{n} bytes possibly form a valid multibyte
+If the the first @var{n} bytes possibly form a valid multibyte
character but the character is incomplete, the return value is
@code{(size_t) -2}. Otherwise the multibyte character sequence is invalid
and the return value is @code{(size_t) -1}.
@@ -2231,7 +2231,7 @@ ordering of the processor (or at least the running process) is not the
same as the one required for UCS-4. This is done for performance reasons
as one does not want to perform unnecessary byte-swapping operations if
one is not interested in actually seeing the result in UCS-4. To avoid
-trouble with endianness, the internal representation consistently is named
+trouble with endianess, the internal representation consistently is named
@code{INTERNAL} even on big-endian systems where the representations are
identical.
diff --git a/manual/conf.texi b/manual/conf.texi
index 605e305071d..ef00db6b7b7 100644
--- a/manual/conf.texi
+++ b/manual/conf.texi
@@ -1455,6 +1455,11 @@ Inquire about the value of @code{_POSIX_ASYNC_IO}.
Inquire about the value of @code{_POSIX_PRIO_IO}.
@comment unistd.h
+@comment POSIX.1g
+@item _PC_SOCK_MAXBUF
+Inquire about the value of @code{_POSIX_PIPE_BUF}.
+
+@comment unistd.h
@comment LFS
@item _PC_FILESIZEBITS
Inquire about the availability of large files on the filesystem.
diff --git a/manual/errno.texi b/manual/errno.texi
index dd9f861dc86..e230506427a 100644
--- a/manual/errno.texi
+++ b/manual/errno.texi
@@ -1434,7 +1434,7 @@ like those given to the @code{printf} family of functions. The
arguments required for the format can follow the @var{format} parameter.
Just like @code{perror}, @code{error} also can report an error code in
textual form. But unlike @code{perror} the error value is explicitly
-passed to the function in the @var{errnum} parameter. This eliminates
+passed to the function in the @var{errnum} parameter. This elimintates
the problem mentioned above that the error reporting function must be
called immediately after the function causing the error since otherwise
@code{errno} might have a different value.
@@ -1479,7 +1479,7 @@ in an input file (like a programming language source code file etc).
If the global variable @code{error_one_per_line} is set to a non-zero
value @code{error_at_line} will avoid printing consecutive messages for
-the same file and line. Repetition which are not directly following
+the same file anem line. Repetition which are not directly following
each other are not caught.
Just like @code{error} this function only returned if @var{status} is
diff --git a/manual/filesys.texi b/manual/filesys.texi
index 9719d419468..2436f22e884 100644
--- a/manual/filesys.texi
+++ b/manual/filesys.texi
@@ -131,7 +131,7 @@ this function is deprecated.
@comment GNU
@deftypefun {char *} get_current_dir_name (void)
@vindex PWD
-This @code{get_current_dir_name} function is basically equivalent to
+This @code{get_current_dir_name} function is bascially equivalent to
@w{@code{getcwd (NULL, 0)}}. The only difference is that the value of
the @code{PWD} variable is returned if this value is correct. This is a
subtle difference which is visible if the path described by the
@@ -917,7 +917,7 @@ function returns a value other than @math{0} this value is returned as
the return value of @code{ftw}.
When the sources are compiled with @code{_FILE_OFFSET_BITS == 64} on a
-32-bit system this function is in fact @code{ftw64}, i.e., the LFS
+32-bit system this function is in fact @code{ftw64}, i.e. the LFS
interface transparently replaces the old interface.
@end deftypefun
@@ -990,7 +990,7 @@ accordingly. If the return value of a callback invocation was non-zero
then that value is returned.
When the sources are compiled with @code{_FILE_OFFSET_BITS == 64} on a
-32-bit system this function is in fact @code{nftw64}, i.e., the LFS
+32-bit system this function is in fact @code{nftw64}, i.e. the LFS
interface transparently replaces the old interface.
@end deftypefun
@@ -1434,7 +1434,7 @@ the existing directory named @var{newname} is deleted first. The name
One useful feature of @code{rename} is that the meaning of @var{newname}
changes ``atomically'' from any previously existing file by that name to
-its new meaning (i.e., the file that was called @var{oldname}). There is
+its new meaning (i.e. the file that was called @var{oldname}). There is
no instant at which @var{newname} is non-existent ``in between'' the old
meaning and the new meaning. If there is a system crash during the
operation, it is possible for both names to still exist; but
@@ -3104,7 +3104,7 @@ terminates abnormally).
This function is reentrant.
When the sources are compiled with @code{_FILE_OFFSET_BITS == 64} on a
-32-bit system this function is in fact @code{tmpfile64}, i.e., the LFS
+32-bit system this function is in fact @code{tmpfile64}, i.e. the LFS
interface transparently replaces the old interface.
@end deftypefun
diff --git a/manual/lang.texi b/manual/lang.texi
index 82c5e962a04..96f6d9df553 100644
--- a/manual/lang.texi
+++ b/manual/lang.texi
@@ -1274,7 +1274,7 @@ type of a particular structure member.
@comment ISO
@deftypefn {Macro} size_t offsetof (@var{type}, @var{member})
This expands to a integer constant expression that is the offset of the
-structure member named @var{member} in the structure type @var{type}.
+structure member named @var{member} in a the structure type @var{type}.
For example, @code{offsetof (struct s, elem)} is the offset, in bytes,
of the member @code{elem} in a @code{struct s}.
diff --git a/manual/maint.texi b/manual/maint.texi
index 567db981a30..2b9221233a2 100644
--- a/manual/maint.texi
+++ b/manual/maint.texi
@@ -156,7 +156,7 @@ subdirectories under it intended to be new specific categories.
to look for a system-dependent version of a file that's not in
@file{generic}. This means that any system-dependent source file must
have an analogue in @file{generic}, even if the routines defined by that
-file are not implemented on other platforms. Second, the @file{generic}
+file are not implemented on other platforms. Second. the @file{generic}
version of a system-dependent file is used if the makefiles do not find
a version specific to the system you're compiling for.
diff --git a/manual/memory.texi b/manual/memory.texi
index cbe147b7120..91b9d84eb26 100644
--- a/manual/memory.texi
+++ b/manual/memory.texi
@@ -31,7 +31,7 @@ One of the most basic resources a process has available to it is memory.
There are a lot of different ways systems organize memory, but in a
typical one, each process has one linear virtual address space, with
addresses running from zero to some huge maximum. It need not be
-contiguous; i.e., not all of these addresses actually can be used to
+contiguous; i.e. not all of these addresses actually can be used to
store data.
The virtual memory is divided into pages (4 kilobytes is typical).
@@ -1065,7 +1065,7 @@ This is the total size of memory occupied by free (not in use) chunks.
@item int keepcost
This is the size of the top-most releasable chunk that normally
-borders the end of the heap (i.e., the high end of the virtual address
+borders the end of the heap (i.e. the high end of the virtual address
space's data segment).
@end table
@@ -2407,7 +2407,7 @@ of the data segment is.
@cindex paging
You can tell the system to associate a particular virtual memory page
-with a real page frame and keep it that way --- i.e., cause the page to
+with a real page frame and keep it that way --- i.e. cause the page to
be paged in if it isn't already and mark it so it will never be paged
out and consequently will never cause a page fault. This is called
@dfn{locking} a page.
@@ -2467,7 +2467,7 @@ A memory lock is associated with a virtual page, not a real frame. The
paging rule is: If a frame backs at least one locked page, don't page it
out.
-Memory locks do not stack. I.e., you can't lock a particular page twice
+Memory locks do not stack. I.e. you can't lock a particular page twice
so that it has to be unlocked twice before it is truly unlocked. It is
either locked or it isn't.
diff --git a/manual/message.texi b/manual/message.texi
index e772b2de1fd..1507a6d04af 100644
--- a/manual/message.texi
+++ b/manual/message.texi
@@ -1810,8 +1810,8 @@ help to understand the input better.
Other programs help to manage development cycle when new messages appear
in the source files or when a new translation of the messages appear.
-Here it should only be noted that using all the tools in GNU gettext it
-is possible to @emph{completely} automate the handling of message
+here it should only be noted that using all the tools in GNU gettext it
+is possible to @emph{completely} automize the handling of message
catalog. Beside marking the translatable string in the source code and
generating the translations the developers do not have anything to do
themselves.
diff --git a/manual/resource.texi b/manual/resource.texi
index aabd28976a7..df77408e684 100644
--- a/manual/resource.texi
+++ b/manual/resource.texi
@@ -584,7 +584,7 @@ to}, but doesn't @emph{need to} run occupies the CPU.
@cindex preemptive scheduling
When two processes are in contention to use the CPU at any instant, the
one with the higher absolute priority always gets it. This is true even if the
-process with the lower priority is already using the CPU (i.e., the
+process with the lower priority is already using the CPU (i.e. the
scheduling is preemptive). Of course, we're only talking about
processes that are running or ``ready to run,'' which means they are
ready to execute instructions right now. When a process blocks to wait
@@ -819,7 +819,7 @@ existing policy is not @code{SCHED_OTHER}.
@item
The calling process does not have @code{CAP_SYS_NICE} permission and its
-owner is not the target process' owner. I.e., the effective uid of the
+owner is not the target process' owner. I.e. the effective uid of the
calling process is neither the effective nor the real uid of process
@var{pid}.
@c We need a cross reference to the capabilities section, when written.
@@ -1185,7 +1185,7 @@ The value of @var{class} is not valid.
@item EPERM
The call would set the nice value of a process which is owned by a different
-user than the calling process (i.e., the target process' real or effective
+user than the calling process (i.e. the target process' real or effective
uid does not match the calling process' effective uid) and the calling
process does not have @code{CAP_SYS_NICE} permission.
@@ -1215,7 +1215,7 @@ a process group ID (pgid).
@comment sys/resource.h
@comment BSD
@item PRIO_USER
-All the processes owned by a particular user (i.e., whose real uid
+All the processes owned by a particular user (i.e. whose real uid
indicates the user). The argument @var{id} is a user ID (uid).
@end vtable
@@ -1272,7 +1272,7 @@ other process or thread is allowed to use.
@item
The access to certain resources (RAM, I/O ports) has different costs
from different CPUs. This is the case in NUMA (Non-Uniform Memory
-Architecture) machines. Preferably memory should be accessed locally
+Architecture) machines. Preferrably memory should be accessed locally
but this requirement is usually not visible to the scheduler.
Therefore forcing a process or thread to the CPUs which have local
access to the mostly used memory helps to significantly boost the
diff --git a/manual/search.texi b/manual/search.texi
index 0afd0aecd06..1ac2653f169 100644
--- a/manual/search.texi
+++ b/manual/search.texi
@@ -82,7 +82,7 @@ starting at @var{base} if it is found. If no matching element is
available @code{NULL} is returned.
The mean runtime of this function is @code{*@var{nmemb}}/2. This
-function should only be used if elements often get added to or deleted from
+function should only be used elements often get added to or deleted from
the array in which case it might not be useful to sort the array before
searching.
@end deftypefun
@@ -247,21 +247,21 @@ Couldn't find Janice.
@node Hash Search Function
@section The @code{hsearch} function.
-The functions mentioned so far in this chapter are for searching in a sorted
+The functions mentioned so far in this chapter are searching in a sorted
or unsorted array. There are other methods to organize information
which later should be searched. The costs of insert, delete and search
differ. One possible implementation is using hashing tables.
-The following functions are declared in the header file @file{search.h}.
+The following functions are declared in the the header file @file{search.h}.
@comment search.h
@comment SVID
@deftypefun int hcreate (size_t @var{nel})
The @code{hcreate} function creates a hashing table which can contain at
least @var{nel} elements. There is no possibility to grow this table so
-it is necessary to choose the value for @var{nel} wisely. The method
-used to implement this function might make it necessary to make the
+it is necessary to choose the value for @var{nel} wisely. The used
+methods to implement this function might make it necessary to make the
number of elements in the hashing table larger than the expected maximal
-number of elements. Hashing tables usually work inefficiently if they are
+number of elements. Hashing tables usually work inefficient if they are
filled 80% or more. The constant access time guaranteed by hashing can
only be achieved if few collisions exist. See Knuth's ``The Art of
Computer Programming, Part 3: Searching and Sorting'' for more
@@ -368,9 +368,9 @@ necessary for the @code{struct hsearch_data} object can be allocated
dynamically. It must be initialized with zero before calling this
function.
-The return value is non-zero if the operation was successful. If the
-return value is zero, something went wrong, which probably means the
-programs ran out of memory.
+The return value is non-zero if the operation were successful. if the
+return value is zero something went wrong which probably means the
+programs runs out of memory.
@end deftypefun
@comment search.h
diff --git a/manual/signal.texi b/manual/signal.texi
index dfaaa889506..cbf746639ac 100644
--- a/manual/signal.texi
+++ b/manual/signal.texi
@@ -2567,7 +2567,7 @@ The prototype for the @code{sigprocmask} function is in @file{signal.h}.
Note that you must not use @code{sigprocmask} in multi-threaded processes,
because each thread has its own signal mask and there is no single process
signal mask. According to POSIX, the behavior of @code{sigprocmask} in a
-multi-threaded process is ``unspecified''.
+multi-threaded process is ``unspeficied''.
Instead, use @code{pthread_sigmask}.
@ifset linuxthreads
@xref{Threads and Signal Handling}.
diff --git a/manual/startup.texi b/manual/startup.texi
index 79c79683f74..5ccb78b9585 100644
--- a/manual/startup.texi
+++ b/manual/startup.texi
@@ -830,7 +830,7 @@ mean that there was difficulty in opening the files.
Don't confuse a program's exit status with a process' termination status.
There are lots of ways a process can terminate besides having it's program
finish. In the event that the process termination @emph{is} caused by program
-termination (i.e., @code{exit}), though, the program's exit status becomes
+termination (i.e. @code{exit}), though, the program's exit status becomes
part of the process' termination status.
@node Cleanups on Exit
diff --git a/manual/stdio.texi b/manual/stdio.texi
index 30a6e6ebe07..977989d95ee 100644
--- a/manual/stdio.texi
+++ b/manual/stdio.texi
@@ -433,7 +433,7 @@ see @ref{Stream Buffering}.
@cindex multi-threaded application
Streams can be used in multi-threaded applications in the same way they
are used in single-threaded applications. But the programmer must be
-aware of the possible complications. It is important to know about
+aware of a the possible complications. It is important to know about
these also if the program one writes never use threads since the design
and implementation of many stream functions is heavily influenced by the
requirements added by multi-threaded programming.
@@ -1992,7 +1992,7 @@ the precision. The exponent always contains at least two digits. The
The @samp{%g} and @samp{%G} conversions print the argument in the style
of @samp{%e} or @samp{%E} (respectively) if the exponent would be less
than -4 or greater than or equal to the precision; otherwise they use
-the @samp{%f} style. A precision of @code{0}, is taken as 1.
+the @samp{%f} style. A precision of @code{0}, is taken as 1. is
Trailing zeros are removed from the fractional portion of the result and
a decimal-point character appears only if it is followed by a digit.
diff --git a/manual/string.texi b/manual/string.texi
index 2fe60395ebd..f582bad96d5 100644
--- a/manual/string.texi
+++ b/manual/string.texi
@@ -1187,8 +1187,8 @@ regards these characters as parts of the alphabet they do match.
@comment ISO
@deftypefun int strncmp (const char *@var{s1}, const char *@var{s2}, size_t @var{size})
This function is the similar to @code{strcmp}, except that no more than
-@var{size} characters are compared. In other words, if the two
-strings are the same in their first @var{size} characters, the
+@var{size} wide characters are compared. In other words, if the two
+strings are the same in their first @var{size} wide characters, the
return value is zero.
@end deftypefun
@@ -1966,6 +1966,11 @@ Note that ``character'' is here used in the sense of byte. In a string
using a multibyte character encoding (abstract) character consisting of
more than one byte are not treated as an entity. Each byte is treated
separately. The function is not locale-dependent.
+
+Note that ``character'' is here used in the sense of byte. In a string
+using a multibyte character encoding (abstract) character consisting of
+more than one byte are not treated as an entity. Each byte is treated
+separately. The function is not locale-dependent.
@end deftypefun
@comment wchar.h
diff --git a/manual/sysinfo.texi b/manual/sysinfo.texi
index 8f2dd451be8..0a448303590 100644
--- a/manual/sysinfo.texi
+++ b/manual/sysinfo.texi
@@ -872,7 +872,7 @@ shall be accessible while the filesystem is mounted.
@item MS_SYNCHRONOUS
This bit on specifies that all writes to the filesystem while it is
-mounted shall be synchronous; i.e., data shall be synced before each
+mounted shall be synchronous; i.e. data shall be synced before each
write completes rather than held in the buffer cache.
@item MS_MANDLOCK
diff --git a/manual/syslog.texi b/manual/syslog.texi
index 3d7def83f79..df4179e27aa 100644
--- a/manual/syslog.texi
+++ b/manual/syslog.texi
@@ -370,7 +370,7 @@ The message is only for debugging purposes.
Results are undefined if the priority code is anything else.
-If the process does not presently have a Syslog connection open (i.e.,
+If the process does not presently have a Syslog connection open (i.e.
it did not call @code{openlog}), @code{syslog} implicitly opens the
connection the same as @code{openlog} would, with the following defaults
for information that would otherwise be included in an @code{openlog}
diff --git a/manual/time.texi b/manual/time.texi
index a3e8438bcef..9b87d3eed06 100644
--- a/manual/time.texi
+++ b/manual/time.texi
@@ -193,7 +193,7 @@ total amount of time a process has actively used a CPU since some
arbitrary event. On the GNU system, that event is the creation of the
process. While arbitrary in general, the event is always the same event
for any particular process, so you can always measure how much time on
-the CPU a particular computation takes by examining the process' CPU
+the CPU a particular computation takes by examinining the process' CPU
time before and after the computation.
@cindex CPU time
@cindex clock ticks
@@ -447,7 +447,7 @@ current calendar time is not available, the value
@comment time.h
@comment SVID, XPG
@deftypefun int stime (time_t *@var{newtime})
-@code{stime} sets the system clock, i.e., it tells the system that the
+@code{stime} sets the system clock, i.e. it tells the system that the
current calendar time is @var{newtime}, where @code{newtime} is
interpreted as described in the above definition of @code{time_t}.
@@ -1470,7 +1470,7 @@ widely available.
@node Low-Level Time String Parsing
@subsubsection Interpret string according to given format
-The first function is rather low-level. It is nevertheless frequently
+he first function is rather low-level. It is nevertheless frequently
used in software since it is better known. Its interface and
implementation are heavily influenced by the @code{getdate} function,
which is defined and implemented in terms of calls to @code{strptime}.
@@ -1790,7 +1790,7 @@ process. If the input string contains more characters than required by
the format string the return value points right after the last consumed
input character. If the whole input string is consumed the return value
points to the @code{NULL} byte at the end of the string. If an error
-occurs, i.e., @code{strptime} fails to match all of the format string,
+occurs, i.e. @code{strptime} fails to match all of the format string,
the function returns @code{NULL}.
@end deftypefun
diff --git a/math/atest-exp.c b/math/atest-exp.c
index 2f168c9a6dd..158be4231ac 100644
--- a/math/atest-exp.c
+++ b/math/atest-exp.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1997, 1998, 2000, 2006 Free Software Foundation, Inc.
+/* Copyright (C) 1997, 1998, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Geoffrey Keating <Geoff.Keating@anu.edu.au>, 1997.
@@ -171,10 +171,8 @@ main (void)
memset (e2, '\0', sizeof (mp1));
for (i = -1; i < 100 && i < FRAC / 4; i++)
- e2[(FRAC - i * 4 - 4) / mpbpl] |= ((mp_limb_t) (strchr (hexdig,
- exp1[i + 1])
- - hexdig)
- << (FRAC - i * 4 - 4) % mpbpl);
+ e2[(FRAC - i * 4 - 4) / mpbpl] |= ((strchr (hexdig, exp1[i + 1]) - hexdig)
+ << (FRAC - i * 4 - 4) % mpbpl);
if (mpn_cmp (ex, e2, SZ) >= 0)
mpn_sub_n (e3, ex, e2, SZ);
diff --git a/math/atest-exp2.c b/math/atest-exp2.c
index 2c028a2b838..33d942fc61e 100644
--- a/math/atest-exp2.c
+++ b/math/atest-exp2.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1997, 1998, 2000, 2006 Free Software Foundation, Inc.
+/* Copyright (C) 1997, 1998, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Geoffrey Keating <Geoff.Keating@anu.edu.au>, 1997.
@@ -73,9 +73,8 @@ read_mpn_hex(mp_limb_t *x, const char *str)
memset (x, 0, sizeof (mp1));
for (i = -1; i < 100 && i < FRAC / 4; ++i)
- x[(FRAC - i * 4 - 4) / mpbpl] |= ((mp_limb_t) (strchr (hexdig, str[i + 1])
- - hexdig)
- << (FRAC - i * 4 - 4) % mpbpl);
+ x[(FRAC - i * 4 - 4) / mpbpl] |= ((strchr (hexdig, str[i + 1]) - hexdig)
+ << (FRAC - i * 4 - 4) % mpbpl);
}
static mp_limb_t *get_log2(void) __attribute__((const));
diff --git a/math/atest-sincos.c b/math/atest-sincos.c
index bef3521c962..911aaec2754 100644
--- a/math/atest-sincos.c
+++ b/math/atest-sincos.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1997, 1998, 2000, 2006 Free Software Foundation, Inc.
+/* Copyright (C) 1997, 1998, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Geoffrey Keating <Geoff.Keating@anu.edu.au>, 1997.
@@ -239,11 +239,9 @@ main (void)
memset (c2, 0, sizeof (mp1));
for (i = 0; i < 100 && i < FRAC / 4; i++)
{
- s2[(FRAC - i * 4 - 4) / mpbpl] |= ((mp_limb_t) (strchr (hexdig, sin1[i])
- - hexdig)
- << (FRAC - i * 4 - 4) % mpbpl);
- c2[(FRAC - i * 4 - 4) / mpbpl] |= ((mp_limb_t) (strchr (hexdig, cos1[i])
- - hexdig)
+ s2[(FRAC - i * 4 - 4) / mpbpl] |= ((strchr (hexdig, sin1[i]) - hexdig)
+ << (FRAC - i * 4 - 4) % mpbpl);
+ c2[(FRAC - i * 4 - 4) / mpbpl] |= ((strchr (hexdig, cos1[i]) - hexdig)
<< (FRAC - i * 4 - 4) % mpbpl);
}
diff --git a/math/basic-test.c b/math/basic-test.c
index e42c0145724..e48a3ae4e0d 100644
--- a/math/basic-test.c
+++ b/math/basic-test.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1999 Free Software Foundation, Inc.
+/* Copyright (C) 1999, 2007 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Andreas Jaeger <aj@suse.de>, 1999.
@@ -44,7 +44,7 @@ NAME (void) \
\
zero_var = 0.0; \
one_var = 1.0; \
- NaN_var = zero_var/zero_var; \
+ NaN_var = zero_var / zero_var; \
Inf_var = one_var / zero_var; \
\
(void) &zero_var; \
@@ -103,21 +103,51 @@ NAME (void) \
check (#FLOAT " isinf (-HUGE_VALx) == -1", isinf (x1) == -1); \
}
+#define TEST_TRUNC(NAME, FLOAT, DOUBLE) \
+void \
+NAME (void) \
+{ \
+ volatile DOUBLE Inf_var, NaN_var, zero_var, one_var; \
+ FLOAT x1, x2; \
+ \
+ zero_var = 0.0; \
+ one_var = 1.0; \
+ NaN_var = zero_var / zero_var; \
+ Inf_var = one_var / zero_var; \
+ \
+ (void) &NaN_var; \
+ (void) &Inf_var; \
+ \
+ x1 = (FLOAT) NaN_var; \
+ check (" "#FLOAT" x = ("#FLOAT") ("#DOUBLE") NaN", isnan (x1) != 0); \
+ x2 = (FLOAT) Inf_var; \
+ check (" "#FLOAT" x = ("#FLOAT") ("#DOUBLE") Inf", isinf (x2) != 0); \
+}
+
TEST_FUNC (float_test, float, nanf, FLT_EPSILON, HUGE_VALF)
TEST_FUNC (double_test, double, nan, DBL_EPSILON, HUGE_VAL)
+TEST_TRUNC (truncdfsf_test, float, double)
#ifndef NO_LONG_DOUBLE
TEST_FUNC (ldouble_test, long double, nanl, LDBL_EPSILON, HUGE_VALL)
+TEST_TRUNC (trunctfsf_test, float, long double)
+TEST_TRUNC (trunctfdf_test, double, long double)
#endif
int
-main (void)
+do_test (void)
{
float_test ();
double_test ();
+ truncdfsf_test();
#ifndef NO_LONG_DOUBLE
ldouble_test ();
+ trunctfsf_test();
+ trunctfdf_test();
#endif
return errors != 0;
}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
diff --git a/math/bug-nextafter.c b/math/bug-nextafter.c
index 2a967c75bf1..1d21841ea66 100644
--- a/math/bug-nextafter.c
+++ b/math/bug-nextafter.c
@@ -4,6 +4,9 @@
#include <stdlib.h>
#include <stdio.h>
+float zero = 0.0;
+float inf = INFINITY;
+
int
main (void)
{
@@ -34,6 +37,81 @@ main (void)
++result;
}
+ i = 0;
+ m = FLT_MIN;
+ feclearexcept (FE_ALL_EXCEPT);
+ i = nextafterf (m, i);
+ if (i < 0 || i >= FLT_MIN)
+ {
+ puts ("nextafterf+ failed");
+ ++result;
+ }
+ if (fetestexcept (FE_UNDERFLOW) == 0)
+ {
+ puts ("nextafterf+ did not underflow");
+ ++result;
+ }
+ i = 0;
+ feclearexcept (FE_ALL_EXCEPT);
+ i = nextafterf (-m, -i);
+ if (i > 0 || i <= -FLT_MIN)
+ {
+ puts ("nextafterf- failed");
+ ++result;
+ }
+ if (fetestexcept (FE_UNDERFLOW) == 0)
+ {
+ puts ("nextafterf- did not underflow");
+ ++result;
+ }
+ i = -INFINITY;
+ feclearexcept (FE_ALL_EXCEPT);
+ m = nextafterf (zero, inf);
+ if (m < 0.0 || m >= FLT_MIN)
+ {
+ puts ("nextafterf+ failed");
+ ++result;
+ }
+ if (fetestexcept (FE_UNDERFLOW) == 0)
+ {
+ puts ("nextafterf+ did not underflow");
+ ++result;
+ }
+ feclearexcept (FE_ALL_EXCEPT);
+ if (nextafterf (m, i) != 0.0)
+ {
+ puts ("nextafterf+ failed");
+ ++result;
+ }
+ if (fetestexcept (FE_UNDERFLOW) == 0)
+ {
+ puts ("nextafterf+ did not underflow");
+ ++result;
+ }
+ feclearexcept (FE_ALL_EXCEPT);
+ m = nextafterf (copysignf (zero, -1.0), -inf);
+ if (m > 0.0 || m <= -FLT_MIN)
+ {
+ puts ("nextafterf- failed");
+ ++result;
+ }
+ if (fetestexcept (FE_UNDERFLOW) == 0)
+ {
+ puts ("nextafterf- did not underflow");
+ ++result;
+ }
+ feclearexcept (FE_ALL_EXCEPT);
+ if (nextafterf (m, -i) != 0.0)
+ {
+ puts ("nextafterf- failed");
+ ++result;
+ }
+ if (fetestexcept (FE_UNDERFLOW) == 0)
+ {
+ puts ("nextafterf- did not underflow");
+ ++result;
+ }
+
double di = INFINITY;
double dm = DBL_MAX;
feclearexcept (FE_ALL_EXCEPT);
@@ -59,5 +137,182 @@ main (void)
++result;
}
+ di = 0;
+ dm = DBL_MIN;
+ feclearexcept (FE_ALL_EXCEPT);
+ di = nextafter (dm, di);
+ if (di < 0 || di >= DBL_MIN)
+ {
+ puts ("nextafter+ failed");
+ ++result;
+ }
+ if (fetestexcept (FE_UNDERFLOW) == 0)
+ {
+ puts ("nextafter+ did not underflow");
+ ++result;
+ }
+ di = 0;
+ feclearexcept (FE_ALL_EXCEPT);
+ di = nextafter (-dm, -di);
+ if (di > 0 || di <= -DBL_MIN)
+ {
+ puts ("nextafter- failed");
+ ++result;
+ }
+ if (fetestexcept (FE_UNDERFLOW) == 0)
+ {
+ puts ("nextafter- did not underflow");
+ ++result;
+ }
+ di = -INFINITY;
+ feclearexcept (FE_ALL_EXCEPT);
+ dm = nextafter (zero, inf);
+ if (dm < 0.0 || dm >= DBL_MIN)
+ {
+ puts ("nextafter+ failed");
+ ++result;
+ }
+ if (fetestexcept (FE_UNDERFLOW) == 0)
+ {
+ puts ("nextafter+ did not underflow");
+ ++result;
+ }
+ feclearexcept (FE_ALL_EXCEPT);
+ if (nextafter (dm, di) != 0.0)
+ {
+ puts ("nextafter+ failed");
+ ++result;
+ }
+ if (fetestexcept (FE_UNDERFLOW) == 0)
+ {
+ puts ("nextafter+ did not underflow");
+ ++result;
+ }
+ feclearexcept (FE_ALL_EXCEPT);
+ dm = nextafter (copysign (zero, -1.0), -inf);
+ if (dm > 0.0 || dm <= -DBL_MIN)
+ {
+ puts ("nextafter- failed");
+ ++result;
+ }
+ if (fetestexcept (FE_UNDERFLOW) == 0)
+ {
+ puts ("nextafter- did not underflow");
+ ++result;
+ }
+ feclearexcept (FE_ALL_EXCEPT);
+ if (nextafter (dm, -di) != 0.0)
+ {
+ puts ("nextafter- failed");
+ ++result;
+ }
+ if (fetestexcept (FE_UNDERFLOW) == 0)
+ {
+ puts ("nextafter- did not underflow");
+ ++result;
+ }
+
+#ifndef NO_LONG_DOUBLE
+ long double li = INFINITY;
+ long double lm = LDBL_MAX;
+ feclearexcept (FE_ALL_EXCEPT);
+ if (nextafterl (lm, li) != li)
+ {
+ puts ("nextafterl+ failed");
+ ++result;
+ }
+ if (fetestexcept (FE_OVERFLOW) == 0)
+ {
+ puts ("nextafterl+ did not overflow");
+ ++result;
+ }
+ feclearexcept (FE_ALL_EXCEPT);
+ if (nextafterl (-lm, -li) != -li)
+ {
+ puts ("nextafterl failed");
+ ++result;
+ }
+ if (fetestexcept (FE_OVERFLOW) == 0)
+ {
+ puts ("nextafterl- did not overflow");
+ ++result;
+ }
+
+ li = 0;
+ lm = LDBL_MIN;
+ feclearexcept (FE_ALL_EXCEPT);
+ li = nextafterl (lm, li);
+ if (li < 0 || li >= LDBL_MIN)
+ {
+ puts ("nextafterl+ failed");
+ ++result;
+ }
+ if (fetestexcept (FE_UNDERFLOW) == 0)
+ {
+ puts ("nextafterl+ did not underflow");
+ ++result;
+ }
+ li = 0;
+ feclearexcept (FE_ALL_EXCEPT);
+ li = nextafterl (-lm, -li);
+ if (li > 0 || li <= -LDBL_MIN)
+ {
+ puts ("nextafterl- failed");
+ ++result;
+ }
+ if (fetestexcept (FE_UNDERFLOW) == 0)
+ {
+ puts ("nextafterl- did not underflow");
+ ++result;
+ }
+ li = -INFINITY;
+ feclearexcept (FE_ALL_EXCEPT);
+ lm = nextafterl (zero, inf);
+ if (lm < 0.0 || lm >= LDBL_MIN)
+ {
+ puts ("nextafterl+ failed");
+ ++result;
+ }
+ if (fetestexcept (FE_UNDERFLOW) == 0)
+ {
+ puts ("nextafterl+ did not underflow");
+ ++result;
+ }
+ feclearexcept (FE_ALL_EXCEPT);
+ if (nextafterl (lm, li) != 0.0)
+ {
+ puts ("nextafterl+ failed");
+ ++result;
+ }
+ if (fetestexcept (FE_UNDERFLOW) == 0)
+ {
+ puts ("nextafterl+ did not underflow");
+ ++result;
+ }
+ feclearexcept (FE_ALL_EXCEPT);
+ lm = nextafterl (copysign (zero, -1.0), -inf);
+ if (lm > 0.0 || lm <= -LDBL_MIN)
+ {
+ puts ("nextafterl- failed");
+ ++result;
+ }
+ if (fetestexcept (FE_UNDERFLOW) == 0)
+ {
+ puts ("nextafterl- did not underflow");
+ ++result;
+ }
+ feclearexcept (FE_ALL_EXCEPT);
+ if (nextafterl (lm, -li) != 0.0)
+ {
+ puts ("nextafterl- failed");
+ ++result;
+ }
+ if (fetestexcept (FE_UNDERFLOW) == 0)
+ {
+ puts ("nextafterl- did not underflow");
+ ++result;
+ }
+#endif
+
return result;
}
diff --git a/math/bug-nexttoward.c b/math/bug-nexttoward.c
index e306a129c2c..ff57e5e3f51 100644
--- a/math/bug-nexttoward.c
+++ b/math/bug-nexttoward.c
@@ -4,6 +4,9 @@
#include <stdlib.h>
#include <stdio.h>
+float zero = 0.0;
+float inf = INFINITY;
+
int
main (void)
{
@@ -35,6 +38,81 @@ main (void)
++result;
}
+ fi = 0;
+ m = FLT_MIN;
+ feclearexcept (FE_ALL_EXCEPT);
+ fi = nexttowardf (m, fi);
+ if (fi < 0 || fi >= FLT_MIN)
+ {
+ puts ("nexttowardf+ failed");
+ ++result;
+ }
+ if (fetestexcept (FE_UNDERFLOW) == 0)
+ {
+ puts ("nexttowardf+ did not underflow");
+ ++result;
+ }
+ fi = 0;
+ feclearexcept (FE_ALL_EXCEPT);
+ fi = nexttowardf (-m, -fi);
+ if (fi > 0 || fi <= -FLT_MIN)
+ {
+ puts ("nexttowardf- failed");
+ ++result;
+ }
+ if (fetestexcept (FE_UNDERFLOW) == 0)
+ {
+ puts ("nexttowardf- did not underflow");
+ ++result;
+ }
+ fi = -INFINITY;
+ feclearexcept (FE_ALL_EXCEPT);
+ m = nexttowardf (zero, inf);
+ if (m < 0.0 || m >= FLT_MIN)
+ {
+ puts ("nexttowardf+ failed");
+ ++result;
+ }
+ if (fetestexcept (FE_UNDERFLOW) == 0)
+ {
+ puts ("nexttowardf+ did not underflow");
+ ++result;
+ }
+ feclearexcept (FE_ALL_EXCEPT);
+ if (nexttowardf (m, fi) != 0.0)
+ {
+ puts ("nexttowardf+ failed");
+ ++result;
+ }
+ if (fetestexcept (FE_UNDERFLOW) == 0)
+ {
+ puts ("nexttowardf+ did not underflow");
+ ++result;
+ }
+ feclearexcept (FE_ALL_EXCEPT);
+ m = nexttowardf (copysignf (zero, -1.0), -inf);
+ if (m > 0.0 || m <= -FLT_MIN)
+ {
+ puts ("nexttowardf- failed");
+ ++result;
+ }
+ if (fetestexcept (FE_UNDERFLOW) == 0)
+ {
+ puts ("nexttowardf- did not underflow");
+ ++result;
+ }
+ feclearexcept (FE_ALL_EXCEPT);
+ if (nexttowardf (m, -fi) != 0.0)
+ {
+ puts ("nexttowardf- failed");
+ ++result;
+ }
+ if (fetestexcept (FE_UNDERFLOW) == 0)
+ {
+ puts ("nexttowardf- did not underflow");
+ ++result;
+ }
+
tl = (long double) DBL_MAX + 1.0e305L;
double di = INFINITY;
double dm = DBL_MAX;
@@ -61,5 +139,182 @@ main (void)
++result;
}
+ di = 0;
+ dm = DBL_MIN;
+ feclearexcept (FE_ALL_EXCEPT);
+ di = nexttoward (dm, di);
+ if (di < 0 || di >= DBL_MIN)
+ {
+ puts ("nexttoward+ failed");
+ ++result;
+ }
+ if (fetestexcept (FE_UNDERFLOW) == 0)
+ {
+ puts ("nexttoward+ did not underflow");
+ ++result;
+ }
+ di = 0;
+ feclearexcept (FE_ALL_EXCEPT);
+ di = nexttoward (-dm, -di);
+ if (di > 0 || di <= -DBL_MIN)
+ {
+ puts ("nexttoward- failed");
+ ++result;
+ }
+ if (fetestexcept (FE_UNDERFLOW) == 0)
+ {
+ puts ("nexttoward- did not underflow");
+ ++result;
+ }
+ di = -INFINITY;
+ feclearexcept (FE_ALL_EXCEPT);
+ dm = nexttoward (zero, inf);
+ if (dm < 0.0 || dm >= DBL_MIN)
+ {
+ puts ("nexttoward+ failed");
+ ++result;
+ }
+ if (fetestexcept (FE_UNDERFLOW) == 0)
+ {
+ puts ("nexttoward+ did not underflow");
+ ++result;
+ }
+ feclearexcept (FE_ALL_EXCEPT);
+ if (nexttoward (dm, di) != 0.0)
+ {
+ puts ("nexttoward+ failed");
+ ++result;
+ }
+ if (fetestexcept (FE_UNDERFLOW) == 0)
+ {
+ puts ("nexttoward+ did not underflow");
+ ++result;
+ }
+ feclearexcept (FE_ALL_EXCEPT);
+ dm = nexttoward (copysign (zero, -1.0), -inf);
+ if (dm > 0.0 || dm <= -DBL_MIN)
+ {
+ puts ("nexttoward- failed");
+ ++result;
+ }
+ if (fetestexcept (FE_UNDERFLOW) == 0)
+ {
+ puts ("nexttoward- did not underflow");
+ ++result;
+ }
+ feclearexcept (FE_ALL_EXCEPT);
+ if (nexttoward (dm, -di) != 0.0)
+ {
+ puts ("nexttoward- failed");
+ ++result;
+ }
+ if (fetestexcept (FE_UNDERFLOW) == 0)
+ {
+ puts ("nexttoward- did not underflow");
+ ++result;
+ }
+
+#ifndef NO_LONG_DOUBLE
+ long double li = INFINITY;
+ long double lm = LDBL_MAX;
+ feclearexcept (FE_ALL_EXCEPT);
+ if (nexttowardl (lm, li) != li)
+ {
+ puts ("nexttowardl+ failed");
+ ++result;
+ }
+ if (fetestexcept (FE_OVERFLOW) == 0)
+ {
+ puts ("nexttowardl+ did not overflow");
+ ++result;
+ }
+ feclearexcept (FE_ALL_EXCEPT);
+ if (nexttowardl (-lm, -li) != -li)
+ {
+ puts ("nexttowardl failed");
+ ++result;
+ }
+ if (fetestexcept (FE_OVERFLOW) == 0)
+ {
+ puts ("nexttowardl- did not overflow");
+ ++result;
+ }
+
+ li = 0;
+ lm = LDBL_MIN;
+ feclearexcept (FE_ALL_EXCEPT);
+ li = nexttowardl (lm, li);
+ if (li < 0 || li >= LDBL_MIN)
+ {
+ puts ("nexttowardl+ failed");
+ ++result;
+ }
+ if (fetestexcept (FE_UNDERFLOW) == 0)
+ {
+ puts ("nexttowardl+ did not underflow");
+ ++result;
+ }
+ li = 0;
+ feclearexcept (FE_ALL_EXCEPT);
+ li = nexttowardl (-lm, -li);
+ if (li > 0 || li <= -LDBL_MIN)
+ {
+ puts ("nexttowardl- failed");
+ ++result;
+ }
+ if (fetestexcept (FE_UNDERFLOW) == 0)
+ {
+ puts ("nexttowardl- did not underflow");
+ ++result;
+ }
+ li = -INFINITY;
+ feclearexcept (FE_ALL_EXCEPT);
+ lm = nexttowardl (zero, inf);
+ if (lm < 0.0 || lm >= LDBL_MIN)
+ {
+ puts ("nexttowardl+ failed");
+ ++result;
+ }
+ if (fetestexcept (FE_UNDERFLOW) == 0)
+ {
+ puts ("nexttowardl+ did not underflow");
+ ++result;
+ }
+ feclearexcept (FE_ALL_EXCEPT);
+ if (nexttowardl (lm, li) != 0.0)
+ {
+ puts ("nexttowardl+ failed");
+ ++result;
+ }
+ if (fetestexcept (FE_UNDERFLOW) == 0)
+ {
+ puts ("nexttowardl+ did not underflow");
+ ++result;
+ }
+ feclearexcept (FE_ALL_EXCEPT);
+ lm = nexttowardl (copysign (zero, -1.0), -inf);
+ if (lm > 0.0 || lm <= -LDBL_MIN)
+ {
+ puts ("nexttowardl- failed");
+ ++result;
+ }
+ if (fetestexcept (FE_UNDERFLOW) == 0)
+ {
+ puts ("nexttowardl- did not underflow");
+ ++result;
+ }
+ feclearexcept (FE_ALL_EXCEPT);
+ if (nexttowardl (lm, -li) != 0.0)
+ {
+ puts ("nexttowardl- failed");
+ ++result;
+ }
+ if (fetestexcept (FE_UNDERFLOW) == 0)
+ {
+ puts ("nexttowardl- did not underflow");
+ ++result;
+ }
+#endif
+
return result;
}
diff --git a/math/libm-test.inc b/math/libm-test.inc
index 23ee6beaa8a..81dd364f77f 100644
--- a/math/libm-test.inc
+++ b/math/libm-test.inc
@@ -4127,7 +4127,9 @@ log_test (void)
TEST_f_f (log, 1, 0);
TEST_f_f (log, -1, nan_value, INVALID_EXCEPTION);
+ TEST_f_f (log, minus_infty, nan_value, INVALID_EXCEPTION);
TEST_f_f (log, plus_infty, plus_infty);
+ TEST_f_f (log, nan_value, nan_value);
TEST_f_f (log, M_El, 1);
TEST_f_f (log, 1.0 / M_El, -1);
@@ -4157,6 +4159,7 @@ log10_test (void)
/* log10 (x) == NaN plus invalid exception if x < 0. */
TEST_f_f (log10, -1, nan_value, INVALID_EXCEPTION);
+ TEST_f_f (log10, minus_infty, nan_value, INVALID_EXCEPTION);
TEST_f_f (log10, plus_infty, plus_infty);
TEST_f_f (log10, nan_value, nan_value);
@@ -4188,6 +4191,7 @@ log1p_test (void)
TEST_f_f (log1p, -1, minus_infty, DIVIDE_BY_ZERO_EXCEPTION);
TEST_f_f (log1p, -2, nan_value, INVALID_EXCEPTION);
+ TEST_f_f (log1p, minus_infty, nan_value, INVALID_EXCEPTION);
TEST_f_f (log1p, plus_infty, plus_infty);
TEST_f_f (log1p, nan_value, nan_value);
@@ -4218,6 +4222,7 @@ log2_test (void)
TEST_f_f (log2, 1, 0);
TEST_f_f (log2, -1, nan_value, INVALID_EXCEPTION);
+ TEST_f_f (log2, minus_infty, nan_value, INVALID_EXCEPTION);
TEST_f_f (log2, plus_infty, plus_infty);
TEST_f_f (log2, nan_value, nan_value);
@@ -4614,6 +4619,17 @@ pow_test (void)
/* pow (x, NaN) == NaN. */
TEST_ff_f (pow, 3.0, nan_value, nan_value);
+ TEST_ff_f (pow, minus_zero, nan_value, nan_value);
+ TEST_ff_f (pow, plus_infty, nan_value, nan_value);
+ TEST_ff_f (pow, -3.0, nan_value, nan_value);
+ TEST_ff_f (pow, minus_infty, nan_value, nan_value);
+
+ TEST_ff_f (pow, nan_value, 3.0, nan_value);
+ TEST_ff_f (pow, nan_value, -3.0, nan_value);
+ TEST_ff_f (pow, nan_value, plus_infty, nan_value);
+ TEST_ff_f (pow, nan_value, minus_infty, nan_value);
+ TEST_ff_f (pow, nan_value, 2.5, nan_value);
+ TEST_ff_f (pow, nan_value, -2.5, nan_value);
TEST_ff_f (pow, 1, plus_infty, 1);
TEST_ff_f (pow, -1, plus_infty, 1);
diff --git a/math/math_private.h b/math/math_private.h
index 572e5468314..129646f8c59 100644
--- a/math/math_private.h
+++ b/math/math_private.h
@@ -332,4 +332,10 @@ extern double __slowexp (double __x);
extern double __slowpow (double __x, double __y, double __z);
extern void __docos (double __x, double __dx, double __v[]);
+#ifndef math_opt_barrier
+#define math_opt_barrier(x) \
+({ __typeof (x) __x = x; __asm ("" : "+m" (__x)); __x; })
+#define math_force_eval(x) __asm __volatile ("" : : "m" (x))
+#endif
+
#endif /* _MATH_PRIVATE_H_ */
diff --git a/math/s_nextafter.c b/math/s_nextafter.c
index 9c678b79c57..d2af52dda38 100644
--- a/math/s_nextafter.c
+++ b/math/s_nextafter.c
@@ -26,7 +26,7 @@ static char rcsid[] = "$NetBSD: s_nextafter.c,v 1.8 1995/05/10 20:47:58 jtc Exp
#define nexttoward __internal_nexttoward
#include <math.h>
-#include "math_private.h"
+#include <math_private.h>
#include <float.h>
#ifdef __STDC__
@@ -49,9 +49,12 @@ static char rcsid[] = "$NetBSD: s_nextafter.c,v 1.8 1995/05/10 20:47:58 jtc Exp
return x+y;
if(x==y) return y; /* x=y, return y */
if((ix|lx)==0) { /* x == 0 */
+ double u;
INSERT_WORDS(x,hy&0x80000000,1); /* return +-minsubnormal */
- y = x*x;
- if(y==x) return y; else return x; /* raise underflow flag */
+ u = math_opt_barrier (x);
+ u = u*u;
+ math_force_eval (u); /* raise underflow flag */
+ return x;
}
if(hx>=0) { /* x > 0 */
if(hx>hy||((hx==hy)&&(lx>ly))) { /* x > y, x -= ulp */
@@ -74,15 +77,12 @@ static char rcsid[] = "$NetBSD: s_nextafter.c,v 1.8 1995/05/10 20:47:58 jtc Exp
if(hy>=0x7ff00000) {
x = x+x; /* overflow */
if (FLT_EVAL_METHOD != 0 && FLT_EVAL_METHOD != 1)
- asm ("" : "=m"(x) : "m"(x));
+ asm ("" : "+m"(x));
return x; /* overflow */
}
- if(hy<0x00100000) { /* underflow */
- y = x*x;
- if(y!=x) { /* raise underflow flag */
- INSERT_WORDS(y,hx,lx);
- return y;
- }
+ if(hy<0x00100000) {
+ double u = x*x; /* underflow */
+ math_force_eval (u); /* raise underflow flag */
}
INSERT_WORDS(x,hx,lx);
return x;
diff --git a/math/s_nexttowardf.c b/math/s_nexttowardf.c
index 1a1026612e2..0494d1a4e9b 100644
--- a/math/s_nexttowardf.c
+++ b/math/s_nexttowardf.c
@@ -21,7 +21,7 @@
*/
#include <math.h>
-#include "math_private.h"
+#include <math_private.h>
#include <float.h>
#ifdef __STDC__
@@ -45,10 +45,12 @@
return x+y;
if((long double) x==y) return y; /* x=y, return y */
if(ix==0) { /* x == 0 */
- float x2;
+ float u;
SET_FLOAT_WORD(x,(u_int32_t)(hy&0x80000000)|1);/* return +-minsub*/
- x2 = x*x;
- if(x2==x) return x2; else return x; /* raise underflow flag */
+ u = math_opt_barrier (x);
+ u = u * u;
+ math_force_eval (u); /* raise underflow flag */
+ return x;
}
if(hx>=0) { /* x > 0 */
if(hy<0||(ix>>23)>(iy>>20)-0x380
@@ -70,15 +72,12 @@
x = x+x; /* overflow */
if (FLT_EVAL_METHOD != 0)
/* Force conversion to float. */
- asm ("" : "=m"(x) : "m"(x));
+ asm ("" : "+m"(x));
return x;
}
- if(hy<0x00800000) { /* underflow */
- float x2 = x*x;
- if(x2!=x) { /* raise underflow flag */
- SET_FLOAT_WORD(x2,hx);
- return x2;
- }
+ if(hy<0x00800000) {
+ float u = x*x; /* underflow */
+ math_force_eval (u); /* raise underflow flag */
}
SET_FLOAT_WORD(x,hx);
return x;
diff --git a/math/test-misc.c b/math/test-misc.c
index d2393cc8406..862e11f0c3b 100644
--- a/math/test-misc.c
+++ b/math/test-misc.c
@@ -1,5 +1,5 @@
/* Miscellaneous tests which don't fit anywhere else.
- Copyright (C) 2000, 2001, 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001, 2004, 2005, 2007 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -44,7 +44,6 @@ main (void)
}
}
-# if __GNUC__ >= 3 || __GNUC_MINOR__ >= 96
{
long double x;
long double m;
@@ -52,17 +51,17 @@ main (void)
int e;
int i;
-# if LDBL_MANT_DIG == 64
+# if LDBL_MANT_DIG == 64
m = 0xf.fffffffffffffffp-4L;
-# elif LDBL_MANT_DIG == 106
+# elif LDBL_MANT_DIG == 106
/* This has to match the mantissa of LDBL_MAX which actually does have a
missing bit in the middle. */
m = 0x1.fffffffffffff7ffffffffffff8p-1L;
-# elif LDBL_MANT_DIG == 113
+# elif LDBL_MANT_DIG == 113
m = 0x1.ffffffffffffffffffffffffffffp-1L;
-# else
-# error "Please adjust"
-# endif
+# else
+# error "Please adjust"
+# endif
for (i = LDBL_MAX_EXP, x = LDBL_MAX; i >= LDBL_MIN_EXP; --i, x /= 2.0L)
{
@@ -106,9 +105,8 @@ main (void)
}
}
-# endif
-#if 0
+# if 0
{
int e;
long double r = frexpl (LDBL_MIN * LDBL_EPSILON, &e);
@@ -126,7 +124,7 @@ main (void)
result = 1;
}
}
-#endif
+# endif
#endif
{
@@ -1183,5 +1181,59 @@ main (void)
}
#endif
+ volatile float f1 = FLT_MAX;
+ volatile float f2 = FLT_MAX / 2;
+ (void) &f1;
+ (void) &f2;
+ feclearexcept (FE_ALL_EXCEPT);
+ f2 += f1;
+ int fe = fetestexcept (FE_ALL_EXCEPT);
+ if (fe != (FE_OVERFLOW | FE_INEXACT))
+ {
+ printf ("float overflow test failed: %x\n", fe);
+ result = 1;
+ }
+
+ volatile double d1 = DBL_MAX;
+ volatile double d2 = DBL_MAX / 2;
+ (void) &d1;
+ (void) &d2;
+ feclearexcept (FE_ALL_EXCEPT);
+ d2 += d1;
+ fe = fetestexcept (FE_ALL_EXCEPT);
+ if (fe != (FE_OVERFLOW | FE_INEXACT))
+ {
+ printf ("double overflow test failed: %x\n", fe);
+ result = 1;
+ }
+
+#ifndef NO_LONG_DOUBLE
+ volatile long double ld1 = LDBL_MAX;
+ volatile long double ld2 = LDBL_MAX / 2;
+ (void) &ld1;
+ (void) &ld2;
+ feclearexcept (FE_ALL_EXCEPT);
+ ld2 += ld1;
+ fe = fetestexcept (FE_ALL_EXCEPT);
+ if (fe != (FE_OVERFLOW | FE_INEXACT))
+ {
+ printf ("long double overflow test failed: %x\n", fe);
+ result = 1;
+ }
+#endif
+
+#if !defined NO_LONG_DOUBLE && LDBL_MANT_DIG == 113
+ volatile long double ld3 = 0x1.0000000000010000000100000001p+1;
+ volatile long double ld4 = 0x1.0000000000000000000000000001p+1;
+ (void) &ld3;
+ (void) &ld4;
+ ld3 -= ld4;
+ if (ld3 != 0x1.0p-47)
+ {
+ printf ("long double subtraction test failed %.28La\n", ld3);
+ result = 1;
+ }
+#endif
+
return result;
}
diff --git a/misc/madvise.c b/misc/madvise.c
index dbef959dd85..7a4aa8ab8e5 100644
--- a/misc/madvise.c
+++ b/misc/madvise.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1994, 1995, 1996, 1997, 2000 Free Software Foundation, Inc.
+/* Copyright (C) 1994,1995,1996,1997,2000,2007 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -29,5 +29,6 @@ madvise (__ptr_t addr, size_t len, int advice)
__set_errno (ENOSYS);
return -1;
}
+libc_hidden_def (madvise)
stub_warning (madvise)
#include <stub-tag.h>
diff --git a/nis/Banner b/nis/Banner
new file mode 100644
index 00000000000..cf7987171c3
--- /dev/null
+++ b/nis/Banner
@@ -0,0 +1 @@
+NIS(YP)/NIS+ NSS modules 0.19 by Thorsten Kukuk
diff --git a/nis/nis_call.c b/nis/nis_call.c
index 928053daf5f..c571e8f367b 100644
--- a/nis/nis_call.c
+++ b/nis/nis_call.c
@@ -1,4 +1,5 @@
-/* Copyright (C) 1997,1998,2001,2004,2005,2006 Free Software Foundation, Inc.
+/* Copyright (C) 1997, 1998, 2001, 2004, 2005, 2006, 2007
+ Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1997.
@@ -25,8 +26,11 @@
#include <rpc/auth.h>
#include <rpcsvc/nis.h>
#include <sys/socket.h>
+#include <sys/stat.h>
+#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
+#include <bits/libc-lock.h>
#include "nis_xdr.h"
#include "nis_intern.h"
@@ -107,10 +111,79 @@ __nisbind_next (dir_binding *bind)
}
libnsl_hidden_def (__nisbind_next)
+static struct ckey_cache_entry
+{
+ struct in_addr inaddr;
+ in_port_t port;
+ unsigned int protocol;
+ des_block ckey;
+} *ckey_cache;
+static size_t ckey_cache_size;
+static size_t ckey_cache_allocated;
+static pid_t ckey_cache_pid;
+static uid_t ckey_cache_euid;
+__libc_lock_define_initialized (static, ckey_cache_lock)
+
+static bool_t
+get_ckey (des_block *ckey, struct sockaddr_in *addr, unsigned int protocol)
+{
+ size_t i;
+ pid_t pid = getpid ();
+ uid_t euid = geteuid ();
+ bool_t ret = FALSE;
+
+ __libc_lock_lock (ckey_cache_lock);
+
+ if (ckey_cache_pid != pid || ckey_cache_euid != euid)
+ {
+ ckey_cache_size = 0;
+ ckey_cache_pid = pid;
+ ckey_cache_euid = euid;
+ }
+
+ for (i = 0; i < ckey_cache_size; ++i)
+ if (ckey_cache[i].port == addr->sin_port
+ && ckey_cache[i].protocol == protocol
+ && memcmp (&ckey_cache[i].inaddr, &addr->sin_addr,
+ sizeof (addr->sin_addr)) == 0)
+ {
+ *ckey = ckey_cache[i].ckey;
+ ret = TRUE;
+ break;
+ }
+
+ if (!ret && key_gendes (ckey) >= 0)
+ {
+ ret = TRUE;
+ /* Don't grow the cache indefinitely. */
+ if (ckey_cache_size == 256)
+ ckey_cache_size = 0;
+ if (ckey_cache_size == ckey_cache_allocated)
+ {
+ size_t size = ckey_cache_allocated ? ckey_cache_allocated * 2 : 16;
+ struct ckey_cache_entry *new_cache
+ = realloc (ckey_cache, size * sizeof (*ckey_cache));
+ if (new_cache != NULL)
+ {
+ ckey_cache = new_cache;
+ ckey_cache_allocated = size;
+ }
+ }
+ ckey_cache[ckey_cache_size].inaddr = addr->sin_addr;
+ ckey_cache[ckey_cache_size].port = addr->sin_port;
+ ckey_cache[ckey_cache_size].protocol = protocol;
+ ckey_cache[ckey_cache_size++].ckey = *ckey;
+ }
+
+ __libc_lock_unlock (ckey_cache_lock);
+ return ret;
+}
+
nis_error
__nisbind_connect (dir_binding *dbp)
{
nis_server *serv;
+ u_short port;
if (dbp == NULL)
return NIS_FAIL;
@@ -128,9 +201,12 @@ __nisbind_connect (dir_binding *dbp)
/* Check, if the host is online and rpc.nisd is running. Much faster
then the clnt*_create functions: */
- if (__pmap_getnisport (&dbp->addr, NIS_PROG, NIS_VERSION, IPPROTO_UDP) == 0)
+ port = __pmap_getnisport (&dbp->addr, NIS_PROG, NIS_VERSION,
+ dbp->use_udp ? IPPROTO_UDP : IPPROTO_TCP);
+ if (port == 0)
return NIS_RPCERROR;
+ dbp->addr.sin_port = htons (port);
dbp->socket = RPC_ANYSOCK;
if (dbp->use_udp)
dbp->clnt = clntudp_create (&dbp->addr, NIS_PROG, NIS_VERSION,
@@ -153,17 +229,16 @@ __nisbind_connect (dir_binding *dbp)
{
char netname[MAXNETNAMELEN + 1];
char *p;
+ des_block ckey;
- p = stpcpy (netname, "unix.");
+ p = stpcpy (netname, "unix@");
strncpy (p, serv->name, MAXNETNAMELEN - 5);
netname[MAXNETNAMELEN] = '\0';
- // XXX What is this supposed to do? If we really want to replace
- // XXX the first dot, then we might as well use unix@ as the
- // XXX prefix string. --drepper
- p = strchr (netname, '.');
- *p = '@';
- dbp->clnt->cl_auth =
- authdes_pk_create (netname, &serv->pkey, 300, NULL, NULL);
+ dbp->clnt->cl_auth = NULL;
+ if (get_ckey (&ckey, &dbp->addr,
+ dbp->use_udp ? IPPROTO_UDP : IPPROTO_TCP))
+ dbp->clnt->cl_auth =
+ authdes_pk_create (netname, &serv->pkey, 300, NULL, &ckey);
if (!dbp->clnt->cl_auth)
dbp->clnt->cl_auth = authunix_create_default ();
}
@@ -177,7 +252,8 @@ libnsl_hidden_def (__nisbind_connect)
nis_error
__nisbind_create (dir_binding *dbp, const nis_server *serv_val,
- unsigned int serv_len, unsigned int flags)
+ unsigned int serv_len, unsigned int server_used,
+ unsigned int current_ep, unsigned int flags)
{
dbp->clnt = NULL;
@@ -203,8 +279,16 @@ __nisbind_create (dir_binding *dbp, const nis_server *serv_val,
dbp->trys = 1;
dbp->class = -1;
- if (__nis_findfastest (dbp) < 1)
- return NIS_NAMEUNREACHABLE;
+ if (server_used == ~0)
+ {
+ if (__nis_findfastest (dbp) < 1)
+ return NIS_NAMEUNREACHABLE;
+ }
+ else
+ {
+ dbp->server_used = server_used;
+ dbp->current_ep = current_ep;
+ }
return NIS_SUCCESS;
}
@@ -306,7 +390,7 @@ __do_niscall2 (const nis_server *server, u_int server_len, u_long prog,
if (flags & MASTER_ONLY)
server_len = 1;
- status = __nisbind_create (&dbp, server, server_len, flags);
+ status = __nisbind_create (&dbp, server, server_len, ~0, ~0, flags);
if (status != NIS_SUCCESS)
return status;
@@ -338,9 +422,7 @@ rec_dirsearch (const_nis_name name, directory_obj *dir, nis_error *status)
case HIGHER_NAME:
{ /* We need data from a parent domain */
directory_obj *obj;
- char ndomain[strlen (dir->do_name) + 3];
-
- nis_domain_of_r (dir->do_name, ndomain, sizeof (ndomain));
+ const char *ndomain = __nis_domain_of (dir->do_name);
/* The root server of our domain is a replica of the parent
domain ! (Now I understand why a root server must be a
@@ -384,7 +466,7 @@ rec_dirsearch (const_nis_name name, directory_obj *dir, nis_error *status)
size_t namelen = strlen (name);
char leaf[namelen + 3];
char domain[namelen + 3];
- char ndomain[namelen + 3];
+ const char *ndomain;
char *cp;
strcpy (domain, name);
@@ -397,8 +479,8 @@ rec_dirsearch (const_nis_name name, directory_obj *dir, nis_error *status)
return NULL;
}
nis_leaf_of_r (domain, leaf, sizeof (leaf));
- nis_domain_of_r (domain, ndomain, sizeof (ndomain));
- strcpy (domain, ndomain);
+ ndomain = __nis_domain_of (domain);
+ memmove (domain, ndomain, strlen (ndomain) + 1);
}
while (nis_dir_cmp (domain, dir->do_name) != SAME_NAME);
@@ -451,29 +533,16 @@ rec_dirsearch (const_nis_name name, directory_obj *dir, nis_error *status)
/* We try to query the current server for the searched object,
maybe he know about it ? */
static directory_obj *
-first_shoot (const_nis_name name, int search_parent_first, directory_obj *dir)
+first_shoot (const_nis_name name, directory_obj *dir)
{
directory_obj *obj = NULL;
fd_result *fd_res;
XDR xdrs;
- char domain[strlen (name) + 3];
-#if 0
if (nis_dir_cmp (name, dir->do_name) == SAME_NAME)
return dir;
-#endif
- const char *search_name = name;
- if (search_parent_first)
- {
- nis_domain_of_r (name, domain, sizeof (domain));
- search_name = domain;
- }
-
- if (nis_dir_cmp (search_name, dir->do_name) == SAME_NAME)
- return dir;
-
- fd_res = __nis_finddirectory (dir, search_name);
+ fd_res = __nis_finddirectory (dir, name);
if (fd_res == NULL)
return NULL;
if (fd_res->status == NIS_SUCCESS
@@ -499,42 +568,224 @@ first_shoot (const_nis_name name, int search_parent_first, directory_obj *dir)
return obj;
}
+static struct nis_server_cache
+{
+ int search_parent;
+ int uses;
+ unsigned int size;
+ unsigned int server_used;
+ unsigned int current_ep;
+ time_t expires;
+ char name[];
+} *nis_server_cache[16];
+static time_t nis_cold_start_mtime;
+__libc_lock_define_initialized (static, nis_server_cache_lock)
+
+static directory_obj *
+nis_server_cache_search (const_nis_name name, int search_parent,
+ unsigned int *server_used, unsigned int *current_ep,
+ struct timeval *now)
+{
+ directory_obj *ret = NULL;
+ int i;
+ char *addr;
+ XDR xdrs;
+ struct stat64 st;
+
+ if (stat64 ("/var/nis/NIS_COLD_START", &st) < 0)
+ st.st_mtime = nis_cold_start_mtime + 1;
+
+ __libc_lock_lock (nis_server_cache_lock);
+
+ for (i = 0; i < 16; ++i)
+ if (nis_server_cache[i] == NULL)
+ continue;
+ else if (st.st_mtime != nis_cold_start_mtime
+ || now->tv_sec > nis_server_cache[i]->expires)
+ {
+ free (nis_server_cache[i]);
+ nis_server_cache[i] = NULL;
+ }
+ else if (nis_server_cache[i]->search_parent == search_parent
+ && strcmp (nis_server_cache[i]->name, name) == 0)
+ {
+ ret = calloc (1, sizeof (directory_obj));
+ if (ret == NULL)
+ break;
+
+ addr = rawmemchr (nis_server_cache[i]->name, '\0') + 8;
+ addr = (char *) ((uintptr_t) addr & ~(uintptr_t) 7);
+ xdrmem_create (&xdrs, addr, nis_server_cache[i]->size, XDR_DECODE);
+ if (!_xdr_directory_obj (&xdrs, ret))
+ {
+ xdr_destroy (&xdrs);
+ free (ret);
+ ret = NULL;
+ free (nis_server_cache[i]);
+ nis_server_cache[i] = NULL;
+ break;
+ }
+ xdr_destroy (&xdrs);
+ *server_used = nis_server_cache[i]->server_used;
+ *current_ep = nis_server_cache[i]->current_ep;
+ break;
+ }
+
+ nis_cold_start_mtime = st.st_mtime;
+
+ __libc_lock_unlock (nis_server_cache_lock);
+ return ret;
+}
+
+static void
+nis_server_cache_add (const_nis_name name, int search_parent,
+ directory_obj *dir, unsigned int server_used,
+ unsigned int current_ep, struct timeval *now)
+{
+ struct nis_server_cache **loc;
+ struct nis_server_cache *new;
+ struct nis_server_cache *old;
+ int i;
+ char *addr;
+ unsigned int size;
+ XDR xdrs;
+
+ if (dir == NULL)
+ return;
+
+ size = xdr_sizeof ((xdrproc_t) _xdr_directory_obj, (char *) dir);
+ new = calloc (1, sizeof (*new) + strlen (name) + 8 + size);
+ if (new == NULL)
+ return;
+ new->search_parent = search_parent;
+ new->uses = 1;
+ new->expires = now->tv_sec + dir->do_ttl;
+ new->size = size;
+ new->server_used = server_used;
+ new->current_ep = current_ep;
+ addr = stpcpy (new->name, name) + 8;
+ addr = (char *) ((uintptr_t) addr & ~(uintptr_t) 7);
+
+ xdrmem_create(&xdrs, addr, size, XDR_ENCODE);
+ if (!_xdr_directory_obj (&xdrs, dir))
+ {
+ xdr_destroy (&xdrs);
+ free (new);
+ return;
+ }
+ xdr_destroy (&xdrs);
+
+ __libc_lock_lock (nis_server_cache_lock);
+
+ /* Choose which entry should be evicted from the cache. */
+ loc = &nis_server_cache[0];
+ if (*loc != NULL)
+ for (i = 1; i < 16; ++i)
+ if (nis_server_cache[i] == NULL)
+ {
+ loc = &nis_server_cache[i];
+ break;
+ }
+ else if ((*loc)->uses > nis_server_cache[i]->uses
+ || ((*loc)->uses == nis_server_cache[i]->uses
+ && (*loc)->expires > nis_server_cache[i]->expires))
+ loc = &nis_server_cache[i];
+ old = *loc;
+ *loc = new;
+
+ __libc_lock_unlock (nis_server_cache_lock);
+ free (old);
+}
+
nis_error
-__nisfind_server (const_nis_name name, int search_parent_first,
- directory_obj **dir)
+__nisfind_server (const_nis_name name, int search_parent,
+ directory_obj **dir, dir_binding *dbp, unsigned int flags)
{
+ nis_error result = NIS_SUCCESS;
+ nis_error status;
+ directory_obj *obj;
+ struct timeval now;
+ unsigned int server_used = ~0;
+ unsigned int current_ep = ~0;
+
if (name == NULL)
return NIS_BADNAME;
-#if 0
- /* Search in local cache. In the moment, we ignore the fastest server */
- if (!(flags & NO_CACHE))
- dir = __nis_cache_search (name, flags, &cinfo);
-#endif
+ if (*dir != NULL)
+ return NIS_SUCCESS;
- nis_error result = NIS_SUCCESS;
- if (*dir == NULL)
+ (void) gettimeofday (&now, NULL);
+
+ if ((flags & NO_CACHE) == 0)
+ *dir = nis_server_cache_search (name, search_parent, &server_used,
+ &current_ep, &now);
+ if (*dir != NULL)
{
- nis_error status;
- directory_obj *obj;
+ unsigned int server_len = (*dir)->do_servers.do_servers_len;
+ if (flags & MASTER_ONLY)
+ {
+ server_len = 1;
+ if (server_used != 0)
+ {
+ server_used = ~0;
+ current_ep = ~0;
+ }
+ }
+ result = __nisbind_create (dbp, (*dir)->do_servers.do_servers_val,
+ server_len, server_used, current_ep, flags);
+ if (result != NIS_SUCCESS)
+ {
+ nis_free_directory (*dir);
+ *dir = NULL;
+ }
+ return result;
+ }
- *dir = readColdStartFile ();
- if (*dir == NULL)
- /* No /var/nis/NIS_COLD_START->no NIS+ installed. */
- return NIS_UNAVAIL;
+ *dir = readColdStartFile ();
+ if (*dir == NULL)
+ /* No /var/nis/NIS_COLD_START->no NIS+ installed. */
+ return NIS_UNAVAIL;
- /* Try at first, if servers in "dir" know our object */
- obj = first_shoot (name, search_parent_first, *dir);
+ /* Try at first, if servers in "dir" know our object */
+ const char *search_name = name;
+ if (search_parent)
+ search_name = __nis_domain_of (name);
+ obj = first_shoot (search_name, *dir);
+ if (obj == NULL)
+ {
+ obj = rec_dirsearch (search_name, *dir, &status);
if (obj == NULL)
+ result = status;
+ }
+
+ if (result == NIS_SUCCESS)
+ {
+ unsigned int server_len = obj->do_servers.do_servers_len;
+ if (flags & MASTER_ONLY)
+ server_len = 1;
+ result = __nisbind_create (dbp, obj->do_servers.do_servers_val,
+ server_len, ~0, ~0, flags);
+ if (result == NIS_SUCCESS)
{
- obj = rec_dirsearch (name, *dir, &status);
- if (obj == NULL)
- result = status;
+ if ((flags & MASTER_ONLY) == 0
+ || obj->do_servers.do_servers_len == 1)
+ {
+ server_used = dbp->server_used;
+ current_ep = dbp->current_ep;
+ }
+ if ((flags & NO_CACHE) == 0)
+ nis_server_cache_add (name, search_parent, obj,
+ server_used, current_ep, &now);
+ }
+ else
+ {
+ nis_free_directory (obj);
+ obj = NULL;
}
-
- *dir = obj;
}
+ *dir = obj;
+
return result;
}
@@ -543,38 +794,19 @@ nis_error
__prepare_niscall (const_nis_name name, directory_obj **dirp,
dir_binding *bptrp, unsigned int flags)
{
- nis_error retcode = __nisfind_server (name, 1, dirp);
+ nis_error retcode = __nisfind_server (name, 1, dirp, bptrp, flags);
if (__builtin_expect (retcode != NIS_SUCCESS, 0))
return retcode;
- nis_server *server;
- u_int server_len;
-
- if (flags & MASTER_ONLY)
- {
- server = (*dirp)->do_servers.do_servers_val;
- server_len = 1;
- }
- else
- {
- server = (*dirp)->do_servers.do_servers_val;
- server_len = (*dirp)->do_servers.do_servers_len;
- }
-
- retcode = __nisbind_create (bptrp, server, server_len, flags);
- if (retcode == NIS_SUCCESS)
- {
- do
- if (__nisbind_connect (bptrp) == NIS_SUCCESS)
- return NIS_SUCCESS;
- while (__nisbind_next (bptrp) == NIS_SUCCESS);
-
- __nisbind_destroy (