From fc9f8d30f7f7ee34e195357753de502eb429a585 Mon Sep 17 00:00:00 2001 From: tecodev Date: Mon, 22 May 2006 21:50:06 +0000 Subject: [PATCH] * src/pic16/gen.c (pic16_storeForReturn): fragile fix for bug #1492360 (problematic due to generic pointers, see code) git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@4186 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- ChangeLog | 5 +++++ src/pic16/gen.c | 25 +++++++++++++++++++------ 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9cd477a9..73ab4758 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2006-05-22 Raphael Neider + + * src/pic16/gen.c (pic16_storeForReturn): fragile fix for + bug #1492360 (problematic due to generic pointers, see code) + 2006-05-22 Borut Razem * support/regression/ports/pic16/specs.mk: removed stack size linker diff --git a/src/pic16/gen.c b/src/pic16/gen.c index 7d58f400..14a0af8d 100644 --- a/src/pic16/gen.c +++ b/src/pic16/gen.c @@ -4012,15 +4012,28 @@ void pic16_storeForReturn(iCode *ic, /*operand *op,*/ int offset, pCodeOp *dest) } } - if(is_LitOp(op)) { - pic16_movLit2f(dest, lit); + if (AOP_TYPE(op) == AOP_LIT) { + /* FIXME: broken for + * char __at(0x456) foo; + * return &foo; + * (upper byte is 0x00 (__code space) instead of 0x80 (__data) */ + pic16_movLit2f(dest, (lit >> (8ul*offset))); + } else if (AOP_TYPE(op) == AOP_PCODE + && AOP(op)->aopu.pcop->type == PO_IMMEDIATE) { + /* char *s= "aaa"; return s; */ + /* XXX: Using UPPER(__str_0) will yield 0b00XXXXXX, so + * that the generic pointer is interpreted correctly + * as referring to __code space, but this is fragile! */ + pic16_emitpcode(POC_MOVLW, pic16_popGet( AOP(op), offset )); + /* XXX: should check that dest != WREG */ + pic16_emitpcode(POC_MOVWF, dest); } else { if(dest->type == PO_WREG && (offset == 0)) { - pic16_emitpcode(POC_MOVFW, pic16_popGet(AOP(op), offset)); - return; + pic16_emitpcode(POC_MOVFW, pic16_popGet(AOP(op), offset)); + return; + } + pic16_emitpcode(POC_MOVFF, pic16_popGet2p(pic16_popGet(AOP(op), offset), dest)); } - pic16_emitpcode(POC_MOVFF, pic16_popGet2p(pic16_popGet(AOP(op), offset), dest)); - } } /*-----------------------------------------------------------------*/ -- 2.47.2