This is the mail archive of the libc-alpha@sources.redhat.com mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Incorrect __THROW markers


I've been working on a port of NPTL to ARM, started by Phil Blundell (very
nearly complete now).  The bit that's been giving me the most headache is,
surprise surprise, cancellation.  ARM is currently using SJLJ exception
handling; in the near future ARM/Linux will also support ARM EABI unwinding,
which has an entirely different set of problems.  I've been able to confine
the unwinding changes to sysdeps/ fairly successfully.

One particular problem is that incorrect nothrow markers in C, for DWARF-2
unwinding, have no particular consequence.  But for SJLJ they're a terminal
problem; if a function call is marked nothrow, the call_site field in the
function context will not be filled in before the call.  This causes a
crash during forced unwinding.

I implemented a warning in GCC about nothrow functions which called
possibly-throwing functions.  It's very noisy and I'm still trying to
decide whether it's worth submitting for general use - very little outside
of glibc would find it useful, I suspect.  But it's great for this.

This patch is just a sampling of the problems, done in no systematic way. If
my assumption is correct - that any function which could call a cancellation
point must not be marked as __THROW - I'll try to find a more systematic and
thorough way to fix this.  The warning currently shows up about six thousand
times in a glibc build.  In this particular patch, the change to
_IO_getline_internal fixes tst-cancel6, which is cancelled during fgets.

Is this patch OK?  If it is, are changelogs at this level of detail
necessary?

-- 
Daniel Jacobowitz

2004-11-10  Daniel Jacobowitz  <dan@debian.org>

	* libio/iolibio.h (_IO_fclose, _IO_new_fclose, _IO_old_fclose)
	(_IO_fflush, _IO_fgetpos, _IO_fgetpos64, _IO_fgets, _IO_fopen)
	(_IO_old_fopen, _IO_new_fopen, _IO_fopen64, __fopen_internal)
	(_IO_fprintf, _IO_fputs, _IO_fsetpos, _IO_fsetpos64, _IO_ftell)
	(_IO_fread, _IO_fwrite, _IO_gets, _IO_printf, _IO_puts, _IO_scanf)
	(_IO_fflush_internal, _IO_ftell_internal, _IO_fputs_internal)
	(_IO_fwrite_internal): Remove incorrect __THROW.
	* libio/libioP.h (_IO_default_xsputn, _IO_wdefault_xsputn)
	(_IO_default_xsgetn, _IO_wdefault_xsgetn, _IO_default_write)
	(_IO_default_read, _IO_getline, _IO_getline_info, _IO_getwline)
	(_IO_getwline_info, _IO_file_read_internal, _IO_sgetn_internal)
	(_IO_wdo_write_internal, _IO_do_write_internal)
	(_IO_getline_info_internal, _IO_getline_internal)
	(_IO_vfprintf_internal, _IO_putc_internal, _IO_read, _IO_write)
	(_IO_close): Likewise.

