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
#
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
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 ();
}
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