* src/SDCCmem.c (allocDefault): removed check sym->level==0 for SPEC_ABSA,
authorMaartenBrock <MaartenBrock@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Sat, 9 Jun 2007 08:20:39 +0000 (08:20 +0000)
committerMaartenBrock <MaartenBrock@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Sat, 9 Jun 2007 08:20:39 +0000 (08:20 +0000)
  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
src/SDCCmem.c
src/SDCCsymt.c
support/regression/tests/absolute.c

index 52ac49adb84fec6c581920984f55d87ceab1a95b..812eccc842d12b946e1e943d6dcb886da84c3c58 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2007-06-09 Maarten Brock <sourceforge.brock AT dse.nl>
+
+       * 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 <rneider AT web.de>
 
        * src/regression/Makefile: suppress parallel builds, allow easy
index 8204490d3b981bb9e8089d4e4d7fc6ee0194b732..183c572e3ed6f5641ecddf871d60d768c4f5817f 100644 (file)
@@ -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;
         }
index 618b092f13beec29e85c1d372fa28d6a45c1f6be..0870e7e409d5c6eabf01e6b8f76d84d422430620 100644 (file)
@@ -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;
index 28bfbf8827c900104ed7eb8612ba4008aa7936f4..cfc5b140c10a3e6a1915a0a169fe00872eb5e264 100644 (file)
@@ -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
 }