Index: libio/iolibio.h
===================================================================
RCS file: /usr/local/src/cvs/nptl/glibc/libio/iolibio.h,v
retrieving revision 1.1.1.1
diff -u -p -r1.1.1.1 iolibio.h
--- libio/iolibio.h	3 Nov 2004 16:41:29 -0000	1.1.1.1
+++ libio/iolibio.h	11 Nov 2004 04:15:30 -0000
@@ -7,36 +7,35 @@
 extern "C" {
 #endif
 
-extern int _IO_fclose (_IO_FILE*) __THROW;
-extern int _IO_new_fclose (_IO_FILE*) __THROW;
-extern int _IO_old_fclose (_IO_FILE*) __THROW;
+extern int _IO_fclose (_IO_FILE*);
+extern int _IO_new_fclose (_IO_FILE*);
+extern int _IO_old_fclose (_IO_FILE*);
 extern _IO_FILE *_IO_fdopen (int, const char*) __THROW;
 extern _IO_FILE *_IO_old_fdopen (int, const char*) __THROW;
 extern _IO_FILE *_IO_new_fdopen (int, const char*) __THROW;
-extern int _IO_fflush (_IO_FILE*) __THROW;
-extern int _IO_fgetpos (_IO_FILE*, _IO_fpos_t*) __THROW;
-extern int _IO_fgetpos64 (_IO_FILE*, _IO_fpos64_t*) __THROW;
-extern char* _IO_fgets (char*, int, _IO_FILE*) __THROW;
-extern _IO_FILE *_IO_fopen (const char*, const char*) __THROW;
-extern _IO_FILE *_IO_old_fopen (const char*, const char*) __THROW;
-extern _IO_FILE *_IO_new_fopen (const char*, const char*) __THROW;
-extern _IO_FILE *_IO_fopen64 (const char*, const char*) __THROW;
-extern _IO_FILE *__fopen_internal (const char*, const char*, int) __THROW;
+extern int _IO_fflush (_IO_FILE*);
+extern int _IO_fgetpos (_IO_FILE*, _IO_fpos_t*);
+extern int _IO_fgetpos64 (_IO_FILE*, _IO_fpos64_t*);
+extern char* _IO_fgets (char*, int, _IO_FILE*);
+extern _IO_FILE *_IO_fopen (const char*, const char*);
+extern _IO_FILE *_IO_old_fopen (const char*, const char*);
+extern _IO_FILE *_IO_new_fopen (const char*, const char*);
+extern _IO_FILE *_IO_fopen64 (const char*, const char*);
+extern _IO_FILE *__fopen_internal (const char*, const char*, int);
 extern _IO_FILE *__fopen_maybe_mmap (_IO_FILE *) __THROW;
-extern int _IO_fprintf (_IO_FILE*, const char*, ...) __THROW;
-extern int _IO_fputs (const char*, _IO_FILE*) __THROW;
+extern int _IO_fprintf (_IO_FILE*, const char*, ...);
+extern int _IO_fputs (const char*, _IO_FILE*);
 libc_hidden_proto (_IO_fputs)
-extern int _IO_fsetpos (_IO_FILE*, const _IO_fpos_t *) __THROW;
-extern int _IO_fsetpos64 (_IO_FILE*, const _IO_fpos64_t *) __THROW;
-extern long int _IO_ftell (_IO_FILE*) __THROW;
-extern _IO_size_t _IO_fread (void*, _IO_size_t, _IO_size_t, _IO_FILE*) __THROW;
-extern _IO_size_t _IO_fwrite (const void*, _IO_size_t, _IO_size_t, _IO_FILE*)
-       __THROW;
-extern char* _IO_gets (char*) __THROW;
+extern int _IO_fsetpos (_IO_FILE*, const _IO_fpos_t *);
+extern int _IO_fsetpos64 (_IO_FILE*, const _IO_fpos64_t *);
+extern long int _IO_ftell (_IO_FILE*);
+extern _IO_size_t _IO_fread (void*, _IO_size_t, _IO_size_t, _IO_FILE*);
+extern _IO_size_t _IO_fwrite (const void*, _IO_size_t, _IO_size_t, _IO_FILE*);
+extern char* _IO_gets (char*);
 extern void _IO_perror (const char*) __THROW;
-extern int _IO_printf (const char*, ...) __THROW;
-extern int _IO_puts (const char*) __THROW;
-extern int _IO_scanf (const char*, ...) __THROW;
+extern int _IO_printf (const char*, ...);
+extern int _IO_puts (const char*);
+extern int _IO_scanf (const char*, ...);
 extern void _IO_setbuffer (_IO_FILE *, char*, _IO_size_t) __THROW;
 extern int _IO_setvbuf (_IO_FILE*, char*, int, _IO_size_t) __THROW;
 extern int _IO_sscanf (const char*, const char*, ...) __THROW;
@@ -89,11 +88,11 @@ extern _IO_size_t _IO_fread_internal (vo
        __THROW;
 extern _IO_FILE *_IO_fdopen_internal (int, const char*) __THROW;
 extern int _IO_vsprintf_internal (char*, const char*, _IO_va_list) __THROW;
-extern int _IO_fflush_internal (_IO_FILE*) __THROW;
+extern int _IO_fflush_internal (_IO_FILE*);
 extern _IO_size_t _IO_fwrite_internal (const void*, _IO_size_t,
-				       _IO_size_t, _IO_FILE*) __THROW;
-extern long int _IO_ftell_internal (_IO_FILE*) __THROW;
-extern int _IO_fputs_internal (const char*, _IO_FILE*) __THROW;
+				       _IO_size_t, _IO_FILE*);
+extern long int _IO_ftell_internal (_IO_FILE*);
+extern int _IO_fputs_internal (const char*, _IO_FILE*);
 extern int _IO_setvbuf_internal (_IO_FILE*, char*, int, _IO_size_t) __THROW;
 
 #ifdef __cplusplus
Index: libio/libioP.h
===================================================================
RCS file: /usr/local/src/cvs/nptl/glibc/libio/libioP.h,v
retrieving revision 1.1.1.1
diff -u -p -r1.1.1.1 libioP.h
--- libio/libioP.h	3 Nov 2004 16:41:30 -0000	1.1.1.1
+++ libio/libioP.h	11 Nov 2004 04:15:30 -0000
@@ -440,18 +440,15 @@ extern void _IO_wdefault_finish (_IO_FIL
 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_size_t _IO_default_xsputn (_IO_FILE *, const void *, _IO_size_t)
-     __THROW;
-extern _IO_size_t _IO_wdefault_xsputn (_IO_FILE *, const void *, _IO_size_t)
-     __THROW;
-extern _IO_size_t _IO_default_xsgetn (_IO_FILE *, void *, _IO_size_t) __THROW;
-extern _IO_size_t _IO_wdefault_xsgetn (_IO_FILE *, void *, _IO_size_t) __THROW;
+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_ssize_t _IO_default_write (_IO_FILE *, const void *, _IO_ssize_t)
-     __THROW;
-extern _IO_ssize_t _IO_default_read (_IO_FILE *, void *, _IO_ssize_t) __THROW;
+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;
 extern _IO_off64_t _IO_default_seek (_IO_FILE *, _IO_off64_t, int) __THROW;
 extern int _IO_default_sync (_IO_FILE *) __THROW;
@@ -657,16 +654,14 @@ extern int _IO_vsnprintf (char *string, 
 			  __const char *format, _IO_va_list args) __THROW;
 
 
-extern _IO_size_t _IO_getline (_IO_FILE *,char *, _IO_size_t, int, int)
-     __THROW;
+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 *) __THROW;
+				    int, int, int *);
 extern _IO_ssize_t _IO_getdelim (char **, _IO_size_t *, int, _IO_FILE *)
      __THROW;
