about summary refs log tree commit diff
path: root/scripts/gen-conf.awk
diff options
context:
space:
mode:
authorSiddhesh Poyarekar <siddhesh@redhat.com>2014-10-01 14:36:03 +0530
committerSiddhesh Poyarekar <siddhesh@redhat.com>2014-12-15 11:03:33 +0530
commit41868acc3a55bad110e79a7a40c030b39c5480bb (patch)
tree9153591b1d908064b0533a33abb65bad7f99f3f3 /scripts/gen-conf.awk
parent67cf3c6ed0b1119bbddc1c6f46af486fc1ad2432 (diff)
downloadglibc-41868acc3a55bad110e79a7a40c030b39c5480bb.tar.gz
glibc-41868acc3a55bad110e79a7a40c030b39c5480bb.tar.xz
glibc-41868acc3a55bad110e79a7a40c030b39c5480bb.zip
Use conf.list to generate spec array siddhesh/posix-wundef
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.
Diffstat (limited to 'scripts/gen-conf.awk')
-rw-r--r--scripts/gen-conf.awk26
1 files changed, 26 insertions, 0 deletions
diff --git a/scripts/gen-conf.awk b/scripts/gen-conf.awk
index 45a4d44333..1370646f58 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"
 }