https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78098
--- Comment #2 from H.J. Lu <hjl.tools at gmail dot com> ---
GCC correctly identified that foo1 == foo2 and generate a tail call.
But we don't want tail call in interrupt handler. On the other hand,
there is no need to have 2 identical copies of an interrupt handler.
There should be only one interrupt handler or they should be different.
This patch
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index eef6d7b..be40ad9 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -28014,7 +28014,8 @@ ix86_expand_call (rtx retval, rtx fnaddr, rtx callarg1,
if (fndecl
&& (lookup_attribute ("interrupt",
TYPE_ATTRIBUTES (TREE_TYPE (fndecl)))))
- error ("interrupt service routine can't be called directly");
+ error ("interrupt service routine %q+D can't be called directly",
+ fndecl);
}
else
fndecl = NULL_TREE;
changes the error message to
foo.i: In function ‘foo1’:
foo.i:9:33: error: interrupt service routine ‘foo2’ can't be called directly
__attribute__((interrupt)) void foo2 (void *p)
to indicate that foo2 is called from foo1.