From f521be31b96b5ca8b6d24c388d644f5dfcafac7d Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Sun, 26 Apr 2009 18:06:47 +0000 Subject: [PATCH] * sysdeps/unix/sysv/linux/libc_pthread_init.c (__libc_pthread_init): Avoid warning by using may_alias attribute on ptrhack. --- gmon/gmon.c | 52 +++++++++++++++---- inet/inet6_option.c | 5 +- libio/iovsprintf.c | 8 +-- libio/iovsscanf.c | 6 +-- libio/strfile.h | 4 +- libio/vasprintf.c | 7 +-- libio/vsnprintf.c | 6 +-- nptl/ChangeLog | 5 ++ .../unix/sysv/linux/libc_pthread_init.c | 8 +-- stdio-common/isoc99_vsscanf.c | 6 +-- stdlib/strfmon_l.c | 13 ++--- sysdeps/unix/sysv/linux/readv.c | 2 + sysdeps/unix/sysv/linux/writev.c | 2 + 13 files changed, 83 insertions(+), 41 deletions(-) diff --git a/gmon/gmon.c b/gmon/gmon.c index 8e2eddd0bc..af2ac1c0f6 100644 --- a/gmon/gmon.c +++ b/gmon/gmon.c @@ -40,6 +40,7 @@ #include #include #include +#include #include #include #include @@ -180,10 +181,18 @@ write_hist (fd) int fd; { u_char tag = GMON_TAG_TIME_HIST; - struct gmon_hist_hdr thdr __attribute__ ((aligned (__alignof__ (char *)))); if (_gmonparam.kcountsize > 0) { + struct real_gmon_hist_hdr + { + char *low_pc; + char *high_pc; + int32_t hist_size; + int32_t prof_rate; + char dimen[15]; + char dimen_abbrev; + } thdr; struct iovec iov[3] = { { &tag, sizeof (tag) }, @@ -191,11 +200,25 @@ write_hist (fd) { _gmonparam.kcount, _gmonparam.kcountsize } }; - *(char **) thdr.low_pc = (char *) _gmonparam.lowpc; - *(char **) thdr.high_pc = (char *) _gmonparam.highpc; - *(int32_t *) thdr.hist_size = (_gmonparam.kcountsize - / sizeof (HISTCOUNTER)); - *(int32_t *) thdr.prof_rate = __profile_frequency (); + if (sizeof (thdr) != sizeof (struct gmon_hist_hdr) + || (offsetof (struct real_gmon_hist_hdr, low_pc) + != offsetof (struct gmon_hist_hdr, low_pc)) + || (offsetof (struct real_gmon_hist_hdr, high_pc) + != offsetof (struct gmon_hist_hdr, high_pc)) + || (offsetof (struct real_gmon_hist_hdr, hist_size) + != offsetof (struct gmon_hist_hdr, hist_size)) + || (offsetof (struct real_gmon_hist_hdr, prof_rate) + != offsetof (struct gmon_hist_hdr, prof_rate)) + || (offsetof (struct real_gmon_hist_hdr, dimen) + != offsetof (struct gmon_hist_hdr, dimen)) + || (offsetof (struct real_gmon_hist_hdr, dimen_abbrev) + != offsetof (struct gmon_hist_hdr, dimen_abbrev))) + abort (); + + thdr.low_pc = (char *) _gmonparam.lowpc; + thdr.high_pc = (char *) _gmonparam.highpc; + thdr.hist_size = _gmonparam.kcountsize / sizeof (HISTCOUNTER); + thdr.prof_rate = __profile_frequency (); strncpy (thdr.dimen, "seconds", sizeof (thdr.dimen)); thdr.dimen_abbrev = 's'; @@ -318,7 +341,6 @@ write_bb_counts (fd) static void write_gmon (void) { - struct gmon_hdr ghdr __attribute__ ((aligned (__alignof__ (int)))); int fd = -1; char *env; @@ -350,9 +372,21 @@ write_gmon (void) } /* write gmon.out header: */ - memset (&ghdr, '\0', sizeof (struct gmon_hdr)); + struct real_gmon_hdr + { + char cookie[4]; + int32_t version; + char spare[3 * 4]; + } ghdr; + if (sizeof (ghdr) != sizeof (struct gmon_hdr) + || (offsetof (struct real_gmon_hdr, cookie) + != offsetof (struct gmon_hdr, cookie)) + || (offsetof (struct real_gmon_hdr, version) + != offsetof (struct gmon_hdr, version))) + abort (); memcpy (&ghdr.cookie[0], GMON_MAGIC, sizeof (ghdr.cookie)); - *(int32_t *) ghdr.version = GMON_VERSION; + ghdr.version = GMON_VERSION; + memset (ghdr.spare, '\0', sizeof (ghdr.spare)); write_not_cancel (fd, &ghdr, sizeof (struct gmon_hdr)); /* write PC histogram: */ diff --git a/inet/inet6_option.c b/inet/inet6_option.c index b34eb22b7d..aa693cc9e4 100644 --- a/inet/inet6_option.c +++ b/inet/inet6_option.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2003, 2006 Free Software Foundation, Inc. +/* Copyright (C) 2003, 2006, 2009 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 2003. @@ -216,7 +216,8 @@ option_alloc (struct cmsghdr *cmsg, int datalen, int multx, int plusy) /* Too long. */ return NULL; - ((struct ip6_ext *) CMSG_DATA (cmsg))->ip6e_len = len8b; + struct ip6_ext *ie = (void *) CMSG_DATA (cmsg); + ie->ip6e_len = len8b; return result; } diff --git a/libio/iovsprintf.c b/libio/iovsprintf.c index 7fcd0a156e..ab82411097 100644 --- a/libio/iovsprintf.c +++ b/libio/iovsprintf.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1993, 1997-2003, 2006 Free Software Foundation, Inc. +/* Copyright (C) 1993, 1997-2003, 2006, 2009 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 @@ -38,10 +38,10 @@ __IO_vsprintf (char *string, const char *format, _IO_va_list args) sf._sbf._f._lock = NULL; #endif _IO_no_init (&sf._sbf._f, _IO_USER_LOCK, -1, NULL, NULL); - _IO_JUMPS ((struct _IO_FILE_plus *) &sf._sbf) = &_IO_str_jumps; + _IO_JUMPS (&sf._sbf) = &_IO_str_jumps; _IO_str_init_static_internal (&sf, string, -1, string); - ret = INTUSE(_IO_vfprintf) ((_IO_FILE *) &sf._sbf, format, args); - _IO_putc_unlocked ('\0', (_IO_FILE *) &sf._sbf); + ret = INTUSE(_IO_vfprintf) (&sf._sbf._f, format, args); + _IO_putc_unlocked ('\0', &sf._sbf._f); return ret; } INTDEF2(__IO_vsprintf, _IO_vsprintf) diff --git a/libio/iovsscanf.c b/libio/iovsscanf.c index 10e4b0a9ac..6f8a826ef6 100644 --- a/libio/iovsscanf.c +++ b/libio/iovsscanf.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1993, 1997-2003, 2006 Free Software Foundation, Inc. +/* Copyright (C) 1993, 1997-2003, 2006, 2009 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,9 +40,9 @@ _IO_vsscanf (string, format, args) sf._sbf._f._lock = NULL; #endif _IO_no_init (&sf._sbf._f, _IO_USER_LOCK, -1, NULL, NULL); - _IO_JUMPS ((struct _IO_FILE_plus *) &sf._sbf) = &_IO_str_jumps; + _IO_JUMPS (&sf._sbf) = &_IO_str_jumps; _IO_str_init_static_internal (&sf, (char*)string, 0, NULL); - ret = INTUSE(_IO_vfscanf) ((_IO_FILE *) &sf._sbf, format, args, NULL); + ret = INTUSE(_IO_vfscanf) (&sf._sbf._f, format, args, NULL); return ret; } ldbl_weak_alias (_IO_vsscanf, __vsscanf) diff --git a/libio/strfile.h b/libio/strfile.h index 53a36a3db8..21ea9a615b 100644 --- a/libio/strfile.h +++ b/libio/strfile.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1993, 1997, 1998, 1999, 2005 Free Software Foundation, Inc. +/* Copyright (C) 1993,1997,1998,1999,2005,2009 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,7 +47,7 @@ struct _IO_str_fields struct _IO_streambuf { struct _IO_FILE _f; - const void *_vtable; + const struct _IO_jump_t *vtable; }; typedef struct _IO_strfile_ diff --git a/libio/vasprintf.c b/libio/vasprintf.c index 2fdb9f6ed2..7e15eb044a 100644 --- a/libio/vasprintf.c +++ b/libio/vasprintf.c @@ -1,4 +1,5 @@ -/* Copyright (C) 1995,1997,1999-2002,2004,2006 Free Software Foundation, Inc. +/* Copyright (C) 1995,1997,1999-2002,2004,2006,2009 + 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 @@ -54,8 +55,8 @@ _IO_vasprintf (result_ptr, format, args) #ifdef _IO_MTSAFE_IO sf._sbf._f._lock = NULL; #endif - _IO_no_init ((_IO_FILE *) &sf._sbf, _IO_USER_LOCK, -1, NULL, NULL); - _IO_JUMPS ((struct _IO_FILE_plus *) &sf._sbf) = &_IO_str_jumps; + _IO_no_init (&sf._sbf._f, _IO_USER_LOCK, -1, NULL, NULL); + _IO_JUMPS (&sf._sbf) = &_IO_str_jumps; _IO_str_init_static_internal (&sf, string, init_string_size, string); sf._sbf._f._flags &= ~_IO_USER_BUF; sf._s._allocate_buffer = (_IO_alloc_type) malloc; diff --git a/libio/vsnprintf.c b/libio/vsnprintf.c index 289160e540..a05eb5455c 100644 --- a/libio/vsnprintf.c +++ b/libio/vsnprintf.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1994,1997,1999-2003, 2004, 2006 Free Software Foundation, Inc. +/* Copyright (C) 1994,1997,1999-2004,2006,2009 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 @@ -114,10 +114,10 @@ _IO_vsnprintf (string, maxlen, format, args) } _IO_no_init (&sf.f._sbf._f, _IO_USER_LOCK, -1, NULL, NULL); - _IO_JUMPS ((struct _IO_FILE_plus *) &sf.f._sbf) = &_IO_strn_jumps; + _IO_JUMPS (&sf.f._sbf) = &_IO_strn_jumps; string[0] = '\0'; _IO_str_init_static_internal (&sf.f, string, maxlen - 1, string); - ret = INTUSE(_IO_vfprintf) ((_IO_FILE *) &sf.f._sbf, format, args); + ret = INTUSE(_IO_vfprintf) (&sf.f._sbf._f, format, args); if (sf.f._sbf._f._IO_buf_base != sf.overflow_buf) *sf.f._sbf._f._IO_write_ptr = '\0'; diff --git a/nptl/ChangeLog b/nptl/ChangeLog index 60bab8502c..5091c8393f 100644 --- a/nptl/ChangeLog +++ b/nptl/ChangeLog @@ -1,3 +1,8 @@ +2009-04-26 Ulrich Drepper + + * sysdeps/unix/sysv/linux/libc_pthread_init.c (__libc_pthread_init): + Avoid warning by using may_alias attribute on ptrhack. + 2009-04-22 Ulrich Drepper [BZ #10090] diff --git a/nptl/sysdeps/unix/sysv/linux/libc_pthread_init.c b/nptl/sysdeps/unix/sysv/linux/libc_pthread_init.c index 4b614bd1a6..8924c4f450 100644 --- a/nptl/sysdeps/unix/sysv/linux/libc_pthread_init.c +++ b/nptl/sysdeps/unix/sysv/linux/libc_pthread_init.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2002, 2003, 2005, 2006, 2007 Free Software Foundation, Inc. +/* Copyright (C) 2002,2003,2005,2006,2007,2009 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 2002. @@ -56,10 +56,10 @@ __libc_pthread_init (ptr, reclaim, functions) union ptrhack { struct pthread_functions pf; - void *parr[1]; - } const *src; - union ptrhack *dest; # define NPTRS (sizeof (struct pthread_functions) / sizeof (void *)) + void *parr[NPTRS]; + } __attribute__ ((may_alias)) const *src; + union ptrhack *dest; src = (const void *) functions; dest = (void *) &__libc_pthread_functions; diff --git a/stdio-common/isoc99_vsscanf.c b/stdio-common/isoc99_vsscanf.c index f10919c79a..b11cf603d3 100644 --- a/stdio-common/isoc99_vsscanf.c +++ b/stdio-common/isoc99_vsscanf.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1993, 1997-2003, 2006, 2007 Free Software Foundation, Inc. +/* Copyright (C) 1993,1997-2003,2006,2007,2009 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 @@ -38,10 +38,10 @@ __isoc99_vsscanf (const char *string, const char *format, _IO_va_list args) sf._sbf._f._lock = NULL; #endif _IO_no_init (&sf._sbf._f, _IO_USER_LOCK, -1, NULL, NULL); - _IO_JUMPS ((struct _IO_FILE_plus *) &sf._sbf) = &_IO_str_jumps; + _IO_JUMPS (&sf._sbf) = &_IO_str_jumps; _IO_str_init_static_internal (&sf, (char*)string, 0, NULL); sf._sbf._f._flags2 |= _IO_FLAGS2_SCANF_STD; - ret = INTUSE(_IO_vfscanf) ((_IO_FILE *) &sf._sbf, format, args, NULL); + ret = INTUSE(_IO_vfscanf) (&sf._sbf._f, format, args, NULL); return ret; } libc_hidden_def (__isoc99_vsscanf) diff --git a/stdlib/strfmon_l.c b/stdlib/strfmon_l.c index 8e63d459e3..eb7a17801a 100644 --- a/stdlib/strfmon_l.c +++ b/stdlib/strfmon_l.c @@ -90,9 +90,6 @@ __vstrfmon_l (char *s, size_t maxsize, __locale_t loc, const char *format, { struct locale_data *current = loc->__locales[LC_MONETARY]; _IO_strfile f; -#ifdef _IO_MTSAFE_IO - _IO_lock_t lock; -#endif struct printf_info info; char *dest; /* Pointer so copy the output. */ const char *fmt; /* Pointer that walks through format. */ @@ -517,11 +514,11 @@ __vstrfmon_l (char *s, size_t maxsize, __locale_t loc, const char *format, /* Print the number. */ #ifdef _IO_MTSAFE_IO - f._sbf._f._lock = &lock; + f._sbf._f._lock = NULL; #endif - INTUSE(_IO_init) ((_IO_FILE *) &f, 0); - _IO_JUMPS ((struct _IO_FILE_plus *) &f) = &_IO_str_jumps; - INTUSE(_IO_str_init_static) ((_IO_strfile *) &f, dest, + INTUSE(_IO_init) (&f._sbf._f, 0); + _IO_JUMPS (&f._sbf) = &_IO_str_jumps; + INTUSE(_IO_str_init_static) (&f, dest, (s + maxsize) - dest, dest); /* We clear the last available byte so we can find out whether the numeric representation is too long. */ @@ -537,7 +534,7 @@ __vstrfmon_l (char *s, size_t maxsize, __locale_t loc, const char *format, info.extra = 1; /* This means use values from LC_MONETARY. */ ptr = &fpnum; - done = __printf_fp ((FILE *) &f, &info, &ptr); + done = __printf_fp (&f._sbf._f, &info, &ptr); if (done < 0) return -1; diff --git a/sysdeps/unix/sysv/linux/readv.c b/sysdeps/unix/sysv/linux/readv.c index bff4a3ff74..9425084a25 100644 --- a/sysdeps/unix/sysv/linux/readv.c +++ b/sysdeps/unix/sysv/linux/readv.c @@ -27,8 +27,10 @@ #include #include +#ifndef __ASSUME_COMPLETE_READV_WRITEV static ssize_t __atomic_readv_replacement (int, __const struct iovec *, int) internal_function; +#endif /* Not all versions of the kernel support the large number of records. */ diff --git a/sysdeps/unix/sysv/linux/writev.c b/sysdeps/unix/sysv/linux/writev.c index 55e915d34d..8552856cdb 100644 --- a/sysdeps/unix/sysv/linux/writev.c +++ b/sysdeps/unix/sysv/linux/writev.c @@ -27,8 +27,10 @@ #include #include +#ifndef __ASSUME_COMPLETE_READV_WRITEV static ssize_t __atomic_writev_replacement (int, const struct iovec *, int) internal_function; +#endif /* Not all versions of the kernel support the large number of records. */