armv6 specific std::async crash from g++6 built a.out [g++5 too; unsure for aarch64/powerpc/powerpc64: help?]
Mark Millard
markmi at dsl-only.net
Sat Sep 3 22:18:28 UTC 2016
[Quick top post reporting that using gcc5 5.4.0 has the same problem for armv6 FreeBSD. I've got a stable/11 context, currently -r304943.]
FreeBSD bugzilla Bug 212330 is for this.
For:
> #include <future> // future, async, launch::async
>
> static void f() {}
>
> int main(int, const char* [])
> {
> auto a0{ std::async( std::launch::async, f ) };
> a0.get();
> return 0;
> }
I've now also tried "pkg install gcc5" on the rpi2 and then used it to produce the a.out file. ./a.out still gets SIGSEGV for the ~10 line program (and the original program the crash was discovered with).
g++6 -g -v -std=c++14 -Wpedantic -Wall -O2 -pthread -Wl,-rpath=/usr/local/lib/gcc6
or
g++5 -g -v -std=c++14 -Wpedantic -Wall -O2 -pthread -Wl,-rpath=/usr/local/lib/gcc5
Omitting the -Wl,-rpath=/usr/local/lib/gcc<?> also produces an a.out for the ~10 line program that gets the SIGSEGV. (I tried the g++6 case anyway.)
Comparison to other rpi2 contexts:
g++-5 on Ubuntu Mate 16.04 on the same rpi2 does not have this problem.
g++-6 on Ubuntu Mate 16.04 on the same rpi2 does not have this problem.
The other contexts that I've tried do not have the problem: so far only armv6 FreeBSD:
clang based builds do not have the problem any place that I've tried. Other than the toolchain in use these are the same contexts as for the g++ tests.
Ubuntu Mate with g++-5 and g++-6 on an ODRIOD-C2 (aarch64) works. [I've no FreeBSD aarch64 context.]
amd64 FreeBSD stable/11 with g++6 works. [I've not tried g++5.]
If anyone has aarch64, powerpc64, or powerpc (or other) FreeBSD contexts and g++5 and/or g++6 and want to try compiling and running the program:
#include <future> // future, async, launch::async
static void f() {}
int main(int, const char* [])
{
auto a0{ std::async( std::launch::async, f ) };
a0.get();
return 0;
}
based on
g++6 -g -v -std=c++14 -Wpedantic -Wall -O2 -pthread -Wl,-rpath=/usr/local/lib/gcc6
and/or
g++6 -g -v -std=c++14 -Wpedantic -Wall -O2 -pthread
and/or
g++5 -g -v -std=c++14 -Wpedantic -Wall -O2 -pthread -Wl,-rpath=/usr/local/lib/gcc5
and/or
g++5 -g -v -std=c++14 -Wpedantic -Wall -O2 -pthread
and report on the result in https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=212330 that might help.
My testing has been limited to stable/11 as well.
Untested (that I will eventually have a context for again): powerpc64 and powerpc.
[I'm still a few weeks away from getting access to the powerpc64 and powerpc contexts again so I've not tried those. Plus I tend to use devel/powerpc64-xtoolchain-gcc FreeBSD builds for powerpc64 and an odd context for a clang-based buildworld for powerpc (with a gcc 4.2.1 based kernel with signal delivery changes to deal with clang producing stack-handling ABI violations). clang++ 3.8.0 for powerpc64 and powerpc has other problems, including exception handling being messed up in the programs it produces.]
===
Mark Millard
markmi at dsl-only.net
On 2016-Sep-2, at 4:28 AM, Mark Millard <markmi at dsl-only.net> wrote:
> On 2016-Sep-1, at 4:35 PM, Mark Millard <markmi at dsl-only.net> wrote:
>
>> Another top post because I should have kept going with the reductions: the following ~10 line program also shows the SIGSEGV behavior on armv6 (an rpi2) for running ./a.out after compiling via g++6.
>>
>>> # more g++6_build_crashes.cpp #include <future> // future, async, launch::async
>>>
>>> static void f() {}
>>>
>>> int main(int, const char* [])
>>> {
>>> auto a0{ std::async( std::launch::async, f ) };
>>> a0.get();
>>> return 0;
>>> }
>>
>> It only takes one std::async use to have the problem. So far the above (and the earlier variants) always crash with SIGSEGV on the rpi2 when the g++6 compiler is used.
>>
>> As for the compile commands used:
>>
>>> g++6 -g -v -std=c++14 -Wpedantic -Wall -O2 -pthread -Wl,-rpath=/usr/local/lib/gcc6 -mcpu=cortex-a7 g++6_build_crashes.cpp
>>
>>
>> Omitting the -mcpu=cortex-a7 still get the problem.
>>
>> Using -O0 instead of -O2 still gets the problem.
>>
>> But I'll note that my stable/11 -r304943 build and my ports builds (usr/ports -r421001 vintage) were/are based on using -mcpu=cortex-a7 . Also the system clang 3.8.0 was used to build g++6:
>>
>>> GNU C++14 (FreeBSD Ports Collection) version 6.2.0 (armv6-portbld-freebsd11.0)
>>> compiled by GNU C version 4.2.1 Compatible FreeBSD Clang 3.8.0 (tags/RELEASE_380/final 262564), GMP version 5.1.3, MPFR version 3.1.4-p1, MPC version 1.0.3, isl version none
>>
>>> # more /etc/make.conf
>>> DEFAULT_VERSIONS+=perl5=5.22
>>> WRKDIRPREFIX=/usr/obj/portswork
>>> WITH_DEBUG=
>>> WITH_DEBUG_FILES=
>>> MALLOC_PRODUCTION=
>>> #
>>> #system clang 3.8 (gcc6 rejects -march=armv7a):
>>> #CFLAGS+= -march=armv7-a -mcpu=cortex-a7
>>> #CXXFLAGS+= -march=armv7-a -mcpu=cortex-a7
>>> #CPPFLAGS+= -march=armv7-a -mcpu=cortex-a7
>>> #
>>> #lang/gcc6's xgcc stage considers the above conflicting so use just:
>>> CFLAGS+= -mcpu=cortex-a7
>>> CXXFLAGS+= -mcpu=cortex-a7
>>> CPPFLAGS+= -mcpu=cortex-a7
>>
>>
>> ===
>> Mark Millard
>> markmi at dsl-only.net
>
> Beyond amd64 FreeBSD not having the problem that armv6 has. . .
>
> I have since booted Ubuntu Mate 16.04 on the rpi2 (armv6 / cortex-a7) and installed g++-6, g++-6 (Ubuntu 6.1.1-2ubuntu12~16.04) 6.1.1 20160510 since it was available. (So not 6.2: not a full vintage match to my FreeBSD g++6 contexts, unfortunately.)
>
> The original program that failed on FreeBSD when compiled with g++6 (v6.2) on the same rpi2 executes just fine after being compiled on the Ubuntu Mate rpi2 configuration with g++-6 (v6.1).
>
> So the armv6 SIGSEGV looks to not not be a generic g++6/libstdc++ problem for std::async use: it seems to be armv6 FreeBSD specific. (Unfortunately I've not been able to form fully matching versions for this comparison.)
>
> I've also installed g++-6 on a ODROID-C2 (aarch64) Linux (Ubuntu 16.04.1) and built the original program that I discovered the problem with. g++-6 (Ubuntu 6.1.1-2ubuntu12~16.04) 6.1.1 20160510 was the compiler.
>
> It executes just fine on the ODROID-C2 under Ubuntu Mate. (So far as I know FreeBSD does not support this type of context (yet) but it is the only aarch64 context I currently have access to.)
>
> ===
> Mark Millard
> markmi at dsl-only.net
>
>
More information about the freebsd-ppc
mailing list