Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 10 Jan 2016 09:59:33 -0800
From:      Mark Millard <markmi@dsl-only.net>
To:        Dimitry Andric <dim@FreeBSD.org>, Ian Lepore <ian@freebsd.org>
Cc:        freebsd-arm <freebsd-arm@freebsd.org>, FreeBSD Toolchain <freebsd-toolchain@freebsd.org>
Subject:   Re: Bug 205663 Clang getting Bus Errors (arm SCLTR Bit[12]==1 context): Reported fixed on llvm's trunk
Message-ID:  <602C5169-40E4-4A68-9C91-214E617FC255@dsl-only.net>
In-Reply-To: <831D8A96-51D6-4E34-B422-A20857B6769E@dsl-only.net>
References:  <C90F0ABA-3C59-4FE1-AAB4-99F8FF32FB24@dsl-only.net> <CANCZdfoWDg_ZX8zxqRV2-Q6teYf_Ef4f3VKB0fhb0sikcW3hUA@mail.gmail.com> <1452020032.1320.21.camel@freebsd.org> <7EE8F65E-7485-4FA9-A136-F22090DB107F@FreeBSD.org> <92264003-CF0E-4624-A28A-8AFB7C663BFB@dsl-only.net> <39774562-F76E-41E9-85E7-ABE257B013D6@FreeBSD.org> <1452365750.1523.9.camel@freebsd.org> <831D8A96-51D6-4E34-B422-A20857B6769E@dsl-only.net>

next in thread | previous in thread | raw e-mail | index | archive | help
[A top post of my so far successful experiment. . .]

amd64 -> rpi2 cross build: buildworld buildkernel installkernel =
installworld mergemaster delete-old then boot the result on an rpi2 =
worked ( -march=3Darmv7a -mcpu=3Dcortex-a7 -mfloat-abi=3Dsoftfp =
-mno-unaligned-access used ).

In order to also build lldb I used the following beyond what Ian sent =
out for -mlong-calls usage:
(I make no claim to have tested the lldb build.)
(Tabs likely not preserved in the copy/paste operations.)

> # more lib_libc++_Makfile.diff=20
> Index: /usr/src/lib/libc++/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/libc++/Makefile        (revision 293430)
> +++ /usr/src/lib/libc++/Makefile        (working copy)
> @@ -57,6 +57,9 @@
>  .endfor
> =20
>  WARNS=3D         0
> +.if ${MACHINE_CPUARCH} =3D=3D "arm"
> +STATIC_CXXFLAGS+=3D-mlong-calls
> +.endif
>  CFLAGS+=3D       -I${HDRDIR} -I${_LIBCXXRTDIR} -nostdlib -DLIBCXXRT
>  .if empty(CXXFLAGS:M-std=3D*)
>  CXXFLAGS+=3D     -std=3Dc++11

> # more usr_bin_clang_lldb_Makefile.diff=20
> Index: /usr/src/usr.bin/clang/lldb/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/usr.bin/clang/lldb/Makefile        (revision 293430)
> +++ /usr/src/usr.bin/clang/lldb/Makefile        (working copy)
> @@ -6,6 +6,10 @@
> =20
>  LLDB_SRCS=3D${.CURDIR}/../../../contrib/llvm/tools/lldb
> =20
> +.if ${MACHINE_CPUARCH} =3D=3D "arm"
> +CFLAGS+=3D-mlong-calls
> +.endif
> +
>  CFLAGS+=3D       -I${LLDB_SRCS}/include
>  CXXFLAGS+=3D     -std=3Dc++11
=20


The rpi2 is now attempting buildworld buildkernel targeting itself. It =
is way beyond where clang 3.7.1 crashed.


The above makes no claim at investigating or addressing powerpc64 =
(PowerMac G5) or powerpc (PowerMac G4/G3) yet(?). So far as I know clang =
mixed with the available supporting toolchain alternatives are still =
insufficient for targeting those for a WITH_LIBCPLUSPLUS=3D build. =
Instead something like powerpc64-xtoolchain-gcc/powerpc64-gcc must be =
used, even if clang is built. (Last I knew gcc5 variations/vintages =
would reject some of the WITH_CLANG_EXTRAS=3D code --but I've not tried =
based on clang 3.8.0 materials.)



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

