Trying to bootstrap m68k i hit an assert in emit_library_call_value_1 that wants to assure that the stack is aligned properly.
PUSH_ROUNDING(GET_MODE_SIZE(QImode)) for m5206 is currently 1 so the testcase below has stack_pointer_delta = 1 + 1 + 4 but emit_library_call_value_1() has this: /* Stack must be properly aligned now. */ gcc_assert (!(stack_pointer_delta & (PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT - 1))); where 6 & 3 != 0 and ICEs I am not familier with m68k so i would be glad for any help! Should the arg be partial? Doesn't look like, no. Does m68k use stack save area? From the looks it doesn't. Is the alignment_pad for QImode arg wrong? Should PUSH_ROUNDING be changed back to the !CF variant? Or is the alignment assert too strict? Perhaps m5206 is not TARGET_CAS and should not compile this linux-atomic in the first place? (is emit_library_call_value_1 missing a do_pending_stack_adjust() before NO_DEFER_POP ? Does not seem relevant for this case though) Slightly simplified reproducer: $ cat x.i ; echo "EOF"; # see libgcc/config/m68k/linux-atomic.c unsigned char __attribute__ ((visibility ("hidden"))) __sync_val_compare_and_swap_1 (unsigned char *ptr, unsigned char soldval, unsigned char snewval) { unsigned *wordptr = (unsigned *) ((unsigned long) ptr & ~3); unsigned int mask, shift, woldval, wnewval; unsigned oldval, newval, cmpval; shift = (((unsigned long) ptr & 3) << 3) ^ 24; mask = 0xffu << shift; woldval = (soldval & 0xffu) << shift; wnewval = (snewval & 0xffu) << shift; cmpval = *wordptr; do { oldval = cmpval; if ((oldval & mask) != woldval) break; newval = (oldval & ~mask) | wnewval; { register unsigned *a0 asm ("a0") = wordptr; register unsigned d2 asm ("d2") = oldval; register unsigned d1 asm ("d1") = newval; register unsigned d0 asm ("d0") = 335; asm volatile ("trap #0":"=r" (d0), "=r" (d1), "=r" (a0):"r" (d0), "r" (d1), "r" (d2), "r" (a0):"memory", "a1"); cmpval = d0; } } while (__builtin_expect (oldval != cmpval, 0)); return (oldval >> shift) & 0xffu; } _Bool __attribute__ ((visibility ("hidden"))) __sync_bool_compare_and_swap_1 (unsigned char *ptr, unsigned char oldval, unsigned char newval) { return (__sync_val_compare_and_swap_1 (ptr, oldval, newval) == oldval); } EOF /home/me/src/oe/openembedded-core/build/tmp-glibc/sysroots/x86_64-linux/usr/bin/m68k-oe-linux.gcc-cross-initial-m68k/m68k-oe-linux-gcc -mcpu=5206 --sysroot=/home/me/src/oe/openembedded-core/build/tmp-glibc/sysroots/qemum68k -O2 -pipe -g -feliminate-unused-debug-types -O2 -g -Os -DIN_GCC -DCROSS_DIRECTORY_STRUCTURE -W -Wall -Wno-narrowing -Wwrite-strings -Wcast-qual -Wstrict-prototypes -Wmissing-prototypes -Wold-style-definition -isystem ./include -fPIC -g -DIN_LIBGCC2 -fbuilding-libgcc -fno-stack-protector -Dinhibit_libc -fPIC -I. -I. -I/home/me/src/oe/openembedded-core/build/tmp-glibc/work/m5206-oe-linux/libgcc-initial/4.9.1-r0/gcc-4.9.1/build.m68k-oe-linux.m68k-oe-linux/m68k-oe-linux/libgcc/../.././gcc -I/home/me/src/oe/openembedded-core/build/tmp-glibc/work-shared/gcc-4.9.1-r0/gcc-4.9.1/libgcc -I/home/me/src/oe/openembedded-core/build/tmp-glibc/work-shared/gcc-4.9.1-r0/gcc-4.9.1/libgcc/. -I/home/me/src/oe/openembedded-core/build/tmp-glibc/work-shared/gcc-4.9.1-r0/gcc-4.9.1/libgcc/../gcc -I/home/me/src/oe/openembedded-core/build/tmp-glibc/work-shared/gcc-4.9.1-r0/gcc-4.9.1/libgcc/../include -DHAVE_CC_TLS -o o.o -MT linux-atomic.i -MD -MP -MF linux-atomic.dep -c x.i -fvisibility=hidden -DHIDE_EXPORTS -v Using built-in specs. COLLECT_GCC=/home/me/src/oe/openembedded-core/build/tmp-glibc/sysroots/x86_64-linux/usr/bin/m68k-oe-linux.gcc-cross-initial-m68k/m68k-oe-linux-gcc Target: m68k-oe-linux Configured with: /home/me/src/oe/openembedded-core/build/tmp-glibc/work-shared/gcc-4.9.1-r0/gcc-4.9.1/configure --build=x86_64-linux --host=x86_64-linux --target=m68k-oe-linux --prefix=/home/me/src/oe/openembedded-core/build/tmp-glibc/sysroots/x86_64-linux/usr --exec_prefix=/home/me/src/oe/openembedded-core/build/tmp-glibc/sysroots/x86_64-linux/usr --bindir=/home/me/src/oe/openembedded-core/build/tmp-glibc/sysroots/x86_64-linux/usr/bin/m68k-oe-linux.gcc-cross-initial-m68k --sbindir=/home/me/src/oe/openembedded-core/build/tmp-glibc/sysroots/x86_64-linux/usr/bin/m68k-oe-linux.gcc-cross-initial-m68k --libexecdir=/home/me/src/oe/openembedded-core/build/tmp-glibc/sysroots/x86_64-linux/usr/libexec/m68k-oe-linux.gcc-cross-initial-m68k --datadir=/home/me/src/oe/openembedded-core/build/tmp-glibc/sysroots/x86_64-linux/usr/share --sysconfdir=/home/me/src/oe/openembedded-core/build/tmp-glibc/sysroots/x86_64-linux/etc --sharedstatedir=/home/me/src/oe/openembedded-core/build/tmp-glibc/sysroots/x86_64-linux/com --localstatedir=/home/me/src/oe/openembedded-core/build/tmp-glibc/sysroots/x86_64-linux/var --libdir=/home/me/src/oe/openembedded-core/build/tmp-glibc/sysroots/x86_64-linux/usr/lib/m68k-oe-linux.gcc-cross-initial-m68k --includedir=/home/me/src/oe/openembedded-core/build/tmp-glibc/sysroots/x86_64-linux/usr/include --oldincludedir=/home/me/src/oe/openembedded-core/build/tmp-glibc/sysroots/x86_64-linux/usr/include --infodir=/home/me/src/oe/openembedded-core/build/tmp-glibc/sysroots/x86_64-linux/usr/share/info --mandir=/home/me/src/oe/openembedded-core/build/tmp-glibc/sysroots/x86_64-linux/usr/share/man --disable-silent-rules --disable-dependency-tracking --with-libtool-sysroot=/home/me/src/oe/openembedded-core/build/tmp-glibc/sysroots/x86_64-linux 'CFLAGS_FOR_TARGET=-O0 -g3 -ggdb3' 'CXXFLAGS_FOR_TARGET=-O0 -g3 -ggdb3' --enable-stage1-checking=yes,all,types,rtl --with-newlib --without-headers --disable-shared --disable-threads --disable-multilib --disable-__cxa_atexit --enable-languages=c --program-prefix=m68k-oe-linux- --with-sysroot=/home/me/src/oe/openembedded-core/build/tmp-glibc/sysroots/qemum68k --with-build-sysroot=/home/me/src/oe/openembedded-core/build/tmp-glibc/work/x86_64-oe-linux/gcc-cross-initial-m68k/4.9.1-r0/gcc-4.9.1/build.x86_64-linux.m68k-oe-linux/tmpsysroot --disable-libmudflap --disable-libgomp --disable-libssp --disable-libquadmath --with-system-zlib --disable-lto --disable-plugin --enable-decimal-float=no --with-native-system-header-dir=/usr/include --disable-nls --enable-__cxa_atexit Thread model: single gcc version 4.9.1 (GCC) COLLECT_GCC_OPTIONS='--sysroot=/home/me/src/oe/openembedded-core/build/tmp-glibc/sysroots/qemum68k' '-mcpu=5206' '-O2' '-pipe' '-g' '-feliminate-unused-debug-types' '-O2' '-g' '-Os' '-D' 'IN_GCC' '-D' 'CROSS_DIRECTORY_STRUCTURE' '-Wextra' '-Wall' '-Wno-narrowing' '-Wwrite-strings' '-Wcast-qual' '-Wstrict-prototypes' '-Wmissing-prototypes' '-Wold-style-definition' '-isystem' './include' '-g' '-D' 'IN_LIBGCC2' '-fbuilding-libgcc' '-fno-stack-protector' '-D' 'inhibit_libc' '-fPIC' '-I' '.' '-I' '.' '-I' '/home/me/src/oe/openembedded-core/build/tmp-glibc/work/m5206-oe-linux/libgcc-initial/4.9.1-r0/gcc-4.9.1/build.m68k-oe-linux.m68k-oe-linux/m68k-oe-linux/libgcc/../.././gcc' '-I' '/home/me/src/oe/openembedded-core/build/tmp-glibc/work-shared/gcc-4.9.1-r0/gcc-4.9.1/libgcc' '-I' '/home/me/src/oe/openembedded-core/build/tmp-glibc/work-shared/gcc-4.9.1-r0/gcc-4.9.1/libgcc/.' '-I' '/home/me/src/oe/openembedded-core/build/tmp-glibc/work-shared/gcc-4.9.1-r0/gcc-4.9.1/libgcc/../gcc' '-I' '/home/me/src/oe/openembedded-core/build/tmp-glibc/work-shared/gcc-4.9.1-r0/gcc-4.9.1/libgcc/../include' '-D' 'HAVE_CC_TLS' '-o' 'o.o' '-MT' 'linux-atomic.i' '-MD' '-MP' '-MF' 'linux-atomic.dep' '-c' '-fvisibility=hidden' '-D' 'HIDE_EXPORTS' '-v' /home/me/src/oe/openembedded-core/build/tmp-glibc/sysroots/x86_64-linux/usr/libexec/m68k-oe-linux.gcc-cross-initial-m68k/gcc/m68k-oe-linux/4.9.1/cc1 -fpreprocessed x.i -isysroot /home/me/src/oe/openembedded-core/build/tmp-glibc/sysroots/qemum68k -quiet -dumpbase x.i -mcpu=5206 -auxbase-strip o.o -g -g -g -O2 -O2 -Os -Wextra -Wall -Wno-narrowing -Wwrite-strings -Wcast-qual -Wstrict-prototypes -Wmissing-prototypes -Wold-style-definition -version -feliminate-unused-debug-types -fbuilding-libgcc -fno-stack-protector -fPIC -fvisibility=hidden -o - | /home/me/src/oe/openembedded-core/build/tmp-glibc/sysroots/x86_64-linux/usr/libexec/m68k-oe-linux.gcc-cross-initial-m68k/gcc/m68k-oe-linux/4.9.1/as -v -I . -I . -I /home/me/src/oe/openembedded-core/build/tmp-glibc/work/m5206-oe-linux/libgcc-initial/4.9.1-r0/gcc-4.9.1/build.m68k-oe-linux.m68k-oe-linux/m68k-oe-linux/libgcc/../.././gcc -I /home/me/src/oe/openembedded-core/build/tmp-glibc/work-shared/gcc-4.9.1-r0/gcc-4.9.1/libgcc -I /home/me/src/oe/openembedded-core/build/tmp-glibc/work-shared/gcc-4.9.1-r0/gcc-4.9.1/libgcc/. -I /home/me/src/oe/openembedded-core/build/tmp-glibc/work-shared/gcc-4.9.1-r0/gcc-4.9.1/libgcc/../gcc -I /home/me/src/oe/openembedded-core/build/tmp-glibc/work-shared/gcc-4.9.1-r0/gcc-4.9.1/libgcc/../include -mcpu=5206 --pcrel -o o.o GNU assembler version 2.24 (m68k-oe-linux) using BFD version (GNU Binutils) 2.24 GNU C (GCC) version 4.9.1 (m68k-oe-linux) compiled by GNU C version 4.7.2, GMP version 6.0.0, MPFR version 3.1.2, MPC version 1.0.2 GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 GNU C (GCC) version 4.9.1 (m68k-oe-linux) compiled by GNU C version 4.7.2, GMP version 6.0.0, MPFR version 3.1.2, MPC version 1.0.2 GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 Compiler executable checksum: fab8bdf6ebfc97a6ab2021160771c16d x.i: In function '__sync_bool_compare_and_swap_1': x.i:39:11: internal compiler error: in emit_library_call_value_1, at calls.c:4187 return (__sync_val_compare_and_swap_1 (ptr, oldval, newval) == oldval); ^ 0x512e60 emit_library_call_value_1 /home/me/src/oe/openembedded-core/build/tmp-glibc/work-shared/gcc-4.9.1-r0/gcc-4.9.1/gcc/calls.c:4186 0x513452 emit_library_call_value(rtx_def*, rtx_def*, libcall_type, machine_mode, int, ...) /home/me/src/oe/openembedded-core/build/tmp-glibc/work-shared/gcc-4.9.1-r0/gcc-4.9.1/gcc/calls.c:4369 0x7dac47 expand_atomic_compare_and_swap(rtx_def**, rtx_def**, rtx_def*, rtx_def*, rtx_def*, bool, memmodel, memmodel) /home/me/src/oe/openembedded-core/build/tmp-glibc/work-shared/gcc-4.9.1-r0/gcc-4.9.1/gcc/optabs.c:7476 0x4ed0ab expand_builtin_compare_and_swap /home/me/src/oe/openembedded-core/build/tmp-glibc/work-shared/gcc-4.9.1-r0/gcc-4.9.1/gcc/builtins.c:5188 0x4ef778 expand_builtin(tree_node*, rtx_def*, rtx_def*, machine_mode, int) /home/me/src/oe/openembedded-core/build/tmp-glibc/work-shared/gcc-4.9.1-r0/gcc-4.9.1/gcc/builtins.c:6522 0x61a391 expand_expr_real_1(tree_node*, rtx_def*, machine_mode, expand_modifier, rtx_def**, bool) /home/me/src/oe/openembedded-core/build/tmp-glibc/work-shared/gcc-4.9.1-r0/gcc-4.9.1/gcc/expr.c:10327 0x6130ce expand_expr_real(tree_node*, rtx_def*, machine_mode, expand_modifier, rtx_def**, bool) /home/me/src/oe/openembedded-core/build/tmp-glibc/work-shared/gcc-4.9.1-r0/gcc-4.9.1/gcc/expr.c:7950 0x60ce1e store_expr(tree_node*, rtx_def*, int, bool) /home/me/src/oe/openembedded-core/build/tmp-glibc/work-shared/gcc-4.9.1-r0/gcc-4.9.1/gcc/expr.c:5336 0x60c47b expand_assignment(tree_node*, tree_node*, bool) /home/me/src/oe/openembedded-core/build/tmp-glibc/work-shared/gcc-4.9.1-r0/gcc-4.9.1/gcc/expr.c:5122 0x52073b expand_call_stmt /home/me/src/oe/openembedded-core/build/tmp-glibc/work-shared/gcc-4.9.1-r0/gcc-4.9.1/gcc/cfgexpand.c:2273 0x522c16 expand_gimple_stmt_1 /home/me/src/oe/openembedded-core/build/tmp-glibc/work-shared/gcc-4.9.1-r0/gcc-4.9.1/gcc/cfgexpand.c:3170 0x5230ff expand_gimple_stmt /home/me/src/oe/openembedded-core/build/tmp-glibc/work-shared/gcc-4.9.1-r0/gcc-4.9.1/gcc/cfgexpand.c:3322 0x527edc expand_gimple_basic_block /home/me/src/oe/openembedded-core/build/tmp-glibc/work-shared/gcc-4.9.1-r0/gcc-4.9.1/gcc/cfgexpand.c:5162 0x52938d gimple_expand_cfg /home/me/src/oe/openembedded-core/build/tmp-glibc/work-shared/gcc-4.9.1-r0/gcc-4.9.1/gcc/cfgexpand.c:5741 0x5299d8 execute /home/me/src/oe/openembedded-core/build/tmp-glibc/work-shared/gcc-4.9.1-r0/gcc-4.9.1/gcc/cfgexpand.c:5961 Please submit a full bug report, with preprocessed source if appropriate. Please include the complete backtrace with any bug report. See <http://gcc.gnu.org/bugs.html> for instructions. (gdb) watch stack_pointer_delta Hardware watchpoint 2: stack_pointer_delta (gdb) c Continuing. GNU C (GCC) version 4.9.1 (m68k-oe-linux) compiled by GNU C version 4.7.2, GMP version 6.0.0, MPFR version 3.1.2, MPC version 1.0.2 GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 Compiler executable checksum: fab8bdf6ebfc97a6ab2021160771c16d Hardware watchpoint 2: stack_pointer_delta Old value = 0 New value = 1 emit_single_push_insn_1 (mode=QImode, x=0x7ffff6d86e88, type=0x0) at /home/me/src/oe/openembedded-core/build/tmp-glibc/work-shared/gcc-4.9.1-r0/gcc-4.9.1/gcc/expr.c:4014 4014 icode = optab_handler (push_optab, mode); (gdb) c Continuing. Hardware watchpoint 2: stack_pointer_delta Old value = 1 New value = 2 emit_single_push_insn_1 (mode=QImode, x=0x7ffff6d86e58, type=0x0) at /home/me/src/oe/openembedded-core/build/tmp-glibc/work-shared/gcc-4.9.1-r0/gcc-4.9.1/gcc/expr.c:4014 4014 icode = optab_handler (push_optab, mode); (gdb) c Continuing. Hardware watchpoint 2: stack_pointer_delta Old value = 2 New value = 6 emit_single_push_insn_1 (mode=SImode, x=0x7ffff6d89480, type=0x0) at /home/me/src/oe/openembedded-core/build/tmp-glibc/work-shared/gcc-4.9.1-r0/gcc-4.9.1/gcc/expr.c:4014 4014 icode = optab_handler (push_optab, mode); thanks,