]> git.sur5r.net Git - cc65/commitdiff
Define the __XX_START__ symbol for a memory area earlier, so it may be used in
authoruz <uz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Fri, 12 Nov 2010 18:01:31 +0000 (18:01 +0000)
committeruz <uz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Fri, 12 Nov 2010 18:01:31 +0000 (18:01 +0000)
the expression for the size of the same area.

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

src/ld65/config.c

index 623264358f09abc2a092b4655aa45b5d0cc4fa32..a67a3127ea207cbbe78500c4414bba8c0da90a5e 100644 (file)
@@ -1764,13 +1764,32 @@ unsigned CfgProcess (void)
         /* Remember if this is a relocatable memory area */
         M->Relocatable = RelocatableBinFmt (M->F->Format);
 
-        /* Resolve the start address expression */
+        /* Resolve the start address expression, remember the start address
+         * and mark the memory area as placed.
+         */
         if (!IsConstExpr (M->StartExpr)) {
             CfgError (&M->Pos,
                       "Start address of memory area `%s' is not constant",
                       GetString (M->Name));
         }
-        M->Start = GetExprVal (M->StartExpr);
+        Addr = M->Start = GetExprVal (M->StartExpr);
+        M->Flags |= MF_PLACED;
+
+        /* If requested, define the symbol for the start of the memory area.
+         * Doing it here means that the expression for the size of the area
+         * may reference this symbol.
+         */
+       if (M->Flags & MF_DEFINE) {
+            Export* E;
+           StrBuf Buf = STATIC_STRBUF_INITIALIZER;
+
+            /* Define the start of the memory area */
+           SB_Printf (&Buf, "__%s_START__", GetString (M->Name));
+           E = CreateMemoryExport (GetStrBufId (&Buf), M, 0);
+            E->Pos = M->Pos;
+
+            SB_Done (&Buf);
+        }
 
         /* Resolve the size expression */
         if (!IsConstExpr (M->SizeExpr)) {
@@ -1780,12 +1799,6 @@ unsigned CfgProcess (void)
         }
         M->Size = GetExprVal (M->SizeExpr);
 
-        /* Mark the memory area as placed */
-        M->Flags |= MF_PLACED;
-
-       /* Get the start address of this memory area */
-       Addr = M->Start;
-
        /* Walk through the segments in this memory area */
         for (J = 0; J < CollCount (&M->SegList); ++J) {
 
@@ -1886,11 +1899,6 @@ unsigned CfgProcess (void)
             Export* E;
            StrBuf Buf = STATIC_STRBUF_INITIALIZER;
 
-            /* Define the start of the memory area */
-           SB_Printf (&Buf, "__%s_START__", GetString (M->Name));
-           E = CreateMemoryExport (GetStrBufId (&Buf), M, 0);
-            E->Pos = M->Pos;
-
             /* Define the size of the memory area */
            SB_Printf (&Buf, "__%s_SIZE__", GetString (M->Name));
            E = CreateConstExport (GetStrBufId (&Buf), M->Size);