fixed bug #482168
authorjohanknol <johanknol@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Mon, 10 Dec 2001 13:57:23 +0000 (13:57 +0000)
committerjohanknol <johanknol@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Mon, 10 Dec 2001 13:57:23 +0000 (13:57 +0000)
git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@1671 4a8a32a2-be11-0410-ad9d-d568d2c75423

as/mcs51/asmain.c
src/SDCCglue.c

index bb2194286945ad9c698ff7308eb90a69b5c6225b..79934663b7702ae7aeeff89cca18c99ac893c8f3 100644 (file)
@@ -843,10 +843,6 @@ loop:
                if ((ap = alookup(id)) != NULL) {
                        if (uaf && uf != ap->a_flag)
                                err('m');
-                        if (ap->a_flag & A_OVR) {
-                               ap->a_size = 0; 
-                                ap->a_fuzz=0;
-                       }
                } else {
                        ap = (struct area *) new (sizeof(struct area));
                        ap->a_ap = areap;
@@ -1114,11 +1110,26 @@ register struct area *nap;
        register struct area *oap;
 
        oap = dot.s_area;
+       /* fprintf (stderr, "%s dot.s_area->a_size: %d dot.s_addr: %d\n",
+            oap->a_id, dot.s_area->a_size, dot.s_addr); */
        oap->a_fuzz = fuzz;
-       oap->a_size = dot.s_addr;
-       fuzz = nap->a_fuzz;
+       if (oap->a_flag & A_OVR) {
+         // the size of an overlay is the biggest size encountered
+         if (oap->a_size < dot.s_addr) {
+           oap->a_size = dot.s_addr;
+         }
+       } else {
+         oap->a_size = dot.s_addr;
+       }
+       if (nap->a_flag & A_OVR) {
+         // a new overlay starts at 0, no fuzz
+         dot.s_addr = 0;
+         fuzz = 0;
+       } else {
+         dot.s_addr = nap->a_size;
+         fuzz = nap->a_fuzz;
+       }
        dot.s_area = nap;
-       dot.s_addr = nap->a_size;
        outall();
 }
 
index 209f5d8fa2ff7dbefe1c7cf6491e1f3cdb78ab1a..4895a3e0cb54d2af21c438631120f30ffa01e7db 100644 (file)
@@ -1226,11 +1226,15 @@ emitOverlay (FILE * afile)
 
       if (elementsInSet (ovrset))
        {
+#if 0
          /* this dummy area is used to fool the assembler
             otherwise the assembler will append each of these
             declarations into one chunk and will not overlay
             sad but true */
          fprintf (afile, "\t.area _DUMMY\n");
+#else
+         /* not anymore since asmain.c:1.13 */
+#endif
          /* output the area informtion */
          fprintf (afile, "\t.area\t%s\n", port->mem.overlay_name);     /* MOF */
        }