Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 30 Dec 2019 09:33:56 -0800
From:      Mark Millard <marklmi@yahoo.com>
To:        FreeBSD PowerPC ML <freebsd-ppc@freebsd.org>, FreeBSD Toolchain <freebsd-toolchain@freebsd.org>
Subject:   Building head -r356187 for powerpc64 via devel/freebsd-gcc9 fails: powerpc64-unknown-freebsd13.0-ld: over 480 cpu minutes on ThreadRipper 1950X
Message-ID:  <7CAD1629-A16F-4D7E-898A-5C06CAC4E0AF@yahoo.com>
References:  <7CAD1629-A16F-4D7E-898A-5C06CAC4E0AF.ref@yahoo.com>

next in thread | previous in thread | raw e-mail | index | archive | help
There are two nearly 100% cpu usage instances of
powerpc64-unknown-freebsd13.0-ld , each with over
480 cpu minutes, one for clang.full and one for
lld.full . (amd64->powerpc64 cross build.)

The below shows the file system view of the status
after all that time: 0 size .full files.

# ls -ldTt  =
/usr/obj/powerpc64vtsc_xtoolchain-gcc/powerpc.powerpc64/usr/src/powerpc.po=
werpc64/usr.bin/clang/clang/clang.full* | head
-rw-r--r--  1 root  wheel  3071 Dec 30 00:30:02 2019 =
/usr/obj/powerpc64vtsc_xtoolchain-gcc/powerpc.powerpc64/usr/src/powerpc.po=
werpc64/usr.bin/clang/clang/clang.full.meta
-rw-r--r--  1 root  wheel     0 Dec 30 00:29:32 2019 =
/usr/obj/powerpc64vtsc_xtoolchain-gcc/powerpc.powerpc64/usr/src/powerpc.po=
werpc64/usr.bin/clang/clang/clang.full

# ls -ldTt  =
/usr/obj/powerpc64vtsc_xtoolchain-gcc/powerpc.powerpc64/usr/src/powerpc.po=
werpc64/usr.bin/clang/clang/clang.full* | head
-rw-r--r--  1 root  wheel  3071 Dec 30 00:30:02 2019 =
/usr/obj/powerpc64vtsc_xtoolchain-gcc/powerpc.powerpc64/usr/src/powerpc.po=
werpc64/usr.bin/clang/clang/clang.full.meta
-rw-r--r--  1 root  wheel     0 Dec 30 00:29:32 2019 =
/usr/obj/powerpc64vtsc_xtoolchain-gcc/powerpc.powerpc64/usr/src/powerpc.po=
werpc64/usr.bin/clang/clang/clang.full

Attaching to one of them with gdb shows
(I build ports optimized but with symbols generally):

(gdb) bt
#0  0x000000000035431d in ppc64_elf_inline_plt (info=3D<optimized out>) =
at elf64-ppc.c:7473
#1  0x000000000032acb0 in ppc_before_allocation () at =
eelf64ppc_fbsd.c:370
#2  0x0000000000319651 in lang_process () at ldlang.c:7678
#3  0x00000000003208d8 in main (argc=3D<optimized out>, argv=3D<optimized =
out>) at ./ldmain.c:441

ppc64_elf_inline_plt does not return (finish
does not stop on its own).

Using step shows:

(gdb) step
7471	in elf64-ppc.c
(gdb)=20
7473	in elf64-ppc.c
(gdb)=20
7471	in elf64-ppc.c
(gdb)=20
7473	in elf64-ppc.c
. . .

Looking at the instruction level:

(gdb) display/i $pc
1: x/i $pc
=3D> 0x35431d <ppc64_elf_inline_plt+557>:	jne    0x354310 =
<ppc64_elf_inline_plt+544>
(gdb) nexti
7471	in elf64-ppc.c
1: x/i $pc
=3D> 0x354310 <ppc64_elf_inline_plt+544>:	mov    0x8(%r13),%r12
(gdb)=20
7473	in elf64-ppc.c
1: x/i $pc
=3D> 0x354314 <ppc64_elf_inline_plt+548>:	mov    %r12d,%eax
(gdb)=20
0x0000000000354317	7473	in elf64-ppc.c
1: x/i $pc
=3D> 0x354317 <ppc64_elf_inline_plt+551>:	or     $0x2,%eax
(gdb)=20
0x000000000035431a	7473	in elf64-ppc.c
1: x/i $pc
=3D> 0x35431a <ppc64_elf_inline_plt+554>:	cmp    $0x7a,%eax
(gdb)=20
0x000000000035431d	7473	in elf64-ppc.c
1: x/i $pc
=3D> 0x35431d <ppc64_elf_inline_plt+557>:	jne    0x354310 =
<ppc64_elf_inline_plt+544>
(gdb)=20
7471	in elf64-ppc.c
1: x/i $pc
=3D> 0x354310 <ppc64_elf_inline_plt+544>:	mov    0x8(%r13),%r12
(gdb)=20
7473	in elf64-ppc.c
1: x/i $pc
=3D> 0x354314 <ppc64_elf_inline_plt+548>:	mov    %r12d,%eax
(gdb)=20
0x0000000000354317	7473	in elf64-ppc.c
1: x/i $pc
=3D> 0x354317 <ppc64_elf_inline_plt+551>:	or     $0x2,%eax
(gdb)=20
0x000000000035431a	7473	in elf64-ppc.c
1: x/i $pc
=3D> 0x35431a <ppc64_elf_inline_plt+554>:	cmp    $0x7a,%eax
(gdb)=20
0x000000000035431d	7473	in elf64-ppc.c
1: x/i $pc
=3D> 0x35431d <ppc64_elf_inline_plt+557>:	jne    0x354310 =
<ppc64_elf_inline_plt+544>
. . .



