Building head -r356187 for powerpc64 via devel/freebsd-gcc9 fails: powerpc64-unknown-freebsd13.0-ld: over 480 cpu minutes on ThreadRipper 1950X

Mark Millard via freebsd-ppc <[email protected]>
Newsgroups gmane.os.freebsd.devel.ppc,gmane.os.freebsd.devel.toolchain
Message-ID <[email protected]>
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.powerpc64/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.powerpc64/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.powerpc64/usr.bin/clang/clang/clang.full

# ls -ldTt  /usr/obj/powerpc64vtsc_xtoolchain-gcc/powerpc.powerpc64/usr/src/powerpc.powerpc64/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.powerpc64/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.powerpc64/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=<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=<optimized out>, argv=<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) 
7473	in elf64-ppc.c
(gdb) 
7471	in elf64-ppc.c
(gdb) 
7473	in elf64-ppc.c
. . .

Looking at the instruction level:

(gdb) display/i $pc
1: x/i $pc
=> 0x35431d <ppc64_elf_inline_plt+557>:	jne    0x354310 <ppc64_elf_inline_plt+544>
(gdb) nexti
7471	in elf64-ppc.c
1: x/i $pc
=> 0x354310 <ppc64_elf_inline_plt+544>:	mov    0x8(%r13),%r12
(gdb) 
7473	in elf64-ppc.c
1: x/i $pc
=> 0x354314 <ppc64_elf_inline_plt+548>:	mov    %r12d,%eax
(gdb) 
0x0000000000354317	7473	in elf64-ppc.c
1: x/i $pc
=> 0x354317 <ppc64_elf_inline_plt+551>:	or     $0x2,%eax
(gdb) 
0x000000000035431a	7473	in elf64-ppc.c
1: x/i $pc
=> 0x35431a <ppc64_elf_inline_plt+554>:	cmp    $0x7a,%eax
(gdb) 
0x000000000035431d	7473	in elf64-ppc.c
1: x/i $pc
=> 0x35431d <ppc64_elf_inline_plt+557>:	jne    0x354310 <ppc64_elf_inline_plt+544>
(gdb) 
7471	in elf64-ppc.c
1: x/i $pc
=> 0x354310 <ppc64_elf_inline_plt+544>:	mov    0x8(%r13),%r12
(gdb) 
7473	in elf64-ppc.c
1: x/i $pc
=> 0x354314 <ppc64_elf_inline_plt+548>:	mov    %r12d,%eax
(gdb) 
0x0000000000354317	7473	in elf64-ppc.c
1: x/i $pc
=> 0x354317 <ppc64_elf_inline_plt+551>:	or     $0x2,%eax
(gdb) 
0x000000000035431a	7473	in elf64-ppc.c
1: x/i $pc
=> 0x35431a <ppc64_elf_inline_plt+554>:	cmp    $0x7a,%eax
(gdb) 
0x000000000035431d	7473	in elf64-ppc.c
1: x/i $pc
=> 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
===================================================================
--- /usr/ports/devel/freebsd-gcc9/Makefile	(revision 520539)
+++ /usr/ports/devel/freebsd-gcc9/Makefile	(working copy)
@@ -53,6 +53,10 @@
 		--with-as=${LOCALBASE}/bin/${BU_PREFIX}-as \
 		--with-ld=${LOCALBASE}/bin/${BU_PREFIX}-ld
 
+.if ${TARGETARCH} == powerpc64
+CONFIGURE_ARGS+=        --with-abi=elfv2
+.endif
+
 ALL_TARGET=	all-gcc
 INSTALL_TARGET=	install-gcc
 

