diff options
author | Eric Andersen <andersen@codepoet.org> | 2003-11-05 07:08:20 +0000 |
---|---|---|
committer | Eric Andersen <andersen@codepoet.org> | 2003-11-05 07:08:20 +0000 |
commit | ae5a2970eff8806dcfac05953e78077b4ef82dbf (patch) | |
tree | 735da4d704da6a2fc0c3b4d19ca7ef2bae585603 /libc | |
parent | 4d1abac54cfba89a15ac9e21824600f05affe79e (diff) |
Rip the guts out of the dynamically generated sysconf.c, and live with a simple
static version. This will need further work later on, but should do the job for
the time being,
Diffstat (limited to 'libc')
-rw-r--r-- | libc/unistd/.cvsignore | 2 | ||||
-rw-r--r-- | libc/unistd/Makefile | 61 | ||||
-rw-r--r-- | libc/unistd/sysconf.c | 162 |
3 files changed, 4 insertions, 221 deletions
diff --git a/libc/unistd/.cvsignore b/libc/unistd/.cvsignore deleted file mode 100644 index dba071497..000000000 --- a/libc/unistd/.cvsignore +++ /dev/null @@ -1,2 +0,0 @@ -sysconf_*.c -gen_sysconf diff --git a/libc/unistd/Makefile b/libc/unistd/Makefile index a8d974734..2ab770cab 100644 --- a/libc/unistd/Makefile +++ b/libc/unistd/Makefile @@ -1,7 +1,6 @@ # Makefile for uClibc # -# Copyright (C) 2000 by Lineo, inc. -# Copyright (C) 2000,2001 Erik Andersen <andersen@uclibc.org> +# Copyright (C) 2000-2003 Erik Andersen <andersen@uclibc.org> # # This program is free software; you can redistribute it and/or modify it under # the terms of the GNU Library General Public License as published by the Free @@ -16,17 +15,13 @@ # You should have received a copy of the GNU Library General Public License # along with this program; if not, write to the Free Software Foundation, Inc., # 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# Derived in part from the Linux-8086 C library, the GNU C Library, and several -# other sundry sources. Files within this library are copyright by their -# respective copyright holders. TOPDIR=../../ include $(TOPDIR)Rules.mak DIRS:= CSRC=execl.c execlp.c execv.c execvep.c execvp.c execle.c \ - sleep.c usleep.c getpass.c sysconf_src.c getlogin.c \ + sleep.c usleep.c getpass.c sysconf.c getlogin.c \ fpathconf.c confstr.c pathconf.c swab.c usershell.c \ getsubopt.c ifeq ($(strip $(UCLIBC_HAS_MMU)),y) @@ -38,13 +33,6 @@ else CSRC += getopt-susv3.c endif -# TESTING -- comment this out if it breaks for you -ifeq ($(TARGET_ARCH), $(HOST_ARCH)) - SYSCONF = sysconf_native -else - SYSCONF = sysconf_$(TARGET_ARCH).c -endif - COBJS=$(patsubst %.c,%.o, $(CSRC)) OBJS=$(COBJS) @@ -55,47 +43,6 @@ $(LIBC): ar-target subdirs ar-target: $(OBJS) $(AR) $(ARFLAGS) $(LIBC) $(OBJS) -# We are cross-compiling so use the generic sysconf.c. -sysconf_$(TARGET_ARCH).c: sysconf.c - @echo warning: sysconf_$(HOST_ARCH).c is older then sysconf.c so using generic sysconf.c - @echo To build sysconf_$(HOST_ARCH).c run gen_sysconf \> sysconf_$(HOST_ARCH).c on - @echo your target platform, place in the unistd directory, and rebuild - cp -f sysconf.c sysconf_$(TARGET_ARCH).c - -# We are compiling for the native platform, so build an optimized sysconf.c. -getpagesize_tester.o: - $(CC) $(CFLAGS) -D_UCLIBC_GENERATE_SYSCONF_ARCH \ - -c ../sysdeps/linux/common/getpagesize.c -o getpagesize_tester.o - -sysconf_tester.o: sysconf.c - $(CC) $(CFLAGS) -D_UCLIBC_GENERATE_SYSCONF_ARCH -c sysconf.c \ - -o sysconf_tester.o - -gen_sysconf_tester.o: sysconf_tester.o getpagesize_tester.o - @ld -r -o gen_sysconf_tester.o sysconf_tester.o getpagesize_tester.o - @if nm -s gen_sysconf_tester.o | grep -v "U errno" | grep " U "; then \ - set -e -x; \ - echo warning: missing symbols in gen_sysconf_tester.o so using generic sysconf.c ;\ - cp -f sysconf.c sysconf_src.c ;\ - else \ - set -e -x; \ - if ../extra/gcc-uClibc/gcc-uClibc-$(HOST_ARCH) -static \ - -D_UCLIBC_GENERATE_SYSCONF_MAIN sysconf.c sysconf_tester.o \ - -o gen_sysconf && ./gen_sysconf > sysconf_$(HOST_ARCH).c ;\ - then \ - echo successfully built sysconf_$(HOST_ARCH).c ;\ - else \ - echo warning: build of gen_sysconf failed so using generic sysconf.c ;\ - cp -f sysconf.c sysconf_$(HOST_ARCH).c ;\ - fi ;\ - fi - -sysconf_native: gen_sysconf_tester.o - -sysconf_src.c: sysconf_$(TARGET_ARCH).c - cp -f sysconf_$(TARGET_ARCH).c sysconf_src.c - - $(COBJS): %.o : %.c $(CC) $(CFLAGS) -c $< -o $@ $(STRIPTOOL) -x -R .note -R .comment $*.o @@ -111,9 +58,9 @@ $(patsubst %, _dir_%, $(DIRS)) : dummy $(patsubst %, _dirclean_%, $(DIRS)) : dummy $(MAKE) -C $(patsubst _dirclean_%, %, $@) clean -.PHONY: dummy sysconf_native +.PHONY: dummy dummy: clean: - $(RM) *.[oa] *~ core gen_sysconf sysconf_*.c + $(RM) *.[oa] *~ core diff --git a/libc/unistd/sysconf.c b/libc/unistd/sysconf.c index 3aa03ea49..daf0e6144 100644 --- a/libc/unistd/sysconf.c +++ b/libc/unistd/sysconf.c @@ -47,7 +47,6 @@ extern int getdtablesize (void); * repeats and moving to a table-based implementation, we generate 283 * bytes on i386 (-Os -fomit-frame-pointer). */ -#ifndef _UCLIBC_GENERATE_SYSCONF_MAIN #ifdef _UCLIBC_GENERATE_SYSCONF_ARCH /* @@ -900,164 +899,3 @@ long int __sysconf(int name) } weak_alias(__sysconf, sysconf); -#endif /* _UCLIBC_GENERATE_SYSCONF_MAIN */ -/***********************************************************************/ -#ifdef _UCLIBC_GENERATE_SYSCONF_MAIN - -static long int ret_vals[_UCLIBC_SYSCONF_NUM_VALID_ARGS]; - -static const char *type_str[] = { - "char", "short", "int", "long" -}; - -static const char *type_fmt[] = { " %4ld", " %6ld", " %8ld", " %8ld" }; -static const int type_mod[] = { 13, 9, 6, 6 }; - -static int find_or_add_in_table(int index, long int val, int *table, - int *num_in_table, int add_flag) -{ - int i; - - for (i=0 ; i<*num_in_table ; i++) { - if (ret_vals[table[i]] == val) { - return i; - } - } - if (add_flag) { - table[(*num_in_table)++] = index; - return i; - } else { - return -1; - } -} - - -int main(void) -{ - long int r; - int type_table[5][_UCLIBC_SYSCONF_NUM_VALID_ARGS]; - int ret_type[_UCLIBC_SYSCONF_NUM_VALID_ARGS]; - int num_type[5]; - int i, j, k, code; - - for (i=0 ; i<5 ; i++) { - num_type[i] = 0; - } - - for (i=0; i<_UCLIBC_SYSCONF_NUM_VALID_ARGS ; i++) { - __set_errno(0); - r = ret_vals[i] = sysconf(i); - switch(errno) { - case EINVAL: /* we're missing a case! */ - fprintf(stderr,"sysconf.c is broken! case %d missing!\n", i); - return EXIT_FAILURE; - case EISNAM: /* function */ - find_or_add_in_table(i,r,type_table[4],num_type+4,1); - ret_type[i] = 4; - break; - case ENOSYS: /* defaults to -1 */ - /* why does this break for shared???? */ - fprintf(stderr,"gen_sysconf advisory --" - "case %d defaults to -1\n", i); - /* fall through */ - case 0: - if ((r>=CHAR_MIN) && (r<=CHAR_MAX)) { - ret_type[i] = 0; - find_or_add_in_table(i,r,type_table[0],num_type+0,1); - } else if ((r>=SHRT_MIN) && (r<=SHRT_MAX)) { - ret_type[i] = 1; - find_or_add_in_table(i,r,type_table[1],num_type+1,1); - } else if ((r>=INT_MIN) && (r<=INT_MAX)) { - ret_type[i] = 2; - find_or_add_in_table(i,r,type_table[2],num_type+2,1); - } else { - ret_type[i] = 3; - find_or_add_in_table(i,r,type_table[3],num_type+3,1); - } - break; - default: - fprintf(stderr,"sysconf.c is broken! errno = %d!\n", errno); - break; - } - } - - printf("#include <errno.h>\n#include <unistd.h>\n#include <limits.h>\n\n"); - - printf("static const unsigned char index[%d] = {", - _UCLIBC_SYSCONF_NUM_VALID_ARGS); - for (i=0 ; i<_UCLIBC_SYSCONF_NUM_VALID_ARGS ; i++) { - if (i) printf(","); - if (i%15 == 0) printf("\n"); - code = 0; - for (j=0 ; j<4 ; j++) { - k = find_or_add_in_table(i,ret_vals[i],type_table[j],num_type+j,0); - if (k>=0) { - code += k; - break; - } - code += num_type[j]; - } - printf(" %3d", code); - } - printf("\n};\n\n"); - - for (j=0 ; j < 4 ; j++) { - if (num_type[j]) { - printf("static const %s %s_vals[%d] = {", - type_str[j], type_str[j], num_type[j]); - for (i = 0 ; i<num_type[j] ; i++) { - if (i) printf(","); - if (i%13 == 0) printf("\n"); - if (ret_vals[type_table[j][i]] == INT_MIN) { - printf("%12s","INT_MIN"); - } else { - printf(type_fmt[j], ret_vals[type_table[j][i]]); - } - - } - printf("\n};\n\n"); - } - } - - printf("long int sysconf(int name)\n{\n\tint i;\n\n" - "\tif ((name < 0) || (name >= %d)) {\n" - "\t\terrno=EINVAL;\n" - "\t\treturn -1;\n" - "\t}\n\n", _UCLIBC_SYSCONF_NUM_VALID_ARGS); - - printf("\ti = index[name];\n\n"); - k = 0; - for (i=0 ; i<4 ; i++) { - if (num_type[i]) { - if (k>0) { - printf("\ti -= %d;\n", k); - } - printf("\tif (i < %d) {\n" - "\t\treturn %s_vals[i];\n" - "\t}\n\n", - num_type[i], type_str[i]); - k = num_type[i]; - } - } - - if (num_type[4]) { - if (k>0) { - printf("\ti -= %d;\n", k); - } - printf("\tswitch(i) {\n"); - for (i = 0 ; i<num_type[4] ; i++) { - printf("\t\tcase %d:\n" - "\t\t\treturn %s;\n", - i, (const char *)ret_vals[type_table[4][i]]); - } - printf("\t}\n\n"); - } - - printf("\treturn -1;\n" - "}\n"); - - - return EXIT_SUCCESS; -} -/***********************************************************************/ -#endif |