From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 26874 invoked by alias); 1 Dec 2009 16:58:55 -0000 Received: (qmail 26528 invoked by uid 48); 1 Dec 2009 16:58:35 -0000 Date: Tue, 01 Dec 2009 16:58:00 -0000 Message-ID: <20091201165835.26527.qmail@sourceware.org> X-Bugzilla-Reason: CC References: Subject: [Bug target/42240] wrong Epilog on nacked function In-Reply-To: Reply-To: gcc-bugzilla@gcc.gnu.org To: gcc-bugs@gcc.gnu.org From: "j at uriah dot heep dot sax dot de" Mailing-List: contact gcc-bugs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-bugs-owner@gcc.gnu.org X-SW-Source: 2009-12/txt/msg00062.txt.bz2 ------- Comment #5 from j at uriah dot heep dot sax dot de 2009-12-01 16:58 ------- My first analysis shows that this is likely to be related to the introduction of RTL prologues/epilogues in GCC 4.3. GCC 4.2.2 has: if (avr_naked_function_p (current_function_decl)) { fputs ("/* epilogue: naked */\n", file); goto out; } ... out: fprintf (file, "/* epilogue end (size=%d) */\n", epilogue_size); fprintf (file, "/* function %s size %d (%d) */\n", current_function_name (), prologue_size + function_size + epilogue_size, function_size); commands_in_file += prologue_size + function_size + epilogue_size; commands_in_prologues += prologue_size; commands_in_epilogues += epilogue_size; } GCC 4.3.4 has: /* epilogue: naked */ if (cfun->machine->is_naked) { emit_jump_insn (gen_return ()); return; } So apparently, emit_jump_insn (gen_return ()); is responsible for creating the infinite loop. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42240