https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69841
Bug ID: 69841
Summary: Wrong template instantiation in C++11 on armv7l
Product: gcc
Version: 5.3.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
Assignee: unassigned at gcc dot gnu.org
Reporter: biblbroks at hotmail dot com
Target Milestone: ---
Created attachment 37706
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=37706&action=edit
Pre-processed source (*.ii) triggering the bug
The two attached source files both instantiate a same std::map<F, A>. However,
when compiled with -std=gnu++11, code emitted for
std::_Rb_tree_iterator<...>
std::_Rb_tree<...>::_M_emplace_hint_unique<...>
(std::_Rb_tree_const_iterator<std::pair<F const, A> >,
std::piecewise_construct_t const&, std::tuple<F&&>&&, std::tuple<>&&)
differs in the two resulting object files:
_ZNSt8_Rb_treeI1FSt4pairIKS0_1AESt10_Select1stIS4_ESt4lessIS0_ESaIS4_EE22_M_emplace_hint_uniqueIJRKSt21piecewise_construct_tSt5tupleIJOS0_EESF_IJEEEEESt17_Rb_tree_iteratorIS4_ESt23_Rb_tree_const_iteratorIS4_EDpOT_:
.fnstart
-.LFB1874:
- @ args = 4, pretend = 0, frame = 8
+.LFB1860:
+ @ args = 8, pretend = 0, frame = 8
@ frame_needed = 0, uses_anonymous_args = 0
strd r4, [sp, #-36]!
.save {r4, r5, r6, r7, r8, r9, r10, fp, lr}
- mov r5, r3
strd r6, [sp, #8]
mov r6, r0
mov r0, #32
strd r8, [sp, #16]
add r9, r6, #4
strd r10, [sp, #24]
- mov r10, r1
+ mov r10, r2
str lr, [sp, #32]
.pad #12
sub sp, sp, #12
+ ldr r5, [sp, #48]
bl _Znwj
- ldr r3, [r5]
mov r4, r0
mov r1, #0
mov r0, #0
cmp r9, r10
+ ldr r3, [r5]
add fp, r4, #16
ldr r7, [r3]
str r7, [r4, #16]
strd r0, [r4, #24]
Namely, the layout of call arguments seems to differ. Linking the two together
results in one of the calls to _M_emplace_hint_unique in the target binary
having mismatched arguments and execution causes a SEGV.
Tested on GCC 5.2.1 and 5.3.1, as shipped with openSUSE Tumbleweed, as well as
vanilla 5.3.0 compiled from sources.
System type is armv7hl-suse-linux-gnueabi
gcc -v:
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/armv7hl-suse-linux-gnueabi/5/lto-wrapper
Target: armv7hl-suse-linux-gnueabi
Configured with: ../configure --prefix=/usr --infodir=/usr/share/info
--mandir=/usr/share/man --libdir=/usr/lib --libexecdir=/usr/lib
--enable-languages=c,c++,objc,fortran,obj-c++,java,go --enable-checking=release
--with-gxx-include-dir=/usr/include/c++/5 --enable-ssp --disable-libssp
--disable-libvtv --disable-plugin --with-bugurl=http://bugs.opensuse.org/
--with-pkgversion='SUSE Linux' --disable-libgcj --with-slibdir=/lib
--with-system-zlib --enable-__cxa_atexit --enable-libstdcxx-allocator=new
--disable-libstdcxx-pch --enable-version-specific-runtime-libs
--enable-linker-build-id --enable-linux-futex --program-suffix=-5
--without-system-libunwind --with-arch=armv7-a --with-tune=cortex-a15
--with-float=hard --with-abi=aapcs-linux --with-fpu=vfpv3-d16
--disable-sjlj-exceptions --build=armv7hl-suse-linux-gnueabi
--host=armv7hl-suse-linux-gnueabi
Thread model: posix
gcc version 5.3.1 20151207 [gcc-5-branch revision 231355] (SUSE Linux)
Steps to compile / reproduce:
g++ -O2 -Wall -std=gnu++11 -c f1.cpp
g++ -O2 -Wall -std=gnu++11 -c f2.cpp
g++ -O2 -Wall -std=gnu++11 -o f f1.o f2.o
./f
Segmentation fault (core dumped)
Code works as expected in -O0 or -std=gnu++98
Not sure if specific to arm, but I'm filing initially under 'target'