[4/4] Use conf.list to generate spec array
diff mbox

Message ID 1411122007-1461-5-git-send-email-siddhesh@redhat.com
State New
Headers show

Commit Message

Siddhesh Poyarekar Sept. 19, 2014, 10:20 a.m. UTC
This patch adds support to generate the spec array in getconf from the
conf.list.  The generated code is mostly unchanged.  the only changes
are due to the change in layout of the spec and val arrays in the ELF.

The val array can also be auto-generated from conf.list once the
remaining macros are added to it.

	* posix/conf.list (SPEC:XBS5): Add sysconf prefix.
	* posix/confstr.c: Define NEED_SPEC_ARRAY to 0.
	* posix/posix-envs.def: Likewise.
	* sysdeps/posix/sysconf.c: Likewise.
	* posix/getconf.c: Define NEED_SPEC_ARRAY to 1.
	(specs): Remove array.
	* scripts/gen-conf.awk: Support generation of specs array.
---
 posix/conf.list         |  2 +-
 posix/confstr.c         |  4 +++-
 posix/getconf.c         | 20 +++-----------------
 posix/posix-envs.def    |  3 ++-
 scripts/gen-conf.awk    | 26 ++++++++++++++++++++++++++
 sysdeps/posix/sysconf.c |  1 +
 6 files changed, 36 insertions(+), 20 deletions(-)

Patch
diff mbox

diff --git a/posix/conf.list b/posix/conf.list
index 07607b7..0a17666 100644
--- a/posix/conf.list
+++ b/posix/conf.list
@@ -104,7 +104,7 @@  SYSCONF:POSIX {
   RAW_SOCKETS
 }
 
-SPEC:XBS5 {
+SPEC:XBS5:_SC_XBS5 {
   ILP32_OFF32
   ILP32_OFFBIG
   LP64_OFF64
diff --git a/posix/confstr.c b/posix/confstr.c
index 1accfee..0400d7f 100644
--- a/posix/confstr.c
+++ b/posix/confstr.c
@@ -21,7 +21,9 @@ 
 #include <string.h>
 #include <confstr.h>
 #include "../version.h"
-#include "confdefs.h"
+
+#define NEED_SPEC_ARRAY 0
+#include <confdefs.h>
 
 /* If BUF is not NULL and LEN > 0, fill in at most LEN - 1 bytes
    of BUF with the value corresponding to NAME and zero-terminate BUF.
diff --git a/posix/getconf.c b/posix/getconf.c
index 14d51d8..3c08688 100644
--- a/posix/getconf.c
+++ b/posix/getconf.c
@@ -26,6 +26,9 @@ 
 #include "../version.h"
 #define PACKAGE _libc_intl_domainname
 
+#define NEED_SPEC_ARRAY 1
+#include <confdefs.h>
+
 struct conf
   {
     const char *name;
@@ -387,23 +390,6 @@  static const struct conf vars[] =
   };
 
 
-static const struct { const char *name; int num; } specs[] =
-  {
-    { "XBS5_ILP32_OFF32", _SC_XBS5_ILP32_OFF32 },
-    { "XBS5_ILP32_OFFBIG", _SC_XBS5_ILP32_OFFBIG },
-    { "XBS5_LP64_OFF64", _SC_XBS5_LP64_OFF64 },
-    { "XBS5_LPBIG_OFFBIG", _SC_XBS5_LPBIG_OFFBIG },
-    { "POSIX_V6_ILP32_OFF32", _SC_V6_ILP32_OFF32 },
-    { "POSIX_V6_ILP32_OFFBIG", _SC_V6_ILP32_OFFBIG },
-    { "POSIX_V6_LP64_OFF64", _SC_V6_LP64_OFF64 },
-    { "POSIX_V6_LPBIG_OFFBIG", _SC_V6_LPBIG_OFFBIG },
-    { "POSIX_V7_ILP32_OFF32", _SC_V7_ILP32_OFF32 },
-    { "POSIX_V7_ILP32_OFFBIG", _SC_V7_ILP32_OFFBIG },
-    { "POSIX_V7_LP64_OFF64", _SC_V7_LP64_OFF64 },
-    { "POSIX_V7_LPBIG_OFFBIG", _SC_V7_LPBIG_OFFBIG },
-  };
-static const int nspecs = sizeof (specs) / sizeof (specs[0]);
-
 extern const char *__progname;
 
 
diff --git a/posix/posix-envs.def b/posix/posix-envs.def
index 9047d0c..0b33e02 100644
--- a/posix/posix-envs.def
+++ b/posix/posix-envs.def
@@ -42,7 +42,8 @@ 
    defined.  These are called with arguments V5, V6, V7 before and
    after the relevant groups of environments.  */
 
-#include "confdefs.h"
+#define NEED_SPEC_ARRAY 0
+#include <confdefs.h>
 
 START_ENV_GROUP (V7)
 
diff --git a/scripts/gen-conf.awk b/scripts/gen-conf.awk
index 45a4d44..1370646 100644
--- a/scripts/gen-conf.awk
+++ b/scripts/gen-conf.awk
@@ -17,12 +17,17 @@  $2 == "{" {
   split ($1, arr, ":")
   type = arr[1]
   prefix = arr[2]
+  if (arr[3] != "")
+    sc_prefix = arr[3]
+  else
+    sc_prefix = "_SC"
   next
 }
 
 $1 == "}" {
   prefix = ""
   type = ""
+  sc_prefix = ""
   next
 }
 
@@ -37,6 +42,7 @@  $1 == "}" {
   # CONFSTR: A configuration string
   # SYSCONF: A numeric value
   # SPEC: A specification
+  sc_prefixes[prefix][$1] = sc_prefix
   conf[prefix][$1] = type
 }
 
@@ -58,6 +64,26 @@  ENDFILE {
 	printf "# endif\n"
       }
       printf "#endif\n\n"
+
+      # Build a name -> sysconf number associative array to print a C array at
+      # the end.
+      if (conf[p][c] == "SPEC") {
+	name = sprintf ("%s_%s", p, c)
+	num = sprintf ("%s_%s", sc_prefixes[p][c], c)
+	spec[name] = num
+      }
     }
   }
+
+  # Print the specification array.  Define the macro NEED_SPEC_ARRAY before
+  # including confdefs.h to make it available in the compilation unit.
+  print "#if NEED_SPEC_ARRAY"
+  print "static const struct { const char *name; int num; } specs[] ="
+  print "  {"
+  for (s in spec) {
+    printf "    { \"%s\", %s },\n", s, spec[s]
+  }
+  print "  };"
+  print "static const int nspecs = sizeof (specs) / sizeof (specs[0]);"
+  print "#endif"
 }
diff --git a/sysdeps/posix/sysconf.c b/sysdeps/posix/sysconf.c
index c7b748b..bff59f4 100644
--- a/sysdeps/posix/sysconf.c
+++ b/sysdeps/posix/sysconf.c
@@ -31,6 +31,7 @@ 
 #include <sys/types.h>
 #include <regex.h>
 
+#define NEED_SPEC_ARRAY 0
 #include <confdefs.h>