From bf7aa82eab0f1f9c78d39cf57a3f6b25eefc47c1 Mon Sep 17 00:00:00 2001 From: Zack Weinberg Date: Thu, 22 Jun 2017 18:06:15 -0400 Subject: Make error_t always int; make __errno_location return an __error_t. error_t is a Hurdism whose purpose, as far as I know, is to make it so you can get GDB to tell you the E-constant corresponding to the current value of errno by typing 'p (error_t) errno'. I tried to generalize this to all platforms a few weeks ago and it was suggested to me that this is maybe a job for a GDB pretty-printer, instead. This patch clears the ground for that, by removing the Hurd-specific definition of error_t. error_t is also used to make the return values of a few GNU extension functions (in argp.h and argz.h) a little more self-documenting, so it can't completely go away, and it will be useful to be able to write 'p (error_t) err' where err is some ordinary int variable that happens to have an errno value stashed in it. So now stdlib/errno.h defines it and it's always just a typedef for 'int'. This patch also changes all definitions of __errno_location and the underlying thread-local errno to have type __error_t instead of int. __error_t is also just a typedef for int, but this is how we will cue the GDB pretty-printer to print errno specially. I believe that this does not have any standards-compliance consequences, because it's just a typedef for int. This part of the change doesn't make sense in the absence of the pretty-printer itself, but this split-up seemed more useful to reviewers. * stdlib/errno.h (__error_t): New type (typedef as int). (__errno_location): Declare as returning __error_t. (error_t): Typedef as __error_t, if not already defined. * csu/errno-loc.c, csu/errno.c, include/errno.h * sysdeps/mach/hurd/dl-sysdep.c, sysdeps/mach/hurd/errno-loc.c: Change type of errno, __libc_errno, and rtld_errno, and return type of __errno_location to __error_t. * sysdeps/mach/hudr/errnos.awk: Do not emit enum __error_t_codes or a definition of error_t. * sysdeps/mach/hurd/bits/errno.h: Regenerate. * sysdeps/mach/hurd/errno.c: Delete file. * bits/errno.h: Update commentary. --- sysdeps/mach/hurd/errnos.awk | 107 ++++++++++++------------------------------- 1 file changed, 29 insertions(+), 78 deletions(-) (limited to 'sysdeps/mach/hurd/errnos.awk') diff --git a/sysdeps/mach/hurd/errnos.awk b/sysdeps/mach/hurd/errnos.awk index 1fdca40d38..c5d33b5d8f 100644 --- a/sysdeps/mach/hurd/errnos.awk +++ b/sysdeps/mach/hurd/errnos.awk @@ -15,31 +15,18 @@ # License along with the GNU C Library; if not, see # . -# errno.texinfo contains lines like: -# @errno{ENOSYS, 123, Function not implemented} +# Generate bits/errno.h from errnos.texi and a number of Mach headers. +# This script must be kept in sync with stdlib/make-errno-constants.awk +# and hurd-add-errno-constants.awk. BEGIN { - print "/* This file generated by errnos.awk from"; - for (i = 1; i < ARGC; i++) - { - arg = ARGV[i]; - sub(/.*(manual|include)\//, "", arg) - print " " arg; - } - print " Do not edit this file; edit errnos.awk and regenerate it. */"; - print ""; - print "#ifndef _BITS_ERRNO_H"; - print "#define _BITS_ERRNO_H 1"; - print ""; - print "#if !defined _ERRNO_H"; - print "# error \"Never include directly; use instead.\""; - print "#endif"; - - maxerrno = 0; - maxerrlen = 0; - in_mach_errors = ""; - seq = 0; - } + maxerrno = 0; + maxerrlen = 0; + in_mach_errors = ""; + in_mig_errors = 0; + in_device_errors = 0; + seq = 0; +} /^@errno\{/ \ { @@ -147,73 +134,37 @@ in_device_errors && $1 == "#endif" \ in_device_errors = 0; } -function print_errno_enum(maxseq) -{ - print ""; - print "#ifndef __ASSEMBLER__"; - print ""; - print "enum __error_t_codes"; - print "{"; - print " /* The value zero always means success and it is perfectly fine"; - print " for code to use 0 explicitly (or implicitly, e.g. via Boolean"; - print " coercion.) Having an enum entry for zero both makes the"; - print " debugger print the name for error_t-typed zero values, and"; - print " prevents the compiler from issuing warnings about 'case 0:'"; - print " in a switch on an error_t-typed value. */"; - printf(" %-*s = 0,\n", maxerrlen, "ESUCCESS"); - - print ""; - print " /* The Hurd uses Mach error system 0x10, subsystem 0. */"; - for (i = 0; i < maxseq; i++) +END { + print "/* This file generated by errnos.awk from"; + for (i = 1; i < ARGC; i++) { - if (i in annot) - print annot[i]; - else if (i in etexts && etexts[i] != "") - printf(" %-*s = %s,\t/* %s */\n", - maxerrlen, econsts[i], errnos[i], etexts[i]); - else if (errnos[i] != "EAGAIN") - printf(" %-*s = %s,\n", maxerrlen, econsts[i], errnos[i]); + arg = ARGV[i]; + sub(/.*(manual|include)\//, "", arg) + print " " arg; } - - print ""; - print " /* Because the C standard requires that errno have type 'int'," - print " this enumeration must be a signed type. */"; - print " __FORCE_ERROR_T_CODES_SIGNED = -1"; - print "};"; + print " Do not edit this file; edit errnos.awk and regenerate it. */"; print ""; - print "/* User-visible type of error codes. It is ok to use 'int' or"; - print " 'kern_return_t' for these, but with 'error_t' the debugger prints"; - print " symbolic values. */"; - print "# if !defined __error_t_defined && defined __USE_GNU"; - print "# define __error_t_defined 1"; - print "typedef enum __error_t_codes error_t;" - print "# endif"; + print "#ifndef _BITS_ERRNO_H"; + print "#define _BITS_ERRNO_H 1"; print ""; - print "#endif /* not __ASSEMBLER__ */"; -} - -function print_errno_defines(maxseq) -{ + print "#if !defined _ERRNO_H"; + print "# error \"Never include directly; use instead.\""; + print "#endif"; print ""; - print "/* The C standard requires that all of the E-constants be" - print " defined as macros. */" + print "/* The Hurd uses Mach error system 0x10, subsystem 0. */"; print ""; - for (i = 0; i < maxseq; i++) + for (i = 0; i < seq; i++) { if (i in annot) print annot[i]; + else if (i in etexts && etexts[i] != "") + printf("#define %-*s %s\t/* %s */\n", + maxerrlen, econsts[i], errnos[i], etexts[i]); else printf("#define %-*s %s\n", maxerrlen, econsts[i], errnos[i]); } print ""; printf("#define _HURD_ERRNOS %d\n", maxerrno+1); + print ""; + print "#endif /* bits/errno.h. */"; } - -END \ - { - print_errno_enum(seq); - print_errno_defines(seq); - - print ""; - print "#endif /* bits/errno.h. */"; - } -- cgit 1.4.1