From 28e26703880560af06ad6fd7b1d0d123587de26e Mon Sep 17 00:00:00 2001 From: MaartenBrock Date: Sat, 9 Jun 2007 08:20:39 +0000 Subject: [PATCH] * src/SDCCmem.c (allocDefault): removed check sym->level==0 for SPEC_ABSA, can also be static, fixes bug 1733438 * src/SDCCsymt.c (checkSClass): static local vars in reentrant funcs can have absolute address too * support/regression/tests/absolute.c: added test for static absolute var git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@4841 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- ChangeLog | 8 +++++++ src/SDCCmem.c | 8 +++---- src/SDCCsymt.c | 36 ++++++++++++++++------------- support/regression/tests/absolute.c | 2 ++ 4 files changed, 34 insertions(+), 20 deletions(-) diff --git a/ChangeLog b/ChangeLog index 52ac49ad..812eccc8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2007-06-09 Maarten Brock + + * src/SDCCmem.c (allocDefault): removed check sym->level==0 for SPEC_ABSA, + can also be static, fixes bug 1733438 + * src/SDCCsymt.c (checkSClass): static local vars in reentrant funcs can + have absolute address too + * support/regression/tests/absolute.c: added test for static absolute var + 2007-06-08 Raphael Neider * src/regression/Makefile: suppress parallel builds, allow easy diff --git a/src/SDCCmem.c b/src/SDCCmem.c index 8204490d..183c572e 100644 --- a/src/SDCCmem.c +++ b/src/SDCCmem.c @@ -411,7 +411,7 @@ allocDefault (symbol * sym) if (sym->_isparm) return FALSE; /* if code change to constant */ - if (sym->ival && (sym->level==0) && SPEC_ABSA (sym->etype)) + if (sym->ival && SPEC_ABSA (sym->etype)) { SPEC_OCLS(sym->etype) = c_abs; } @@ -422,7 +422,7 @@ allocDefault (symbol * sym) break; case S_XDATA: /* absolute initialized global */ - if (sym->ival && (sym->level==0) && SPEC_ABSA (sym->etype)) + if (sym->ival && SPEC_ABSA (sym->etype)) { SPEC_OCLS(sym->etype) = x_abs; } @@ -438,7 +438,7 @@ allocDefault (symbol * sym) break; case S_DATA: /* absolute initialized global */ - if (sym->ival && (sym->level==0) && SPEC_ABSA (sym->etype)) + if (sym->ival && SPEC_ABSA (sym->etype)) { SPEC_OCLS(sym->etype) = d_abs; } @@ -449,7 +449,7 @@ allocDefault (symbol * sym) break; case S_IDATA: /* absolute initialized global */ - if (sym->ival && (sym->level==0) && SPEC_ABSA (sym->etype)) + if (sym->ival && SPEC_ABSA (sym->etype)) { SPEC_OCLS(sym->etype) = i_abs; } diff --git a/src/SDCCsymt.c b/src/SDCCsymt.c index 618b092f..0870e7e4 100644 --- a/src/SDCCsymt.c +++ b/src/SDCCsymt.c @@ -1594,7 +1594,7 @@ checkSClass (symbol * sym, int isProto) /* automatic symbols cannot be given */ /* an absolute address ignore it */ - if (sym->level && + if (sym->level && !IS_STATIC(sym->etype) && SPEC_ABSA (sym->etype) && (options.stackAuto || reentrant)) { @@ -2059,27 +2059,31 @@ compareType (sym_link * dest, sym_link * src) return compareType (dest->next, src->next); } - if (DCL_TYPE (src) == DCL_TYPE (dest)) { - if (IS_FUNC(src)) { - //checkFunction(src,dest); + if (DCL_TYPE (src) == DCL_TYPE (dest)) + { + if (IS_FUNC(src)) + { + //checkFunction(src,dest); + } + return compareType (dest->next, src->next); + } + if (IS_PTR (dest) && IS_GENPTR (src) && IS_VOID(src->next)) + { + return -1; } - return compareType (dest->next, src->next); - } - if (IS_PTR (dest) && IS_GENPTR (src) && IS_VOID(src->next)) { - return -1; - } if (IS_PTR (src) && (IS_GENPTR (dest) || ((DCL_TYPE(src) == POINTER) && (DCL_TYPE(dest) == IPOINTER)) )) return -1; - if (IS_PTR (dest) && IS_ARRAY (src)) { - value *val=aggregateToPointer (valFromType(src)); - int res=compareType (dest, val->type); - Safe_free(val->type); - Safe_free(val); - return res; - } + if (IS_PTR (dest) && IS_ARRAY (src)) + { + value *val=aggregateToPointer (valFromType(src)); + int res=compareType (dest, val->type); + Safe_free(val->type); + Safe_free(val); + return res; + } if (IS_PTR (dest) && IS_FUNC (dest->next) && IS_FUNC (src)) return compareType (dest->next, src); return 0; diff --git a/support/regression/tests/absolute.c b/support/regression/tests/absolute.c index 28bfbf88..cfc5b140 100644 --- a/support/regression/tests/absolute.c +++ b/support/regression/tests/absolute.c @@ -15,12 +15,14 @@ void testAbsolute(void) { #if defined(SDCC_mcs51) || defined(SDCC_ds390) || defined(SDCC_hc08) + static {mem} at(0xCAB6) char s = 's'; char {mem} *pC = (char {mem} *)(0xCAB0); int {mem} *pI = (int {mem} *)(0xCAB0); ASSERT(u == 'x'); ASSERT(pC[7] == 'x'); ASSERT(pC[9] == 'y'); + ASSERT(pC[6] == 's'); ASSERT(pI[0] == 0x1234); #endif } -- 2.30.2