]> git.sur5r.net Git - cc65/blobdiff - src/cc65/compile.c
Typo
[cc65] / src / cc65 / compile.c
index 48a5c29d35adca95c566a0adf9f490b041ffbab9..d79ef350b9ff102d86afc8b45f787bf0d5c5065b 100644 (file)
@@ -242,16 +242,25 @@ static void Parse (void)
                             Error ("Variable `%s' has unknown size", Decl.Ident);
                         }
                         Entry->Flags &= ~(SC_STORAGE | SC_DEF);
+                    } else {
+                        /* A global (including static) uninitialized variable is
+                        ** only a tentative definition. For example, this is valid:
+                        ** int i;
+                        ** int i;
+                        ** static int j;
+                        ** static int j = 42;
+                        ** Code for them will be generated by FinishCompile().
+                        ** For now, just save the BSS segment name
+                        ** (can be set by #pragma bss-name).
+                        */
+                        const char* bssName = GetSegName (SEG_BSS);
+
+                        if (Entry->V.BssName && strcmp (Entry->V.BssName, bssName) != 0) {
+                            Error ("Global variable `%s' already was defined in the `%s' segment.",
+                                   Entry->Name, Entry->V.BssName);
+                        }
+                        Entry->V.BssName = xstrdup (bssName);
                     }
-
-                    /* A global (including static) uninitialized variable
-                    ** is only a tentative definition. For example, this is valid:
-                    ** int i;
-                    ** int i;
-                    ** static int j;
-                    ** static int j = 42;
-                    ** Code for these will be generated in FinishCompile.
-                    */
                 }
 
             }
@@ -327,17 +336,22 @@ void Compile (const char* FileName)
     ** changes using #pragma later.
     */
     if (IS_Get (&Optimize)) {
-        long CodeSize = IS_Get (&CodeSizeFactor);
         DefineNumericMacro ("__OPT__", 1);
+    }
+    {
+        long CodeSize = IS_Get (&CodeSizeFactor);
         if (CodeSize > 100) {
             DefineNumericMacro ("__OPT_i__", CodeSize);
         }
-        if (IS_Get (&EnableRegVars)) {
-            DefineNumericMacro ("__OPT_r__", 1);
-        }
-        if (IS_Get (&InlineStdFuncs)) {
-            DefineNumericMacro ("__OPT_s__", 1);
-        }
+    }
+    if (IS_Get (&EnableRegVars)) {
+        DefineNumericMacro ("__OPT_r__", 1);
+    }
+    if (IS_Get (&InlineStdFuncs)) {
+        DefineNumericMacro ("__OPT_s__", 1);
+    }
+    if (IS_Get (&EagerlyInlineFuncs)) {
+        DefineNumericMacro ("__EAGERLY_INLINE_FUNCS__", 1);
     }
 
     /* __TIME__ and __DATE__ macros */
@@ -406,7 +420,7 @@ void FinishCompile (void)
     SymEntry* Entry;
 
     /* Walk over all global symbols:
-    ** - for functions do cleanup, optimizations ...
+    ** - for functions, do clean-up and optimizations
     ** - generate code for uninitialized global variables
     */
     for (Entry = GetGlobalSymTab ()->SymHead; Entry; Entry = Entry->NextSym) {
@@ -416,11 +430,17 @@ void FinishCompile (void)
             CS_MergeLabels (Entry->V.F.Seg->Code);
             RunOpt (Entry->V.F.Seg->Code);
         } else if ((Entry->Flags & (SC_STORAGE | SC_DEF | SC_STATIC)) == (SC_STORAGE | SC_STATIC)) {
-            /* Tentative definition of uninitialized global variable */
+            /* Assembly definition of uninitialized global variable */
+
+            /* Set the segment name only when it changes */
+            if (strcmp (GetSegName (SEG_BSS), Entry->V.BssName) != 0) {
+                SetSegName (SEG_BSS, Entry->V.BssName);
+                g_segname (SEG_BSS);
+            }
             g_usebss ();
             g_defgloblabel (Entry->Name);
             g_res (SizeOf (Entry->Type));
-            /* Mark as defined, so that it will be exported not imported */
+            /* Mark as defined; so that it will be exported, not imported */
             Entry->Flags |= SC_DEF;
         }
     }