Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 10 Jan 2017 13:19:05 -0800
From:      Mark Millard <markmi@dsl-only.net>
To:        Roman Divacky <rdivacky@vlakno.cz>, Ed Maste <emaste@freebsd.org>
Cc:        Justin Hibbits <chmeeedalf@gmail.com>, Nathan Whitehorn <nwhitehorn@freebsd.org>, FreeBSD Toolchain <freebsd-toolchain@freebsd.org>, FreeBSD PowerPC ML <freebsd-ppc@freebsd.org>
Subject:   Re: clang 3.9.0 buildkernel on old powerpc64's vs. trying to build hwpmc_e500.o and the like. . . [Actually .__start code failure vs. working and R_PPC64_ADDR16_DS vs. R_PPC64_TOC16_DS]
Message-ID:  <F2CE3972-6990-44CB-8D76-DEDCA92F8314@dsl-only.net>
In-Reply-To: <964800DA-213A-4855-A5E7-8C62823E55D5@dsl-only.net>
References:  <20161208221452.GA42380@vlakno.cz> <20161212210922.GA27403@vlakno.cz> <613BB28B-46F1-4959-B576-C8AD42A21200@dsl-only.net> <20170107085126.GA82107@vlakno.cz> <2B5FDD60-4D8B-4803-B59C-3C569BA36E68@dsl-only.net> <FB7F73D7-BF8F-4477-8057-1404D27622A8@dsl-only.net> <45C94BFE-4F93-4897-A767-518DACB5D28B@dsl-only.net> <20170108090307.GA3140@vlakno.cz> <1BBC8304-F9E8-4181-A287-11DD8E73B31F@dsl-only.net> <A88C2D49-FAF2-4026-B9C1-A1D3C1E39287@dsl-only.net> <20170108144133.GA19529@vlakno.cz> <5A1FE9C4-684B-43B5-AE26-03C2052E9750@dsl-only.net> <964800DA-213A-4855-A5E7-8C62823E55D5@dsl-only.net>

next in thread | previous in thread | raw e-mail | index | archive | help
I have added the patches to my various historical submittals
and submitted some I'd never made submittals for.

For the sys/modules/zfs/Makefile I eliminated the extra blank line
that was added in what I showed earlier for the patches.

Some of the patches are tied to allowing all 3 types of
buidlworld buildkernel contexts in Makefile* 's for
one or both of powerpc64 and powerpc:

0) system gcc 4.2.1 and (bootstrapped) system binutils
   (not libc++ based)

1) devel/powerpc64-xtoolchain-gcc devel/powerpc64-gcc =
devel/powerpc64-binutils
   (libc++ based, no lib32)

2) system clang and devel/powerpc64-binutils or (bootstrapped) system =
binutils
   (One(?) driven by 3.8.0 that would not be needed for 3.9.1)
   (libc++ based)

Some contexts require options that the others do not.
Some contexts require options that others do not allow and do not need.

Some I added note to about potentially using CFLAGS.gcc+=3D  and
CFLAGS.clang+=3D instead of conditional logic if the contexts allow
such to be effective.

The bugzilla numbers (if I found them all):

205455
206303
214904 (the patch allowed building but is not a complete clang/llvm =
update)
215107
215681
215819
215947
215948

Generally this list excludes things for which WERROR=3D allows the
buildkernel attempts to complete and things related to restrictions
like avoiding lib32 for devel/powerpc64-gcc based builds.


=3D=3D=3D
Mark Millard
markmi at dsl-only.net

On 2017-Jan-8, at 9:34 PM, Mark Millard <markmi@dsl-only.net> wrote:

I'll note that:

Bug 214855 - head -r309179 TARGET_ARCH=3Dpowerpc64 clang 3.9.0 based =
cross build: powerpc.powerpc64/usr/src/tmp/usr/bin/ld: BFD 2.17.50 =
[FreeBSD] 2007-07-03 internal error

means that I can not use the bootstrap binutils to do buildworld for =
powerpc64.
I've confirmed that it still happens in -r311147 .

So to span both buildkernel and buildworld  does require =
devel/powerpc64-binutils
or the like for TARGET_ARCH=3Dpowerpc64 .

=3D=3D=3D
Mark Millard
markmi at dsl-only.net

On 2017-Jan-8, at 4:40 PM, Mark Millard <markmi at dsl-only.net> wrote:

