]> Shamusworld >> Repos - rmac/blobdiff - symbol.c
Fix for "*" getting bad section attributes, reported by A. Seed.
[rmac] / symbol.c
index d4761214006bf4a98e631cc89fb8321344e4d447..9ba661fc3fa931609a7f34eb1c95c5aa84d33d6c 100644 (file)
--- a/symbol.c
+++ b/symbol.c
@@ -3,7 +3,7 @@
 // SYMBOL.C - Symbol Handling
 // Copyright (C) 199x Landon Dyer, 2011-2012 Reboot and Friends
 // RMAC derived from MADMAC v1.07 Written by Landon Dyer, 1986
-// Source Utilised with the Kind Permission of Landon Dyer
+// Source utilised with the kind permission of Landon Dyer
 //
 
 #include "symbol.h"
@@ -35,7 +35,7 @@ static char tdb_text[8] = {
 
 
 //
-// Initialize Symbol Table
+// Initialize symbol table
 //
 void InitSymbolTable(void)
 {
@@ -54,7 +54,7 @@ void InitSymbolTable(void)
 
 
 //
-// Hash the Print Name and Enviroment Number
+// Hash the print name and enviroment number
 //
 int HashSymbol(char * name, int envno)
 {
@@ -91,7 +91,7 @@ SYM * NewSymbol(char * name, int type, int envno)
        symbol->stype  = (BYTE)type;
        symbol->senv   = (WORD)envno;
        symbol->sattr  = 0;
-//we don't do this, it could be a forward reference!
+       // Don't do this, it could be a forward reference!
 //     symbol->sattr  = DEFINED;               // We just defined it...
        // This is a bad assumption. Not every symbol 1st seen in a RISC section is
        // a RISC symbol!
@@ -170,20 +170,23 @@ SYM * lookup(char * name, int type, int envno)
 //
 // Put symbol on "order-of-declaration" list of symbols
 //
-//void sym_decl(SYM * symbol)
-void AddToSymbolOrderList(SYM * symbol)
+void AddToSymbolDeclarationList(SYM * symbol)
 {
-       if (symbol->sattr & SDECLLIST)
-               return;                                                         // Already on list
+       // Don't add if already on list, or it's an equated register/CC
+       if ((symbol->sattr & SDECLLIST)
+               || (symbol->sattre & (EQUATEDREG | UNDEF_EQUR | EQUATEDCC | UNDEF_CC)))
+               return;
 
-       symbol->sattr |= SDECLLIST;                             // Mark "already on list"
+       // Mark as "on .sdecl list"
+       symbol->sattr |= SDECLLIST;
 
        if (sdecl == NULL)
-               sdecl = symbol;                                         // First on decl-list
+               sdecl = symbol;                         // First on decl-list
        else 
-               sdecltail->sdecl = symbol;                      // Add to end of list
+               sdecltail->sdecl = symbol;      // Add to end of list
 
-       symbol->sdecl = NULL;                                   // Fix up list's tail
+       // Fix up list's tail
+       symbol->sdecl = NULL;
        sdecltail = symbol;
 }
 
@@ -191,11 +194,11 @@ void AddToSymbolOrderList(SYM * symbol)
 //
 // Make all referenced, undefined symbols global
 //
-int syg_fix(void)
+void ForceUndefinedSymbolsGlobal(void)
 {
        SYM * sy;
 
-       DEBUG printf("~syg_fix()\n");
+       DEBUG printf("~ForceUndefinedSymbolsGlobal()\n");
 
        // Scan through all symbols;
        // If a symbol is REFERENCED but not DEFINED, then make it global.
@@ -205,8 +208,6 @@ int syg_fix(void)
                        && ((sy->sattr & (REFERENCED | DEFINED)) == REFERENCED))
                        sy->sattr |= GLOBAL;
        }
-
-       return 0;
 }
 
 
@@ -233,43 +234,25 @@ int uc_string(char * s)
 int sy_assign(char * buf, char *(* constr)())
 {
        SYM * sy;
-       int scount;
-       //int i;
-
-       scount = 0;
+       int scount = 0;
 
        if (buf == NULL)
        {
                // Append all symbols not appearing on the .sdecl list to the end of
                // the .sdecl list
                for(sy=sorder; sy!=NULL; sy=sy->sorder)
-               {
-                       // Essentially the same as 'sym_decl()' above:
-                       if (sy->sattr & SDECLLIST)
-                               continue;                // Already on list 
-
-                       sy->sattr |= SDECLLIST;                            // Mark "on the list"
-
-                       if (sdecl == NULL)
-                               sdecl = sy;                      // First on decl-list 
-                       else
-                               sdecltail->sdecl = sy;                        // Add to end of list
-
-                       sy->sdecl = NULL;                                  // Fix up list's tail
-                       sdecltail = sy;
-               }
+                       AddToSymbolDeclarationList(sy);
        }
 
        // Run through all symbols (now on the .sdecl list) and assign numbers to
        // them. We also pick which symbols should be global or not here.
        for(sy=sdecl; sy!=NULL; sy=sy->sdecl)
        {
-               if (sy->sattre & UNDEF_EQUR)
-                       continue;                 // Don't want undefined on our list
+               // Don't want register/CC or undefined on our list
+//these should already be rejected above...
+//             if (sy->sattre & (EQUATEDREG | UNDEF_EQUR | EQUATEDCC | UNDEF_CC)))
+//                     continue;
 
-               if (sy->sattre & UNDEF_CC)
-                       continue;                   
-               
                // Export or import external references, and export COMMON blocks.
                if ((sy->stype == LABEL)
                        && ((sy->sattr & (GLOBAL | DEFINED)) == (GLOBAL | DEFINED)
@@ -288,7 +271,9 @@ int sy_assign(char * buf, char *(* constr)())
                        && (!as68_flag || *sy->sname != 'L'))
                {
                        sy->senv = (WORD)scount++;
-                       if (buf != NULL) buf = (*constr)(buf, sy, 0);
+
+                       if (buf != NULL)
+                               buf = (*constr)(buf, sy, 0);
                }
        }
 
@@ -322,7 +307,6 @@ int symtable(void)
 
        // Allocate storage for list headers and partition all labels.  
        // Throw away macros and macro arguments.
-//     sy = (SYM **)amem((LONG)(128 * sizeof(LONG)));
        sy = (SYM **)malloc(128 * sizeof(LONG));
 
        for(i=0; i<128; ++i)
@@ -336,27 +320,27 @@ int symtable(void)
                        j = *p->sname;
                        r = NULL;
 
-                       if (p->stype != LABEL)
-                               continue;                   // Ignore non-labels
-
-                       if (p->sattre & UNDEF_EQUR)
+                       // Ignore non-labels
+                       if ((p->stype != LABEL) || (p->sattre & UNDEF_EQUR))
                                continue;
 
                        for(q=sy[j]; q!=NULL; q=q->snext)
                        {
                                if (strcmp(p->sname, q->sname) < 0)
                                        break;
-                               else
-                                       r = q;
+
+                               r = q;
                        }
 
                        if (r == NULL)
-                       {                               // Insert at front of list
+                       {
+                               // Insert at front of list
                                p->snext = sy[j];
                                sy[j] = p;
                        }
                        else
-                       {                               // Insert in middle or append to list
+                       {
+                               // Insert in middle or append to list
                                p->snext = r->snext;
                                r->snext = p;
                        }
@@ -453,3 +437,4 @@ int symtable(void)
 
        return 0;
 }
+