From 814be2524bc1e7e9f5e3ac6e8526e9a7d5833485 Mon Sep 17 00:00:00 2001 From: uz Date: Fri, 23 Oct 2009 09:22:17 +0000 Subject: [PATCH] Restructured parts of locals.c. This will also fix a problem where arrays with unspecified size but an initializer would cause an error when -Cl (static locals) was in effect. git-svn-id: svn://svn.cc65.org/cc65/trunk@4385 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- src/cc65/locals.c | 117 +++++++++++++++++++++++++--------------------- 1 file changed, 63 insertions(+), 54 deletions(-) diff --git a/src/cc65/locals.c b/src/cc65/locals.c index c31832780..3f5c99420 100644 --- a/src/cc65/locals.c +++ b/src/cc65/locals.c @@ -61,6 +61,41 @@ +static unsigned AllocLabel (void (*UseSeg) ()) +/* Switch to a segment, define a local label and return it */ +{ + unsigned Label; + + /* Switch to the segment */ + UseSeg (); + + /* Define the variable label */ + Label = GetLocalLabel (); + g_defdatalabel (Label); + + /* Return the label */ + return Label; +} + + + +static unsigned AllocStorage (void (*UseSeg) (), unsigned Size) +/* Reserve Size bytes of BSS storage prefixed by a local label. Return the + * label. + */ +{ + /* Switch to the segment and define the label */ + unsigned Label = AllocLabel (UseSeg); + + /* Reserve space for the data */ + g_res (Size); + + /* Return the label */ + return Label; +} + + + static unsigned ParseRegisterDecl (Declaration* Decl, unsigned* SC, int Reg) /* Parse the declaration of a register variable. The function returns the * symbol data, which is the offset of the variable in the register bank. @@ -89,12 +124,10 @@ static unsigned ParseRegisterDecl (Declaration* Decl, unsigned* SC, int Reg) /* Special handling for compound types */ if (IsCompound) { - /* Switch to read only data */ - g_userodata (); - - /* Define a label for the initialization data */ - InitLabel = GetLocalLabel (); - g_defdatalabel (InitLabel); + /* Switch to read only data and define a label for the + * initialization data. + */ + InitLabel = AllocLabel (g_userodata); /* Parse the initialization generating a memory image of the * data in the RODATA segment. The function does return the size @@ -150,7 +183,6 @@ static unsigned ParseAutoDecl (Declaration* Decl, unsigned* SC) { unsigned Flags; unsigned SymData; - unsigned InitLabel; /* Determine if this is a compound variable */ int IsCompound = IsClassStruct (Decl->Type) || IsTypeArray (Decl->Type); @@ -172,12 +204,10 @@ static unsigned ParseAutoDecl (Declaration* Decl, unsigned* SC) /* Special handling for compound types */ if (IsCompound) { - /* Switch to read only data */ - g_userodata (); - - /* Define a label for the initialization data */ - InitLabel = GetLocalLabel (); - g_defdatalabel (InitLabel); + /* Switch to read only data and define a label for the + * initialization data. + */ + unsigned InitLabel = AllocLabel (g_userodata); /* Parse the initialization generating a memory image of the * data in the RODATA segment. The function will return the @@ -248,16 +278,6 @@ static unsigned ParseAutoDecl (Declaration* Decl, unsigned* SC) /* Static local variables. */ *SC = (*SC & ~SC_AUTO) | SC_STATIC; - /* Put them into the BSS */ - g_usebss (); - - /* Define the variable label */ - SymData = GetLocalLabel (); - g_defdatalabel (SymData); - - /* Reserve space for the data */ - g_res (Size); - /* Allow assignments */ if (CurTok.Tok == TOK_ASSIGN) { @@ -268,23 +288,27 @@ static unsigned ParseAutoDecl (Declaration* Decl, unsigned* SC) if (IsCompound) { - /* Switch to read only data */ - g_userodata (); - - /* Define a label for the initialization data */ - InitLabel = GetLocalLabel (); - g_defdatalabel (InitLabel); + /* Switch to read only data and define a label for the + * initialization data. + */ + unsigned InitLabel = AllocLabel (g_userodata); /* Parse the initialization generating a memory image of the * data in the RODATA segment. */ - ParseInit (Decl->Type); + Size = ParseInit (Decl->Type); + + /* Allocate a label and space for the variable */ + SymData = AllocStorage (g_usebss, Size); /* Generate code to copy this data into the variable space */ g_initstatic (InitLabel, SymData, Size); } else { + /* Allocate a label and space for the variable */ + SymData = AllocStorage (g_usebss, Size); + /* Parse the expression */ hie1 (&Expr); @@ -320,49 +344,34 @@ static unsigned ParseStaticDecl (Declaration* Decl, unsigned* SC) */ { unsigned SymData; - - /* Get the size of the variable */ - unsigned Size = SizeOf (Decl->Type); + unsigned Size; /* Static data */ if (CurTok.Tok == TOK_ASSIGN) { - /* Initialization ahead, switch to data segment */ + /* Initialization ahead, switch to data segment and define a label */ if (IsQualConst (Decl->Type)) { - g_userodata (); + SymData = AllocLabel (g_userodata); } else { - g_usedata (); + SymData = AllocLabel (g_usedata); } - /* Define the variable label */ - SymData = GetLocalLabel (); - g_defdatalabel (SymData); - /* Skip the '=' */ NextToken (); /* Allow initialization of static vars */ - ParseInit (Decl->Type); - - /* If the previous size has been unknown, it must be known now */ - if (Size == 0) { - Size = SizeOf (Decl->Type); - } + Size = ParseInit (Decl->Type); /* Mark the variable as referenced */ *SC |= SC_REF; } else { - /* Uninitialized data, use BSS segment */ - g_usebss (); - - /* Define the variable label */ - SymData = GetLocalLabel (); - g_defdatalabel (SymData); + /* Get the size of the variable */ + Size = SizeOf (Decl->Type); - /* Reserve space for the data */ - g_res (Size); + /* Allocate a label and space for the variable in the BSS segment */ + SymData = AllocStorage (g_usebss, Size); } -- 2.39.5