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,

Reply via email to