]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Define GEN_AS_CONST_HEADERS when generating header files [BZ #22792]
authorH.J. Lu <hjl.tools@gmail.com>
Fri, 23 Feb 2018 19:29:27 +0000 (11:29 -0800)
committerH.J. Lu <hjl.tools@gmail.com>
Fri, 23 Feb 2018 19:29:39 +0000 (11:29 -0800)
Glibc build generates header files to define constants from special .sym
files.  If a .sym file includes the same header file which it generates,
it leads to circular dependency which may lead to build hang on a
many-core machine.  Define GEN_AS_CONST_HEADERS when generating header
files to avoid circular dependency.

<tcb-offsets.h> is needed for i686 and it isn't needed for x86-64 at
least since glibc 2.23.

Tested on i686 and x86-64.

[BZ #22792]
* Makerules ($(common-objpfx)%.h): Pass -DGEN_AS_CONST_HEADERS
to $(CC).
* sysdeps/unix/sysv/linux/i386/lowlevellock.h: Include
<tcb-offsets.h> only if GEN_AS_CONST_HEADERS isn't defined.
* sysdeps/unix/sysv/linux/x86_64/lowlevellock.h: Don't include
<tcb-offsets.h>.

ChangeLog
Makerules
sysdeps/unix/sysv/linux/i386/lowlevellock.h
sysdeps/unix/sysv/linux/x86_64/lowlevellock.h

index e14f3d876470a378cd6cc7ecb0d2f0bf3dd36f7f..66e9c5bbeaca8a3ef784140aa19d4b240759880a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2018-02-23  H.J. Lu  <hongjiu.lu@intel.com>
+
+       [BZ #22792]
+       * Makerules ($(common-objpfx)%.h): Pass -DGEN_AS_CONST_HEADERS
+       to $(CC).
+       * sysdeps/unix/sysv/linux/i386/lowlevellock.h: Include
+       <tcb-offsets.h> only if GEN_AS_CONST_HEADERS isn't defined.
+       * sysdeps/unix/sysv/linux/x86_64/lowlevellock.h: Don't include
+       <tcb-offsets.h>.
+
 2018-02-23  Joseph Myers  <joseph@codesourcery.com>
 
        [BZ #15105]
index ef6abeac6d9dd0e9bb1aa68db7f1b64e64f9c9eb..b2c2724fcbd4a7e8e9462c34e375f0b3736f8670 100644 (file)
--- a/Makerules
+++ b/Makerules
@@ -276,10 +276,17 @@ ifdef gen-as-const-headers
 # Generating headers for assembly constants.
 # We need this defined early to get into before-compile before
 # it's used in sysd-rules, below.
+# Define GEN_AS_CONST_HEADERS to avoid circular dependency [BZ #22792].
+# NB: <tcb-offsets.h> is generated from tcb-offsets.sym to define
+# offsets and sizes of types in <tls.h> and maybe <pthread.h> which
+# may include <tcb-offsets.h>.  Target header files can check if
+# GEN_AS_CONST_HEADERS is defined to avoid circular dependency which
+# may lead to build hang on a many-core machine.
 $(common-objpfx)%.h $(common-objpfx)%.h.d: $(..)scripts/gen-as-const.awk \
                                           %.sym $(common-before-compile)
        $(AWK) -f $< $(filter %.sym,$^) \
-       | $(CC) -S -o $(@:.h.d=.h)T3 $(CFLAGS) $(CPPFLAGS) -x c - \
+       | $(CC) -S -o $(@:.h.d=.h)T3 $(CFLAGS) $(CPPFLAGS) \
+               -DGEN_AS_CONST_HEADERS -x c - \
                -MD -MP -MF $(@:.h=.h.d)T -MT '$(@:.h=.h.d) $(@:.h.d=.h)'
        sed -n 's/^.*@@@name@@@\([^@]*\)@@@value@@@[^0-9Xxa-fA-F-]*\([0-9Xxa-fA-F-][0-9Xxa-fA-F-]*\).*@@@end@@@.*$$/#define \1 \2/p' \
                $(@:.h.d=.h)T3 > $(@:.h.d=.h)T
index fb59b57934e911a9416a2a28d4abb518b4147ba6..38fbc2556f2f5a3fdf93953c6ed01b383f2a2433 100644 (file)
 # include <sys/param.h>
 # include <bits/pthreadtypes.h>
 # include <kernel-features.h>
-# include <tcb-offsets.h>
+/* <tcb-offsets.h> is generated from tcb-offsets.sym to define offsets
+   and sizes of types in <tls.h> as well as <pthread.h> which includes
+   <lowlevellock.h> via nptl/descr.h.  Don't include <tcb-offsets.h>
+   when generating <tcb-offsets.h> to avoid circular dependency which
+   may lead to build hang on a many-core machine.  */
+# ifndef GEN_AS_CONST_HEADERS
+#  include <tcb-offsets.h>
+# endif
 
 # ifndef LOCK_INSTR
 #  ifdef UP
index a8bcfbe4a3f3f121637f9799ad758474469c4e9b..eedb6fc990eae61d4ab68381bc6e709c9e4abaee 100644 (file)
@@ -26,7 +26,6 @@
 # include <sys/param.h>
 # include <bits/pthreadtypes.h>
 # include <kernel-features.h>
-# include <tcb-offsets.h>
 
 # ifndef LOCK_INSTR
 #  ifdef UP