diff mbox

[ping3,03/19,v2] Auto-generate libc-modules.h

Message ID 20141001081750.GH2217@spoyarek.pnq.redhat.com
State New
Headers show

Commit Message

Siddhesh Poyarekar Oct. 1, 2014, 8:17 a.m. UTC
Rebased against current master and verified that the generated code is
still unchanged.

Siddhesh

commit 33724079bde7aca8149fa9c2831578041cf7da03
Author: Siddhesh Poyarekar <siddhesh@redhat.com>
Date:   Thu Aug 21 11:44:54 2014 +0530

    Auto-generate libc-modules.h
    
    Remove libc-modules.h from the tree and auto-generate it from
    soversions.i and a new file build.list.  Macros generated from
    soversions.i have lower values starting from 1, while those from
    build.list start from a special value MODULE_OTHER_BEGIN, which has a
    high enough value (1000).  This allows us to conveniently
    differentiate between the versioned libraries and other built modules,
    which is needed in errno.h and netdb.h to decide whether to use an
    internal symbol or an external one.
    
    Verified that generated code remains unchanged on x86_64.
    
    	* Makeconfig (module-cppflags): Include libc-modules.h for
    	everything except shlib-versions.v.i.
    	(CPPFLAGS): Use it.
    	(before-compile): Add libc-modules.h.
    	($(common-objpfx)libc-modules.h,
    	$(common-objpfx)libc-modules.stmp): New targets.
    	(common-generated): Add libc-modules.h and libc-modules.stmp.
    	($(common-objpfx)Versions.v.i): Depend on libc-modules.h.
    	* build.list: New file.
    	* include/libc-symbols.h: Don't include libc-modules.h.
    	* include/libc-modules.h: Remove file.
    	* scripts/gen-libc-modules.awk: New script to generate
    	libc-modules.h.
    	* sysdeps/unix/Makefile ($(common-objpfx)sysd-syscalls):
    	Depend on libc-modules.stmp.

Comments

Siddhesh Poyarekar Oct. 14, 2014, 4:21 p.m. UTC | #1
Ping!

