From 55a426ef8c54eb1d6e48b5858eb43496b1742797 Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <hjl.tools@gmail.com>
Date: Thu, 8 Feb 2018 08:37:54 -0800
Subject: [PATCH] Define GEN_AS_CONST_HEADERS when generating header files [BZ
#22792]
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>.
---
Makerules | 9 ++++++++-
sysdeps/unix/sysv/linux/i386/lowlevellock.h | 9 ++++++++-
sysdeps/unix/sysv/linux/x86_64/lowlevellock.h | 1 -
3 files changed, 16 insertions(+), 3 deletions(-)
@@ -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
@@ -26,7 +26,14 @@
# 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
@@ -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
--
2.14.3