* src/SDCCast.c (backPatchLabels): fixed bug #1504636
[fw/sdcc] / src / SDCCsymt.c
index 0c0c00cc0f9d6c2c1642378cfbc798df56e63814..9be6c7f5d3f97ca22ffae209848cbcc619b55853 100644 (file)
@@ -1280,12 +1280,24 @@ compStructSize (int su, structdef * sdef)
                     bitOffset += loop->bitVar;
                 } 
                 else {
-                    /* does not fit; need to realign first */
-                    sum++;
-                    loop->offset = (su == UNION ? sum = 0 : sum);
-                    bitOffset = 0;
-                    SPEC_BSTR (loop->etype) = bitOffset;
-                    bitOffset += loop->bitVar;
+                                       if( TARGET_IS_PIC16 && getenv("PIC16_PACKED_BITFIELDS") ) {
+                                               /* if PIC16 && enviroment variable is set, then
+                                                * tightly pack bitfields, this means that when a
+                                                * bitfield goes beyond byte alignment, do not
+                                                * automatically start allocatint from next byte,
+                                                * but also use the available bits first */
+                                               fprintf(stderr, ": packing bitfields in structures\n");
+                                               SPEC_BSTR (loop->etype) = bitOffset;
+                                               bitOffset += loop->bitVar;
+                                               loop->offset = (su == UNION ? sum = 0 : sum);
+                                       } else {
+                                               /* does not fit; need to realign first */
+                           sum++;
+                       loop->offset = (su == UNION ? sum = 0 : sum);
+                           bitOffset = 0;
+                       SPEC_BSTR (loop->etype) = bitOffset;
+                           bitOffset += loop->bitVar;
+                       }
                 }
                 while (bitOffset>8) {
                     bitOffset -= 8;
@@ -1954,12 +1966,12 @@ computeType (sym_link * type1, sym_link * type2,
       && (   (SPEC_USIGN (etype1)
               /* if this operand is promoted to a larger type,
                  then it will be promoted to a signed type */
-              && !(getSize (etype1) < getSize (reType))
+              && !(bitsForType (etype1) < bitsForType (reType))
               /* char require special handling */
               && !IS_CHAR (etype1))
           || /* same for 2nd operand */  
              (SPEC_USIGN (etype2)
-              && !(getSize (etype2) < getSize (reType))
+              && !(bitsForType (etype2) < bitsForType (reType))
               && !IS_CHAR (etype2))
           || /* if both are 'unsigned char' and not promoted
                 let the result be unsigned too */