From: MaartenBrock Date: Mon, 9 Jul 2007 14:41:30 +0000 (+0000) Subject: * src/mcs51/peep.c (isCallerSaveFunc): fixed bug 1749275, thanks Robert X-Git-Url: https://git.gag.com/?p=fw%2Fsdcc;a=commitdiff_plain;h=a447f8806f692f0e6c172ddd47b8b290019fdd62 * src/mcs51/peep.c (isCallerSaveFunc): fixed bug 1749275, thanks Robert 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 --- diff --git a/ChangeLog b/ChangeLog index 864275ad..71936861 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2007-07-09 Maarten Brock + + * 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 * src/mcs51/gen.c, src/avr/gen.c, src/pic/gen.c, src/z80/gen.c, diff --git a/src/mcs51/peep.c b/src/mcs51/peep.c index ad52c518..213eb788 100644 --- a/src/mcs51/peep.c +++ b/src/mcs51/peep.c @@ -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 index 00000000..79bb0c43 --- /dev/null +++ b/support/regression/tests/bug1749275.c @@ -0,0 +1,23 @@ +/* + bug 1749275 +*/ + +#include + +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); +}