From a346458fa85decb63d2bf237c62f58ca46450c3b Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Fri, 11 Apr 2008 19:44:05 +0000 Subject: Updated to fedora-glibc-20080411T1934 --- ChangeLog | 61 +++++++ configure | 10 +- configure.in | 6 +- fedora/branch.mk | 4 +- fedora/glibc.spec.in | 14 +- math/libm-test.inc | 43 +++++ sysdeps/powerpc/powerpc32/fpu/s_lround.S | 52 +++--- sysdeps/powerpc/powerpc32/fpu/s_lroundf.S | 1 - sysdeps/powerpc/powerpc32/power4/fpu/s_llround.S | 71 +++++--- sysdeps/powerpc/powerpc32/power5+/fpu/s_llroundf.S | 1 - sysdeps/powerpc/powerpc32/power6/fpu/s_llroundf.S | 1 - sysdeps/powerpc/powerpc64/dl-machine.h | 16 +- sysdeps/powerpc/powerpc64/fpu/s_llround.S | 57 ++++--- sysdeps/powerpc/powerpc64/fpu/s_llroundf.S | 53 ++++-- sysdeps/powerpc/powerpc64/fpu/s_lrint.S | 1 - sysdeps/powerpc/powerpc64/fpu/s_lround.S | 1 - sysdeps/powerpc/powerpc64/fpu/s_lroundf.S | 1 - time/alt_digit.c | 16 +- time/era.c | 8 +- timezone/asia | 104 ++++++++++-- timezone/backward | 5 +- timezone/europe | 3 +- timezone/iso3166.tab | 6 +- timezone/leapseconds | 19 +-- timezone/northamerica | 75 ++++++++- timezone/private.h | 96 ++--------- timezone/southamerica | 178 ++++++++++++++++++--- timezone/zdump.c | 35 ++-- timezone/zic.c | 149 ++++++++--------- timezone/zone.tab | 14 +- wcsmbs/wcsmbsload.c | 8 +- 31 files changed, 740 insertions(+), 369 deletions(-) diff --git a/ChangeLog b/ChangeLog index 4384f33a8a..1faab8a4b8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,64 @@ +2007-11-20 Ryan S. Arnold + + [BZ #4997] + * sysdeps/powerpc/powerpc32/fpu/s_lround.S (__lround): Fixed erroneous + result when x is +/-nextafter(+/-0.5,-/+1) i.e. all 1's in the + mantissa. + * sysdeps/powerpc/powerpc32/power4/fpu/s_llround.S (__llround): + Likewise. Also account for when x is an odd number between 2^52 + and 2^53-1. + * sysdeps/powerpc/powerpc64/fpu/s_llround.S (__llround): Likewise. + * sysdeps/powerpc/powerpc64/fpu/s_llroundf.S (__llroundf): Likewise. + * math/libm-test.inc (lround_test, llround_test): Added test cases to + detect aforementioned erroneous conditions. + +2008-04-11 Jakub Jelinek + + * configure.in: Check for -fno-section-anchors in addition to + -fno-toplevel-reorder. + +2008-04-11 Ulrich Drepper + + * include/features.h (__GLIBC_MINOR__): Bump to 8. + + * sysdeps/powerpc/powerpc32/fpu/s_lroundf.S: Remove duplicate comment. + * sysdeps/powerpc/powerpc32/power5+/fpu/s_llroundf.S: Likewise. + * sysdeps/powerpc/powerpc32/power6/fpu/s_llroundf.S: Likewise. + * sysdeps/powerpc/powerpc64/fpu/s_lrint.S: Likewise. + * sysdeps/powerpc/powerpc64/fpu/s_lround.S: Likewise. + * sysdeps/powerpc/powerpc64/fpu/s_lroundf.S: Likewise. + +2008-04-11 Jakub Jelinek + + [BZ #5443] + * time/era.c: Transform __libc_setlocale_lock into rwlock. + * time/alt_digit.c: Likewise. + * wcsmbs/wcsmbsload.c: Likewise. + +2008-04-10 Ulrich Drepper + + * version.h (VERSION): Bump to 2.8. + + * timzeone/asia: Update from tzdata2008b. + * timezone/backward: Likewise. + * timezone/europe: Likewise. + * timezone/northamerica: Likewise. + * timezone/southamerica: Likewise. + * timezone/iso3166.tab: Likewise. + * timezone/leapseconds: Likewise. + * timezone/zone.tab: Likewise. + * timezone/private.h: Update from tzcode2008a. + * timezone/zdump.c: Likewise. + * timezone/zic.c: Likewise. + +2008-01-24 Steven Munroe + + [BZ #5741] + * sysdeps/powerpc/powerpc64/dl-machine.h (PPC_DCBT, PPC_DCBF): + Define additonal Data Cache Block instruction macros. + (elf_machine_fixup_plt): Add dcbt for opd and plt entries. + Replace dcbst with dcbf and sync with sync/isync. + 2008-02-21 Alan Modra * sysdeps/powerpc/powerpc64/dl-machine.h (elf_machine_type_class): diff --git a/configure b/configure index 4b969787e3..3330d53dc3 100755 --- a/configure +++ b/configure @@ -5067,7 +5067,7 @@ echo "$as_me: WARNING: if test -n "$sysheaders"; then SYSINCLUDES=-nostdinc for d in include include-fixed; do - i=`$CC -print-file-name="$d"` && test "x$i" != "x$d" && + i=`$CC -print-file-name="$d"` && test "x$i" != x && test "x$i" != "x$d" && SYSINCLUDES="$SYSINCLUDES -isystem $i" done SYSINCLUDES="$SYSINCLUDES \ @@ -6411,15 +6411,15 @@ echo "${ECHO_T}$libc_cv_hashstyle" >&6; } fi -{ echo "$as_me:$LINENO: checking for -fno-toplevel-reorder" >&5 -echo $ECHO_N "checking for -fno-toplevel-reorder... $ECHO_C" >&6; } +{ echo "$as_me:$LINENO: checking for -fno-toplevel-reorder -fno-section-anchors" >&5 +echo $ECHO_N "checking for -fno-toplevel-reorder -fno-section-anchors... $ECHO_C" >&6; } if test "${libc_cv_fno_toplevel_reorder+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat > conftest.c <&5' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 @@ -6436,7 +6436,7 @@ fi { echo "$as_me:$LINENO: result: $libc_cv_fno_toplevel_reorder" >&5 echo "${ECHO_T}$libc_cv_fno_toplevel_reorder" >&6; } if test $libc_cv_fno_toplevel_reorder = yes; then - fno_unit_at_a_time=-fno-toplevel-reorder + fno_unit_at_a_time="-fno-toplevel-reorder -fno-section-anchors" else fno_unit_at_a_time=-fno-unit-at-a-time fi diff --git a/configure.in b/configure.in index 3098ebfd3d..e6a5abb54c 100644 --- a/configure.in +++ b/configure.in @@ -1614,11 +1614,11 @@ EOF AC_SUBST(libc_cv_hashstyle) fi -AC_CACHE_CHECK(for -fno-toplevel-reorder, libc_cv_fno_toplevel_reorder, [dnl +AC_CACHE_CHECK(for -fno-toplevel-reorder -fno-section-anchors, libc_cv_fno_toplevel_reorder, [dnl cat > conftest.c <&AS_MESSAGE_LOG_FD]) then libc_cv_fno_toplevel_reorder=yes @@ -1627,7 +1627,7 @@ else fi rm -f conftest*]) if test $libc_cv_fno_toplevel_reorder = yes; then - fno_unit_at_a_time=-fno-toplevel-reorder + fno_unit_at_a_time="-fno-toplevel-reorder -fno-section-anchors" else fno_unit_at_a_time=-fno-unit-at-a-time fi diff --git a/fedora/branch.mk b/fedora/branch.mk index 227fdf5885..80cc48e13e 100644 --- a/fedora/branch.mk +++ b/fedora/branch.mk @@ -3,5 +3,5 @@ glibc-branch := fedora glibc-base := HEAD DIST_BRANCH := devel COLLECTION := dist-f8 -fedora-sync-date := 2008-04-10 19:07 UTC -fedora-sync-tag := fedora-glibc-20080410T1907 +fedora-sync-date := 2008-04-11 19:34 UTC +fedora-sync-tag := fedora-glibc-20080411T1934 diff --git a/fedora/glibc.spec.in b/fedora/glibc.spec.in index 26acf2f8f4..18eb47dab5 100644 --- a/fedora/glibc.spec.in +++ b/fedora/glibc.spec.in @@ -19,7 +19,7 @@ Summary: The GNU libc libraries Name: glibc Version: @glibcversion@ -Release: 15 +Release: 16 # GPLv2+ is used in a bunch of programs, LGPLv2+ is used for libraries. # Things that are linked directly into dynamically linked programs # and shared libraries (e.g. crt files, lib*_nonshared.a) have an additional @@ -976,10 +976,18 @@ rm -f *.filelist* %endif %changelog +* Fri Apr 11 2008 Jakub Jelinek 2.7.90-16 +- update to trunk + - misc fixes (BZ#4997, BZ#5741) + - make sure all users of __libc_setlocale_lock know it is + now a rwlock + - fix ppc/ppc64 compatibility _sys_errlist and _sys_siglist + symbols + * Thu Apr 10 2008 Jakub Jelinek 2.7.90-15 - update to trunk - misc fixes (BZ#4314, BZ#4407, BZ#5209, BZ#5436, BZ#5768, BZ#5998, - BZ#6024) + BZ#6024) - restart sshd in %post when upstart is used - it doesn't have /dev/initctl (#441763) - disable assert checking again @@ -987,7 +995,7 @@ rm -f *.filelist* * Tue Apr 8 2008 Jakub Jelinek 2.7.90-14 - update to trunk - misc fixes (BZ#5443, BZ#5475, BZ#5478, BZ#5939, BZ#5979, BZ#5995, - BZ#6004, BZ#6007, BZ#6020, BZ#6021, BZ#6042) + BZ#6004, BZ#6007, BZ#6020, BZ#6021, BZ#6042) - change mtrace to keep perl 5.10 quiet (#441082) - don't share conversion state between mbtowc and wctomb (#438687) - if st_blksize is too large and malloc fails, retry with smaller diff --git a/math/libm-test.inc b/math/libm-test.inc index a33a182857..b8a73ae1f6 100644 --- a/math/libm-test.inc +++ b/math/libm-test.inc @@ -4300,6 +4300,17 @@ lround_test (void) # endif TEST_f_l (lround, 2097152.5, 2097153); TEST_f_l (lround, -2097152.5, -2097153); + /* nextafter(0.5,-1) */ + TEST_f_l (lround, 0x1.fffffffffffffp-2, 0); + /* nextafter(-0.5,1) */ + TEST_f_l (lround, -0x1.fffffffffffffp-2, 0); +#else + /* nextafter(0.5,-1) */ + TEST_f_l (lround, 0x1.fffffp-2, 0); + /* nextafter(-0.5,1) */ + TEST_f_l (lround, -0x1.fffffp-2, 0); + TEST_f_l (lround, 0x1.fffffep+23, 16777215); + TEST_f_l (lround, -0x1.fffffep+23, -16777215); #endif END (lround); } @@ -4359,8 +4370,40 @@ llround_test (void) TEST_f_L (llround, 4294967295.5, 4294967296LL); /* 0x200000000 */ TEST_f_L (llround, 8589934591.5, 8589934592LL); + + /* nextafter(0.5,-1) */ + TEST_f_L (llround, 0x1.fffffffffffffp-2, 0); + /* nextafter(-0.5,1) */ + TEST_f_L (llround, -0x1.fffffffffffffp-2, 0); + /* On PowerPC an exponent of '52' is the largest incrementally + * representable sequence of whole-numbers in the 'double' range. We test + * lround to make sure that a guard bit set during the lround operation + * hasn't forced an erroneous shift giving us an incorrect result. The odd + * numbers between +-(2^52+1 and 2^53-1) are affected since they have the + * rightmost bit set. */ + /* +-(2^52+1) */ + TEST_f_L (llround, 0x1.0000000000001p+52,4503599627370497LL); + TEST_f_L (llround, -0x1.0000000000001p+52,-4503599627370497LL); + /* +-(2^53-1): Input is the last (positive and negative) incrementally + * representable whole-number in the 'double' range that might round + * erroneously. */ + TEST_f_L (llround, 0x1.fffffffffffffp+52, 9007199254740991LL); + TEST_f_L (llround, -0x1.fffffffffffffp+52, -9007199254740991LL); +#else + /* nextafter(0.5,-1) */ + TEST_f_L (llround, 0x1.fffffep-2, 0); + /* nextafter(-0.5,1) */ + TEST_f_L (llround, -0x1.fffffep-2, 0); + /* As above, on PowerPC an exponent of '23' is the largest incrementally + * representable sequence of whole-numbers in the 'float' range. + * Likewise, numbers between +-(2^23+1 and 2^24-1) are affected. */ + TEST_f_L (llround, 0x1.000002p+23,8388609); + TEST_f_L (llround, -0x1.000002p+23,-8388609); + TEST_f_L (llround, 0x1.fffffep+23, 16777215); + TEST_f_L (llround, -0x1.fffffep+23, -16777215); #endif + #ifdef TEST_LDOUBLE /* The input can only be represented in long double. */ TEST_f_L (llround, 4503599627370495.5L, 4503599627370496LL); diff --git a/sysdeps/powerpc/powerpc32/fpu/s_lround.S b/sysdeps/powerpc/powerpc32/fpu/s_lround.S index 9c534ec2be..ebaccccd9b 100644 --- a/sysdeps/powerpc/powerpc32/fpu/s_lround.S +++ b/sysdeps/powerpc/powerpc32/fpu/s_lround.S @@ -1,5 +1,5 @@ /* lround function. PowerPC32 version. - Copyright (C) 2004, 2006 Free Software Foundation, Inc. + Copyright (C) 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 @@ -20,13 +20,10 @@ #include #include - .section .rodata.cst8,"aM",@progbits,8 + .section .rodata.cst4,"aM",@progbits,4 .align 2 -.LC0: /* 0.0 */ - .long 0x00000000 -.LC1: /* 0.5 */ +.LC0: /* 0.5 */ .long 0x3f000000 - .section ".text" /* long [r3] lround (float x [fp1]) @@ -37,7 +34,10 @@ tie, choose the one that is even (least significant bit o).". So we can't use the PowerPC "round to Nearest" mode. Instead we set "round toward Zero" mode and round by adding +-0.5 before rounding - to the integer value. */ + to the integer value. It is necessary to detect when x is + (+-)0x1.fffffffffffffp-2 because adding +-0.5 in this case will + cause an erroneous shift, carry and round. We simply return 0 if + 0.5 > x > -0.5. */ ENTRY (__lround) stwu r1,-16(r1) @@ -49,40 +49,40 @@ ENTRY (__lround) bcl 20,31,1f 1: mflr r9 addis r9,r9,.LC0-1b@ha - addi r9,r9,.LC0-1b@l + lfs fp10,.LC0-1b@l(r9) # else bl _GLOBAL_OFFSET_TABLE_@local-4 mflr r10 lwz r9,.LC0@got(10) + lfs fp10,0(r9) # endif mtlr r11 cfi_same_value (lr) - lfs fp12,0(r9) #else lis r9,.LC0@ha - lfs fp12,.LC0@l(r9) -#endif -#ifdef SHARED - lfs fp10,.LC1-.LC0(r9) -#else - lis r9,.LC1@ha - lfs fp10,.LC1@l(r9) + lfs fp10,.LC0@l(r9) #endif - fcmpu cr6,fp1,fp12 /* if (x > 0.0) */ - ble- cr6,.L4 - fadd fp1,fp1,fp10 /* x+= 0.5; */ -.L9: - fctiwz fp2,fp1 /* Convert To Integer DW lround toward 0. */ - stfd fp2,8(r1) + fabs fp2, fp1 /* Get the absolute value of x. */ + fsub fp12,fp10,fp10 /* Compute 0.0. */ + fcmpu cr6, fp2, fp10 /* if |x| < 0.5 */ + fcmpu cr3, fp1, fp12 /* x is negative? x < 0.0 */ + blt- cr6,.Lretzero + fadd fp3,fp2,fp10 /* |x|+=0.5 bias to prepare to round. */ + bge cr3,.Lconvert /* x is positive so don't negate x. */ + fnabs fp3,fp3 /* -(|x|+=0.5) */ +.Lconvert: + fctiwz fp4,fp3 /* Convert to Integer word lround toward 0. */ + stfd fp4,8(r1) nop /* Ensure the following load is in a different dispatch */ nop /* group to avoid pipe stall on POWER4&5. */ nop - lwz r3,12(r1) + lwz r3,12(r1) /* Load return as integer. */ +.Lout: addi r1,r1,16 blr -.L4: - fsub fp1,fp1,fp10 /* x-= 0.5; */ - b .L9 +.Lretzero: /* when 0.5 > x > -0.5 */ + li r3,0 /* return 0. */ + b .Lout END (__lround) weak_alias (__lround, lround) diff --git a/sysdeps/powerpc/powerpc32/fpu/s_lroundf.S b/sysdeps/powerpc/powerpc32/fpu/s_lroundf.S index e3c992d771..6289e0be58 100644 --- a/sysdeps/powerpc/powerpc32/fpu/s_lroundf.S +++ b/sysdeps/powerpc/powerpc32/fpu/s_lroundf.S @@ -1,2 +1 @@ /* __lroundf is in s_lround.S */ -/* __lroundf is in s_lround.S */ diff --git a/sysdeps/powerpc/powerpc32/power4/fpu/s_llround.S b/sysdeps/powerpc/powerpc32/power4/fpu/s_llround.S index 952d2aa6a5..4b1691efd3 100644 --- a/sysdeps/powerpc/powerpc32/power4/fpu/s_llround.S +++ b/sysdeps/powerpc/powerpc32/power4/fpu/s_llround.S @@ -1,5 +1,5 @@ /* llround function. PowerPC32 on PowerPC64 version. - Copyright (C) 2004, 2006 Free Software Foundation, Inc. + Copyright (C) 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 @@ -20,15 +20,15 @@ #include #include - .section .rodata.cst8,"aM",@progbits,8 - .align 2 -.LC0: /* 0.0 */ + .section .rodata.cst12,"aM",@progbits,12 + .align 3 + .LC0: /* 0x1.0000000000000p+52 == 2^52 */ + .long 0x43300000 .long 0x00000000 -.LC1: /* 0.5 */ - .long 0x3f000000 + .long 0x3f000000 /* Use this for 0.5 */ .section ".text" - + /* long [r3] lround (float x [fp1]) IEEE 1003.1 lround function. IEEE specifies "round to the nearest integer value, rounding halfway cases away from zero, regardless of @@ -37,7 +37,15 @@ tie, choose the one that is even (least significant bit o).". So we can't use the PowerPC "round to Nearest" mode. Instead we set "round toward Zero" mode and round by adding +-0.5 before rounding - to the integer value. */ + to the integer value. + + It is necessary to detect when x is (+-)0x1.fffffffffffffp-2 + because adding +-0.5 in this case will cause an erroneous shift, + carry and round. We simply return 0 if 0.5 > x > -0.5. Likewise + if x is and odd number between +-(2^52 and 2^53-1) a shift and + carry will erroneously round if biased with +-0.5. Therefore if x + is greater/less than +-2^52 we don't need to bias the number with + +-0.5. */ ENTRY (__llround) stwu r1,-16(r1) @@ -57,30 +65,41 @@ ENTRY (__llround) # endif mtlr r11 cfi_same_value (lr) - lfs fp12,0(r9) - lfs fp10,.LC1-.LC0(r9) + lfd fp9,0(r9) + lfs fp10,8(r9) #else - lis r9,.LC0@ha - lis r10,.LC1@ha - lfs fp12,.LC0@l(r9) - lfs fp10,.LC1@l(r10) + lis r9,.LC0@ha + lfd fp9,.LC0@l(r9) /* Load 2^52 into fpr9. */ + lfs fp10,.LC0@l+8(r9) /* Load 0.5 into fpr10. */ #endif - fcmpu cr6,fp1,fp12 /* if (x > 0.0) */ - ble- cr6,.L4 - fadd fp1,fp1,fp10 /* x+= 0.5; */ -.L9: - fctidz fp2,fp1 /* Convert To Integer DW round toward 0. */ - stfd fp2,8(r1) - nop /* Ensure the following load is in a different dispatch */ - nop /* group to avoid pipe stall on POWER4&5. */ + fabs fp2,fp1 /* Get the absolute value of x. */ + fsub fp12,fp10,fp10 /* Compute 0.0 into fpr12. */ + fcmpu cr6,fp2,fp10 /* if |x| < 0.5 */ + fcmpu cr4,fp2,fp9 /* if |x| >= 2^52 */ + fcmpu cr3,fp1,fp12 /* x is negative? x < 0.0 */ + blt- cr6,.Lretzero /* 0.5 > x < -0.5 so just return 0. */ + bge- cr4,.Lnobias /* 2^52 > x < -2^52 just convert with no bias. */ + fadd fp3,fp2,fp10 /* |x|+=0.5 bias to prepare to round. */ + bge cr3,.Lconvert /* x is positive so don't negate x. */ + fnabs fp3,fp3 /* -(|x|+=0.5) */ +.Lconvert: + fctidz fp4,fp3 /* Convert to Integer double word round toward 0. */ + stfd fp4,8(r1) + nop + nop nop - lwz r4,12(r1) + lwz r4,12(r1) /* Load return as integer. */ lwz r3,8(r1) +.Lout: addi r1,r1,16 blr -.L4: - fsub fp1,fp1,fp10 /* x-= 0.5; */ - b .L9 +.Lretzero: /* 0.5 > x > -0.5 */ + li r3,0 /* return 0. */ + li r4,0 + b .Lout +.Lnobias: + fmr fp3,fp1 + b .Lconvert END (__llround) weak_alias (__llround, llround) diff --git a/sysdeps/powerpc/powerpc32/power5+/fpu/s_llroundf.S b/sysdeps/powerpc/powerpc32/power5+/fpu/s_llroundf.S index ffe6b7eb37..030d2fdff8 100644 --- a/sysdeps/powerpc/powerpc32/power5+/fpu/s_llroundf.S +++ b/sysdeps/powerpc/powerpc32/power5+/fpu/s_llroundf.S @@ -1,2 +1 @@ /* __llroundf is in s_llround.S */ -/* __llroundf is in s_llround.S */ diff --git a/sysdeps/powerpc/powerpc32/power6/fpu/s_llroundf.S b/sysdeps/powerpc/powerpc32/power6/fpu/s_llroundf.S index ffe6b7eb37..030d2fdff8 100644 --- a/sysdeps/powerpc/powerpc32/power6/fpu/s_llroundf.S +++ b/sysdeps/powerpc/powerpc32/power6/fpu/s_llroundf.S @@ -1,2 +1 @@ /* __llroundf is in s_llround.S */ -/* __llroundf is in s_llround.S */ diff --git a/sysdeps/powerpc/powerpc64/dl-machine.h b/sysdeps/powerpc/powerpc64/dl-machine.h index c837393d79..b674dbef43 100644 --- a/sysdeps/powerpc/powerpc64/dl-machine.h +++ b/sysdeps/powerpc/powerpc64/dl-machine.h @@ -1,6 +1,6 @@ /* Machine-dependent ELF dynamic relocation inline functions. PowerPC64 version. - Copyright 1995-2005, 2006 Free Software Foundation, Inc. + Copyright 1995-2005, 2006, 2008 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 @@ -287,6 +287,8 @@ BODY_PREFIX "_dl_start_user:\n" \ #define GLINK_INITIAL_ENTRY_WORDS 8 #define PPC_DCBST(where) asm volatile ("dcbst 0,%0" : : "r"(where) : "memory") +#define PPC_DCBT(where) asm volatile ("dcbt 0,%0" : : "r"(where) : "memory") +#define PPC_DCBF(where) asm volatile ("dcbf 0,%0" : : "r"(where) : "memory") #define PPC_SYNC asm volatile ("sync" : : : "memory") #define PPC_ISYNC asm volatile ("sync; isync" : : : "memory") #define PPC_ICBI(where) asm volatile ("icbi 0,%0" : : "r"(where) : "memory") @@ -408,6 +410,11 @@ elf_machine_fixup_plt (struct link_map *map, lookup_t sym_map, Elf64_FuncDesc *rel = (Elf64_FuncDesc *) finaladdr; Elf64_Addr offset = 0; + PPC_DCBT (&plt->fd_aux); + PPC_DCBT (&plt->fd_func); + PPC_DCBT (&rel->fd_aux); + PPC_DCBT (&rel->fd_func); + /* If sym_map is NULL, it's a weak undefined sym; Leave the plt zero. */ if (sym_map == NULL) return 0; @@ -430,13 +437,12 @@ elf_machine_fixup_plt (struct link_map *map, lookup_t sym_map, plt->fd_aux = rel->fd_aux + offset; plt->fd_toc = rel->fd_toc + offset; - PPC_DCBST (&plt->fd_aux); - PPC_DCBST (&plt->fd_toc); - PPC_SYNC; + PPC_DCBF (&plt->fd_toc); + PPC_ISYNC; plt->fd_func = rel->fd_func + offset; PPC_DCBST (&plt->fd_func); - PPC_SYNC; + PPC_ISYNC; return finaladdr; } diff --git a/sysdeps/powerpc/powerpc64/fpu/s_llround.S b/sysdeps/powerpc/powerpc64/fpu/s_llround.S index d023b8f2c0..4134847536 100644 --- a/sysdeps/powerpc/powerpc64/fpu/s_llround.S +++ b/sysdeps/powerpc/powerpc64/fpu/s_llround.S @@ -1,5 +1,5 @@ /* llround function. PowerPC64 version. - Copyright (C) 2004, 2006 Free Software Foundation, Inc. + Copyright (C) 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 @@ -21,13 +21,13 @@ #include .section ".toc","aw" -.LC0: /* -0.0 */ - .tc FD_00000000_0[TC],0x0000000000000000 +.LC0: /* 2^52 */ + .tc FD_43300000_0[TC],0x4330000000000000 .LC1: /* 0.5 */ .tc FD_3fe00000_0[TC],0x3fe0000000000000 .section ".text" -/* long long [r3] llround (float x [fp1]) +/* long long [r3] llround (double x [fp1]) IEEE 1003.1 llround function. IEEE specifies "round to the nearest integer value, rounding halfway cases away from zero, regardless of the current rounding mode." However PowerPC Architecture defines @@ -35,26 +35,45 @@ tie, choose the one that is even (least significant bit o).". So we can't use the PowerPC "round to Nearest" mode. Instead we set "round toward Zero" mode and round by adding +-0.5 before rounding - to the integer value. */ + to the integer value. + + It is necessary to detect when x is (+-)0x1.fffffffffffffp-2 + because adding +-0.5 in this case will cause an erroneous shift, + carry and round. We simply return 0 if 0.5 > x > -0.5. Likewise + if x is and odd number between +-(2^52 and 2^53-1) a shift and + carry will erroneously round if biased with +-0.5. Therefore if x + is greater/less than +-2^52 we don't need to bias the number with + +-0.5. */ ENTRY (__llround) CALL_MCOUNT 0 - lfd fp12,.LC0@toc(2) - lfd fp10,.LC1@toc(2) - fcmpu cr6,fp1,fp12 /* if (x > 0.0) */ - ble- cr6,.L4 - fadd fp1,fp1,fp10 /* x+= 0.5; */ -.L9: - fctidz fp2,fp1 /* Convert To Integer DW llround toward 0. */ - stfd fp2,-16(r1) - nop /* Insure the following load is in a different dispatch group */ - nop /* to avoid pipe stall on POWER4&5. */ + lfd fp9,.LC0@toc(2) /* Load 2^52 into fpr9. */ + lfd fp10,.LC1@toc(2)/* Load 0.5 into fpr10. */ + fabs fp2,fp1 /* Get the absolute value of x. */ + fsub fp12,fp10,fp10 /* Compute 0.0 into fp12. */ + fcmpu cr6,fp2,fp10 /* if |x| < 0.5 */ + fcmpu cr4,fp2,fp9 /* if |x| >= 2^52 */ + fcmpu cr3,fp1,fp12 /* x is negative? x < 0.0 */ + blt- cr6,.Lretzero /* 0.5 > x < -0.5 so just return 0. */ + bge- cr4,.Lnobias /* 2^52 > x < -2^52 just convert with no bias. */ + fadd fp3,fp2,fp10 /* |x|+=0.5 bias to prepare to round. */ + bge cr3,.Lconvert /* x is positive so don't negate x. */ + fnabs fp3,fp3 /* -(|x|+=0.5) */ +.Lconvert: + fctidz fp4,fp3 /* Convert to Integer double word round toward 0. */ + stfd fp4,-16(r1) + nop + nop nop - ld r3,-16(r1) + ld r3,-16(r1) /* Load return as integer. */ +.Lout: blr -.L4: - fsub fp1,fp1,fp10 /* x-= 0.5; */ - b .L9 +.Lretzero: /* 0.5 > x > -0.5 */ + li r3,0 /* return 0. */ + b .Lout +.Lnobias: + fmr fp3,fp1 + b .Lconvert END (__llround) strong_alias (__llround, __lround) diff --git a/sysdeps/powerpc/powerpc64/fpu/s_llroundf.S b/sysdeps/powerpc/powerpc64/fpu/s_llroundf.S index bbbd05492e..a211879393 100644 --- a/sysdeps/powerpc/powerpc64/fpu/s_llroundf.S +++ b/sysdeps/powerpc/powerpc64/fpu/s_llroundf.S @@ -1,5 +1,5 @@ /* llroundf function. PowerPC64 version. - Copyright (C) 2004, 2006 Free Software Foundation, Inc. + Copyright (C) 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 @@ -20,8 +20,8 @@ #include .section ".toc","aw" -.LC0: /* -0.0 */ - .tc FD_00000000_0[TC],0x0000000000000000 +.LC0: /* 2^23 */ + .tc FD_41600000_0[TC],0x4160000000000000 .LC1: /* 0.5 */ .tc FD_3fe00000_0[TC],0x3fe0000000000000 .section ".text" @@ -34,24 +34,45 @@ tie, choose the one that is even (least significant bit o).". So we can't use the PowerPC "round to Nearest" mode. Instead we set "round toward Zero" mode and round by adding +-0.5 before rounding - to the integer value. */ + to the integer value. + + It is necessary to detect when x is (+-)0x1.fffffffffffffp-2 + because adding +-0.5 in this case will cause an erroneous shift, + carry and round. We simply return 0 if 0.5 > x > -0.5. Likewise + if x is and odd number between +-(2^23 and 2^24-1) a shift and + carry will erroneously round if biased with +-0.5. Therefore if x + is greater/less than +-2^23 we don't need to bias the number with + +-0.5. */ ENTRY (__llroundf) CALL_MCOUNT 0 - lfd fp12,.LC0@toc(2) - lfd fp10,.LC1@toc(2) - fcmpu cr6,fp1,fp12 /* if (x < 0.0) */ - fsubs fp3,fp1,fp10 /* x-= 0.5; */ - ble- cr6,.L9 - fadds fp3,fp1,fp10 /* x+= 0.5; */ -.L9: - fctidz fp2,fp3 /* Convert To Integer DW round toward 0. */ - stfd fp2,-16(r1) - nop /* Insure the following load is in a different dispatch group */ - nop /* to avoid pipe stall on POWER4&5. */ + lfd fp9,.LC0@toc(2) /* Load 2^23 into fpr9. */ + lfd fp10,.LC1@toc(2)/* Load 0.5 into fpr10. */ + fabs fp2,fp1 /* Get the absolute value of x. */ + fsub fp12,fp10,fp10 /* Compute 0.0 into fp12. */ + fcmpu cr6,fp2,fp10 /* if |x| < 0.5 */ + fcmpu cr4,fp2,fp9 /* if |x| >= 2^23 */ + fcmpu cr3,fp1,fp12 /* x is negative? x < 0.0 */ + blt- cr6,.Lretzero /* 0.5 > x < -0.5 so just return 0. */ + bge- cr4,.Lnobias /* 2^23 > x < -2^23 just convert with no bias. */ + fadd fp3,fp2,fp10 /* |x|+=0.5 bias to prepare to round. */ + bge cr3,.Lconvert /* x is positive so don't negate x. */ + fnabs fp3,fp3 /* -(|x|+=0.5) */ +.Lconvert: + fctidz fp4,fp3 /* Convert to Integer double word round toward 0. */ + stfd fp4,-16(r1) + nop + nop nop - ld r3,-16(r1) + ld r3,-16(r1) /* Load return as integer. */ +.Lout: blr +.Lretzero: /* 0.5 > x > -0.5 */ + li r3,0 /* return 0. */ + b .Lout +.Lnobias: + fmr fp3,fp1 + b .Lconvert END (__llroundf) strong_alias (__llroundf, __lroundf) diff --git a/sysdeps/powerpc/powerpc64/fpu/s_lrint.S b/sysdeps/powerpc/powerpc64/fpu/s_lrint.S index fe774693b7..d3c2fff581 100644 --- a/sysdeps/powerpc/powerpc64/fpu/s_lrint.S +++ b/sysdeps/powerpc/powerpc64/fpu/s_lrint.S @@ -1,2 +1 @@ /* __lrint is in s_llrint.c */ -/* __lrint is in s_llrint.c */ diff --git a/sysdeps/powerpc/powerpc64/fpu/s_lround.S b/sysdeps/powerpc/powerpc64/fpu/s_lround.S index 883bba1c5d..4306c405c4 100644 --- a/sysdeps/powerpc/powerpc64/fpu/s_lround.S +++ b/sysdeps/powerpc/powerpc64/fpu/s_lround.S @@ -1,2 +1 @@ /* __lround is in s_llround.S */ -/* __lround is in s_llround.S */ diff --git a/sysdeps/powerpc/powerpc64/fpu/s_lroundf.S b/sysdeps/powerpc/powerpc64/fpu/s_lroundf.S index 15506f6801..6b2a4e37a6 100644 --- a/sysdeps/powerpc/powerpc64/fpu/s_lroundf.S +++ b/sysdeps/powerpc/powerpc64/fpu/s_lroundf.S @@ -1,2 +1 @@ /* __lroundf is in s_llroundf.S */ -/* __lroundf is in s_llroundf.S */ diff --git a/time/alt_digit.c b/time/alt_digit.c index 1a81ba1254..95e4f07c73 100644 --- a/time/alt_digit.c +++ b/time/alt_digit.c @@ -1,5 +1,5 @@ /* Helper functions used by strftime/strptime to handle alternate digits. - Copyright (C) 1995-2001,02 Free Software Foundation, Inc. + Copyright (C) 1995-2002, 2008 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 @@ -24,7 +24,7 @@ #include /* Some of the functions here must not be used while setlocale is called. */ -__libc_lock_define (extern, __libc_setlocale_lock attribute_hidden) +__libc_rwlock_define (extern, __libc_setlocale_lock attribute_hidden) #define CURRENT(item) (current->values[_NL_ITEM_INDEX (item)].string) #define CURRENT_WSTR(item) \ @@ -77,7 +77,7 @@ _nl_get_alt_digit (unsigned int number, struct locale_data *current) if (number >= 100 || CURRENT (ALT_DIGITS)[0] == '\0') return NULL; - __libc_lock_lock (__libc_setlocale_lock); + __libc_rwlock_wrlock (__libc_setlocale_lock); if (current->private.time == NULL || ! current->private.time->alt_digits_initialized) @@ -88,7 +88,7 @@ _nl_get_alt_digit (unsigned int number, struct locale_data *current) ? current->private.time->alt_digits[number] : NULL); - __libc_lock_unlock (__libc_setlocale_lock); + __libc_rwlock_unlock (__libc_setlocale_lock); return result; } @@ -104,7 +104,7 @@ _nl_get_walt_digit (unsigned int number, struct locale_data *current) if (number >= 100 || CURRENT_WSTR (_NL_WALT_DIGITS)[0] == L'\0') return NULL; - __libc_lock_lock (__libc_setlocale_lock); + __libc_rwlock_wrlock (__libc_setlocale_lock); if (current->private.time == NULL) { @@ -141,7 +141,7 @@ _nl_get_walt_digit (unsigned int number, struct locale_data *current) result = data->walt_digits[number]; out: - __libc_lock_unlock (__libc_setlocale_lock); + __libc_rwlock_unlock (__libc_setlocale_lock); return (wchar_t *) result; } @@ -159,7 +159,7 @@ _nl_parse_alt_digit (const char **strp, struct locale_data *current) if (CURRENT_WSTR (_NL_WALT_DIGITS)[0] == L'\0') return result; - __libc_lock_lock (__libc_setlocale_lock); + __libc_rwlock_wrlock (__libc_setlocale_lock); if (current->private.time == NULL || ! current->private.time->alt_digits_initialized) @@ -184,7 +184,7 @@ _nl_parse_alt_digit (const char **strp, struct locale_data *current) } } - __libc_lock_unlock (__libc_setlocale_lock); + __libc_rwlock_unlock (__libc_setlocale_lock); if (result != -1) *strp += maxlen; diff --git a/time/era.c b/time/era.c index a8d2237338..a6f4a4cb07 100644 --- a/time/era.c +++ b/time/era.c @@ -1,5 +1,5 @@ /* Helper functions used by strftime/strptime to handle locale-specific "eras". - Copyright (C) 1995-2001,02 Free Software Foundation, Inc. + Copyright (C) 1995-2002, 2008 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 @@ -24,7 +24,7 @@ #include /* Some of the functions here must not be used while setlocale is called. */ -__libc_lock_define (extern, __libc_setlocale_lock attribute_hidden) +__libc_rwlock_define (extern, __libc_setlocale_lock attribute_hidden) #define CURRENT(item) (current->values[_NL_ITEM_INDEX (item)].string) #define CURRENT_WORD(item) (current->values[_NL_ITEM_INDEX (item)].word) @@ -45,7 +45,7 @@ _nl_init_era_entries (struct locale_data *current) if (CURRENT_WORD (_NL_TIME_ERA_NUM_ENTRIES) == 0) return; - __libc_lock_lock (__libc_setlocale_lock); + __libc_rwlock_wrlock (__libc_setlocale_lock); if (current->private.time == NULL) { @@ -135,7 +135,7 @@ _nl_init_era_entries (struct locale_data *current) } out: - __libc_lock_unlock (__libc_setlocale_lock); + __libc_rwlock_unlock (__libc_setlocale_lock); } struct era_entry * diff --git a/timezone/asia b/timezone/asia index 3007414a7f..70f1515321 100644 --- a/timezone/asia +++ b/timezone/asia @@ -1,4 +1,4 @@ -# @(#)asia 8.12 +# @(#)asia 8.18 #
 
 # This data is by no means authoritative; if you think you know better,
@@ -446,13 +446,13 @@ Zone	Asia/Dili	8:22:20 -	LMT	1912
 
 # India
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
-Zone	Asia/Calcutta	5:53:28 -	LMT	1880	# Kolkata
+Zone	Asia/Kolkata	5:53:28 -	LMT	1880	# Kolkata
 			5:53:20	-	HMT	1941 Oct    # Howrah Mean Time?
 			6:30	-	BURT	1942 May 15 # Burma Time
 			5:30	-	IST	1942 Sep
 			5:30	1:00	IST	1945 Oct 15
 			5:30	-	IST
-# The following are like Asia/Calcutta:
+# The following are like Asia/Kolkata:
 #	Andaman Is
 #	Lakshadweep (Laccadive, Minicoy and Amindivi Is)
 #	Nicobar Is
@@ -577,6 +577,15 @@ Zone Asia/Jayapura	9:22:48 -	LMT	1932 Nov
 # daylight saving time ...
 # http://uk.reuters.com/article/oilRpt/idUKBLA65048420070916
 #
+# From Roozbeh Pournader (2007-11-05):
+# This is quoted from Official Gazette of the Islamic Republic of
+# Iran, Volume 63, Number 18242, dated Tuesday 1386/6/24
+# [2007-10-16]. I am doing the best translation I can:...
+# The official time of the country will be moved forward for one hour
+# on the 24 hours of the first day of the month of Farvardin and will
+# be changed back to its previous state on the 24 hours of the
+# thirtieth day of Shahrivar.
+#
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Iran	1978	1980	-	Mar	21	0:00	1:00	D
 Rule	Iran	1978	only	-	Oct	21	0:00	0	S
@@ -651,6 +660,21 @@ Zone	Asia/Tehran	3:25:44	-	LMT	1916
 #
 # So we'll ignore the Economist's claim.
 
+# From Steffen Thorsen (2008-03-10):
+# The cabinet in Iraq abolished DST last week, according to the following
+# news sources (in Arabic):
+# 
+# http://www.aljeeran.net/wesima_articles/news-20080305-98602.html
+# 
+# 
+# http://www.aswataliraq.info/look/article.tpl?id=2047&IdLanguage=17&IdPublication=4&NrArticle=71743&NrIssue=1&NrSection=10
+# 
+#
+# We have published a short article in English about the change:
+# 
+# http://www.timeanddate.com/news/time/iraq-dumps-daylight-saving.html
+# 
+
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Iraq	1982	only	-	May	1	0:00	1:00	D
 Rule	Iraq	1982	1984	-	Oct	1	0:00	0	S
@@ -661,8 +685,8 @@ Rule	Iraq	1986	1990	-	Mar	lastSun	1:00s	1:00	D
 # IATA SSIM (1991/1996) says Apr 1 12:01am UTC; guess the `:01' is a typo.
 # Shanks & Pottenger say Iraq did not observe DST 1992/1997; ignore this.
 #
-Rule	Iraq	1991	max	-	Apr	 1	3:00s	1:00	D
-Rule	Iraq	1991	max	-	Oct	 1	3:00s	0	S
+Rule	Iraq	1991	2007	-	Apr	 1	3:00s	1:00	D
+Rule	Iraq	1991	2007	-	Oct	 1	3:00s	0	S
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Asia/Baghdad	2:57:40	-	LMT	1890
 			2:57:36	-	BMT	1918	    # Baghdad Mean Time?
@@ -1678,7 +1702,7 @@ Zone	Asia/Singapore	6:55:25 -	LMT	1901 Jan  1
 # kept their clocks set five and a half hours ahead of Greenwich Mean
 # Time (GMT), in line with neighbor India.
 # From Paul Eggert (2006-04-18):
-# People who live in regions under Tamil control can use TZ='Asia/Calcutta',
+# People who live in regions under Tamil control can use [TZ='Asia/Kolkata'],
 # as that zone has agreed with the Tamil areas since our cutoff date of 1970.
 
 # From K Sethu (2006-04-25):
@@ -1768,10 +1792,62 @@ Rule	Syria	2006	only	-	Sep	22	0:00	0	-
 # From Paul Eggert (2007-03-29):
 # Today the AP reported "Syria will switch to summertime at midnight Thursday."
 # http://www.iht.com/articles/ap/2007/03/29/africa/ME-GEN-Syria-Time-Change.php
-# For lack of better info, assume the rule changed to "last Friday in March"
-# this year.
-Rule	Syria	2007	max	-	Mar	lastFri	0:00	1:00	S
-Rule	Syria	2007	max	-	Oct	 1	0:00	0	-
+Rule	Syria	2007	only	-	Mar	lastFri	0:00	1:00	S
+# From Jesper Norgard (2007-10-27):
+# The sister center ICARDA of my work CIMMYT is confirming that Syria DST will
+# not take place 1.st November at 0:00 o'clock but 1.st November at 24:00 or
+# rather Midnight between Thursday and Friday. This does make more sence than
+# having it between Wednesday and Thursday (two workdays in Syria) since the
+# weekend in Syria is not Saturday and Sunday, but Friday and Saturday. So now
+# it is implemented at midnight of the last workday before weekend...
+# 
+# From Steffen Thorsen (2007-10-27):
+# Jesper Norgaard Welen wrote:
+# 
+# > "Winter local time in Syria will be observed at midnight of Thursday 1
+# > November 2007, and the clock will be put back 1 hour."
+# 
+# I found confirmation on this in this gov.sy-article (Arabic):
+# http://wehda.alwehda.gov.sy/_print_veiw.asp?FileName=12521710520070926111247
+# 
+# which using Google's translate tools says:
+# Council of Ministers also approved the commencement of work on 
+# identifying the winter time as of Friday, 2/11/2007 where the 60th 
+# minute delay at midnight Thursday 1/11/2007.
+Rule	Syria	2007	only	-	Nov	 Fri>=1	0:00	0	-
+
+# From Stephen Colebourne (2008-03-17):
+# For everyone's info, I saw an IATA time zone change for [Syria] for
+# this month (March 2008) in the last day or so...This is the data IATA
+# are now using:
+# Country     Time Standard   --- DST Start ---   --- DST End ---  DST
+# Name        Zone Variation   Time    Date        Time    Date
+# Variation
+# Syrian Arab
+# Republic    SY    +0200      2200  03APR08       2100  30SEP08   +0300
+#                              2200  02APR09       2100  30SEP09   +0300
+#                              2200  01APR10       2100  30SEP10   +0300
+
+# From Arthur David Olson (2008-03-17):
+# Here's a link to English-language coverage by the Syrian Arab News
+# Agency (SANA)...
+# 
+# http://www.sana.sy/eng/21/2008/03/11/165173.htm
+# ...which reads (in part) "The Cabinet approved the suggestion of the
+# Ministry of Electricity to begin daylight savings time on Friday April
+# 4th, advancing clocks one hour ahead on midnight of Thursday April 3rd."
+# Since Syria is two hours east of UTC, the 2200 and 2100 transition times
+# shown above match up with midnight in Syria.
+
+# From Arthur David Olson (2008-03-18):
+# My buest guess at a Syrian rule is "the Friday nearest April 1";
+# coding that involves either using a "Mar Fri>=29" construct that old time zone
+# compilers can't handle  or having multiple Rules (a la Israel).
+# For now, use "Apr Fri>=1", and go with IATA on a uniform Sep 30 end.
+
+Rule	Syria	2008	max	-	Apr	Fri>=1	0:00	1:00	S
+Rule	Syria	2008	max	-	Oct	1	0:00	0	-
+
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Asia/Damascus	2:25:12 -	LMT	1920	# Dimashq
 			2:00	Syria	EE%sT
@@ -1825,13 +1901,13 @@ Zone	Asia/Tashkent	4:37:12 -	LMT	1924 May  2
 
 # Vietnam
 
-# From Paul Eggert (1993-11-18):
-# Saigon's official name is Thanh-Pho Ho Chi Minh, but it's too long.
-# We'll stick with the traditional name for now.
+# From Arthur David Olson (2008-03-18):
+# The English-language name of Vietnam's most populous city is "Ho Chi Min City";
+# we use Ho_Chi_Minh below to avoid a name of more than 14 characters.
 
 # From Shanks & Pottenger:
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
-Zone	Asia/Saigon	7:06:40 -	LMT	1906 Jun  9
+Zone	Asia/Ho_Chi_Minh	7:06:40 -	LMT	1906 Jun  9
 			7:06:20	-	SMT	1911 Mar 11 0:01 # Saigon MT?
 			7:00	-	ICT	1912 May
 			8:00	-	ICT	1931 May
diff --git a/timezone/backward b/timezone/backward
index 7c922604e2..a65991c2dd 100644
--- a/timezone/backward
+++ b/timezone/backward
@@ -1,4 +1,4 @@
-# @(#)backward	8.3
+# @(#)backward	8.6
 
 # This file provides links between current names for time zones
 # and their old names.  Many names changed in late 1993.
@@ -24,12 +24,15 @@ Link	America/St_Thomas	America/Virgin
 Link	Asia/Ashgabat		Asia/Ashkhabad
 Link	Asia/Chongqing		Asia/Chungking
 Link	Asia/Dhaka		Asia/Dacca
+Link	Asia/Kolkata		Asia/Calcutta
 Link	Asia/Macau		Asia/Macao
 Link	Asia/Jerusalem		Asia/Tel_Aviv
+Link	Asia/Ho_Chi_Minh	Asia/Saigon
 Link	Asia/Thimphu		Asia/Thimbu
 Link	Asia/Makassar		Asia/Ujung_Pandang
 Link	Asia/Ulaanbaatar	Asia/Ulan_Bator
 Link	Atlantic/Faroe		Atlantic/Faeroe
+Link	Europe/Oslo		Atlantic/Jan_Mayen
 Link	Australia/Sydney	Australia/ACT
 Link	Australia/Sydney	Australia/Canberra
 Link	Australia/Lord_Howe	Australia/LHI
diff --git a/timezone/europe b/timezone/europe
index 60290ddc5a..73eed00fc2 100644
--- a/timezone/europe
+++ b/timezone/europe
@@ -1,4 +1,4 @@
-# @(#)europe	8.11
+# @(#)europe	8.12
 # 
 
 # This data is by no means authoritative; if you think you know better,
@@ -1714,7 +1714,6 @@ Zone	Europe/Oslo	0:43:00 -	LMT	1895 Jan  1
 # come up with more definitive info about the timekeeping during the
 # war years it's probably best just do do the following for now:
 Link	Europe/Oslo	Arctic/Longyearbyen
-Link	Europe/Oslo	Atlantic/Jan_Mayen
 
 # Poland
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
diff --git a/timezone/iso3166.tab b/timezone/iso3166.tab
index 0e985e95b4..8d62399580 100644
--- a/timezone/iso3166.tab
+++ b/timezone/iso3166.tab
@@ -1,12 +1,12 @@
 # ISO 3166 alpha-2 country codes
 #
-# @(#)iso3166.tab	8.4
+# @(#)iso3166.tab	8.5
 #
 # From Paul Eggert (2006-09-27):
 #
 # This file contains a table with the following columns:
 # 1.  ISO 3166-1 alpha-2 country code, current as of
-#     ISO 3166-1 Newsletter No. V-12 (2006-09-26).  See:
+#     ISO 3166-1 Newsletter VI-1 (2007-09-21).  See:
 #     
 #     ISO 3166 Maintenance agency (ISO 3166/MA)
 #     .
@@ -47,6 +47,7 @@ BG	Bulgaria
 BH	Bahrain
 BI	Burundi
 BJ	Benin
+BL	St Barthelemy
 BM	Bermuda
 BN	Brunei
 BO	Bolivia
@@ -159,6 +160,7 @@ MA	Morocco
 MC	Monaco
 MD	Moldova
 ME	Montenegro
+MF	St Martin (French part)
 MG	Madagascar
 MH	Marshall Islands
 MK	Macedonia
diff --git a/timezone/leapseconds b/timezone/leapseconds
index 583451e49e..35df858d79 100644
--- a/timezone/leapseconds
+++ b/timezone/leapseconds
@@ -1,4 +1,4 @@
-# @(#)leapseconds	8.4
+# @(#)leapseconds	8.5
 
 # Allowance for leapseconds added to each timezone file.
 
@@ -46,26 +46,27 @@ Leap	1998	Dec	31	23:59:60	+	S
 Leap	2005	Dec	31	23:59:60	+	S
 
 # INTERNATIONAL EARTH ROTATION AND REFERENCE SYSTEMS SERVICE (IERS)
+#
 # SERVICE INTERNATIONAL DE LA ROTATION TERRESTRE ET DES SYSTEMES DE REFERENCE
 #
 # SERVICE DE LA ROTATION TERRESTRE
-# OBSERVATOIRE DE PARIS
+# OBSERVATOIRE DE PARIS				
 # 61, Av. de l'Observatoire 75014 PARIS (France)
 # Tel.      : 33 (0) 1 40 51 22 26
 # FAX       : 33 (0) 1 40 51 22 91
 # Internet  : services.iers@obspm.fr
 #
-# Paris, 28 June 2007
+# Paris, 18 January 2008
 #
-# Bulletin C 34
+# Bulletin C 35
 #
-# To authorities responsible
+# To authorities responsible		
 # for the measurement and
-# distribution of time
+# distribution of time	
 #
 # INFORMATION ON UTC - TAI
 #
-# NO positive leap second will be introduced at the end of December 2007.
+# NO positive leap second will be introduced at the end of June 2008.
 # The difference between Coordinated Universal Time UTC and the
 # International Atomic Time TAI is :		
 #
@@ -77,6 +78,6 @@ Leap	2005	Dec	31	23:59:60	+	S
 # will be no time step at the next possible date.
 #
 # Daniel GAMBIS
-# Director			
-# Earth Orientation Center of IERS
+# Head			
+# Earth Orientation Center of the IERS
 # Observatoire de Paris, France
diff --git a/timezone/northamerica b/timezone/northamerica
index 73e13a5200..60e5d51e00 100644
--- a/timezone/northamerica
+++ b/timezone/northamerica
@@ -1,4 +1,4 @@
-# @(#)northamerica	8.18
+# @(#)northamerica	8.23
 # 
 
 # also includes Central America and the Caribbean
@@ -2187,6 +2187,69 @@ Zone America/Costa_Rica	-5:36:20 -	LMT	1890		# San Jose
 # says Cuban clocks will advance at midnight on March 10.
 # For lack of better information, assume Cuba will use US rules,
 # except that it switches at midnight standard time as usual.
+#
+# From Steffen Thorsen (2007-10-25):
+# Carlos Alberto Fonseca Arauz informed me that Cuba will end DST one week 
+# earlier - on the last Sunday of October, just like in 2006.
+# 
+# He supplied these references:
+# 
+# http://www.prensalatina.com.mx/article.asp?ID=%7B4CC32C1B-A9F7-42FB-8A07-8631AFC923AF%7D&language=ES
+# http://actualidad.terra.es/sociedad/articulo/cuba_llama_ahorrar_energia_cambio_1957044.htm
+# 
+# From Alex Kryvenishev (2007-10-25):
+# Here is also article from Granma (Cuba):
+# 
+# [Regira] el Horario Normal desde el [proximo] domingo 28 de octubre
+# http://www.granma.cubaweb.cu/2007/10/24/nacional/artic07.html
+# 
+# http://www.worldtimezone.com/dst_news/dst_news_cuba03.html
+
+# From Arthur David Olson (2008-03-09):
+# I'm in Maryland which is now observing United States Eastern Daylight
+# Time. At 9:44 local time I used RealPlayer to listen to
+# 
+# http://media.enet.cu/radioreloj
+# , a Cuban information station, and heard
+# the time announced as "ocho cuarenta y cuatro" ("eight forty-four"),
+# indicating that Cuba is still on standard time.
+
+# From Steffen Thorsen (2008-03-12):
+# It seems that Cuba will start DST on Sunday, 2007-03-16...
+# It was announced yesterday, according to this source (in Spanish):
+# 
+# http://www.nnc.cubaweb.cu/marzo-2008/cien-1-11-3-08.htm
+# 
+#
+# Some more background information is posted here:
+# 
+# http://www.timeanddate.com/news/time/cuba-starts-dst-march-16.html
+# 
+#
+# The article also says that Cuba has been observing DST since 1963,
+# while Shanks (and tzdata) has 1965 as the first date (except in the
+# 1940's). Many other web pages in Cuba also claim that it has been
+# observed since 1963, but with the exception of 1970 - an exception
+# which is not present in tzdata/Shanks. So there is a chance we need to
+# change some historic records as well.
+#
+# One example:
+# 
+# http://www.radiohc.cu/espanol/noticias/mar07/11mar/hor.htm
+# 
+
+# From Jesper Norgaard Welen (2008-03-13):
+# The Cuban time change has just been confirmed on the most authoritative
+# web site, the Granma.  Please check out
+# 
+# http://www.granma.cubaweb.cu/2008/03/13/nacional/artic10.html
+# 
+#
+# Basically as expected after Steffen Thorsens information, the change
+# will take place midnight between Saturday and Sunday.
+
+# From Arthur David Olson (2008-03-12):
+# Assume Sun>=15 (third Sunday) going forward.
 
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Cuba	1928	only	-	Jun	10	0:00	1:00	D
@@ -2218,9 +2281,9 @@ Rule	Cuba	1997	only	-	Oct	12	0:00s	0	S
 Rule	Cuba	1998	1999	-	Mar	lastSun	0:00s	1:00	D
 Rule	Cuba	1998	2003	-	Oct	lastSun	0:00s	0	S
 Rule	Cuba	2000	2006	-	Apr	Sun>=1	0:00s	1:00	D
-Rule	Cuba	2006	only	-	Oct	lastSun	0:00s	0	S
-Rule	Cuba	2007	max	-	Mar	Sun>=8	0:00s	1:00	D
-Rule	Cuba	2007	max	-	Nov	Sun>=1	0:00s	0	S
+Rule	Cuba	2006	max	-	Oct	lastSun	0:00s	0	S
+Rule	Cuba	2007	only	-	Mar	Sun>=8	0:00s	1:00	D
+Rule	Cuba	2008	max	-	Mar	Sun>=15	0:00s	1:00	D
 
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	America/Havana	-5:29:28 -	LMT	1890
@@ -2287,6 +2350,10 @@ Zone	America/Grenada	-4:07:00 -	LMT	1911 Jul	# St George's
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone America/Guadeloupe	-4:06:08 -	LMT	1911 Jun 8	# Pointe a Pitre
 			-4:00	-	AST
+# St Barthelemy
+Link America/Guadeloupe	America/St_Barthelemy
+# St Martin (French part)
+Link America/Guadeloupe	America/Marigot
 
 # Guatemala
 #
diff --git a/timezone/private.h b/timezone/private.h
index d64c724ef6..008d468ac7 100644
--- a/timezone/private.h
+++ b/timezone/private.h
@@ -21,7 +21,7 @@
 
 #ifndef lint
 #ifndef NOID
-static char	privatehid[] = "@(#)private.h	8.3";
+static char	privatehid[] = "@(#)private.h	8.6";
 #endif /* !defined NOID */
 #endif /* !defined lint */
 
@@ -48,10 +48,6 @@ static char	privatehid[] = "@(#)private.h	8.3";
 #define HAVE_SETTIMEOFDAY	3
 #endif /* !defined HAVE_SETTIMEOFDAY */
 
-#ifndef HAVE_STRERROR
-#define HAVE_STRERROR		1
-#endif /* !defined HAVE_STRERROR */
-
 #ifndef HAVE_SYMLINK
 #define HAVE_SYMLINK		1
 #endif /* !defined HAVE_SYMLINK */
@@ -109,17 +105,15 @@ static char	privatehid[] = "@(#)private.h	8.3";
 #endif /* !defined WEXITSTATUS */
 
 #if HAVE_UNISTD_H
-#include "unistd.h"	/* for F_OK and R_OK */
+#include "unistd.h"	/* for F_OK, R_OK, and other POSIX goodness */
 #endif /* HAVE_UNISTD_H */
 
-#if !HAVE_UNISTD_H
 #ifndef F_OK
 #define F_OK	0
 #endif /* !defined F_OK */
 #ifndef R_OK
 #define R_OK	4
 #endif /* !defined R_OK */
-#endif /* !HAVE_UNISTD_H */
 
 /* Unlike 's isdigit, this also works if c < 0 | c > UCHAR_MAX. */
 #define is_digit(c) ((unsigned)(c) - '0' <= 9)
@@ -164,70 +158,6 @@ typedef long		int_fast64_t;
 ** Workarounds for compilers/systems.
 */
 
-/*
-** If your compiler lacks prototypes, "#define P(x) ()".
-*/
-
-#ifndef P
-#define P(x)	x
-#endif /* !defined P */
-
-/*
-** SunOS 4.1.1 headers lack EXIT_SUCCESS.
-*/
-
-#ifndef EXIT_SUCCESS
-#define EXIT_SUCCESS	0
-#endif /* !defined EXIT_SUCCESS */
-
-/*
-** SunOS 4.1.1 headers lack EXIT_FAILURE.
-*/
-
-#ifndef EXIT_FAILURE
-#define EXIT_FAILURE	1
-#endif /* !defined EXIT_FAILURE */
-
-/*
-** SunOS 4.1.1 headers lack FILENAME_MAX.
-*/
-
-#ifndef FILENAME_MAX
-
-#ifndef MAXPATHLEN
-#ifdef unix
-#include "sys/param.h"
-#endif /* defined unix */
-#endif /* !defined MAXPATHLEN */
-
-#ifdef MAXPATHLEN
-#define FILENAME_MAX	MAXPATHLEN
-#endif /* defined MAXPATHLEN */
-#ifndef MAXPATHLEN
-#define FILENAME_MAX	1024		/* Pure guesswork */
-#endif /* !defined MAXPATHLEN */
-
-#endif /* !defined FILENAME_MAX */
-
-/*
-** SunOS 4.1.1 libraries lack remove.
-*/
-
-#ifndef remove
-extern int	unlink P((const char * filename));
-#define remove	unlink
-#endif /* !defined remove */
-
-/*
-** Some ancient errno.h implementations don't declare errno.
-** But some newer errno.h implementations define it as a macro.
-** Fix the former without affecting the latter.
-*/
-
-#ifndef errno
-extern int errno;
-#endif /* !defined errno */
-
 /*
 ** Some time.h implementations don't declare asctime_r.
 ** Others might define it as a macro.
@@ -235,21 +165,21 @@ extern int errno;
 */
 
 #ifndef asctime_r
-extern char *	asctime_r();
+extern char *	asctime_r(struct tm const *, char *);
 #endif
 
 /*
 ** Private function declarations.
 */
 
-char *		icalloc P((int nelem, int elsize));
-char *		icatalloc P((char * old, const char * new));
-char *		icpyalloc P((const char * string));
-char *		imalloc P((int n));
-void *		irealloc P((void * pointer, int size));
-void		icfree P((char * pointer));
-void		ifree P((char * pointer));
-const char *	scheck P((const char * string, const char * format));
+char *		icalloc(int nelem, int elsize);
+char *		icatalloc(char * old, const char * new);
+char *		icpyalloc(const char * string);
+char *		imalloc(int n);
+void *		irealloc(void * pointer, int size);
+void		icfree(char * pointer);
+void		ifree(char * pointer);
+const char *	scheck(const char * string, const char * format);
 
 /*
 ** Finally, some convenience items.
@@ -337,8 +267,8 @@ const char *	scheck P((const char * string, const char * format));
 #if HAVE_INCOMPATIBLE_CTIME_R
 #undef asctime_r
 #undef ctime_r
-char *asctime_r P((struct tm const *, char *));
-char *ctime_r P((time_t const *, char *));
+char *asctime_r(struct tm const *, char *);
+char *ctime_r(time_t const *, char *);
 #endif /* HAVE_INCOMPATIBLE_CTIME_R */
 
 #ifndef YEARSPERREPEAT
diff --git a/timezone/southamerica b/timezone/southamerica
index bfda827649..43f73d3238 100644
--- a/timezone/southamerica
+++ b/timezone/southamerica
@@ -1,4 +1,4 @@
-# @(#)southamerica	8.12
+# @(#)southamerica	8.19
 # 
 
 # This data is by no means authoritative; if you think you know better,
@@ -105,7 +105,11 @@ Rule	Arg	1989	1992	-	Oct	Sun>=15	0:00	1:00	S
 # which did not result in the switch of a time zone, as they stayed 9 hours
 # from the International Date Line.
 Rule	Arg	1999	only	-	Oct	Sun>=1	0:00	1:00	S
-Rule	Arg	2000	only	-	Mar	Sun>=1	0:00	0	-
+# From Paul Eggert (2007-12-28):
+# DST was set to expire on March 5, not March 3, but since it was converted
+# to standard time on March 3 it's more convenient for us to pretend that
+# it ended on March 3.
+Rule	Arg	2000	only	-	Mar	3	0:00	0	-
 #
 # From Peter Gradelski via Steffen Thorsen (2000-03-01):
 # We just checked with our Sao Paulo office and they say the government of
@@ -140,6 +144,30 @@ Rule	Arg	2000	only	-	Mar	Sun>=1	0:00	0	-
 # This kind of things had always been done this way in Argentina.
 # We are still -03:00 all year round in all of the country.
 #
+# From Steffen Thorsen (2007-12-21):
+# A user (Leonardo Chaim) reported that Argentina will adopt DST....
+# all of the country (all Zone-entries) are affected.  News reports like
+# http://www.lanacion.com.ar/opinion/nota.asp?nota_id=973037 indicate
+# that Argentina will use DST next year as well, from October to
+# March, although exact rules are not given.
+#
+# From Jesper Norgaard Welen (2007-12-26)
+# The last hurdle of Argentina DST is over, the proposal was approved in
+# the lower chamber too (Deputados) with a vote 192 for and 2 against.
+# By the way thanks to Mariano Absatz and Daniel Mario Vega for the link to
+# the original scanned proposal, where the dates and the zero hours are
+# clear and unambiguous...This is the article about final approval:
+# 
+# http://www.lanacion.com.ar/politica/nota.asp?nota_id=973996
+# 
+#
+# From Paul Eggert (2007-12-22):
+# For dates after mid-2008, the following rules are my guesses and
+# are quite possibly wrong, but are more likely than no DST at all.
+Rule	Arg	2007	only	-	Dec	30	0:00	1:00	S
+Rule	Arg	2008	max	-	Mar	Sun>=15	0:00	0	-
+Rule	Arg	2008	max	-	Oct	Sun>=1	0:00	1:00	S
+ 
 # From Mariano Absatz (2004-05-21):
 # Today it was officially published that the Province of Mendoza is changing
 # its timezone this winter... starting tomorrow night....
@@ -200,6 +228,76 @@ Rule	Arg	2000	only	-	Mar	Sun>=1	0:00	0	-
 # http://www.sanjuan.gov.ar/prensa/archivo/000426.html
 # http://www.sanjuan.gov.ar/prensa/archivo/000441.html
 
+# From Alex Krivenyshev (2008-01-17):
+# Here are articles that Argentina Province San Luis is planning to end DST
+# as earlier as upcoming Monday January 21, 2008 or February 2008:
+#
+# Provincia argentina retrasa reloj y marca diferencia con resto del pais
+# (Argentine Province delayed clock and mark difference with the rest of the
+# country)
+# 
+# http://cl.invertia.com/noticias/noticia.aspx?idNoticia=200801171849_EFE_ET4373&idtel
+# 
+#
+# Es inminente que en San Luis atrasen una hora los relojes
+# (It is imminent in San Luis clocks one hour delay)
+# 
+# http://www.lagaceta.com.ar/vernotae.asp?id_nota=253414
+# 
+#
+# 
+# http://www.worldtimezone.net/dst_news/dst_news_argentina02.html
+# 
+
+# From Jesper Norgaard Welen (2008-01-18):
+# The page of the San Luis provincial government
+# 
+# http://www.sanluis.gov.ar/notas.asp?idCanal=0&id=22812
+# 
+# confirms what Alex Krivenyshev has earlier sent to the tz
+# emailing list about that San Luis plans to return to standard
+# time much earlier than the rest of the country. It also
+# confirms that upon request the provinces San Juan and Mendoza 
+# refused to follow San Luis in this change. 
+# 
+# The change is supposed to take place Monday the 21.st at 0:00
+# hours. As far as I understand it if this goes ahead, we need
+# a new timezone for San Luis (although there are also documented
+# independent changes in the southamerica file of San Luis in
+# 1990 and 1991 which has not been confirmed).
+
+# From Jesper Norgaard Welen (2008-01-25):
+# Unfortunately the below page has become defunct, about the San Luis
+# time change. Perhaps because it now is part of a group of pages "Most
+# important pages of 2008."
+#
+# You can use
+# 
+# http://www.sanluis.gov.ar/notas.asp?idCanal=8141&id=22834
+# 
+# instead it seems. Or use "Buscador" from the main page of the San Luis
+# government, and fill in "huso" and click OK, and you will get 3 pages
+# from which the first one is identical to the above.
+
+# From Mariano Absatz (2008-01-28):
+# I can confirm that the Province of San Luis (and so far only that
+# province) decided to go back to UTC-3 effective midnight Jan 20th 2008
+# (that is, Monday 21st at 0:00 is the time the clocks were delayed back
+# 1 hour), and they intend to keep UTC-3 as their timezone all year round
+# (that is, unless they change their mind any minute now).
+#
+# So we'll have to add yet another city to 'southamerica' (I think San
+# Luis city is the mos populated city in the Province, so it'd be
+# America/Argentina/San_Luis... of course I can't remember if San Luis's
+# history of particular changes goes along with Mendoza or San Juan :-(
+# (I only remember not being able to collect hard facts about San Luis
+# back in 2004, when these provinces changed to UTC-4 for a few days, I
+# mailed them personally and never got an answer).
+
+# From Arthur David Olson (2008-03-15):
+# Until there's better information, asssume San Luis was like San Juan
+# rather than Mendoza (since San Juan has a simpler DST history).
+
 # Unless otherwise specified, data are from Shanks & Pottenger through 1992,
 # from the IATA otherwise.  As noted below, Shanks & Pottenger say that
 # America/Cordoba split into 6 subregions during 1991/1992, but we
@@ -214,7 +312,7 @@ Zone America/Argentina/Buenos_Aires -3:53:48 - LMT 1894 Oct 31
 			-4:00	Arg	AR%sT	1969 Oct  5
 			-3:00	Arg	AR%sT	1999 Oct  3
 			-4:00	Arg	AR%sT	2000 Mar  3
-			-3:00	-	ART
+			-3:00	Arg	AR%sT
 #
 # Santa Fe (SF), Entre Rios (ER), Corrientes (CN), Misiones (MN), Chaco (CC),
 # Formosa (FM), Salta (SA), Santiago del Estero (SE), Cordoba (CB),
@@ -237,7 +335,7 @@ Zone America/Argentina/Cordoba -4:16:48 - LMT	1894 Oct 31
 			-4:00	-	WART	1991 Oct 20
 			-3:00	Arg	AR%sT	1999 Oct  3
 			-4:00	Arg	AR%sT	2000 Mar  3
-			-3:00	-	ART
+			-3:00	Arg	AR%sT
 #
 # Tucuman (TM)
 Zone America/Argentina/Tucuman -4:20:52 - LMT	1894 Oct 31
@@ -250,7 +348,7 @@ Zone America/Argentina/Tucuman -4:20:52 - LMT	1894 Oct 31
 			-4:00	Arg	AR%sT	2000 Mar  3
 			-3:00	-	ART	2004 Jun  1
 			-4:00	-	WART	2004 Jun 13
-			-3:00	-	ART
+			-3:00	Arg	AR%sT
 #
 # La Rioja (LR)
 Zone America/Argentina/La_Rioja -4:27:24 - LMT	1894 Oct 31
@@ -263,7 +361,7 @@ Zone America/Argentina/La_Rioja -4:27:24 - LMT	1894 Oct 31
 			-4:00	Arg	AR%sT	2000 Mar  3
 			-3:00	-	ART	2004 Jun  1
 			-4:00	-	WART	2004 Jun 20
-			-3:00	-	ART
+			-3:00	Arg	AR%sT
 #
 # San Juan (SJ)
 Zone America/Argentina/San_Juan -4:34:04 - LMT	1894 Oct 31
@@ -276,7 +374,7 @@ Zone America/Argentina/San_Juan -4:34:04 - LMT	1894 Oct 31
 			-4:00	Arg	AR%sT	2000 Mar  3
 			-3:00	-	ART	2004 May 31
 			-4:00	-	WART	2004 Jul 25
-			-3:00	-	ART
+			-3:00	Arg	AR%sT
 #
 # Jujuy (JY)
 Zone America/Argentina/Jujuy -4:21:12 -	LMT	1894 Oct 31
@@ -290,7 +388,7 @@ Zone America/Argentina/Jujuy -4:21:12 -	LMT	1894 Oct 31
 			-3:00	1:00	ARST	1992
 			-3:00	Arg	AR%sT	1999 Oct  3
 			-4:00	Arg	AR%sT	2000 Mar  3
-			-3:00	-	ART
+			-3:00	Arg	AR%sT
 #
 # Catamarca (CT), Chubut (CH)
 Zone America/Argentina/Catamarca -4:23:08 - LMT	1894 Oct 31
@@ -303,7 +401,7 @@ Zone America/Argentina/Catamarca -4:23:08 - LMT	1894 Oct 31
 			-4:00	Arg	AR%sT	2000 Mar  3
 			-3:00	-	ART	2004 Jun  1
 			-4:00	-	WART	2004 Jun 20
-			-3:00	-	ART
+			-3:00	Arg	AR%sT
 #
 # Mendoza (MZ)
 Zone America/Argentina/Mendoza -4:35:16 - LMT	1894 Oct 31
@@ -320,6 +418,20 @@ Zone America/Argentina/Mendoza -4:35:16 - LMT	1894 Oct 31
 			-4:00	Arg	AR%sT	2000 Mar  3
 			-3:00	-	ART	2004 May 23
 			-4:00	-	WART	2004 Sep 26
+			-3:00	Arg	AR%sT
+#
+# San Luis (SL)
+Zone America/Argentina/San_Luis -4:25:24 - LMT	1894 Oct 31
+			-4:16:48 -	CMT	1920 May
+			-4:00	-	ART	1930 Dec
+			-4:00	Arg	AR%sT	1969 Oct  5
+			-3:00	Arg	AR%sT	1991 Mar  1
+			-4:00	-	WART	1991 May  7
+			-3:00	Arg	AR%sT	1999 Oct  3
+			-4:00	Arg	AR%sT	2000 Mar  3
+			-3:00	-	ART	2004 May 31
+			-4:00	-	WART	2004 Jul 25
+			-3:00	Arg	AR%sT	2008 Jan 21
 			-3:00	-	ART
 #
 # Santa Cruz (SC)
@@ -331,7 +443,7 @@ Zone America/Argentina/Rio_Gallegos -4:36:52 - LMT 1894 Oct 31
 			-4:00	Arg	AR%sT	2000 Mar  3
 			-3:00	-	ART	2004 Jun  1
 			-4:00	-	WART	2004 Jun 20
-			-3:00	-	ART
+			-3:00	Arg	AR%sT
 #
 # Tierra del Fuego, Antartida e Islas del Atlantico Sur (TF)
 Zone America/Argentina/Ushuaia -4:33:12 - LMT 1894 Oct 31
@@ -342,7 +454,7 @@ Zone America/Argentina/Ushuaia -4:33:12 - LMT 1894 Oct 31
 			-4:00	Arg	AR%sT	2000 Mar  3
 			-3:00	-	ART	2004 May 30
 			-4:00	-	WART	2004 Jun 20
-			-3:00	-	ART
+			-3:00	Arg	AR%sT
 
 # Aruba
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
@@ -731,6 +843,26 @@ Zone America/Rio_Branco	-4:31:12 -	LMT	1914
 # America/Santiago.  The pre-1980 Pacific/Easter data are dubious,
 # but we have no other source.
 
+# From German Poo-Caaman~o (2008-03-03):
+# Due to drought, Chile extends Daylight Time in three weeks.  This
+# is one-time change (Saturday 3/29 at 24:00 for America/Santiago
+# and Saturday 3/29 at 22:00 for Pacific/Easter)
+# The Supreme Decree is located at 
+# 
+# http://www.shoa.cl/servicios/supremo316.pdf
+# 
+# and the instructions for 2008 are located in:
+# 
+# http://www.horaoficial.cl/cambio.htm
+# .
+
+# From José Miguel Garrido (2008-03-05):
+# ...
+# You could see the announces of the change on 
+# 
+# http://www.shoa.cl/noticias/2008/04hora/hora.htm
+# .
+
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Chile	1927	1932	-	Sep	 1	0:00	1:00	S
 Rule	Chile	1928	1932	-	Apr	 1	0:00	0	-
@@ -761,7 +893,11 @@ Rule	Chile	1998	only	-	Mar	Sun>=9	3:00u	0	-
 Rule	Chile	1998	only	-	Sep	27	4:00u	1:00	S
 Rule	Chile	1999	only	-	Apr	 4	3:00u	0	-
 Rule	Chile	1999	max	-	Oct	Sun>=9	4:00u	1:00	S
-Rule	Chile	2000	max	-	Mar	Sun>=9	3:00u	0	-
+Rule	Chile	2000	2007	-	Mar	Sun>=9	3:00u	0	-
+# N.B.: the end of March 29 in Chile is March 30 in Universal time,
+# which is used below in specifying the transition.
+Rule	Chile	2008	only	-	Mar	30	3:00u	0	-
+Rule	Chile	2009	max	-	Mar	Sun>=9	3:00u	0	-
 # IATA SSIM anomalies: (1992-02) says 1992-03-14;
 # (1996-09) says 1998-03-08.  Ignore these.
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
@@ -1107,19 +1243,17 @@ Zone America/Montevideo	-3:44:44 -	LMT	1898 Jun 28
 
 # Venezuela
 #
-# From Kiraz Janicke (2007-09-25), in
-# http://www.venezuelanalysis.com/analysis/2645:
-# The proposal ... involves turning the clock back half an hour from
-# +4.00 Greenwich Mean Time (GMT), to +4.30GMT, the time zone
-# Venezuela had until December 31, 1964, when the current time zone
-# was adopted. The change was due to take place on September 17 and
-# then on September 24, but has since been postponed until December
-# 31, to allow for compliance with international organizations, such
-# as the International Office of Weights and Measures.
+# From John Stainforth (2007-11-28):
+# ... the change for Venezuela originally expected for 2007-12-31 has
+# been brought forward to 2007-12-09.  The official announcement was
+# published today in the "Gaceta Oficial de la Republica Bolivariana
+# de Venezuela, numero 38.819" (official document for all laws or
+# resolution publication)
+# http://www.globovision.com/news.php?nid=72208
 
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	America/Caracas	-4:27:44 -	LMT	1890
 			-4:27:40 -	CMT	1912 Feb 12 # Caracas Mean Time?
 			-4:30	-	VET	1965	     # Venezuela Time
-			-4:00	-	VET	2008
+			-4:00	-	VET	2007 Dec  9 03:00
 			-4:30	-	VET
diff --git a/timezone/zdump.c b/timezone/zdump.c
index 6bf540aefd..82c91e485e 100644
--- a/timezone/zdump.c
+++ b/timezone/zdump.c
@@ -1,4 +1,4 @@
-static char	elsieid[] = "@(#)zdump.c	8.4";
+static char	elsieid[] = "@(#)zdump.c	8.6";
 
 /*
 ** This code has been made independent of the rest of the time
@@ -88,6 +88,9 @@ static char	elsieid[] = "@(#)zdump.c	8.4";
 #define SECSPERNYEAR	(SECSPERDAY * DAYSPERNYEAR)
 #define SECSPERLYEAR	(SECSPERNYEAR + SECSPERDAY)
 
+#ifndef HAVE_GETTEXT
+#define HAVE_GETTEXT 0
+#endif
 #if HAVE_GETTEXT
 #include "locale.h"	/* for setlocale */
 #include "libintl.h"
@@ -129,13 +132,9 @@ static char	elsieid[] = "@(#)zdump.c	8.4";
 #define TZ_DOMAIN "tz"
 #endif /* !defined TZ_DOMAIN */
 
-#ifndef P
-#define P(x)	x
-#endif /* !defined P */
-
 extern char **	environ;
-extern int	getopt P((int argc, char * const argv[],
-			const char * options));
+extern int	getopt(int argc, char * const argv[],
+			const char * options);
 extern char *	optarg;
 extern int	optind;
 extern char *	tzname[2];
@@ -146,15 +145,15 @@ static size_t	longest;
 static char *	progname;
 static int	warned;
 
-static char *	abbr P((struct tm * tmp));
-static void	abbrok P((const char * abbrp, const char * zone));
-static long	delta P((struct tm * newp, struct tm * oldp));
-static void	dumptime P((const struct tm * tmp));
-static time_t	hunt P((char * name, time_t lot, time_t	hit));
-static void	setabsolutes P((void));
-static void	show P((char * zone, time_t t, int v));
-static const char *	tformat P((void));
-static time_t	yeartot P((long y));
+static char *	abbr(struct tm * tmp);
+static void	abbrok(const char * abbrp, const char * zone);
+static long	delta(struct tm * newp, struct tm * oldp);
+static void	dumptime(const struct tm * tmp);
+static time_t	hunt(char * name, time_t lot, time_t	hit);
+static void	setabsolutes(void);
+static void	show(char * zone, time_t t, int v);
+static const char *	tformat(void);
+static time_t	yeartot(long y);
 
 #ifndef TYPECHECK
 #define my_localtime	localtime
@@ -394,7 +393,7 @@ _("%s: usage is %s [ --version ] [ -v ] [ -c [loyear,]hiyear ] zonename ...\n"),
 }
 
 static void
