From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail.ispras.ru (mail.ispras.ru [83.149.199.84]) by sourceware.org (Postfix) with ESMTPS id 2BB91384A018 for ; Wed, 13 Jan 2021 16:09:43 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 2BB91384A018 Received: from monopod.intra.ispras.ru (unknown [10.10.3.121]) by mail.ispras.ru (Postfix) with ESMTPS id A3FDB40AAD84; Wed, 13 Jan 2021 16:09:35 +0000 (UTC) Date: Wed, 13 Jan 2021 19:09:35 +0300 (MSK) From: Alexander Monakov To: Fredrik Noring cc: gcc-help@gcc.gnu.org Subject: Re: m68k: Simple loop compiles into boundless recursion with -O2 In-Reply-To: Message-ID: References: User-Agent: Alpine 2.20.13 (LNX 116 2015-12-14) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII X-Spam-Status: No, score=-3.2 required=5.0 tests=BAYES_00, KAM_DMARC_STATUS, KAM_NUMSUBJECT, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=no autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gcc-help@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-help mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 13 Jan 2021 16:09:44 -0000 On Wed, 13 Jan 2021, Fredrik Noring wrote: > Hi, > > Compiler used is GCC m68k-elf version 10.2.0. A variant of the classic > memset > > void *memset2(void *s, int c, unsigned int n) > { > char *b = s; > for (unsigned int i = 0; i < n; i++) > b[i] = c; > return s; > } > > compiles into boundless recursion with O2 optimisation and the m68k-elf > target. This will, of course, exhaust the stack and crash badly. > > The commands > > m68k-elf-gcc -O2 -march=68000 -c -o memset2.o memset2.c > m68k-elf-objdump -d memset2.o Please invoke objdump with -dr instead to see the relocations. > > produce > > 00000000 : > 0: 2f02 movel %d2,%sp@- > 2: 242f 0008 movel %sp@(8),%d2 > 6: 202f 0010 movel %sp@(16),%d0 > a: 6718 beqs 24 > c: 2f00 movel %d0,%sp@- > e: 102f 0013 moveb %sp@(19),%d0 > 12: 4880 extw %d0 > 14: 3040 moveaw %d0,%a0 > 16: 2f08 movel %a0,%sp@- > 18: 2f02 movel %d2,%sp@- > 1a: 4eb9 0000 0000 jsr 0 /* <<<--- recursion */ The relocation associated with this instruction should point to memset. Most likely the compiler is optimizing your memset2 function to call the standard function 'memset'. When implementing memset itself you need to pass -ffreestanding to GCC, which will disable this optimization. Alexander