To do the experiment I built devel/freebsd-gcc9 based on:
( ports at -r520539 )

# svnlite diff /usr/ports/devel/freebsd-gcc9/
Index: /usr/ports/devel/freebsd-gcc9/Makefile
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- /usr/ports/devel/freebsd-gcc9/Makefile	(revision 520539)
+++ /usr/ports/devel/freebsd-gcc9/Makefile	(working copy)
@@ -53,6 +53,10 @@
 		--with-as=3D${LOCALBASE}/bin/${BU_PREFIX}-as \
 		--with-ld=3D${LOCALBASE}/bin/${BU_PREFIX}-ld
=20
+.if ${TARGETARCH} =3D=3D powerpc64
+CONFIGURE_ARGS+=3D        --with-abi=3Delfv2
+.endif
+
 ALL_TARGET=3D	all-gcc
 INSTALL_TARGET=3D	install-gcc
=20

(So I forced elfv2 for powerpc64.)

I'm also using WITHOUT_LIB32 to avoid the
the forced bss-plt that ends up involved:
It stops the build:

# svnlite diff /usr/src/share/mk/bsd.cpu.mk=20
Index: /usr/src/share/mk/bsd.cpu.mk
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- /usr/src/share/mk/bsd.cpu.mk	(revision 356187)
+++ /usr/src/share/mk/bsd.cpu.mk	(working copy)
@@ -421,7 +421,7 @@
 # normal builds works when CROSS_BINUTILS_PREFIX and could be removed
 # when LLD PowerPC 32 bit support is completed
 .if defined(CROSS_BINUTILS_PREFIX)
-LD_BFD=3D${LOCALBASE}/bin/${CROSS_BINUTILS_PREFIX}-ld.bfd
+LD_BFD=3D${CROSS_BINUTILS_PREFIX}ld.bfd
 .else
 LD_BFD=3D${OBJTOP}/tmp/usr/bin/ld.bfd
 .endif

(The above change used a working file path.)

I used:

