Use posix-conf-vars.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 posix-conf-vars.list
once the remaining macros are added to it.

	* posix/posix-conf-vars.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-posix-conf-vars.awk: Support generation of specs
	array.
This commit is contained in:
Siddhesh Poyarekar 2014-12-29 17:40:47 +05:30
parent 3b566046c3
commit 50cbbaa935
7 changed files with 49 additions and 22 deletions

View File

@ -1,5 +1,14 @@
2014-12-29 Siddhesh Poyarekar <siddhesh@redhat.com> 2014-12-29 Siddhesh Poyarekar <siddhesh@redhat.com>
* posix/posix-conf-vars.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-posix-conf-vars.awk: Support generation of specs
array.
* posix/posix-conf-vars.list: Add _POSIX sysconf namespace. * posix/posix-conf-vars.list: Add _POSIX sysconf namespace.
* sysdeps/posix/sysconf.c: Include posix-conf-vars.h. * sysdeps/posix/sysconf.c: Include posix-conf-vars.h.
(__sysconf): Use CONF_IS_* macros. (__sysconf): Use CONF_IS_* macros.

View File

@ -21,6 +21,8 @@
#include <string.h> #include <string.h>
#include <confstr.h> #include <confstr.h>
#include "../version.h" #include "../version.h"
#define NEED_SPEC_ARRAY 0
#include <posix-conf-vars.h> #include <posix-conf-vars.h>
/* If BUF is not NULL and LEN > 0, fill in at most LEN - 1 bytes /* If BUF is not NULL and LEN > 0, fill in at most LEN - 1 bytes

View File

@ -26,6 +26,9 @@
#include "../version.h" #include "../version.h"
#define PACKAGE _libc_intl_domainname #define PACKAGE _libc_intl_domainname
#define NEED_SPEC_ARRAY 1
#include <posix-conf-vars.h>
struct conf struct conf
{ {
const char *name; 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; extern const char *__progname;

View File

@ -1,7 +1,8 @@
# Configuration variables identified by getconf. The heading of each section # 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. # is of the format TYPE PREFIX SC_PREFIX with the opening curly brace on the
# TYPE can either be SYSCONF, PATHCONF, CONFSTR or SPEC. Variable names are # same line. TYPE can either be SYSCONF, PATHCONF, CONFSTR or SPEC. In the
# put one on each line with a curly brace on its own line ending the section. # 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 { SPEC POSIX {
V6_ILP32_OFF32 V6_ILP32_OFF32
@ -104,7 +105,7 @@ SYSCONF POSIX {
RAW_SOCKETS RAW_SOCKETS
} }
SPEC XBS5 { SPEC XBS5 _SC_XBS5 {
ILP32_OFF32 ILP32_OFF32
ILP32_OFFBIG ILP32_OFFBIG
LP64_OFF64 LP64_OFF64

View File

@ -42,6 +42,7 @@
defined. These are called with arguments V5, V6, V7 before and defined. These are called with arguments V5, V6, V7 before and
after the relevant groups of environments. */ after the relevant groups of environments. */
#define NEED_SPEC_ARRAY 0
#include <posix-conf-vars.h> #include <posix-conf-vars.h>
START_ENV_GROUP (V7) START_ENV_GROUP (V7)

View File

@ -15,12 +15,19 @@ $1 ~ /^#/ || $0 ~ /^\s*$/ {
$NF == "{" { $NF == "{" {
type = $1 type = $1
prefix = $2 prefix = $2
if (NF == 4)
sc_prefix = $3
else
sc_prefix = "_SC"
next next
} }
$1 == "}" { $1 == "}" {
prefix = "" prefix = ""
type = "" type = ""
sc_prefix = ""
next next
} }
@ -35,6 +42,7 @@ $1 == "}" {
# CONFSTR: A configuration string # CONFSTR: A configuration string
# SYSCONF: A numeric value # SYSCONF: A numeric value
# SPEC: A specification # SPEC: A specification
sc_prefixes[prefix][$1] = sc_prefix
conf[prefix][$1] = type conf[prefix][$1] = type
} }
@ -56,6 +64,26 @@ END {
printf "# endif\n" printf "# endif\n"
} }
printf "#endif\n\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 posix-conf-vars.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"
} }

View File

@ -31,9 +31,9 @@
#include <sys/types.h> #include <sys/types.h>
#include <regex.h> #include <regex.h>
#define NEED_SPEC_ARRAY 0
#include <posix-conf-vars.h> #include <posix-conf-vars.h>
#define NEED_CHECK_SPEC \ #define NEED_CHECK_SPEC \
(!defined _XBS5_ILP32_OFF32 || !defined _XBS5_ILP32_OFFBIG \ (!defined _XBS5_ILP32_OFF32 || !defined _XBS5_ILP32_OFFBIG \
|| !defined _XBS5_LP64_OFF64 || !defined _XBS5_LPBIG_OFFBIG \ || !defined _XBS5_LP64_OFF64 || !defined _XBS5_LPBIG_OFFBIG \