This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c/33083] New: noreturn function should be invoked via JMP
- From: "us15 at os dot inf dot tu-dresden dot de" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 16 Aug 2007 00:00:44 -0000
- Subject: [Bug c/33083] New: noreturn function should be invoked via JMP
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
When a noreturn function is called, the compiler should emit a "jmp"
instruction rather than "call", because the called function will not return.
Saving callee-save registers in the function prologue also seems unnecessary
since there won't be an epilogue to restore them.
The following example uses 'noinline' to prevent gcc from inlining these
trivial functions.
#define NOINLINE __attribute__((noinline))
#define NORETURN __attribute__((noreturn))
NORETURN NOINLINE
static void f1()
{
for (;;);
}
NORETURN NOINLINE
static void f2()
{
f1();
}
int main()
{
f2();
return 0;
}
This results in the following code:
08048228 <f1>:
8048228: 55 push %ebp
8048229: 89 e5 mov %esp,%ebp
804822b: eb fe jmp 804822b <f1+0x3>
0804822d <f2>:
804822d: 55 push %ebp
804822e: 89 e5 mov %esp,%ebp
8048230: e8 f3 ff ff ff call 8048228 <f1> <= this should
be jmp
--
Summary: noreturn function should be invoked via JMP
Product: gcc
Version: 4.3.0
Status: UNCONFIRMED
Severity: minor
Priority: P3
Component: c
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: us15 at os dot inf dot tu-dresden dot de
GCC build triplet: i686-pc-linux-gnu
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33083