On 2016-Jan-10, at 3:55 AM, Mark Millard <markmi at dsl-only.net> wrote:
>=20
>=20
> On 2016-Jan-9, at 10:55 AM, Ian Lepore <ian at freebsd.org> wrote:
>>=20
>> On Sat, 2016-01-09 at 15:03 +0100, Dimitry Andric wrote:
>>> On 09 Jan 2016, at 04:46, Mark Millard <markmi at dsl-only.net> =
wrote:
>>>>=20
>>>> On 2016-Jan-7, at 2:57 PM, Dimitry Andric <dim at FreeBSD.org>
>>>> wrote:
>>> ...
>>>>> FYI, I have added a -mno-movt option for this purpose upstream,
>>>>> and
>>>>> imported a newer snapshot into the clang380-import branch.  As of
>>>>> r293384, it now uses the new option spelling for modules, if your
>>>>> clang
>>>>> is 3.8.0 or higher.
>>>>>=20
>>>>> -Dimitry
>>>>=20
>>>> I've not been able to get to the point of running clang++ 3.8 on
>>>> the rpi2 yet: R_ARM_CALL and R_ARM_JUMP24 relocation truncations
>>>> during the cross build's buildworld interfere.
>>>=20
>>> Yes, this is caused by too large call distances.  In other words, =
the
>>> clang executable is getting to big to link.  Apparently we need to =
do
>>> some tricks with -mlongcall to fix this.  As I am no arm expert, I
>>> welcome any patch submissions. :-)
>>>=20
>>> -Dimitry
>>>=20
>>=20
>> Here's the patch I got from Andy for the clang380 branch, modified =
with
>> Warner's suggestion to use MACHINE_CPUARCH instead of MACHINE.  With
>> this I can get a working arm world that will build a runnable
>> helloworld.c (and .cc) on a dreamplug.  (I.e., it appears clang 3.8.0
>> fixes the problem we had with clang 3.7.x where it wouldn't run at =
all
>> on armv4/5 systems).  I have not tried compling anything complex yet.
>>=20
>> -- Ian
>=20
>=20
> Context: When I build I normally build lldb and the like as well, even =
using WITH_CLANG_EXTRAS=3D .
>=20
> In trying to get lldb to link I eventually get to the point that =
libc++ is getting relocation truncations. Before getting to that I deal =
with /usr/src/usr.bin/clang/lldb/Makefile to cover what is initially =
reported during buildworld for lldb relocation truncations. Then with =
that in place and retrying I get reports from libc++.a for a couple of =
the contained .o files having relocations that are truncated (before it =
reports "additional relocation overflows omitted from the output"):
>=20
> /usr/obj/clang/arm.armv6/usr/src/tmp/usr/lib/libc++.a(thread.o)
> /usr/obj/clang/arm.armv6/usr/src/tmp/usr/lib/libc++.a(locale.o)
>=20
> (Both have messages from multiple places in each .o file.)
>=20
> As far as I can tell for general use -long-calls is going to be needed =
for at least some system level .a library content if the .a's are to be =
used.
>=20
> Which leaves me wondering if STATIC_CXXFLAGS having -mlong-calls for =
arm system libraries fairly generally is appropriate for those intending =
on building the arm-native clang toolchain  and related material in =
buildworld. (STATIC_CFLAGS too?) A significant case analysis of what =
happens to currently be too far apart would be fragile as things grow =
even more later.
>=20
> This sort of issue may well not be limited to TARGET=3Darm contexts.
>=20
> The detailed libc++.a relocation truncation complaints that I got =
were:
>=20
>=20
>> --- all_subdir_lldb ---
>> /usr/obj/clang/arm.armv6/usr/src/tmp/usr/lib/libc++.a(thread.o): In =
function =
`_ZNSt3__16vectorINS_4pairIPNS_18condition_variableEPNS_5mutexEEENS_18__hi=
dden_allocatorIS6_EEE21__push_back_slow_pathIS6_EEvOT_':
>> =
/usr/src/lib/libc++/../../contrib/libc++/src/thread.cpp:(.text._ZNSt3__16v=
ectorINS_4pairIPNS_18condition_variableEPNS_5mutexEEENS_18__hidden_allocat=
orIS6_EEE21__push_back_slow_pathIS6_EEvOT_[_ZNSt3__16vectorINS_4pairIPNS_1=
8condition_variableEPNS_5mutexEEENS_18__hidden_allocatorIS6_EEE21__push_ba=
ck_slow_pathIS6_EEvOT_]+0x30): relocation truncated to fit: R_ARM_CALL =
against symbol =
`std::__1::__vector_base_common<true>::__throw_length_error() const' =
defined in =
.text._ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv[_ZNKS=
t3__120__vector_base_commonILb1EE20__throw_length_errorEv] section in =
/usr/obj/clang/arm.armv6/usr/src/usr.bin/clang/lldb/../../../lib/clang/lib=
lldbCore/liblldbCore.a(CxaDemangle.o)
>=20
>> /usr/obj/clang/arm.armv6/usr/src/tmp/usr/lib/libc++.a(thread.o): In =
function =
`_ZNSt3__16vectorIPNS_17__assoc_sub_stateENS_18__hidden_allocatorIS2_EEE21=
__push_back_slow_pathIRKS2_EEvOT_':
>> =
/usr/src/lib/libc++/../../contrib/libc++/src/thread.cpp:(.text._ZNSt3__16v=
ectorIPNS_17__assoc_sub_stateENS_18__hidden_allocatorIS2_EEE21__push_back_=
slow_pathIRKS2_EEvOT_[_ZNSt3__16vectorIPNS_17__assoc_sub_stateENS_18__hidd=
en_allocatorIS2_EEE21__push_back_slow_pathIRKS2_EEvOT_]+0x30): =
relocation truncated to fit: R_ARM_CALL against symbol =
`std::__1::__vector_base_common<true>::__throw_length_error() const' =
defined in =
.text._ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv[_ZNKS=
t3__120__vector_base_commonILb1EE20__throw_length_errorEv] section in =
/usr/obj/clang/arm.armv6/usr/src/usr.bin/clang/lldb/../../../lib/clang/lib=
lldbCore/liblldbCore.a(CxaDemangle.o)
>=20
> . . .
>> --- all_subdir_clang ---
>> /usr/obj/clang/arm.armv6/usr/src/tmp/usr/lib/libc++.a(locale.o): In =
function `std::__1::collate_byname<char>::do_compare(char const*, char =
const*, char const*, char const*) const':
> . . .
>> --- all_subdir_clang ---
>> =
/usr/src/lib/libc++/../../contrib/libc++/src/locale.cpp:(.text+0x81ec): =
relocation truncated to fit: R_ARM_CALL against symbol =
`std::__1::__basic_string_common<true>::__throw_length_error() const' =
defined in =
.text._ZNKSt3__121__basic_string_commonILb1EE20__throw_length_errorEv[_ZNK=
St3__121__basic_string_commonILb1EE20__throw_length_errorEv] section in =
/usr/obj/clang/arm.armv6/usr/src/usr.bin/clang/lldb/../../../lib/clang/lib=
lldbCore/liblldbCore.a(CxaDemangle.o)
> . . .
>> --- all_subdir_clang ---
>> =
/usr/src/lib/libc++/../../contrib/libc++/src/locale.cpp:(.text+0x82c0): =
relocation truncated to fit: R_ARM_CALL against symbol =
`std::__1::__basic_string_common<true>::__throw_length_error() const' =
defined in =
.text._ZNKSt3__121__basic_string_commonILb1EE20__throw_length_errorEv[_ZNK=
St3__121__basic_string_commonILb1EE20__throw_length_errorEv] section in =
/usr/obj/clang/arm.armv6/usr/src/usr.bin/clang/lldb/../../../lib/clang/lib=
lldbCore/liblldbCore.a(CxaDemangle.o)
>=20
>> /usr/obj/clang/arm.armv6/usr/src/tmp/usr/lib/libc++.a(locale.o): In =
function `std::__1::collate_byname<char>::do_transform(char const*, char =
const*) const':
>> =
/usr/src/lib/libc++/../../contrib/libc++/src/locale.cpp:(.text+0x8430): =
relocation truncated to fit: R_ARM_CALL against symbol =
`std::__1::__basic_string_common<true>::__throw_length_error() const' =
defined in =
.text._ZNKSt3__121__basic_string_commonILb1EE20__throw_length_errorEv[_ZNK=
St3__121__basic_string_commonILb1EE20__throw_length_errorEv] section in =
/usr/obj/clang/arm.armv6/usr/src/usr.bin/clang/lldb/../../../lib/clang/lib=
lldbCore/liblldbCore.a(CxaDemangle.o)
>=20
>> /usr/obj/clang/arm.armv6/usr/src/tmp/usr/lib/libc++.a(locale.o): In =
function `std::__1::collate_byname<wchar_t>::do_compare(wchar_t const*, =
wchar_t const*, wchar_t const*, wchar_t const*) const':
>=20
>> --- all_subdir_clang ---
>> =
/usr/src/lib/libc++/../../contrib/libc++/src/locale.cpp:(.text+0x88a8): =
relocation truncated to fit: R_ARM_CALL against symbol =
`std::__1::__basic_string_common<true>::__throw_length_error() const' =
defined in =
.text._ZNKSt3__121__basic_string_commonILb1EE20__throw_length_errorEv[_ZNK=
St3__121__basic_string_commonILb1EE20__throw_length_errorEv] section in =
/usr/obj/clang/arm.armv6/usr/src/usr.bin/clang/lldb/../../../lib/clang/lib=
lldbCore/liblldbCore.a(CxaDemangle.o)
>=20
>> =
/usr/src/lib/libc++/../../contrib/libc++/src/locale.cpp:(.text+0x899c): =
relocation truncated to fit: R_ARM_CALL against symbol =
`std::__1::__basic_string_common<true>::__throw_length_error() const' =
defined in =
.text._ZNKSt3__121__basic_string_commonILb1EE20__throw_length_errorEv[_ZNK=
St3__121__basic_string_commonILb1EE20__throw_length_errorEv] section in =
/usr/obj/clang/arm.armv6/usr/src/usr.bin/clang/lldb/../../../lib/clang/lib=
lldbCore/liblldbCore.a(CxaDemangle.o)
>=20
>> /usr/obj/clang/arm.armv6/usr/src/tmp/usr/lib/libc++.a(locale.o): In =
function `std::__1::collate_byname<wchar_t>::do_transform(wchar_t =
const*, wchar_t const*) const':
>> =
/usr/src/lib/libc++/../../contrib/libc++/src/locale.cpp:(.text+0x8b34): =
relocation truncated to fit: R_ARM_CALL against symbol =
`std::__1::__basic_string_common<true>::__throw_length_error() const' =
defined in =
.text._ZNKSt3__121__basic_string_commonILb1EE20__throw_length_errorEv[_ZNK=
St3__121__basic_string_commonILb1EE20__throw_length_errorEv] section in =
/usr/obj/clang/arm.armv6/usr/src/usr.bin/clang/lldb/../../../lib/clang/lib=
lldbCore/liblldbCore.a(CxaDemangle.o)
>=20
>> /usr/obj/clang/arm.armv6/usr/src/tmp/usr/lib/libc++.a(locale.o): In =
function `std::__1::collate<char>::do_transform(char const*, char =
const*) const':
>> =
/usr/src/lib/libc++/../../contrib/libc++/src/locale.cpp:(.text._ZNKSt3__17=
collateIcE12do_transformEPKcS3_[_ZNKSt3__17collateIcE12do_transformEPKcS3_=
]+0x34): relocation truncated to fit: R_ARM_CALL against symbol =
`std::__1::__basic_string_common<true>::__throw_length_error() const' =
defined in =
.text._ZNKSt3__121__basic_string_commonILb1EE20__throw_length_errorEv[_ZNK=
St3__121__basic_string_commonILb1EE20__throw_length_errorEv] section in =
/usr/obj/clang/arm.armv6/usr/src/usr.bin/clang/lldb/../../../lib/clang/lib=
lldbCore/liblldbCore.a(CxaDemangle.o)
>=20
>> /usr/obj/clang/arm.armv6/usr/src/tmp/usr/lib/libc++.a(locale.o): In =
function `std::__1::collate<wchar_t>::do_transform(wchar_t const*, =
wchar_t const*) const':
>> =
/usr/src/lib/libc++/../../contrib/libc++/src/locale.cpp:(.text._ZNKSt3__17=
collateIwE12do_transformEPKwS3_[_ZNKSt3__17collateIwE12do_transformEPKwS3_=
]+0x38): relocation truncated to fit: R_ARM_CALL against symbol =
`std::__1::__basic_string_common<true>::__throw_length_error() const' =
defined in =
.text._ZNKSt3__121__basic_string_commonILb1EE20__throw_length_errorEv[_ZNK=
St3__121__basic_string_commonILb1EE20__throw_length_errorEv] section in =
/usr/obj/clang/arm.armv6/usr/src/usr.bin/clang/lldb/../../../lib/clang/lib=
lldbCore/liblldbCore.a(CxaDemangle.o)
>=20
>> /usr/obj/clang/arm.armv6/usr/src/tmp/usr/lib/libc++.a(locale.o): In =
function `std::__1::num_put<char, std::__1::ostreambuf_iterator<char, =
std::__1::char_traits<char> > =
>::do_put(std::__1::ostreambuf_iterator<char, =
std::__1::char_traits<char> >, std::__1::ios_base&, char, long) const':
>> =
/usr/src/lib/libc++/../../contrib/libc++/src/locale.cpp:(.text._ZNKSt3__17=
num_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_putES4_RNS_8=
ios_baseEcl[_ZNKSt3__17num_putIcNS_19ostreambuf_iteratorIcNS_11char_traits=
IcEEEEE6do_putES4_RNS_8ios_baseEcl]+0x16c): additional relocation =
overflows omitted from the output
>=20
>=20
> Ian's/Andy's original patch is listed below for reference.
>=20
>> Index: lib/clang/clang.lib.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
>> --- lib/clang/clang.lib.mk	(revision 293584)
>> +++ lib/clang/clang.lib.mk	(working copy)
>> @@ -6,4 +6,8 @@ LLVM_SRCS=3D ${.CURDIR}/../../../contrib/llvm
>>=20
>> INTERNALLIB=3D
>>=20
>> +.if ${MACHINE_CPUARCH} =3D=3D "arm"
>> +STATIC_CXXFLAGS+=3D-mlong-calls
>> +.endif
>> +
>> .include <bsd.lib.mk>
>> Index: lib/csu/arm/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
>> --- lib/csu/arm/Makefile	(revision 293584)
>> +++ lib/csu/arm/Makefile	(working copy)
>> @@ -23,7 +23,7 @@ CLEANFILES+=3D	crt1.s gcrt1.s Scrt1.s
>> # directly compiled to .o files.
>>=20
>> crt1.s: crt1.c
>> -	${CC} ${CFLAGS} -S -o ${.TARGET} ${.CURDIR}/crt1.c
>> +	${CC} ${CFLAGS} -mlong-calls -S -o ${.TARGET} ${.CURDIR}/crt1.c
>> 	sed ${SED_FIX_NOTE} ${.TARGET}
>>=20
>> crt1.o: crt1.s
>> @@ -30,7 +30,7 @@ crt1.o: crt1.s
>> 	${CC} ${ACFLAGS} -c -o ${.TARGET} crt1.s
>>=20
>> gcrt1.s: crt1.c
>> -	${CC} ${CFLAGS} -DGCRT -S -o ${.TARGET} ${.CURDIR}/crt1.c
>> +	${CC} ${CFLAGS} -mlong-calls -DGCRT -S -o ${.TARGET} =
${.CURDIR}/crt1.c
>> 	sed ${SED_FIX_NOTE} ${.TARGET}
>>=20
>> gcrt1.o: gcrt1.s
>> Index: usr.bin/clang/clang/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.bin/clang/clang/Makefile	(revision 293584)
>> +++ usr.bin/clang/clang/Makefile	(working copy)
>> @@ -11,7 +11,11 @@ SRCS=3D	cc1_main.cpp \
>>=20
>> .if ${MK_SHARED_TOOLCHAIN} =3D=3D "no"
>> NO_SHARED?=3D yes
>> +
>> +.if ${MACHINE_CPUARCH} =3D=3D "arm"
>> +CFLAGS+=3D-mlong-calls
>> .endif
>> +.endif
>>=20
>> LINKS=3D	${BINDIR}/clang ${BINDIR}/clang++ \
>> 	${BINDIR}/clang ${BINDIR}/clang-cpp
>>=20
>=20



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?602C5169-40E4-4A68-9C91-214E617FC255>