[4/4,v1.1] Use conf.list to generate spec array
Commit Message
This patch also had to be updated due to 1/4 to update the comment in
conf.list. Tested on x86_64.
Siddhesh
commit 218aad6c5df66ad432b9083db7e3f0cb4da686d6
Author: Siddhesh Poyarekar <siddhesh@redhat.com>
Date: Wed Oct 1 14:36:03 2014 +0530
Use conf.list to generate spec array
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.
Comments
> +SPEC:XBS5:_SC_XBS5 {
As I mentioned in 1/4, just use whitespace as separator.
It simplifies the awk code.
> + print "static const int nspecs = sizeof (specs) / sizeof (specs[0]);"
I know you are just reproducing what the current source has.
But this should be size_t and the loop referring to it changed too.
Otherwise OK.
Thanks,
Roland
On Wed, Dec 17, 2014 at 04:48:31PM -0800, Roland McGrath wrote:
> I know you are just reproducing what the current source has.
> But this should be size_t and the loop referring to it changed too.
I pushed it as a separate change.
Siddhesh
@@ -1,7 +1,8 @@
# Configuration variables identified by getconf. The heading of each section
-# is of the format TYPE:PREFIX with the opening curly brace on the same line.
-# TYPE can either be SYSCONF, PATHCONF, CONFSTR or SPEC. Variable names are
-# put one on each line with a curly brace on its own line ending the section.
+# is of the format TYPE:PREFIX:SC_PREFIX with the opening curly brace on the
+# same line. TYPE can either be SYSCONF, PATHCONF, CONFSTR or SPEC. In the
+# absence of SC_PREFIX, _SC is used as the SC_PREFIX. Variable names are put
+# one on each line with a curly brace on its own line ending the section.
SPEC:POSIX {
V6_ILP32_OFF32
@@ -103,7 +104,7 @@ SYSCONF:POSIX {
RAW_SOCKETS
}
-SPEC:XBS5 {
+SPEC:XBS5:_SC_XBS5 {
ILP32_OFF32
ILP32_OFFBIG
LP64_OFF64
@@ -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.
@@ -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;
@@ -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)
@@ -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"
}
@@ -31,6 +31,7 @@
#include <sys/types.h>
#include <regex.h>
+#define NEED_SPEC_ARRAY 0
#include <confdefs.h>