-setabsolutes()
+setabsolutes(void)
 {
 	if (0.5 == (time_t) 0.5) {
 		/*
@@ -592,7 +591,7 @@ struct tm *	tmp;
 */
 
 static const char *
-tformat()
+tformat(void)
 {
 	if (0.5 == (time_t) 0.5) {	/* floating */
 		if (sizeof (time_t) > sizeof (double))
diff --git a/timezone/zic.c b/timezone/zic.c
index 3cb0b171f0..5f8028e480 100644
--- a/timezone/zic.c
+++ b/timezone/zic.c
@@ -3,7 +3,7 @@
 ** 2006-07-17 by Arthur David Olson.
 */
 
-static char	elsieid[] = "@(#)zic.c	8.14";
+static char	elsieid[] = "@(#)zic.c	8.17";
 
 #include "private.h"
 #include "locale.h"
@@ -99,70 +99,66 @@ struct zone {
 	zic_t		z_untiltime;
 };
 
-extern int	getopt P((int argc, char * const argv[],
-			const char * options));
-extern int	link P((const char * fromname, const char * toname));
+extern int	getopt(int argc, char * const argv[],
+			const char * options);
+extern int	link(const char * fromname, const char * toname);
 extern char *	optarg;
 extern int	optind;
 
-static void	addtt P((zic_t starttime, int type));
-static int	addtype P((long gmtoff, const char * abbr, int isdst,
-				int ttisstd, int ttisgmt));
-static void	leapadd P((zic_t t, int positive, int rolling, int count));
-static void	adjleap P((void));
-static void	associate P((void));
-static int	ciequal P((const char * ap, const char * bp));
-static void	convert P((long val, char * buf));
-static void	convert64 P((zic_t val, char * buf));
-static void	dolink P((const char * fromfield, const char * tofield));
-static void	doabbr P((char * abbr, const char * format,
-			const char * letters, int isdst, int doquotes));
-static void	eat P((const char * name, int num));
-static void	eats P((const char * name, int num,
-			const char * rname, int rnum));
-static long	eitol P((int i));
-static void	error P((const char * message));
-static char **	getfields P((char * buf));
-static long	gethms P((const char * string, const char * errstrng,
-			int signable));
-static void	infile P((const char * filename));
-static void	inleap P((char ** fields, int nfields));
-static void	inlink P((char ** fields, int nfields));
-static void	inrule P((char ** fields, int nfields));
-static int	inzcont P((char ** fields, int nfields));
-static int	inzone P((char ** fields, int nfields));
-static int	inzsub P((char ** fields, int nfields, int iscont));
-static int	is32 P((zic_t x));
-static int	itsabbr P((const char * abbr, const char * word));
-static int	itsdir P((const char * name));
-static int	lowerit P((int c));
-static char *	memcheck P((char * tocheck));
-static int	mkdirs P((char * filename));
-static void	newabbr P((const char * abbr));
-static long	oadd P((long t1, long t2));
-static void	outzone P((const struct zone * zp, int ntzones));
-static void	puttzcode P((long code, FILE * fp));
-static void	puttzcode64 P((zic_t code, FILE * fp));
-static int	rcomp P((const void * leftp, const void * rightp));
-static zic_t	rpytime P((const struct rule * rp, int wantedy));
-static void	rulesub P((struct rule * rp,
+static void	addtt(zic_t starttime, int type);
+static int	addtype(long gmtoff, const char * abbr, int isdst,
+				int ttisstd, int ttisgmt);
+static void	leapadd(zic_t t, int positive, int rolling, int count);
+static void	adjleap(void);
+static void	associate(void);
+static int	ciequal(const char * ap, const char * bp);
+static void	convert(long val, char * buf);
+static void	convert64(zic_t val, char * buf);
+static void	dolink(const char * fromfield, const char * tofield);
+static void	doabbr(char * abbr, const char * format,
+			const char * letters, int isdst, int doquotes);
+static void	eat(const char * name, int num);
+static void	eats(const char * name, int num,
+			const char * rname, int rnum);
+static long	eitol(int i);
+static void	error(const char * message);
+static char **	getfields(char * buf);
+static long	gethms(const char * string, const char * errstrng,
+			int signable);
+static void	infile(const char * filename);
+static void	inleap(char ** fields, int nfields);
+static void	inlink(char ** fields, int nfields);
+static void	inrule(char ** fields, int nfields);
+static int	inzcont(char ** fields, int nfields);
+static int	inzone(char ** fields, int nfields);
+static int	inzsub(char ** fields, int nfields, int iscont);
+static int	is32(zic_t x);
+static int	itsabbr(const char * abbr, const char * word);
+static int	itsdir(const char * name);
+static int	lowerit(int c);
+static char *	memcheck(char * tocheck);
+static int	mkdirs(char * filename);
+static void	newabbr(const char * abbr);
+static long	oadd(long t1, long t2);
+static void	outzone(const struct zone * zp, int ntzones);
+static void	puttzcode(long code, FILE * fp);
+static void	puttzcode64(zic_t code, FILE * fp);
+static int	rcomp(const void * leftp, const void * rightp);
+static zic_t	rpytime(const struct rule * rp, int wantedy);
+static void	rulesub(struct rule * rp,
 			const char * loyearp, const char * hiyearp,
 			const char * typep, const char * monthp,
-			const char * dayp, const char * timep));
-static int 	stringoffset P((char * result, long offset));
-static int	stringrule P((char * result, const struct rule * rp,
-			long dstoff, long gmtoff));
-static void 	stringzone P((char * result,
-			const struct zone * zp, int ntzones));
-static void	setboundaries P((void));
-static zic_t	tadd P((zic_t t1, long t2));
-static void	usage P((void));
-static void	writezone P((const char * name, const char * string));
-static int	yearistype P((int year, const char * type));
-
-#if !HAVE_STRERROR
-static char *	strerror P((int));
-#endif /* !HAVE_STRERROR */
+			const char * dayp, const char * timep);
+static int 	stringoffset(char * result, long offset);
+static int	stringrule(char * result, const struct rule * rp,
+			long dstoff, long gmtoff);
+static void 	stringzone(char * result,
+			const struct zone * zp, int ntzones);
+static void	setboundaries(void);
+static zic_t	tadd(zic_t t1, long t2);
+static void	usage(void);
+static void	writezone(const char * name, const char * string);
+static int	yearistype(int year, const char * type);
 
 static int		charcnt;
 static int		errors;
@@ -287,8 +283,8 @@ struct lookup {
 	const int	l_value;
 };
 
-static struct lookup const *	byword P((const char * string,
-					const struct lookup * lp));
+static struct lookup const *	byword(const char * string,
+					const struct lookup * lp);
 
 static struct lookup const	line_codes[] = {
 	{ "Rule",	LC_RULE },
@@ -405,19 +401,6 @@ char * const	ptr;
 ** Error handling.
 */
 
-#if !HAVE_STRERROR
-static char *
-strerror(errnum)
-int	errnum;
-{
-	extern char *	sys_errlist[];
-	extern int	sys_nerr;
-
-	return (errnum > 0 && errnum <= sys_nerr) ?
-		sys_errlist[errnum] : _("Unknown system error");
-}
-#endif /* !HAVE_STRERROR */
-
 static void
 eats(name, num, rname, rnum)
 const char * const	name;
@@ -471,7 +454,7 @@ const char * const	string;
 }
 
 static void
-usage P((void))
+usage(void)
 {
 	(void) fprintf(stderr, _("%s: usage is %s \
 [ --version ] [ -v ] [ -l localtime ] [ -p posixrules ] \\\n\
@@ -699,7 +682,7 @@ warning(_("hard link failed, symbolic link used"));
 #define TIME_T_BITS_IN_FILE	64
 
 static void
-setboundaries P((void))
+setboundaries(void)
 {
 	register int	i;
 
@@ -741,7 +724,7 @@ const void *	cp2;
 }
 
 static void
-associate P((void))
+associate(void)
 {
 	register struct zone *	zp;
 	register struct rule *	rp;
@@ -2012,7 +1995,8 @@ const int			zonecount;
 	}
 	for (i = 0; i < zonecount; ++i) {
 		zp = &zpfirst[i];
-		updateminmax(zp->z_untilrule.r_loyear);
+		if (i < zonecount - 1)
+			updateminmax(zp->z_untilrule.r_loyear);
 		for (j = 0; j < zp->z_nrules; ++j) {
 			rp = &zp->z_rules[j];
 			if (rp->r_lowasnum)
@@ -2043,8 +2027,11 @@ wp = ecpyalloc(_("no POSIX environment variable for zone"));
 		else	max_year = INT_MAX;
 	}
 	/*
-	** For the benefit of older systems, generate data through 2037.
+	** For the benefit of older systems,
+	** generate data from 1900 through 2037.
 	*/
+	if (min_year > 1900)
+		min_year = 1900;
 	if (max_year < 2037)
 		max_year = 2037;
 	for (i = 0; i < zonecount; ++i) {
@@ -2331,7 +2318,7 @@ int		count;
 }
 
 static void
-adjleap P((void))
+adjleap(void)
 {
 	register int	i;
 	register long	last = 0;
diff --git a/timezone/zone.tab b/timezone/zone.tab
index 8d4333ad9d..1647036c0e 100644
--- a/timezone/zone.tab
+++ b/timezone/zone.tab
@@ -1,4 +1,4 @@
-# @(#)zone.tab	8.11
+# @(#)zone.tab	8.16
 #
 # TZ zone descriptions
 #
@@ -42,7 +42,8 @@ AQ	-7824+10654	Antarctica/Vostok	Vostok Station, S Magnetic Pole
 AQ	-6640+14001	Antarctica/DumontDUrville	Dumont-d'Urville Station, Terre Adelie
 AQ	-690022+0393524	Antarctica/Syowa	Syowa Station, E Ongul I
 AR	-3436-05827	America/Argentina/Buenos_Aires	Buenos Aires (BA, CF)
-AR	-3124-06411	America/Argentina/Cordoba	most locations (CB, CC, CN, ER, FM, LP, MN, NQ, RN, SA, SE, SF, SL)
+AR	-3124-06411	America/Argentina/Cordoba	most locations (CB, CC, CN, ER, FM, LP, MN, NQ, RN, SA, SE, SF)
+AR	-3319-06621	America/Argentina/San_Luis	San Luis (SL)
 AR	-2411-06518	America/Argentina/Jujuy	Jujuy (JY)
 AR	-2649-06513	America/Argentina/Tucuman	Tucuman (TM)
 AR	-2828-06547	America/Argentina/Catamarca	Catamarca (CT), Chubut (CH)
@@ -77,6 +78,7 @@ BG	+4241+02319	Europe/Sofia
 BH	+2623+05035	Asia/Bahrain
 BI	-0323+02922	Africa/Bujumbura
 BJ	+0629+00237	Africa/Porto-Novo
+BL	+1753-06251	America/St_Barthelemy
 BM	+3217-06446	Atlantic/Bermuda
 BN	+0456+11455	Asia/Brunei
 BO	-1630-06809	America/La_Paz
@@ -208,7 +210,7 @@ ID	-0232+14042	Asia/Jayapura	Irian Jaya & the Moluccas
 IE	+5320-00615	Europe/Dublin
 IL	+3146+03514	Asia/Jerusalem
 IM	+5409-00428	Europe/Isle_of_Man
-IN	+2232+08822	Asia/Calcutta
+IN	+2232+08822	Asia/Kolkata
 IO	-0720+07225	Indian/Chagos
 IQ	+3321+04425	Asia/Baghdad
 IR	+3540+05126	Asia/Tehran
@@ -250,6 +252,7 @@ MA	+3339-00735	Africa/Casablanca
 MC	+4342+00723	Europe/Monaco
 MD	+4700+02850	Europe/Chisinau
 ME	+4226+01916	Europe/Podgorica
+MF	+1804-06305	America/Marigot
 MG	-1855+04731	Indian/Antananarivo
 MH	+0709+17112	Pacific/Majuro	most locations
 MH	+0905+16720	Pacific/Kwajalein	Kwajalein
@@ -339,8 +342,7 @@ SE	+5920+01803	Europe/Stockholm
 SG	+0117+10351	Asia/Singapore
 SH	-1555-00542	Atlantic/St_Helena
 SI	+4603+01431	Europe/Ljubljana
-SJ	+7800+01600	Arctic/Longyearbyen	Svalbard
-SJ	+7059-00805	Atlantic/Jan_Mayen	Jan Mayen
+SJ	+7800+01600	Arctic/Longyearbyen
 SK	+4809+01707	Europe/Bratislava
 SL	+0830-01315	Africa/Freetown
 SM	+4355+01228	Europe/San_Marino
@@ -410,7 +412,7 @@ VC	+1309-06114	America/St_Vincent
 VE	+1030-06656	America/Caracas
 VG	+1827-06437	America/Tortola
 VI	+1821-06456	America/St_Thomas
-VN	+1045+10640	Asia/Saigon
+VN	+1045+10640	Asia/Ho_Chi_Minh
 VU	-1740+16825	Pacific/Efate
 WF	-1318-17610	Pacific/Wallis
 WS	-1350-17144	Pacific/Apia
diff --git a/wcsmbs/wcsmbsload.c b/wcsmbs/wcsmbsload.c
index e82b1ffaff..2b46131b14 100644
--- a/wcsmbs/wcsmbsload.c
+++ b/wcsmbs/wcsmbsload.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1998-2002,2004,2005 Free Software Foundation, Inc.
+/* Copyright (C) 1998-2002,2004,2005,2008 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper , 1998.
 
@@ -145,7 +145,7 @@ __wcsmbs_getfct (const char *to, const char *from, size_t *nstepsp)
 
 
 /* Some of the functions here must not be used while setlocale is called.  */
-__libc_lock_define (extern, __libc_setlocale_lock attribute_hidden)
+__libc_rwlock_define (extern, __libc_setlocale_lock attribute_hidden)
 
 /* Load conversion functions for the currently selected locale.  */
 void
@@ -153,7 +153,7 @@ internal_function
 __wcsmbs_load_conv (struct locale_data *new_category)
 {
   /* Acquire the lock.  */
-  __libc_lock_lock (__libc_setlocale_lock);
+  __libc_rwlock_wrlock (__libc_setlocale_lock);
 
   /* We should repeat the test since while we waited some other thread
      might have run this function.  */
@@ -211,7 +211,7 @@ __wcsmbs_load_conv (struct locale_data *new_category)
 	}
     }
 
-  __libc_lock_unlock (__libc_setlocale_lock);
+  __libc_rwlock_unlock (__libc_setlocale_lock);
 }
 
 
-- 
cgit v1.2.3