-extern _IO_size_t _IO_getwline (_IO_FILE *,wchar_t *, _IO_size_t, wint_t, int)
-     __THROW;
+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 *) __THROW;
+				     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;
@@ -718,7 +713,7 @@ extern _IO_FILE* _IO_file_attach_interna
 extern _IO_FILE* _IO_file_fopen_internal (_IO_FILE *, const char *,
 					  const char *, int) __THROW;
 extern _IO_ssize_t _IO_file_read_internal (_IO_FILE *, void *,
-					   _IO_ssize_t) __THROW;
+					   _IO_ssize_t);
 extern int _IO_file_sync_internal (_IO_FILE *) __THROW;
 extern _IO_off64_t _IO_file_seek_internal (_IO_FILE *, _IO_off64_t, int)
      __THROW;
@@ -747,20 +742,18 @@ extern void _IO_link_in_internal (struct
 extern int _IO_sputbackc_internal (_IO_FILE *, int) __THROW;
 extern void _IO_wdoallocbuf_internal (_IO_FILE *) __THROW;
 
-extern _IO_size_t _IO_sgetn_internal (_IO_FILE *, void *, _IO_size_t) __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 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)
-     __THROW;
-extern int _IO_do_write_internal (_IO_FILE *, const char *, _IO_size_t)
-     __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_size_t _IO_getline_info_internal (_IO_FILE *,char *, _IO_size_t,
-					     int, int, int *) __THROW;
+					     int, int, int *);
 extern _IO_size_t _IO_getline_internal (_IO_FILE *, char *, _IO_size_t, int,
-					int) __THROW;
+					int);
 extern void _IO_free_wbackup_area_internal (_IO_FILE *) __THROW;
 extern void _IO_free_backup_area_internal (_IO_FILE *) __THROW;
 extern void _IO_switch_to_wbackup_area_internal (_IO_FILE *) __THROW;
@@ -771,7 +764,7 @@ extern int _IO_vfscanf_internal (_IO_FIL
 				 const char * __restrict,
 				 _IO_va_list, int *__restrict);
 extern int _IO_vfprintf_internal (_IO_FILE *__restrict, const char *__restrict,
-				  _IO_va_list) __THROW;
+				  _IO_va_list);
 extern void _IO_doallocbuf_internal (_IO_FILE *) __THROW;
 extern void _IO_wsetb_internal (_IO_FILE *, wchar_t *, wchar_t *, int)
      __THROW;
@@ -779,7 +772,7 @@ extern _IO_off64_t _IO_seekoff_unlocked 
      attribute_hidden __THROW;
 extern _IO_off64_t _IO_seekpos_unlocked (_IO_FILE *, _IO_off64_t, int)
      attribute_hidden __THROW;
-extern int _IO_putc_internal (int __c, _IO_FILE *__fp) __THROW;
+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;
 
@@ -871,10 +864,10 @@ extern void _IO_un_link_internal (struct
 # define OS_FSTAT fstat
 #endif
 struct stat;
-extern _IO_ssize_t _IO_read (int, void *, _IO_size_t) __THROW;
-extern _IO_ssize_t _IO_write (int, const void *, _IO_size_t) __THROW;
+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) __THROW;
+extern int _IO_close (int);
 extern int _IO_fstat (int, struct stat *) __THROW;
 extern int _IO_vscanf (const char *, _IO_va_list) __THROW;
 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]