Larice, also handle function pointers
* support/regression/tests/bug1749275.c: new, added
git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@4876
4a8a32a2-be11-0410-ad9d-
d568d2c75423
+2007-07-09 Maarten Brock <sourceforge.brock AT dse.nl>
+
+ * src/mcs51/peep.c (isCallerSaveFunc): fixed bug 1749275, thanks Robert
+ Larice, also handle function pointers
+ * support/regression/tests/bug1749275.c: new, added
+
2007-07-03 Borut Razem <borut.razem AT siol.net>
* src/mcs51/gen.c, src/avr/gen.c, src/pic/gen.c, src/z80/gen.c,
static bool
isCallerSaveFunc (const lineNode *pl)
{
+ sym_link *ftype;
+
if (!isFunc (pl))
return FALSE;
- if (FUNC_CALLEESAVES(OP_SYM_TYPE(IC_LEFT(pl->ic))))
+ // let's assume calls to literally given locations use the default
+ // most notably : (*(void (*)()) 0) (); see bug 1749275
+ if (IS_VALOP (IC_LEFT (pl->ic)))
+ return !options.all_callee_saves;
+
+ ftype = OP_SYM_TYPE(IC_LEFT(pl->ic));
+ if (IS_FUNCPTR (ftype))
+ ftype = ftype->next;
+ if (FUNC_CALLEESAVES(ftype))
return FALSE;
- if (FUNC_ISNAKED(OP_SYM_TYPE(IC_LEFT(pl->ic))))
+ if (FUNC_ISNAKED(ftype))
return FALSE;
return TRUE;
}
--- /dev/null
+/*
+ bug 1749275
+*/
+
+#include <testfwk.h>
+
+xdata char baz;
+
+// no need to call this, it generates compiler error:
+// Internal error: validateOpType failed in
+// OP_SYM_TYPE(IC_LEFT(pl->ic)) @ peep\.c:226:
+// expected symbol, got value
+void foo(void)
+{
+ baz |= 5;
+ (*(void (*)()) 0) ();
+}
+
+void
+testBug(void)
+{
+ ASSERT(1);
+}