[I've not tried lldb yet but I have good news. . .]

Well it turns out I was wrong: after the @toc changes (now in the
TOC_REF(...) macro instead of per instruction) I can boot a kernel built
using the bootstrap system binutils and clang as well.
devel/powerpc64-binutils or the like is not required.

It looks like bugzilla 215821 is wrong/redundant and 215819 actually
covers the issue. I will likely close 215821 after I've played around
some more.

I can build with clang 3.9.1, devel/powerpc64-xtoolchain-gcc, or gcc =
4.2.1
as I have things. clang 3.9.1 based builds do not handle throwing C++
exceptions. lib32 does not work for devel/powerpc64-gcc based builds.


As stands I have head -r311147 with:

# svnlite status /usr/src/ | sort
?       /usr/src/sys/amd64/conf/GENERIC-DBG
?       /usr/src/sys/amd64/conf/GENERIC-NODBG
?       /usr/src/sys/arm/conf/BPIM3-DBG
?       /usr/src/sys/arm/conf/BPIM3-NODBG
?       /usr/src/sys/arm/conf/RPI2-DBG
?       /usr/src/sys/arm/conf/RPI2-NODBG
?       /usr/src/sys/arm64/conf/GENERIC-DBG
?       /usr/src/sys/arm64/conf/GENERIC-NODBG
?       /usr/src/sys/powerpc/conf/GENERIC64vtsc-DBG
?       /usr/src/sys/powerpc/conf/GENERIC64vtsc-NODBG
?       /usr/src/sys/powerpc/conf/GENERICvtsc-DBG
?       /usr/src/sys/powerpc/conf/GENERICvtsc-NODBG
M       /usr/src/contrib/llvm/lib/Target/PowerPC/PPCInstrInfo.td
M       /usr/src/lib/csu/powerpc64/Makefile
M       /usr/src/sys/boot/ofw/Makefile.inc
M       /usr/src/sys/boot/powerpc/Makefile.inc
M       /usr/src/sys/boot/powerpc/kboot/Makefile
M       /usr/src/sys/boot/uboot/Makefile.inc
M       /usr/src/sys/conf/Makefile.powerpc
M       /usr/src/sys/conf/kern.mk
M       /usr/src/sys/conf/kmod.mk
M       /usr/src/sys/ddb/db_main.c (Not relevant)
M       /usr/src/sys/ddb/db_script.c (Not relevant)
M       /usr/src/sys/modules/zfs/Makefile
M       /usr/src/sys/powerpc/aim/trap_subr32.S
M       /usr/src/sys/powerpc/include/asm.h
M       /usr/src/sys/powerpc/ofw/ofw_machdep.c (Not relevant)

The various KERNCONF's include standard ones then adjust things.
They are not otherwise relevant.


Notes on the differences ("M" lines):

[I do not have a context to test powerpc's kboot or uboot
for powerpc or powerpc64: only PowerMacs. Those Makefile
changes were based on avoiding build errors that occurred
before the change (long ago). I've not gone back through
the armv6(/v7) and arm64 builds recently but historically
they have worked on the rpi2, bpim3, and pine64 with the
boot/uboot/Makefile.inc change in place.]


llvm/lib/Target/PowerPC/PPCInstrInfo.td is Roman D.'s
incomplete patch for the e500 instructions. It was
sufficient to let me continue.


The various Makefile*'s and *.mk's deal with:

-mlongcall (gcc) vs. not (clang)

-m elf32ppc_fbsd (old) vs. -Wl,-m -Wl,elf32ppc_fbsd (new)

-mcpu=3Dpowerpc64 and -Wa,-mppc64bridge in a Makefile
(kboot) that TARGET_ARCH=3Dpowerpc tried to build and
failed: delete the usage of these options. (No test
validation of built kboot result!)

-Wa,many for gcc vs. no-such for clang


sys/conf/kern.mk deals with:

-mllvm -disable-ppc-float-in-variadic=3Dtrue (older clang)
vs.
-msoft-float (newer clang)


sys/modules/zfs/Makefile deals with:

-mminimial-toc (gcc) vs. no-such (clang)


sys/ddb/db_main.c and sys/ddb/db_script.c :

These would not be included. (They set up to execute
a built-in default script so I get information for
early boot issues from before ddb takes input.)


sys/powerpc/aim/trap_subr32.S deals with:

Have a cmp instruction be explicit by adding a "0, ".
(This is a TARGET_ARCH=3Dpowerpc issue, not a
TARGET_ARCH=3Dpowerpc64 issue.)


sys/powerpc/include/asm.h deals with:

Have TOC_REF(...) also include @toc in the notation
that results. Have a TOC_NAME_FOR_REF(...) that only
adds the .L to the name passed in and use it where
appropriate.


sys/powerpc/ofw/ofw_machdep.c :

This would not be included. (It is a PowerMac G5 specific
workaround for a openfirmware vs. FreeBSD conflict that
makes booting unreliable for standard FreeBSD builds.)



The details that are not driven by PowerMac G5 specifics
look like:

Index: /usr/src/contrib/llvm/lib/Target/PowerPC/PPCInstrInfo.td
=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/contrib/llvm/lib/Target/PowerPC/PPCInstrInfo.td	=
(revision 311147)
+++ /usr/src/contrib/llvm/lib/Target/PowerPC/PPCInstrInfo.td	(working =
copy)
@@ -2336,6 +2336,12 @@
def MFTB : XFXForm_1<31, 371, (outs gprc:$RT), (ins i32imm:$SPR),
                    "mftb $RT, $SPR", IIC_SprMFTB>;

+def MFPMR : XFXForm_1<31, 334, (outs gprc:$RT), (ins i32imm:$PMRN),
+                     "mfpmr $RT, $PMRN", IIC_IntGeneral>;
+
+def MTPMR : XFXForm_1<31, 462, (outs), (ins i32imm:$PMRN, gprc:$RS),
+                     "mtpmr $PMRN, $RS", IIC_IntGeneral>;
+
// A pseudo-instruction used to implement the read of the 64-bit cycle =
counter
// on a 32-bit target.
let hasSideEffects =3D 1, usesCustomInserter =3D 1 in
Index: /usr/src/lib/csu/powerpc64/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/src/lib/csu/powerpc64/Makefile	(revision 311147)
+++ /usr/src/lib/csu/powerpc64/Makefile	(working copy)
@@ -5,19 +5,20 @@
SRCS=3D		crt1.c crti.S crtn.S
OBJS=3D		${SRCS:N*.h:R:S/$/.o/g}
OBJS+=3D		Scrt1.o gcrt1.o
+.include <bsd.compiler.mk>
+.if ${COMPILER_TYPE} =3D=3D "gcc"
CFLAGS+=3D	-I${.CURDIR}/../common \
		-I${.CURDIR}/../../libc/include \
		-mlongcall
+.else
+CFLAGS+=3D	-I${.CURDIR}/../common \
+		-I${.CURDIR}/../../libc/include
+.endif

# XXX: See the log for r232932 as to why the above -mlongcall is needed. =
 Since
# clang doesn't support -mlongcall, and testing shows a clang linked =
with a
# clang-built csu segfaults, this must currently be compiled with gcc.  =
Once
# clang supports -mlongcall, or we get a fixed ld, this can be =
revisited.
-.include <bsd.compiler.mk>
-.if ${COMPILER_TYPE} !=3D "gcc"
-CC:=3D		gcc
-COMPILER_TYPE:=3D	gcc
-.endif

FILES=3D		${OBJS}
FILESMODE=3D	${LIBMODE}
Index: /usr/src/sys/boot/ofw/Makefile.inc
=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/sys/boot/ofw/Makefile.inc	(revision 311147)
+++ /usr/src/sys/boot/ofw/Makefile.inc	(working copy)
@@ -2,7 +2,7 @@

.if ${MACHINE_ARCH} =3D=3D "powerpc64"
CFLAGS+=3D	-m32 -mcpu=3Dpowerpc
-LDFLAGS+=3D	-m elf32ppc_fbsd
+LDFLAGS+=3D	-Wl,-m -Wl,elf32ppc_fbsd
.endif

.include "../Makefile.inc"
Index: /usr/src/sys/boot/powerpc/Makefile.inc
=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/sys/boot/powerpc/Makefile.inc	(revision 311147)
+++ /usr/src/sys/boot/powerpc/Makefile.inc	(working copy)
@@ -2,6 +2,7 @@

.if ${MACHINE_ARCH} =3D=3D "powerpc64"
CFLAGS+=3D	-m32 -mcpu=3Dpowerpc
+LDFLAGS+=3D	-Wl,-m -Wl,elf32ppc_fbsd
.endif

.include "../Makefile.inc"
Index: /usr/src/sys/boot/powerpc/kboot/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/src/sys/boot/powerpc/kboot/Makefile	(revision 311147)
+++ /usr/src/sys/boot/powerpc/kboot/Makefile	(working copy)
@@ -68,8 +68,6 @@
LIBFICL=3D	${.OBJDIR}/../../ficl/libficl.a
.endif

-CFLAGS+=3D	-mcpu=3Dpowerpc64
-
# Always add MI sources
.PATH:		${.CURDIR}/../../common ${.CURDIR}/../../../libkern
.include	"${.CURDIR}/../../common/Makefile.inc"
@@ -85,9 +83,6 @@

LDFLAGS=3D	-nostdlib -static -T ${.CURDIR}/ldscript.powerpc

-# 64-bit bridge extensions
-CFLAGS+=3D -Wa,-mppc64bridge
-
# Pull in common loader code
#.PATH:		${.CURDIR}/../../ofw/common
#.include	"${.CURDIR}/../../ofw/common/Makefile.inc"
Index: /usr/src/sys/boot/uboot/Makefile.inc
=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/sys/boot/uboot/Makefile.inc	(revision 311147)
+++ /usr/src/sys/boot/uboot/Makefile.inc	(working copy)
@@ -2,7 +2,7 @@

.if ${MACHINE_ARCH} =3D=3D "powerpc64"
CFLAGS+=3D	-m32 -mcpu=3Dpowerpc
-LDFLAGS+=3D	-m elf32ppc_fbsd
+LDFLAGS+=3D	-Wl,-m -Wl,elf32ppc_fbsd
.endif

.include "../Makefile.inc"
Index: /usr/src/sys/conf/Makefile.powerpc
=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/sys/conf/Makefile.powerpc	(revision 311147)
+++ /usr/src/sys/conf/Makefile.powerpc	(working copy)
@@ -39,7 +39,11 @@
# Force __SPE__, since the builtin will be removed later with -mno-spe
CFLAGS+=3D -mabi=3Dspe -D__SPE__
.endif
+.if ${COMPILER_TYPE} =3D=3D "gcc"
CFLAGS+=3D -msoft-float -Wa,-many
+.else
+CFLAGS+=3D -msoft-float
+.endif

# Build position-independent kernel
CFLAGS+=3D -fPIC
Index: /usr/src/sys/conf/kern.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/sys/conf/kern.mk	(revision 311147)
+++ /usr/src/sys/conf/kern.mk	(working copy)
@@ -162,7 +162,11 @@
#
.if ${MACHINE_CPUARCH} =3D=3D "powerpc"
CFLAGS+=3D	-mno-altivec
+.if ${COMPILER_TYPE} =3D=3D "clang" && ${COMPILER_VERSION} < 30800
CFLAGS.clang+=3D	-mllvm -disable-ppc-float-in-variadic=3Dtrue
+.else
+CFLAGS.clang+=3D	-msoft-float
+.endif
CFLAGS.gcc+=3D	-msoft-float
INLINE_LIMIT?=3D	15000
.endif
Index: /usr/src/sys/conf/kmod.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/sys/conf/kmod.mk	(revision 311147)
+++ /usr/src/sys/conf/kmod.mk	(working copy)
@@ -147,8 +147,12 @@
.endif

.if ${MACHINE_CPUARCH} =3D=3D powerpc
+.if ${COMPILER_TYPE} =3D=3D "gcc"
CFLAGS+=3D	-mlongcall -fno-omit-frame-pointer
+.else
+CFLAGS+=3D	-fno-omit-frame-pointer
.endif
+.endif

.if ${MACHINE_CPUARCH} =3D=3D mips
CFLAGS+=3D	-G0 -fno-pic -mno-abicalls -mlong-calls
Index: /usr/src/sys/modules/zfs/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/src/sys/modules/zfs/Makefile	(revision 311147)
+++ /usr/src/sys/modules/zfs/Makefile	(working copy)
@@ -93,9 +93,16 @@
CFLAGS+=3D-I${SUNW}/common
CFLAGS+=3D-DBUILDING_ZFS

+
.if ${MACHINE_ARCH} =3D=3D "powerpc64"
+.include <bsd.compiler.mk>
+.if ${COMPILER_TYPE} =3D=3D "gcc"
+# gcc421 requires the -mminimal-toc .
+# But clang 3.9.1 disallows it and does not need it.
+# more modern gcc's allow it.
CFLAGS+=3D-mminimal-toc
.endif
+.endif

.ifdef ZFS_DEBUG
CFLAGS+=3D-DDEBUG=3D1
Index: /usr/src/sys/powerpc/aim/trap_subr32.S
=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/sys/powerpc/aim/trap_subr32.S	(revision 311147)
+++ /usr/src/sys/powerpc/aim/trap_subr32.S	(working copy)
@@ -406,7 +406,7 @@
	mtctr %r1			/* load counter */
im1:
	lwzu %r1, 8(%r2)		/* get next pte */
-	cmp 0, %r1, %r3			/* see if found pte */
+	cmp 0, 0, %r1, %r3		/* see if found pte */
	bdnzf 2, im1			/* dec count br if cmp ne and if
					 * count not zero */
	bne instr_sec_hash		/* if not found set up second =
hash
Index: /usr/src/sys/powerpc/include/asm.h
=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/sys/powerpc/include/asm.h	(revision 311147)
+++ /usr/src/sys/powerpc/include/asm.h	(working copy)
@@ -89,10 +89,11 @@
	name:

#ifdef __powerpc64__
-#define TOC_REF(name)	__CONCAT(.L,name)
+#define TOC_NAME_FOR_REF(name)	__CONCAT(.L,name)
+#define TOC_REF(name)	TOC_NAME_FOR_REF(name)@toc
#define TOC_ENTRY(name) \
	.section ".toc","aw"; \
-	TOC_REF(name): \
+	TOC_NAME_FOR_REF(name): \
       .tc name[TC],name
#endif



=3D=3D=3D
Mark Millard
markmi at dsl-only.net

On 2017-Jan-8, at 6:41 AM, Roman Divacky <rdivacky@vlakno.cz> wrote:

Mark,

Would you be interested in trying lld? It has some support for =
ppc/ppc64, which
is probably quite incomplete but it would be nice to know what exactly =
is
missing.

We also have some people (emaste@, davide@) that have non-trivial lld =
knowledge
so perhaps progress can be achieved on this side easily?

Roman

On Sun, Jan 08, 2017 at 02:57:11AM -0800, Mark Millard wrote:
> [I forgot to indicate that I still can not use the system bootstrapped
> ld command and so there is a reason that I used =
devel/powerpc64-binutils.]
>=20
> On 2017-Jan-8, at 2:24 AM, Mark Millard <markmi at dsl-only.net> =
wrote:
>=20
>> On 2017-Jan-8, at 1:03 AM, Roman Divacky <rdivacky at vlakno.cz> =
wrote:
>>=20
>>> I think we should add the @toc notations to all the places where =
it's needed.
>>> Can you submit such a patch (perhaps with the one for adding 0 to =
the cmp
>>> instruction) so they can be committed to FreeBSD repo?
>>=20
>> In order to test I added @toc to each of the 10 instructions instead
>> of adjusting the macros so that instructions would automatically
>> get the notation but other (what are now) TOC_REF(...) usage would
>> not that should not.
>>=20
>> I suspect Nathan and Justin might prefer a more automatic
>> alternative so that TOC_REF(...) in an instruction would
>> be sufficient without an explicit @toc in the instruction.
>>=20
>> I'll see about switching to such code before providing a
>> patch. I'd include the "0, " update to the cmp instruction.
>>=20
>> But adding @toc's in those instructions (with prior workarounds
>> as well) did allow me to build a bootable system based on using
>> devel/powerpc64-binutils and clang 3.9.1 for both buildworld
>> and buildkernel --still using clang's internal assembler.
>>=20
>> One issue is that clang does not support (or need) the
>> -mminmal-toc in sys/modules/zfs/Makefile but gcc 4.2.1
>> requires it. For sys/modules/zfs/Makefile my source
>> currently does not support gcc 4.2.1 without editing.
>> As I remember devel/powerpc64-gcc
>> (devel/powerpc64-xtoolchain-gcc) does not require the
>> -mminimal-toc either. But devel/powerpc64-gcc does
>> allow -mminimal-toc so it can be a clang vs. gcc based
>> choice.
>>=20
>> I  might also deal with that before providing patches.
>>=20
>> Note: -mlongcall was also not needed nor used for clang.
>> (Still used for gcc.)
>>=20
>> sys/boot/powerpc/kboot/Makefile has a -mcpu=3Dpowerpc64
>> and -Wa,-mppc64bridge that I eliminated (they messed up
>> 32-bit powerpc builds) but I've no way to test kboot that
>> I know of. This patch might be rejected.
>>=20
>> Remember that I got this far in part by using your partial
>> e500-instructions patch. I can provide my variant that
>> is a diff with -r311147 instead of an older place in the
>> history. But it would be incomplete coverage of those 2
>> instructions in clang.
>>=20
>> Also I build with a workaround for PowerMac G5 boot
>> reliability since OpenFirmware and FreeBSD interact
>> badly at times on PowerMac G5's. This I would not
>> provide as it is PowerMac G5 specific.
>>=20
>>> If gnu as warns and llvm assembler does the wrong thing without @toc =
and both
>>> do the correct thing with @toc I think it's an obvious decision.
>>=20
>> My choice would be to supply the @toc notation in some way,
>> not necessarily the form I used for the initial test.
>>=20
>>> Also, with all these changes. Does clang compiled kernel boot?
>>=20
>> The PowerMac G5 so-called "Quad Core" that I currently have access
>> to is now running from buildworld and buildkernel based on
>> devel/powerpc64-binutils and clang 3.9.1 :
>>=20
>> Copyright (c) 1992-2017 The FreeBSD Project.
>> Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, =
1994
>>    The Regents of the University of California. All rights reserved.
>> FreeBSD is a registered trademark of The FreeBSD Foundation.
>> FreeBSD 12.0-CURRENT #2 r311147M: Sat Jan  7 16:55:01 PST 2017
>> =
markmi@FreeBSDx64:/usr/obj/powerpc64vtsc_clang_altbinutils_kernel/powerpc.=
powerpc64/usr/src/sys/GENERIC64vtsc-NODBG powerpc
>> FreeBSD clang version 3.9.1 (tags/RELEASE_391/final 289601) (based on =
LLVM 3.9.1)
>> . . .
>>=20
>> # uname -apKU
>> FreeBSD FBSDG5L 12.0-CURRENT FreeBSD 12.0-CURRENT #2 r311147M: Sat =
Jan  7 16:55:01 PST 2017     =
markmi@FreeBSDx64:/usr/obj/powerpc64vtsc_clang_altbinutils_kernel/powerpc.=
powerpc64/usr/src/sys/GENERIC64vtsc-NODBG  powerpc powerpc64 1200019 =
1200019
>>=20
>> I've built about a dozen ports on it after booting but I've not
>> done a self-hosted buildworld buildkernel yet.
>>=20
>> [Note: Anything dependent on throwing C++ exceptions in
>> code generated by clang++ 3.9.1 is broken.]
>=20
> I should have been explicit:
>=20
> I still can not use the system bootstrapped ld command
> and such binutils for buildkernel and so there is a
> reason that I used devel/powerpc64-binutils instead.
>=20
> Thus even with my patches clang 3.9.1 would not be ready
> for general use or for a default way of building. I
> have to have a tailored SRC_ENV_CONF file or the like
> still --and a port built and installed.
>=20
> [On a powerpc64 system devel/binutils could be used.]
>=20
> There is also the issue with throwing C++ exceptions
> in code when clang 3.9.1 was the code generator used.
>=20
> =3D=3D=3D
> Mark Millard
> markmi at dsl-only.net
>=20
> On Sat, Jan 07, 2017 at 04:28:48PM -0800, Mark Millard wrote:
>> [Top post about FreeBSD bugzilla 215819 and llvm bugzilla
>> 31574 submittals for the issue involved.]
>>=20
>> My guess is that FreeBSD will view this as a kernel
>> source code issue and not as a toolchain issue. But
>> it is only a guess on my part.
>>=20
>>=20
>> I have submitted llvm bugzilla 31574 for this issue. It
>> includes example .S file content that shows the "problem"
>> in the generated .o file (form FreeBSD's view point).
>> (I've no clue how llvm views its criteria relative to this
>> mismatch with gcc/binutils.)
>>=20
>> Because FreeBSD source code changes (being explicit about
>> @toc) avoid the distinction between clang and gcc/binutils
>> I've not added 31574 to the Depends on list for llvm 25780
>> (the FreeBSD system compiler issues META entry in llvm).
>>=20
>> Someone with official status for FreeBSD could add 31574 to
>> llvm's 25780 if FreeBSD wants to push llvm to match
>> gcc/binutils for "@toc notation missing".
>>=20
>> Otherwise this is a kernel source code issue (as I would
>> guess) and not a toolchain issue.
>>=20
>> Ed Maste or someone like that likely would make the final
>> decision.
>>=20
>>=20
>> I've added to FreeBSD Bugzilla 215819 the new information,
>> including the simple example .S file content that shows the
>> problem in the generated .o file. (Comments #3 and #4
>> have the new material.)
>>=20
>> My guess is that FreeBSD Bugzilla 215819 should no longer
>> be assigned to freebsd-toolchain@FreeBSD.org . Instead it
>> would be a powerpc64 kernel source code issue if I'm right.
>>=20
>> Ed Maste or someone like that likely would make this final
>> decision as well.
>>=20
>> =3D=3D=3D
>> Mark Millard
>> markmi at dsl-only.net
>>=20
>> On 2017-Jan-7, at 3:12 PM, Mark Millard <markmi at dsl-only.net> =
wrote:
>>=20
>>> [I've supplied a list of places that adding @toc notation should
>>> make clang 3.9.1 targeting powerpc64 do the right thing for
>>> this issue.]
>>>=20
>>> On 2017-Jan-7, at 2:07 PM, Mark Millard <markmi at dsl-only.net> =
wrote:
>>>=20
>>>> On 2017-Jan-7, at 12:51 AM, Roman Divacky <rdivacky at vlakno.cz> =
wrote:
>>>>=20
>>>>> That's a great progress. Can you produce minimal self contained =
test case that
>>>>> exhibits this bug? And submit it to llvm bugzilla?
>>>>>=20
>>>>> Also, clang3.9 defaults to using it's own internal asm, what =
happens if you
>>>>> add -no-integrated-as to CFLAGS and recompile the kernel? That =
should remove
>>>>> this llvm assembly problem. Does it boot?
>>>>>=20
>>>>> Thanks Mark, really great progress.
>>>>>=20
>>>>> Roman
>>>>=20
>>>> In attempting this I found how to control the behavior based on
>>>> the assembler notation @toc being missing vs. being present.
>>>>=20
>>>> If llvm should change is strongly tied to llvm's criteria for
>>>> gcc compatibility relative to filling-in/defaulting omitted
>>>> @toc's in the assembler notation.
>>>>=20
>>>> FreeBSD has the option of always being explicit with @toc in order
>>>> to avoid differences in handling of omitted notation.
>>>>=20
>>>> So I've no clue if FreebSD wants to claim that a llvm change
>>>> is a requirement for using clang as the powerpc64 system compiler.
>>>>=20
>>>> [The issue of the distinction is submittable to llvm either way.]
>>>>=20
>>>> Details. . .
>>>>=20
>>>> For:
>>>>=20
>>>>  .section ".toc","aw"
>>>> tmpstk.L: .tc tmpstk[TC],tmpstk
>>>> . . .
>>>>  /* Set up the stack pointer */
>>>>  ld      %r1,tmpstk.L(%r2)
>>>>=20
>>>> using devel/powerpc64-gcc gets:
>>>>=20
>>>> # /usr/local/bin/powerpc64-unknown-freebsd12.0-gcc \                =
                                                                         =
                                                                         =
                                                           -c \          =
                                                                         =
                                                                         =
                                                                         =
                                        -x assembler-with-cpp \          =
                                                                         =
                                                                         =
                                                                         =
                     -pipe  \                                            =
                                                                         =
                                                =20

>=20
>>=20
>>>=20
>>>>                                                                     =
                    locore64_simplified.S
>>>> locore64_simplified.S: Assembler messages:
>>>> locore64_simplified.S:80: Warning: assuming @toc on symbol
>>>>=20
>>>> and produces (with R_PPC64_TOC16_DS for .toc):
>>>>=20
>>>> # /usr/local/powerpc64-freebsd/bin/objdump -r locore64_simplified.o
>>>>=20
>>>> locore64_simplified.o:     file format elf64-powerpc-freebsd
>>>>=20
>>>> RELOCATION RECORDS FOR [.text]:
>>>> OFFSET           TYPE              VALUE=20
>>>> 0000000000000028 R_PPC64_REL64     __tocbase+0x0000000000008000
>>>> 0000000000000046 R_PPC64_TOC16_DS  .toc
>>>>=20
>>>>=20
>>>> RELOCATION RECORDS FOR [.toc]:
>>>> OFFSET           TYPE              VALUE=20
>>>> 0000000000000000 R_PPC64_ADDR64    tmpstk
>>>>=20
>>>>=20
>>>> RELOCATION RECORDS FOR [.opd]:
>>>> OFFSET           TYPE              VALUE=20
>>>> 0000000000000000 R_PPC64_ADDR64    .__start
>>>> 0000000000000008 R_PPC64_TOC       *ABS*
>>>>=20
>>>>=20
>>>> By contrast clang is silent (cross compiler used):
>>>>=20
>>>> # =
/usr/obj/powerpc64vtsc_clang_kernel/powerpc.powerpc64/usr/src/tmp/usr/bin/=
cc \                                                                     =
                                                                         =
                                                   -target =
powerpc64-unknown-freebsd12.0 \                                          =
                                                                         =
                                                                         =
                                              =
--sysroot=3D/usr/obj/powerpc64vtsc_clang_kernel/powerpc.powerpc64/usr/src/=
tmp \                                                                    =
                                                                         =
                                                       =
-B/usr/obj/powerpc64vtsc_clang_kernel/powerpc.powerpc64/usr/src/tmp/usr/bi=
n \                                                                      =
                          =20

>=20
>>=20
>>>=20
>>>>                                                                     =
                    -c \                                                 =
                                                                         =
                                                                         =
                                                                         =
 -x assembler-with-cpp \                                                 =
                                                                         =
                                                                         =
                                                       -pipe  \          =
                                                                         =
                                                                         =
                                                                         =
                                    locore64_simplified.S
>>>>=20
>>>> and produces code with R_PPC64_ADDR16_DS for the .toc instead:
>>>>=20
>>>> # /usr/local/powerpc64-freebsd/bin/objdump -r locore64_simplified.o =
| more                                                                   =
                                                                         =
                                                          =20
>>>> locore64_simplified.o:     file format elf64-powerpc-freebsd
>>>>=20
>>>> RELOCATION RECORDS FOR [.text]:
>>>> OFFSET           TYPE              VALUE=20
>>>> 0000000000000028 R_PPC64_REL64     __tocbase+0x0000000000008000
>>>> 0000000000000046 R_PPC64_ADDR16_DS  .toc
>>>>=20
>>>>=20
>>>> RELOCATION RECORDS FOR [.toc]:
>>>> OFFSET           TYPE              VALUE=20
>>>> 0000000000000000 R_PPC64_ADDR64    tmpstk
>>>>=20
>>>>=20
>>>> RELOCATION RECORDS FOR [.opd]:
>>>> OFFSET           TYPE              VALUE=20
>>>> 0000000000000000 R_PPC64_ADDR64    .__start
>>>> 0000000000000008 R_PPC64_TOC       *ABS*
>>>>=20
>>>>=20
>>>>=20
>>>> But for:
>>>>=20
>>>>  .section ".toc","aw"
>>>> tmpstk.L: .tc tmpstk[TC],tmpstk
>>>> . . .
>>>>  /* Set up the stack pointer */
>>>>  ld      %r1,tmpstk.L@toc(%r2)
>>>>=20
>>>> (note the @toc notation) both compilers agree and use
>>>> R_PPC64_TOC16_DS for the .toc:
>>>>=20
>>>> # /usr/local/bin/powerpc64-unknown-freebsd12.0-gcc \                =
                                                                         =
                                                                         =
                                                           -c \          =
                                                                         =
                                                                         =
                                                                         =
                                        -x assembler-with-cpp \          =
                                                                         =
                                                                         =
                                                                         =
                     -pipe  \                                            =
                                                                         =
                                                =20

>=20
>>=20
>>>=20
>>>>                                                                     =
                    locore64_simplified.S
>>>>=20
>>>> # /usr/local/powerpc64-freebsd/bin/objdump -r locore64_simplified.o =
| more                                                                   =
                                                                         =
                                                          =20
>>>> locore64_simplified.o:     file format elf64-powerpc-freebsd
>>>>=20
>>>> RELOCATION RECORDS FOR [.text]:
>>>> OFFSET           TYPE              VALUE=20
>>>> 0000000000000028 R_PPC64_REL64     __tocbase+0x0000000000008000
>>>> 0000000000000046 R_PPC64_TOC16_DS  .toc
>>>>=20
>>>>=20
>>>> RELOCATION RECORDS FOR [.toc]:
>>>> OFFSET           TYPE              VALUE=20
>>>> 0000000000000000 R_PPC64_ADDR64    tmpstk
>>>>=20
>>>>=20
>>>> RELOCATION RECORDS FOR [.opd]:
>>>> OFFSET           TYPE              VALUE=20
>>>> 0000000000000000 R_PPC64_ADDR64    .__start
>>>> 0000000000000008 R_PPC64_TOC       *ABS*
>>>>=20
>>>>=20
>>>> # =
/usr/obj/powerpc64vtsc_clang_kernel/powerpc.powerpc64/usr/src/tmp/usr/bin/=
cc \                                                                     =
                                                                         =
                                                   -target =
powerpc64-unknown-freebsd12.0 \                                          =
                                                                         =
                                                                         =
                                              =
--sysroot=3D/usr/obj/powerpc64vtsc_clang_kernel/powerpc.powerpc64/usr/src/=
tmp \                                                                    =
                                                                         =
                                                       =
-B/usr/obj/powerpc64vtsc_clang_kernel/powerpc.powerpc64/usr/src/tmp/usr/bi=
n \                                                                      =
                          =20

>=20
>>=20
>>>=20
>>>>                                                                     =
                    -c \                                                 =
                                                                         =
                                                                         =
                                                                         =
 -x assembler-with-cpp \                                                 =
                                                                         =
                                                                         =
                                                       -pipe  \          =
                                                                         =
                                                                         =
                                                                         =
                                    locore64_simplified.S
>>>>=20
>>>> # /usr/local/powerpc64-freebsd/bin/objdump -r locore64_simplified.o =
| more                                                                   =
                                                                         =
                                                          =20
>>>> locore64_simplified.o:     file format elf64-powerpc-freebsd
>>>>=20
>>>> RELOCATION RECORDS FOR [.text]:
>>>> OFFSET           TYPE              VALUE=20
>>>> 0000000000000028 R_PPC64_REL64     __tocbase+0x0000000000008000
>>>> 0000000000000046 R_PPC64_TOC16_DS  .toc
>>>>=20
>>>>=20
>>>> RELOCATION RECORDS FOR [.toc]:
>>>> OFFSET           TYPE              VALUE=20
>>>> 0000000000000000 R_PPC64_ADDR64    tmpstk
>>>>=20
>>>>=20
>>>> RELOCATION RECORDS FOR [.opd]:
>>>> OFFSET           TYPE              VALUE=20
>>>> 0000000000000000 R_PPC64_ADDR64    .__start
>>>> 0000000000000008 R_PPC64_TOC       *ABS*
>>>>=20
>>>>=20
>>>>=20
>>>> I omitted "-f -gdwarf-2" to simplify things but with such
>>>> clang complains about:
>>>>=20
>>>> locore64_simplified.S:36:2: warning: DWARF2 only supports one =
section per compilation unit
>>>> .section ".toc","aw"
>>>> ^
>>>> locore64_simplified.S:47:2: warning: DWARF2 only supports one =
section per compilation unit
>>>> .section ".opd","aw"
>>>> ^
>>>>=20
>>>> (buildkernel gets such messages.)
>>>>=20
>>>>=20
>>>> I expect I can simplify the .S code more than I have so far but
>>>> I figured I'd report the discovery of the choice FreeBSD needs
>>>> to make for powerpc64 for if llvm changes are to be required
>>>> vs. not.
>>>=20
>>> The following should be a list of the places that adding @toc usage
>>> would fix some things for using clang 3.9.1 to target powerpc64:
>>>=20
>>> # grep "@toc[^b]" =
/root/sys_typescripts/typescript_make_powerpc64vtsc_nodebug_incl_clang_xto=
olchain_kernel-amd64-host-2017-01-03:23:48:41 | more
>>> /usr/src/sys/powerpc/aim/locore64.S:102: Warning: assuming @toc on =
symbol
>>> /usr/src/sys/powerpc/aim/trap_subr64.S:320: Warning: assuming @toc =
on symbol
>>> /usr/src/sys/powerpc/aim/trap_subr64.S:797: Warning: assuming @toc =
on symbol
>>> /usr/src/sys/powerpc/ofw/ofwcall64.S:104: Warning: assuming @toc on =
symbol
>>> /usr/src/sys/powerpc/ofw/ofwcall64.S:108: Warning: assuming @toc on =
symbol
>>> /usr/src/sys/powerpc/ofw/ofwcall64.S:116: Warning: assuming @toc on =
symbol
>>> /usr/src/sys/powerpc/ofw/ofwcall64.S:226: Warning: assuming @toc on =
symbol
>>> /usr/src/sys/powerpc/ofw/ofwcall64.S:228: Warning: assuming @toc on =
symbol
>>> /usr/src/sys/powerpc/ofw/ofwcall64.S:235: Warning: assuming @toc on =
symbol
>>> /usr/src/sys/powerpc/powerpc/swtch64.S:153: Warning: assuming @toc =
on symbol
>>>=20
>>> devel/powerpc64-gcc and devel/powerpc64-binutils together happens to =
report
>>> on missing @toc 's.
>>>=20
>>> But, of course, if some sections of code are conditionally compiled =
and
>>> excluded above they would not be listed.
>>>=20
>>> =3D=3D=3D
>>> Mark Millard
>>> markmi at dsl-only.net
>>=20
>> _______________________________________________
>> freebsd-toolchain@freebsd.org mailing list
>> https://lists.freebsd.org/mailman/listinfo/freebsd-toolchain
>> To unsubscribe, send any mail to =
"freebsd-toolchain-unsubscribe@freebsd.org"
>=20
> _______________________________________________
> freebsd-toolchain@freebsd.org mailing list
> https://lists.freebsd.org/mailman/listinfo/freebsd-toolchain
> To unsubscribe, send any mail to =
"freebsd-toolchain-unsubscribe@freebsd.org"

_______________________________________________
freebsd-ppc@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/freebsd-ppc
To unsubscribe, send any mail to "freebsd-ppc-unsubscribe@freebsd.org"





Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?F2CE3972-6990-44CB-8D76-DEDCA92F8314>