On Wed, Oct 01, 2014 at 01:47:50PM +0530, Siddhesh Poyarekar wrote:
> Rebased against current master and verified that the generated code is
> still unchanged.
> 
> Siddhesh
> 
> commit 33724079bde7aca8149fa9c2831578041cf7da03
> Author: Siddhesh Poyarekar <siddhesh@redhat.com>
> Date:   Thu Aug 21 11:44:54 2014 +0530
> 
>     Auto-generate libc-modules.h
>     
>     Remove libc-modules.h from the tree and auto-generate it from
>     soversions.i and a new file build.list.  Macros generated from
>     soversions.i have lower values starting from 1, while those from
>     build.list start from a special value MODULE_OTHER_BEGIN, which has a
>     high enough value (1000).  This allows us to conveniently
>     differentiate between the versioned libraries and other built modules,
>     which is needed in errno.h and netdb.h to decide whether to use an
>     internal symbol or an external one.
>     
>     Verified that generated code remains unchanged on x86_64.
>     
>     	* Makeconfig (module-cppflags): Include libc-modules.h for
>     	everything except shlib-versions.v.i.
>     	(CPPFLAGS): Use it.
>     	(before-compile): Add libc-modules.h.
>     	($(common-objpfx)libc-modules.h,
>     	$(common-objpfx)libc-modules.stmp): New targets.
>     	(common-generated): Add libc-modules.h and libc-modules.stmp.
>     	($(common-objpfx)Versions.v.i): Depend on libc-modules.h.
>     	* build.list: New file.
>     	* include/libc-symbols.h: Don't include libc-modules.h.
>     	* include/libc-modules.h: Remove file.
>     	* scripts/gen-libc-modules.awk: New script to generate
>     	libc-modules.h.
>     	* sysdeps/unix/Makefile ($(common-objpfx)sysd-syscalls):
>     	Depend on libc-modules.stmp.
> 
> diff --git a/Makeconfig b/Makeconfig
> index 671eceb..5ffbd92 100644
> --- a/Makeconfig
> +++ b/Makeconfig
> @@ -813,10 +813,22 @@ endif	# $(+cflags) == ""
>  # of many little headers in the include directory.
>  libio-include = -I$(..)libio
>  
> +# We don't include libc-modules.h when these targets are being built.  These
> +# targets don't (and will likely never need to) use the IS_IN facility.  In
> +# fact, shlib-versions should not use it because that will create a circular
> +# dependency as libc-modules.h is generated from shlib-versions.
> +skip-module-cppflags = shlib-versions.v.i Versions.v.i
> +
>  in-module = $(strip $(foreach lib,$(libof-$(basename $(@F))) $(libof-$(<F)) \
>  				  $(libof-$(@F)),-DIN_MODULE=MODULE_$(lib)))
>  
>  module-def = $(if $(in-module),$(in-module),-DIN_MODULE=MODULE_libc)
> +module-cppflags-real = -include $(common-objpfx)libc-modules.h $(module-def)
> +
> +# We don't need libc-modules.h and the IN_MODULE definition for
> +# shlib-version.v.i.
> +module-cppflags = $(if $(filter $(@F),$(skip-module-cppflags)), \
> +		       ,$(module-cppflags-real))
>  
>  # These are the variables that the implicit compilation rules use.
>  # Note that we can't use -std=* in CPPFLAGS, because it overrides
> @@ -824,9 +836,9 @@ module-def = $(if $(in-module),$(in-module),-DIN_MODULE=MODULE_libc)
>  # it causes cpp to stop predefining __ASSEMBLER__.
>  CPPFLAGS = $(config-extra-cppflags) $(CPPUNDEFS) $(CPPFLAGS-config) \
>  	   $($(subdir)-CPPFLAGS) \
> -	   $(+includes) $(defines) \
> +	   $(+includes) $(defines) $(module-cppflags) \
>  	   -include $(..)include/libc-symbols.h $(sysdep-CPPFLAGS) \
> -	   $(CPPFLAGS-$(suffix $@)) $(module-def) \
> +	   $(CPPFLAGS-$(suffix $@)) \
>  	   $(foreach lib,$(libof-$(basename $(@F))) \
>  			 $(libof-$(<F)) $(libof-$(@F)),$(CPPFLAGS-$(lib))) \
>  	   $(CPPFLAGS-$(<F)) $(CPPFLAGS-$(@F)) $(CPPFLAGS-$(basename $(@F)))
> @@ -986,6 +998,24 @@ endif
>  postclean-generated += soversions.mk soversions.i \
>  		       shlib-versions.v shlib-versions.v.i
>  
> +before-compile += $(common-objpfx)libc-modules.h
> +ifeq ($(soversions.mk-done),t)
> +# Generate a header with macro definitions for use with the IS_IN macro.
> +# These are the possible values for the IN_MODULE macro defined when building
> +# sources, to identify which module the translation unit is going to be built
> +# into.
> +$(common-objpfx)libc-modules.h: $(common-objpfx)libc-modules.stmp; @:
> +$(common-objpfx)libc-modules.stmp: $(..)scripts/gen-libc-modules.awk \
> +				   $(common-objpfx)soversions.i \
> +				   $(..)build.list
> +	$(AWK) -f $^ > ${@:stmp=T}
> +	$(move-if-change) ${@:stmp=T} ${@:stmp=h}
> +	touch $@
> +
> +endif
> +
> +common-generated += libc-modules.h libc-modules.stmp
> +
>  # The name under which the run-time dynamic linker is installed.
>  # We are currently going for the convention that `/lib/ld.so.1'
>  # names the SVR4/ELF ABI-compliant dynamic linker.
> diff --git a/build.list b/build.list
> new file mode 100644
> index 0000000..eab57c7
> --- /dev/null
> +++ b/build.list
> @@ -0,0 +1,15 @@
> +iconvprogs
> +iconvdata
> +ldconfig
> +lddlibc4
> +libmemusage
> +libSegFault
> +libpcprofile
> +librpcsvc
> +libutil
> +locale_programs
> +memusagestat
> +nonlib
> +nscd
> +extramodules
> +libnldbl
> diff --git a/include/libc-modules.h b/include/libc-modules.h
> deleted file mode 100644
> index d12fb90..0000000
> --- a/include/libc-modules.h
> +++ /dev/null
> @@ -1,37 +0,0 @@
> -#define MODULE_libc		1
> -#define MODULE_libpthread	2
> -#define MODULE_rtld		3
> -#define MODULE_libdl		4
> -#define MODULE_libm		5
> -#define MODULE_iconvprogs	6
> -#define MODULE_iconvdata	7
> -#define MODULE_lddlibc4		8
> -#define MODULE_locale_programs	9
> -#define MODULE_memusagestat	10
> -#define MODULE_libutil		12
> -#define MODULE_libBrokenLocale	13
> -#define MODULE_libmemusage	15
> -#define MODULE_libresolv	16
> -#define MODULE_libnss_db	17
> -#define MODULE_libnss_files	18
> -#define	MODULE_libnss_dns	19
> -#define MODULE_libnss_compat	20
> -#define MODULE_libnss_hesiod	21
> -#define MODULE_libnss_nis	22
> -#define MODULE_libnss_nisplus	23
> -#define MODULE_libanl		24
> -#define MODULE_librt		25
> -#define MODULE_libSegFault	26
> -#define MODULE_libthread_db	27
> -#define MODULE_libcidn		28
> -#define MODULE_libcrypt		29
> -#define MODULE_libnsl		30
> -#define MODULE_libpcprofile	31
> -#define MODULE_librpcsvc	32
> -#define MODULE_nscd		33
> -#define MODULE_ldconfig 	34
> -#define MODULE_libnldbl 	35
> -
> -/* Catch-all for test modules and other binaries.  */
> -#define MODULE_nonlib		98
> -#define MODULE_extramodules	99
> diff --git a/include/libc-symbols.h b/include/libc-symbols.h
> index 131d7eb..9b8208b 100644
> --- a/include/libc-symbols.h
> +++ b/include/libc-symbols.h
> @@ -20,8 +20,6 @@
>  #ifndef _LIBC_SYMBOLS_H
>  #define _LIBC_SYMBOLS_H	1
>  
> -#include "libc-modules.h"
> -
>  #define IS_IN(lib) (IN_MODULE == MODULE_##lib)
>  
>  /* This file's macros are included implicitly in the compilation of every
> diff --git a/scripts/gen-libc-modules.awk b/scripts/gen-libc-modules.awk
> new file mode 100644
> index 0000000..d3382b6
> --- /dev/null
> +++ b/scripts/gen-libc-modules.awk
> @@ -0,0 +1,40 @@
> +# Generate a header file that defines the MODULE_* macros for each library and
> +# module we build in glibc.  The library names are pulled in from soversions.i
> +# and the additional modules are mentioned one-per-line in build.list.
> +BEGIN {
> +  PROCINFO["sorted_in"] = "@val_type_asc"
> +  shlibs = 1
> +  others = 1000
> +  libs["OTHERS_BEGIN"] = others++
> +}
> +
> +# Skip over comments.
> +$1 == "#" {
> +  next
> +}
> +
> +# build.list is simply one module per line.
> +match (FILENAME, ".*build.list") {
> +  libs[$0] = others++
> +}
> +
> +# We have only one special case in soversions.i parsing, which is to replace ld
> +# with rtld since that's what we call it throughout the sources.
> +match (FILENAME, ".*soversions.i") {
> +  name = $2
> +  if (name == "ld")
> +    name = "rtld"
> +
> +  if (!(name in libs)) {
> +    libs[name] = shlibs++
> +  }
> +}
> +
> +# Finally, print out the header file.
> +END {
> +  printf ("/* AUTOGENERATED BY gen-libc-modules.awk, DO NOT EDIT.  */\n\n")
> +  i = 1
> +  for (l in libs) {
> +    printf ("#define MODULE_%s %d\n", l, libs[l])
> +  }
> +}
> diff --git a/sysdeps/unix/Makefile b/sysdeps/unix/Makefile
> index 0e535b6..573e90d 100644
> --- a/sysdeps/unix/Makefile
> +++ b/sysdeps/unix/Makefile
> @@ -79,7 +79,8 @@ compile-syscall = $(COMPILE.S) -o $@ -x assembler-with-cpp - \
>  
>  ifndef avoid-generated
>  $(common-objpfx)sysd-syscalls: $(..)sysdeps/unix/make-syscalls.sh \
> -			       $(wildcard $(+sysdep_dirs:%=%/syscalls.list))
> +			       $(wildcard $(+sysdep_dirs:%=%/syscalls.list)) \
> +			       $(common-objpfx)libc-modules.stmp
>  	for dir in $(+sysdep_dirs); do \
>  	  test -f $$dir/syscalls.list && \
>  	  { sysdirs='$(sysdirs)' \
Roland McGrath Nov. 7, 2014, 11:29 p.m. UTC | #2
I'm not crazy about build.list.  I'd rather it just be a variable in
Makeconfig like subdirs.  You can pass it through to awk with -v.
diff mbox

Patch

diff --git a/Makeconfig b/Makeconfig
index 671eceb..5ffbd92 100644
--- a/Makeconfig
+++ b/Makeconfig
@@ -813,10 +813,22 @@  endif	# $(+cflags) == ""
 # of many little headers in the include directory.
 libio-include = -I$(..)libio
 
+# We don't include libc-modules.h when these targets are being built.  These
+# targets don't (and will likely never need to) use the IS_IN facility.  In
+# fact, shlib-versions should not use it because that will create a circular
+# dependency as libc-modules.h is generated from shlib-versions.
+skip-module-cppflags = shlib-versions.v.i Versions.v.i
+
 in-module = $(strip $(foreach lib,$(libof-$(basename $(@F))) $(libof-$(<F)) \
 				  $(libof-$(@F)),-DIN_MODULE=MODULE_$(lib)))
 
 module-def = $(if $(in-module),$(in-module),-DIN_MODULE=MODULE_libc)
+module-cppflags-real = -include $(common-objpfx)libc-modules.h $(module-def)
+
+# We don't need libc-modules.h and the IN_MODULE definition for
+# shlib-version.v.i.
+module-cppflags = $(if $(filter $(@F),$(skip-module-cppflags)), \
+		       ,$(module-cppflags-real))
 
 # These are the variables that the implicit compilation rules use.
 # Note that we can't use -std=* in CPPFLAGS, because it overrides
@@ -824,9 +836,9 @@  module-def = $(if $(in-module),$(in-module),-DIN_MODULE=MODULE_libc)
 # it causes cpp to stop predefining __ASSEMBLER__.
 CPPFLAGS = $(config-extra-cppflags) $(CPPUNDEFS) $(CPPFLAGS-config) \
 	   $($(subdir)-CPPFLAGS) \
-	   $(+includes) $(defines) \
+	   $(+includes) $(defines) $(module-cppflags) \
 	   -include $(..)include/libc-symbols.h $(sysdep-CPPFLAGS) \
-	   $(CPPFLAGS-$(suffix $@)) $(module-def) \
+	   $(CPPFLAGS-$(suffix $@)) \
 	   $(foreach lib,$(libof-$(basename $(@F))) \
 			 $(libof-$(<F)) $(libof-$(@F)),$(CPPFLAGS-$(lib))) \
 	   $(CPPFLAGS-$(<F)) $(CPPFLAGS-$(@F)) $(CPPFLAGS-$(basename $(@F)))
@@ -986,6 +998,24 @@  endif
 postclean-generated += soversions.mk soversions.i \
 		       shlib-versions.v shlib-versions.v.i
 
+before-compile += $(common-objpfx)libc-modules.h
+ifeq ($(soversions.mk-done),t)
+# Generate a header with macro definitions for use with the IS_IN macro.
+# These are the possible values for the IN_MODULE macro defined when building
+# sources, to identify which module the translation unit is going to be built
+# into.
+$(common-objpfx)libc-modules.h: $(common-objpfx)libc-modules.stmp; @:
+$(common-objpfx)libc-modules.stmp: $(..)scripts/gen-libc-modules.awk \
+				   $(common-objpfx)soversions.i \
+				   $(..)build.list
+	$(AWK) -f $^ > ${@:stmp=T}
+	$(move-if-change) ${@:stmp=T} ${@:stmp=h}
+	touch $@
+
+endif
+
+common-generated += libc-modules.h libc-modules.stmp
+
 # The name under which the run-time dynamic linker is installed.
 # We are currently going for the convention that `/lib/ld.so.1'
 # names the SVR4/ELF ABI-compliant dynamic linker.
diff --git a/build.list b/build.list
new file mode 100644
index 0000000..eab57c7
--- /dev/null
+++ b/build.list
@@ -0,0 +1,15 @@ 
+iconvprogs
+iconvdata
+ldconfig
+lddlibc4
+libmemusage
+libSegFault
+libpcprofile
+librpcsvc
+libutil
+locale_programs
+memusagestat
+nonlib
+nscd
+extramodules
+libnldbl
diff --git a/include/libc-modules.h b/include/libc-modules.h
deleted file mode 100644
index d12fb90..0000000
--- a/include/libc-modules.h
+++ /dev/null
@@ -1,37 +0,0 @@ 
-#define MODULE_libc		1
-#define MODULE_libpthread	2
-#define MODULE_rtld		3
-#define MODULE_libdl		4
-#define MODULE_libm		5
-#define MODULE_iconvprogs	6
-#define MODULE_iconvdata	7
-#define MODULE_lddlibc4		8
-#define MODULE_locale_programs	9
-#define MODULE_memusagestat	10
-#define MODULE_libutil		12
-#define MODULE_libBrokenLocale	13
-#define MODULE_libmemusage	15
-#define MODULE_libresolv	16
-#define MODULE_libnss_db	17
-#define MODULE_libnss_files	18
-#define	MODULE_libnss_dns	19
-#define MODULE_libnss_compat	20
-#define MODULE_libnss_hesiod	21
-#define MODULE_libnss_nis	22
-#define MODULE_libnss_nisplus	23
-#define MODULE_libanl		24
-#define MODULE_librt		25
-#define MODULE_libSegFault	26
-#define MODULE_libthread_db	27
-#define MODULE_libcidn		28
-#define MODULE_libcrypt		29
-#define MODULE_libnsl		30
-#define MODULE_libpcprofile	31
-#define MODULE_librpcsvc	32
-#define MODULE_nscd		33
-#define MODULE_ldconfig 	34
-#define MODULE_libnldbl 	35
-
-/* Catch-all for test modules and other binaries.  */
-#define MODULE_nonlib		98
-#define MODULE_extramodules	99
diff --git a/include/libc-symbols.h b/include/libc-symbols.h
index 131d7eb..9b8208b 100644
--- a/include/libc-symbols.h
+++ b/include/libc-symbols.h
@@ -20,8 +20,6 @@ 
 #ifndef _LIBC_SYMBOLS_H
 #define _LIBC_SYMBOLS_H	1
 
-#include "libc-modules.h"
-
 #define IS_IN(lib) (IN_MODULE == MODULE_##lib)
 
 /* This file's macros are included implicitly in the compilation of every
diff --git a/scripts/gen-libc-modules.awk b/scripts/gen-libc-modules.awk
new file mode 100644
index 0000000..d3382b6
--- /dev/null
+++ b/scripts/gen-libc-modules.awk
@@ -0,0 +1,40 @@ 
+# Generate a header file that defines the MODULE_* macros for each library and
+# module we build in glibc.  The library names are pulled in from soversions.i
+# and the additional modules are mentioned one-per-line in build.list.
+BEGIN {
+  PROCINFO["sorted_in"] = "@val_type_asc"
+  shlibs = 1
+  others = 1000
+  libs["OTHERS_BEGIN"] = others++
+}
+
+# Skip over comments.
+$1 == "#" {
+  next
+}
+
+# build.list is simply one module per line.
+match (FILENAME, ".*build.list") {
+  libs[$0] = others++
+}
+
+# We have only one special case in soversions.i parsing, which is to replace ld
+# with rtld since that's what we call it throughout the sources.
+match (FILENAME, ".*soversions.i") {
+  name = $2
+  if (name == "ld")
+    name = "rtld"
+
+  if (!(name in libs)) {
+    libs[name] = shlibs++
+  }
+}
+
+# Finally, print out the header file.
+END {
+  printf ("/* AUTOGENERATED BY gen-libc-modules.awk, DO NOT EDIT.  */\n\n")
+  i = 1
+  for (l in libs) {
+    printf ("#define MODULE_%s %d\n", l, libs[l])
+  }
+}
diff --git a/sysdeps/unix/Makefile b/sysdeps/unix/Makefile
index 0e535b6..573e90d 100644
--- a/sysdeps/unix/Makefile
+++ b/sysdeps/unix/Makefile
@@ -79,7 +79,8 @@  compile-syscall = $(COMPILE.S) -o $@ -x assembler-with-cpp - \
 
 ifndef avoid-generated
 $(common-objpfx)sysd-syscalls: $(..)sysdeps/unix/make-syscalls.sh \
-			       $(wildcard $(+sysdep_dirs:%=%/syscalls.list))
+			       $(wildcard $(+sysdep_dirs:%=%/syscalls.list)) \
+			       $(common-objpfx)libc-modules.stmp
 	for dir in $(+sysdep_dirs); do \
 	  test -f $$dir/syscalls.list && \
 	  { sysdirs='$(sysdirs)' \