# more ~/src.configs/src.conf.powerpc64-xtoolchain-gcc.amd64-host=20
GCCVERSION=3D9
TO_TYPE=3Dpowerpc64
TOOLS_TO_TYPE=3D${TO_TYPE}
VERSION_CONTEXT=3D13.0
#
KERNCONF=3DGENERIC64vtsc-NODBG
TARGET=3Dpowerpc
.if ${.MAKE.LEVEL} =3D=3D 0
TARGET_ARCH=3D${TO_TYPE}
.export TARGET_ARCH
.endif
#
WITHOUT_CROSS_COMPILER=3D
WITHOUT_SYSTEM_COMPILER=3D
WITHOUT_SYSTEM_LINKER=3D
#
WITH_LLVM_LIBUNWIND=3D
WITH_LIBCPLUSPLUS=3D
WITHOUT_LLD_BOOTSTRAP=3D
WITHOUT_BINUTILS_BOOTSTRAP=3D
WITHOUT_ELFTOOLCHAIN_BOOTSTRAP=3D
WITHOUT_LLVM_TARGET_ALL=3D
WITHOUT_CLANG_BOOTSTRAP=3D
WITH_CLANG=3D
WITH_CLANG_IS_CC=3D
WITH_CLANG_FULL=3D
WITH_CLANG_EXTRAS=3D
WITH_LLD=3D
WITH_LLD_IS_LD=3D
WITHOUT_BINUTILS=3D
#WITH_PORT_BASE_BINUTILS=3D
# Note: LLDB fails to build (link).
WITHOUT_LLDB=3D
#
WITH_BOOT=3D
#
# Fails to build because of forced bss-plt use.
WITHOUT_LIB32=3D
#
LOADER_DEFAULT_INTERP=3D4th
#
WITHOUT_GCC_BOOTSTRAP=3D
WITHOUT_GCC=3D
WITHOUT_GCC_IS_CC=3D
WITHOUT_GNUCXX=3D
#
NO_WERROR=3D
#
#WERROR=3D
MALLOC_PRODUCTION=3D
#
# Avoid stripping but do not control host -g status as well:
DEBUG_FLAGS+=3D
#
WITH_REPRODUCIBLE_BUILD=3D
WITH_DEBUG_FILES=3D
#
#XCFLAGS+=3D -gdwarf-2
#
# For TO (so-called "cross") stages . . .
# So-called-cross via freebsd-gcc${GCCVERSION}@${TO_TYPE}
# TOOLS_TO_TYPE based on freebsd-gcc${GCCVERSION}@${TO_TYPE} related =
binutils. . .
#
CROSS_TOOLCHAIN=3D${TO_TYPE}-gcc${GCCVERSION}
X_COMPILER_TYPE=3Dgcc
=
CROSS_BINUTILS_PREFIX=3D/usr/local/${TOOLS_TO_TYPE}-unknown-freebsd${VERSI=
ON_CONTEXT}/bin/
.if ${.MAKE.LEVEL} =3D=3D 0
=
XCC=3D/usr/local/bin/${TOOLS_TO_TYPE}-unknown-freebsd${VERSION_CONTEXT}-gc=
c${GCCVERSION}
=
XCXX=3D/usr/local/bin/${TOOLS_TO_TYPE}-unknown-freebsd${VERSION_CONTEXT}-g=
++${GCCVERSION}
=
XCPP=3D/usr/local/bin/${TOOLS_TO_TYPE}-unknown-freebsd${VERSION_CONTEXT}-c=
pp${GCCVERSION}
.export XCC
.export XCXX
.export XCPP
XAS=3D/usr/local/${TOOLS_TO_TYPE}-unknown-freebsd${VERSION_CONTEXT}/bin/as=

XAR=3D/usr/local/${TOOLS_TO_TYPE}-unknown-freebsd${VERSION_CONTEXT}/bin/ar=

XLD=3D/usr/local/${TOOLS_TO_TYPE}-unknown-freebsd${VERSION_CONTEXT}/bin/ld=

XNM=3D/usr/local/${TOOLS_TO_TYPE}-unknown-freebsd${VERSION_CONTEXT}/bin/nm=

=
XOBJCOPY=3D/usr/local/${TOOLS_TO_TYPE}-unknown-freebsd${VERSION_CONTEXT}/b=
in/objcopy
=
XOBJDUMP=3D/usr/local/${TOOLS_TO_TYPE}-unknown-freebsd${VERSION_CONTEXT}/b=
in/objdump
=
XRANLIB=3D/usr/local/${TOOLS_TO_TYPE}-unknown-freebsd${VERSION_CONTEXT}/bi=
n/ranlib
=
XSIZE=3D/usr/local/${TOOLS_TO_TYPE}-unknown-freebsd${VERSION_CONTEXT}/bin/=
size
#NO-SUCH: =
XSTRINGS=3D/usr/local/${TOOLS_TO_TYPE}-unknown-freebsd${VERSION_CONTEXT}/b=
in/strings
=
XSTRINGS=3D/usr/local/bin/${TOOLS_TO_TYPE}-unknown-freebsd${VERSION_CONTEX=
T}-strings
.export XAS
.export XAR
.export XLD
.export XNM
.export XOBJCOPY
.export XOBJDUMP
.export XRANLIB
.export XSIZE
.export XSTRINGS
.endif
#
#
# =46rom based on clang (via system). . .
#
.if ${.MAKE.LEVEL} =3D=3D 0
CC=3D/usr/bin/clang
CXX=3D/usr/bin/clang++
CPP=3D/usr/bin/clang-cpp
.export CC
.export CXX
.export CPP
.endif

By contrast, cross-building powerpc64 using system-clang
and devel/binutils@powerpc64 ran to completion, as did
the default system-clang/lld use.

Using ELFv2 for devel/freebsd-gcc9 did avoid the
internal plt template error report that I got
earlier when targeting a ELFv1 context.


32-bit powerpc side note:

For 32-bit powerpc, the only combination to complete
buildworld buildkernel was system-clang with
devel/binutils@powerpc . The default system linker
failed with acl_nfs4.kld(.text+0x234): R_PPC_PLTREL24=20
reloc against local symbol. Using
devel/freebsd-gcc9@powerpc with devel/binutils@powerpc
resulted in forced bss-plt use stopping the build.


=3D=3D=3D
Mark Millard
marklmi at yahoo.com
( dsl-only.net went
away in early 2018-Mar)




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?7CAD1629-A16F-4D7E-898A-5C06CAC4E0AF>