* src/mcs51/peep.c (isCallerSaveFunc): fixed bug 1749275, thanks Robert
authorMaartenBrock <MaartenBrock@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Mon, 9 Jul 2007 14:41:30 +0000 (14:41 +0000)
committerMaartenBrock <MaartenBrock@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Mon, 9 Jul 2007 14:41:30 +0000 (14:41 +0000)
  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

ChangeLog
src/mcs51/peep.c
support/regression/tests/bug1749275.c [new file with mode: 0644]

index 864275ade35b70f1ab65077bc7a6d13d97761bc8..71936861dca0d25aa098c2a357c94a6dcc7e3976 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+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,
index ad52c518e46b959fdd5d1a114eff8779363f050f..213eb7883d8c98c7df3b7ce0cc03e5eca3f4a8aa 100644 (file)
@@ -221,11 +221,21 @@ isFunc (const lineNode *pl)
 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;
 }
diff --git a/support/regression/tests/bug1749275.c b/support/regression/tests/bug1749275.c
new file mode 100644 (file)
index 0000000..79bb0c4
--- /dev/null
@@ -0,0 +1,23 @@
+/*
+    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);
+}