]> git.sur5r.net Git - cc65/commitdiff
Last fix was wrong. The problem wasn't in the struct code but in SymLeaveLevel
authoruz <uz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Fri, 19 Aug 2011 15:24:11 +0000 (15:24 +0000)
committeruz <uz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Fri, 19 Aug 2011 15:24:11 +0000 (15:24 +0000)
calling CloseSpans, which does not only close spans but might also add some,
in which case the scope became another size.

git-svn-id: svn://svn.cc65.org/cc65/trunk@5232 b7a2c559-68d2-44c3-8de9-860c34a00d81

src/ca65/make/gcc.mak
src/ca65/struct.c
src/ca65/symtab.c

index 176e246e275c2996e0400cd37f4c80dcb3f3a0d1..46d432bbd6bb0422ef0b286fbfe609ffbc4c4bd8 100644 (file)
@@ -15,7 +15,7 @@ CA65_INC = \"/usr/lib/cc65/asminc/\"
 
 #
 CC     = gcc
-CFLAGS         = -g -Wall -W -std=c89
+CFLAGS         = -g -O2 -Wall -W -std=c89
 override CFLAGS += -I$(COMMON)
 override CFLAGS += -DCA65_INC=$(CA65_INC)
 EBIND  = emxbind
index a716c861ab60a18fffb0f1afd151a12e9cecd4fe..07068ef947464520949abc8a4c39d3e7af7da381 100644 (file)
@@ -244,10 +244,17 @@ static long DoStructInternal (long Offs, unsigned Type)
         ConsumeSep ();
     }
 
-    /* If this is not a anon struct, leave the struct scope level. This will
-     * also record the size of the scope.
+    /* If this is not a anon struct, enter a special symbol named ".size"
+     * into the symbol table of the struct that holds the size of the
+     * struct. Since the symbol starts with a dot, it cannot be accessed
+     * by user code.
+     * Leave the struct scope level.
      */
     if (!Anon) {
+        /* Add a symbol */
+        SymEntry* SizeSym = GetSizeOfScope (CurrentScope);
+        SymDef (SizeSym, GenLiteralExpr (Size), ADDR_SIZE_DEFAULT, SF_NONE);
+
         /* Close the struct scope */
         SymLeaveLevel ();
     }
index 653506691f09e5ebacaca5dab1ed8d4f86eb4512..bc64b03641512cb8302bc62727b7c7b19fa0208d 100644 (file)
@@ -244,10 +244,12 @@ void SymEnterLevel (const StrBuf* ScopeName, unsigned char Type,
 void SymLeaveLevel (void)
 /* Leave the current lexical level */
 {
-    /* Close the spans. We don't care about the scope type here, since types
-     * without spans will just have an empty list.
+    /* If this is a scope that allows to emit data into segments, close the
+     * open the spans.
      */
-    CloseSpans (&CurrentScope->Spans);
+    if (CurrentScope->Type <= SCOPE_HAS_DATA) {
+        CloseSpans (&CurrentScope->Spans);
+    }
 
     /* If we have spans, the first one is the segment that was active, when the
      * scope was opened. Set the size of the scope to the number of data bytes