(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 
Index: /usr/src/share/mk/bsd.cpu.mk
===================================================================
--- /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=${LOCALBASE}/bin/${CROSS_BINUTILS_PREFIX}-ld.bfd
+LD_BFD=${CROSS_BINUTILS_PREFIX}ld.bfd
 .else
 LD_BFD=${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 
GCCVERSION=9
TO_TYPE=powerpc64
TOOLS_TO_TYPE=${TO_TYPE}
VERSION_CONTEXT=13.0
#
KERNCONF=GENERIC64vtsc-NODBG
TARGET=powerpc
.if ${.MAKE.LEVEL} == 0
TARGET_ARCH=${TO_TYPE}
.export TARGET_ARCH
.endif
#
WITHOUT_CROSS_COMPILER=
WITHOUT_SYSTEM_COMPILER=
WITHOUT_SYSTEM_LINKER=
#
WITH_LLVM_LIBUNWIND=
WITH_LIBCPLUSPLUS=
WITHOUT_LLD_BOOTSTRAP=
WITHOUT_BINUTILS_BOOTSTRAP=
WITHOUT_ELFTOOLCHAIN_BOOTSTRAP=
WITHOUT_LLVM_TARGET_ALL=
WITHOUT_CLANG_BOOTSTRAP=
WITH_CLANG=
WITH_CLANG_IS_CC=
WITH_CLANG_FULL=
WITH_CLANG_EXTRAS=
WITH_LLD=
WITH_LLD_IS_LD=
WITHOUT_BINUTILS=
#WITH_PORT_BASE_BINUTILS=
# Note: LLDB fails to build (link).
WITHOUT_LLDB=
#
WITH_BOOT=
#
# Fails to build because of forced bss-plt use.
WITHOUT_LIB32=
#
LOADER_DEFAULT_INTERP=4th
#
WITHOUT_GCC_BOOTSTRAP=
WITHOUT_GCC=
WITHOUT_GCC_IS_CC=
WITHOUT_GNUCXX=
#
NO_WERROR=
#
#WERROR=
MALLOC_PRODUCTION=
#
# Avoid stripping but do not control host -g status as well:
DEBUG_FLAGS+=
#
WITH_REPRODUCIBLE_BUILD=
WITH_DEBUG_FILES=
#
#XCFLAGS+= -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=${TO_TYPE}-gcc${GCCVERSION}
X_COMPILER_TYPE=gcc
CROSS_BINUTILS_PREFIX=/usr/local/${TOOLS_TO_TYPE}-unknown-freebsd${VERSION_CONTEXT}/bin/
.if ${.MAKE.LEVEL} == 0
XCC=/usr/local/bin/${TOOLS_TO_TYPE}-unknown-freebsd${VERSION_CONTEXT}-gcc${GCCVERSION}
XCXX=/usr/local/bin/${TOOLS_TO_TYPE}-unknown-freebsd${VERSION_CONTEXT}-g++${GCCVERSION}
XCPP=/usr/local/bin/${TOOLS_TO_TYPE}-unknown-freebsd${VERSION_CONTEXT}-cpp${GCCVERSION}
.export XCC
.export XCXX
.export XCPP
XAS=/usr/local/${TOOLS_TO_TYPE}-unknown-freebsd${VERSION_CONTEXT}/bin/as
XAR=/usr/local/${TOOLS_TO_TYPE}-unknown-freebsd${VERSION_CONTEXT}/bin/ar
XLD=/usr/local/${TOOLS_TO_TYPE}-unknown-freebsd${VERSION_CONTEXT}/bin/ld
XNM=/usr/local/${TOOLS_TO_TYPE}-unknown-freebsd${VERSION_CONTEXT}/bin/nm
XOBJCOPY=/usr/local/${TOOLS_TO_TYPE}-unknown-freebsd${VERSION_CONTEXT}/bin/objcopy
XOBJDUMP=/usr/local/${TOOLS_TO_TYPE}-unknown-freebsd${VERSION_CONTEXT}/bin/objdump
XRANLIB=/usr/local/${TOOLS_TO_TYPE}-unknown-freebsd${VERSION_CONTEXT}/bin/ranlib
XSIZE=/usr/local/${TOOLS_TO_TYPE}-unknown-freebsd${VERSION_CONTEXT}/bin/size
#NO-SUCH: XSTRINGS=/usr/local/${TOOLS_TO_TYPE}-unknown-freebsd${VERSION_CONTEXT}/bin/strings
XSTRINGS=/usr/local/bin/${TOOLS_TO_TYPE}-unknown-freebsd${VERSION_CONTEXT}-strings
.export XAS
.export XAR
.export XLD
.export XNM
.export XOBJCOPY
.export XOBJDUMP
.export XRANLIB
.export XSIZE
.export XSTRINGS
.endif
#
#
# From based on clang (via system). . .
#
.if ${.MAKE.LEVEL} == 0
CC=/usr/bin/clang
CXX=/usr/bin/clang++
CPP=/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 
reloc against local symbol. Using
devel/freebsd-gcc9@powerpc with devel/binutils@powerpc
resulted in forced bss-plt use stopping the build.


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

_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/freebsd-ppc
To unsubscribe, send any mail to "[email protected]"
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.