]> git.sur5r.net Git - cc65/blobdiff - src/ca65/symtab.c
atari5200: name conio constructor 'initconio'
[cc65] / src / ca65 / symtab.c
index acb1ed3bba386494481302f5d240293527074679..afe7b3ad6b621b89c291bec0ed562e25cc38cf7f 100644 (file)
@@ -1,12 +1,12 @@
 /*****************************************************************************/
 /*                                                                           */
-/*                                symtab.c                                  */
+/*                                 symtab.c                                  */
 /*                                                                           */
-/*                Symbol table for the ca65 macroassembler                  */
+/*                 Symbol table for the ca65 macroassembler                  */
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 1998-2011, Ullrich von Bassewitz                                      */
+/* (C) 1998-2014, Ullrich von Bassewitz                                      */
 /*                Roemerstrasse 52                                           */
 /*                D-70794 Filderstadt                                        */
 /* EMail:         uz@cc65.org                                                */
 
 
 /*****************************************************************************/
-/*                                          Data                                    */
+/*                                   Data                                    */
 /*****************************************************************************/
 
 
 
 /* Combined symbol entry flags used within this module */
-#define SF_UNDEFMASK   (SF_REFERENCED | SF_DEFINED | SF_IMPORT)
-#define SF_UNDEFVAL    (SF_REFERENCED)
+#define SF_UNDEFMASK    (SF_REFERENCED | SF_DEFINED | SF_IMPORT)
+#define SF_UNDEFVAL     (SF_REFERENCED)
 
 /* Symbol tables */
-SymTable*                  CurrentScope = 0;   /* Pointer to current symbol table */
-SymTable*          RootScope    = 0;   /* Root symbol table */
+SymTable*           CurrentScope = 0;   /* Pointer to current symbol table */
+SymTable*           RootScope    = 0;   /* Root symbol table */
 static SymTable*    LastScope    = 0;   /* Pointer to last scope in list */
 static unsigned     ScopeCount   = 0;   /* Number of scopes */
 
@@ -83,7 +83,7 @@ static unsigned     ExportCount = 0;    /* Counter for export symbols */
 
 
 /*****************************************************************************/
-/*                                Internally used functions                         */
+/*                         Internally used functions                         */
 /*****************************************************************************/
 
 
@@ -141,7 +141,7 @@ static SymTable* NewSymTable (SymTable* Parent, const StrBuf* Name)
     S->Parent       = Parent;
     S->Name         = GetStrBufId (Name);
     while (Slots--) {
-               S->Table[Slots] = 0;
+        S->Table[Slots] = 0;
     }
 
     /* Insert the symbol table into the list of all symbol tables */
@@ -178,7 +178,7 @@ static SymTable* NewSymTable (SymTable* Parent, const StrBuf* Name)
                     }
                 } else {
                     /* Duplicate scope name */
-                    Internal ("Duplicate scope name: `%m%p'", Name);
+                    Internal ("Duplicate scope name: '%m%p'", Name);
                 }
             }
         }
@@ -191,7 +191,7 @@ static SymTable* NewSymTable (SymTable* Parent, const StrBuf* Name)
 
 
 /*****************************************************************************/
-/*                                          Code                                    */
+/*                                   Code                                    */
 /*****************************************************************************/
 
 
@@ -207,8 +207,8 @@ void SymEnterLevel (const StrBuf* ScopeName, unsigned char Type,
     }
 
     /* If we have a current scope, search for the given name and create a
-     * new one if it doesn't exist. If this is the root scope, just create it.
-     */
+    ** new one if it doesn't exist. If this is the root scope, just create it.
+    */
     if (CurrentScope) {
 
         /* Search for the scope, create a new one */
@@ -216,7 +216,7 @@ void SymEnterLevel (const StrBuf* ScopeName, unsigned char Type,
 
         /* Check if the scope has been defined before */
         if (CurrentScope->Flags & ST_DEFINED) {
-            Error ("Duplicate scope `%m%p'", ScopeName);
+            Error ("Duplicate scope '%m%p'", ScopeName);
         }
 
     } else {
@@ -230,11 +230,11 @@ void SymEnterLevel (const StrBuf* ScopeName, unsigned char Type,
     CurrentScope->Label    = ScopeLabel;
 
     /* If this is a scope that allows to emit data into segments, add spans
-     * for all currently existing segments. Doing this for just a few scope
-     * types is not really necessary but an optimization, because it does not
-     * allocate memory for useless data (unhandled types here don't occupy
-     * space in any segment).
-     */
+    ** for all currently existing segments. Doing this for just a few scope
+    ** types is not really necessary but an optimization, because it does not
+    ** allocate memory for useless data (unhandled types here don't occupy
+    ** space in any segment).
+    */
     if (CurrentScope->Type <= SCOPE_HAS_DATA) {
         OpenSpanList (&CurrentScope->Spans);
     }
@@ -246,17 +246,17 @@ void SymLeaveLevel (void)
 /* Leave the current lexical level */
 {
     /* If this is a scope that allows to emit data into segments, close the
-     * open the spans.
-     */
+    ** open the spans.
+    */
     if (CurrentScope->Type <= SCOPE_HAS_DATA) {
         CloseSpanList (&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
-     * emitted into this segment. If we have an owner symbol set the size of
-     * this symbol, too.
-     */
+    ** scope was opened. Set the size of the scope to the number of data bytes
+    ** emitted into this segment. If we have an owner symbol set the size of
+    ** this symbol, too.
+    */
     if (CollCount (&CurrentScope->Spans) > 0) {
         const Span* S = CollAtUnchecked (&CurrentScope->Spans, 0);
         unsigned long Size = GetSpanSize (S);
@@ -266,13 +266,16 @@ void SymLeaveLevel (void)
         }
     }
 
+    /* Mark the scope as closed */
+    CurrentScope->Flags |= ST_CLOSED;
+
     /* Leave the scope */
     CurrentScope = CurrentScope->Parent;
 }
 
 
 
-SymTable* SymFindScope (SymTable* Parent, const StrBuf* Name, int AllocNew)
+SymTable* SymFindScope (SymTable* Parent, const StrBuf* Name, SymFindAction Action)
 /* Find a scope in the given enclosing scope */
 {
     SymTable** T = &Parent->Childs;
@@ -289,7 +292,7 @@ SymTable* SymFindScope (SymTable* Parent, const StrBuf* Name, int AllocNew)
     }
 
     /* Create a new scope if requested and we didn't find one */
-    if (*T == 0 && AllocNew) {
+    if (*T == 0 && (Action & SYM_ALLOC_NEW) != 0) {
         *T = NewSymTable (Parent, Name);
     }
 
@@ -301,18 +304,18 @@ SymTable* SymFindScope (SymTable* Parent, const StrBuf* Name, int AllocNew)
 
 SymTable* SymFindAnyScope (SymTable* Parent, const StrBuf* Name)
 /* Find a scope in the given or any of its parent scopes. The function will
- * never create a new symbol, since this can only be done in one specific
- * scope.
- */
+** never create a new symbol, since this can only be done in one specific
+** scope.
+*/
 {
     SymTable* Scope;
     do {
-       /* Search in the current table */
-       Scope = SymFindScope (Parent, Name, SYM_FIND_EXISTING);
-               if (Scope == 0) {
-           /* Not found, search in the parent scope, if we have one */
-           Parent = Parent->Parent;
-       }
+        /* Search in the current table */
+        Scope = SymFindScope (Parent, Name, SYM_FIND_EXISTING);
+        if (Scope == 0) {
+            /* Not found, search in the parent scope, if we have one */
+            Parent = Parent->Parent;
+        }
     } while (Scope == 0 && Parent != 0);
 
     return Scope;
@@ -320,11 +323,12 @@ SymTable* SymFindAnyScope (SymTable* Parent, const StrBuf* Name)
 
 
 
-SymEntry* SymFindLocal (SymEntry* Parent, const StrBuf* Name, int AllocNew)
-/* Find a cheap local symbol. If AllocNew is given and the entry is not
- * found, create a new one. Return the entry found, or the new entry created,
- * or - in case AllocNew is zero - return 0.
- */
+SymEntry* SymFindLocal (SymEntry* Parent, const StrBuf* Name, SymFindAction Action)
+/* Find a cheap local symbol. If Action contains SYM_ALLOC_NEW and the entry is
+** not found, create a new one. Return the entry found, or the new entry
+** created, or - in case Action is SYM_FIND_EXISTING - return 0.
+*/
+
 {
     SymEntry* S;
     int Cmp;
@@ -333,7 +337,7 @@ SymEntry* SymFindLocal (SymEntry* Parent, const StrBuf* Name, int AllocNew)
     if (!Parent) {
         /* No last global, so there's no local table */
         Error ("No preceeding global symbol");
-        if (AllocNew) {
+        if (Action & SYM_ALLOC_NEW) {
             return NewSymEntry (Name, SF_LOCAL);
         } else {
             return 0;
@@ -348,7 +352,7 @@ SymEntry* SymFindLocal (SymEntry* Parent, const StrBuf* Name, int AllocNew)
         return S;
     }
 
-    if (AllocNew) {
+    if (Action & SYM_ALLOC_NEW) {
 
         /* Otherwise create a new entry, insert and return it */
         SymEntry* N = NewSymEntry (Name, SF_LOCAL);
@@ -369,11 +373,12 @@ SymEntry* SymFindLocal (SymEntry* Parent, const StrBuf* Name, int AllocNew)
 
 
 
-SymEntry* SymFind (SymTable* Scope, const StrBuf* Name, int AllocNew)
-/* Find a new symbol table entry in the given table. If AllocNew is given and
- * the entry is not found, create a new one. Return the entry found, or the
- * new entry created, or - in case AllocNew is zero - return 0.
- */
+SymEntry* SymFind (SymTable* Scope, const StrBuf* Name, SymFindAction Action)
+/* Find a new symbol table entry in the given table. If Action contains
+** SYM_ALLOC_NEW and the entry is not found, create a new one. Return the
+** entry found, or the new entry created, or - in case Action is
+** SYM_FIND_EXISTING - return 0.
+*/
 {
     SymEntry* S;
 
@@ -385,13 +390,22 @@ SymEntry* SymFind (SymTable* Scope, const StrBuf* Name, int AllocNew)
 
     /* If we found an entry, return it */
     if (Cmp == 0) {
+        if ((Action & SYM_CHECK_ONLY) == 0 && SymTabIsClosed (Scope)) {
+            S->Flags |= SF_FIXED;
+        }
         return S;
     }
 
-    if (AllocNew) {
+    if (Action & SYM_ALLOC_NEW) {
 
-        /* Otherwise create a new entry, insert and return it */
+        /* Otherwise create a new entry, insert and return it. If the scope is
+        ** already closed, mark the symbol as fixed so it won't be resolved
+        ** by a symbol in the enclosing scopes later.
+        */
         SymEntry* N = NewSymEntry (Name, SF_NONE);
+        if (SymTabIsClosed (Scope)) {
+            N->Flags |= SF_FIXED;
+        }
         N->Sym.Tab = Scope;
         if (S == 0) {
             Scope->Table[Hash] = N;
@@ -413,21 +427,33 @@ SymEntry* SymFind (SymTable* Scope, const StrBuf* Name, int AllocNew)
 
 SymEntry* SymFindAny (SymTable* Scope, const StrBuf* Name)
 /* Find a symbol in the given or any of its parent scopes. The function will
- * never create a new symbol, since this can only be done in one specific
- * scope.
- */
+** never create a new symbol, since this can only be done in one specific
+** scope.
+*/
 {
+    /* Generate the name hash */
+    unsigned Hash = HashBuf (Name);
+
+    /* Search for the symbol */
     SymEntry* Sym;
     do {
-       /* Search in the current table */
-       Sym = SymFind (Scope, Name, SYM_FIND_EXISTING);
-               if (Sym) {
-           /* Found, return it */
-           break;
-       }
+        /* Search in the current table. Ignore entries flagged with SF_UNUSED,
+        ** because for such symbols there is a real entry in one of the parent
+        ** scopes.
+        */
+        if (SymSearchTree (Scope->Table[Hash % Scope->TableSlots], Name, &Sym) == 0) {
+            if (Sym->Flags & SF_UNUSED) {
+                Sym = 0;
+            } else {
+                /* Found, return it */
+                break;
+            }
+        } else {
+            Sym = 0;
+        }
 
         /* Not found, search in the parent scope, if we have one */
-       Scope = Scope->Parent;
+        Scope = Scope->Parent;
 
     } while (Sym == 0 && Scope != 0);
 
@@ -441,53 +467,45 @@ static void SymCheckUndefined (SymEntry* S)
 /* Handle an undefined symbol */
 {
     /* Undefined symbol. It may be...
-     *
-     *   - An undefined symbol in a nested lexical level. In this
-     *     case, search for the symbol in the higher levels and
-     *            make the entry a trampoline entry if we find one.
-     *
-     *   - If the symbol is not found, it is a real undefined symbol.
-     *     If the AutoImport flag is set, make it an import. If the
-     *     AutoImport flag is not set, it's an error.
-     */
+    **
+    **   - An undefined symbol in a nested lexical level. If the symbol is not
+    **     fixed to this level, search for the symbol in the higher levels and
+    **     make the entry a trampoline entry if we find one.
+    **
+    **   - If the symbol is not found, it is a real undefined symbol. If the
+    **     AutoImport flag is set, make it an import. If the AutoImport flag is
+    **     not set, it's an error.
+    */
     SymEntry* Sym = 0;
-    SymTable* Tab = GetSymParentScope (S);
-    while (Tab) {
-        Sym = SymFind (Tab, GetStrBuf (S->Name), SYM_FIND_EXISTING);
-        if (Sym && (Sym->Flags & (SF_DEFINED | SF_IMPORT)) != 0) {
-            /* We've found a symbol in a higher level that is
-             * either defined in the source, or an import.
-             */
-             break;
+    if ((S->Flags & SF_FIXED) == 0) {
+        SymTable* Tab = GetSymParentScope (S);
+        while (Tab) {
+            Sym = SymFind (Tab, GetStrBuf (S->Name), SYM_FIND_EXISTING | SYM_CHECK_ONLY);
+            if (Sym && (Sym->Flags & (SF_DEFINED | SF_IMPORT)) != 0) {
+                /* We've found a symbol in a higher level that is
+                ** either defined in the source, or an import.
+                */
+                 break;
+            }
+            /* No matching symbol found in this level. Look further */
+            Tab = Tab->Parent;
         }
-        /* No matching symbol found in this level. Look further */
-        Tab = Tab->Parent;
     }
 
     if (Sym) {
 
         /* We found the symbol in a higher level. Transfer the flags and
-         * address size from the local symbol to that in the higher level
-         * and check for problems.
-         */
+        ** address size from the local symbol to that in the higher level
+        ** and check for problems.
+        */
         if (S->Flags & SF_EXPORT) {
-           if (Sym->Flags & SF_IMPORT) {
-               /* The symbol is already marked as import */
-                       LIError (&S->RefLines,
-                         "Symbol `%s' is already an import",
+            if (Sym->Flags & SF_IMPORT) {
+                /* The symbol is already marked as import */
+                LIError (&S->RefLines,
+                         "Symbol '%s' is already an import",
                          GetString (Sym->Name));
-           }
-            if (Sym->Flags & SF_EXPORT) {
-                /* The symbol is already marked as an export. */
-                if (Sym->AddrSize > S->ExportSize) {
-                    /* We're exporting a symbol smaller than it actually is */
-                    LIWarning (&S->DefLines, 1,
-                               "Symbol `%m%p' is %s but exported %s",
-                              GetSymName (Sym),
-                              AddrSizeToStr (Sym->AddrSize),
-                              AddrSizeToStr (S->ExportSize));
-                }
-            } else {
+            }
+            if ((Sym->Flags & SF_EXPORT) == 0) {
                 /* Mark the symbol as an export */
                 Sym->Flags |= SF_EXPORT;
                 Sym->ExportSize = S->ExportSize;
@@ -497,8 +515,8 @@ static void SymCheckUndefined (SymEntry* S)
                 }
                 if (Sym->AddrSize > Sym->ExportSize) {
                     /* We're exporting a symbol smaller than it actually is */
-                    LIWarning (&S->DefLines, 1,
-                               "Symbol `%m%p' is %s but exported %s",
+                    LIWarning (&Sym->DefLines, 1,
+                               "Symbol '%m%p' is %s but exported %s",
                                GetSymName (Sym),
                                AddrSizeToStr (Sym->AddrSize),
                                AddrSizeToStr (Sym->ExportSize));
@@ -519,27 +537,27 @@ static void SymCheckUndefined (SymEntry* S)
         S->Flags = SF_UNUSED;
 
     } else {
-       /* The symbol is definitely undefined */
-       if (S->Flags & SF_EXPORT) {
-           /* We will not auto-import an export */
-           LIError (&S->RefLines,
-                     "Exported symbol `%m%p' was never defined",
+        /* The symbol is definitely undefined */
+        if (S->Flags & SF_EXPORT) {
+            /* We will not auto-import an export */
+            LIError (&S->RefLines,
+                     "Exported symbol '%m%p' was never defined",
                      GetSymName (S));
-       } else {
-           if (AutoImport) {
-               /* Mark as import, will be indexed later */
-               S->Flags |= SF_IMPORT;
+        } else {
+            if (AutoImport) {
+                /* Mark as import, will be indexed later */
+                S->Flags |= SF_IMPORT;
                 /* Use the address size for code */
                 S->AddrSize = CodeAddrSize;
                 /* Mark point of import */
                 GetFullLineInfo (&S->DefLines);
-           } else {
-               /* Error */
-               LIError (&S->RefLines,
-                         "Symbol `%m%p' is undefined",
+            } else {
+                /* Error */
+                LIError (&S->RefLines,
+                         "Symbol '%m%p' is undefined",
                          GetSymName (S));
-           }
-       }
+            }
+        }
     }
 }
 
@@ -552,44 +570,44 @@ void SymCheck (void)
 
     /* Check for open scopes */
     if (CurrentScope->Parent != 0) {
-       Error ("Local scope was not closed");
+        Error ("Local scope was not closed");
     }
 
     /* First pass: Walk through all symbols, checking for undefined's and
-     * changing them to trampoline symbols or make them imports.
-     */
+    ** changing them to trampoline symbols or make them imports.
+    */
     S = SymList;
     while (S) {
-       /* If the symbol is marked as global, mark it as export, if it is
-        * already defined, otherwise mark it as import.
-        */
-       if (S->Flags & SF_GLOBAL) {
-           if (S->Flags & SF_DEFINED) {
-               SymExportFromGlobal (S);
-           } else {
-               SymImportFromGlobal (S);
-           }
-       }
-
-       /* Handle undefined symbols */
-               if ((S->Flags & SF_UNDEFMASK) == SF_UNDEFVAL) {
-           /* This is an undefined symbol. Handle it. */
-           SymCheckUndefined (S);
-       }
-
-       /* Next symbol */
-       S = S->List;
+        /* If the symbol is marked as global, mark it as export, if it is
+        ** already defined, otherwise mark it as import.
+        */
+        if (S->Flags & SF_GLOBAL) {
+            if (S->Flags & SF_DEFINED) {
+                SymExportFromGlobal (S);
+            } else {
+                SymImportFromGlobal (S);
+            }
+        }
+
+        /* Handle undefined symbols */
+        if ((S->Flags & SF_UNDEFMASK) == SF_UNDEFVAL) {
+            /* This is an undefined symbol. Handle it. */
+            SymCheckUndefined (S);
+        }
+
+        /* Next symbol */
+        S = S->List;
     }
 
     /* Second pass: Walk again through the symbols. Count exports and imports
-     * and set address sizes where this has not happened before. Ignore
-     * undefined's, since we handled them in the last pass, and ignore unused
-     * symbols, since we handled them in the last pass, too.
-     */
+    ** and set address sizes where this has not happened before. Ignore
+    ** undefined's, since we handled them in the last pass, and ignore unused
+    ** symbols, since we handled them in the last pass, too.
+    */
     S = SymList;
     while (S) {
-       if ((S->Flags & SF_UNUSED) == 0 &&
-           (S->Flags & SF_UNDEFMASK) != SF_UNDEFVAL) {
+        if ((S->Flags & SF_UNUSED) == 0 &&
+            (S->Flags & SF_UNDEFMASK) != SF_UNDEFVAL) {
 
             /* Check for defined symbols that were never referenced */
             if (IsSizeOfSymbol (S)) {
@@ -598,31 +616,31 @@ void SymCheck (void)
                 ReleaseFullLineInfo (&S->RefLines);
             } else if ((S->Flags & SF_DEFINED) != 0 && (S->Flags & SF_REFERENCED) == 0) {
                 LIWarning (&S->DefLines, 2,
-                           "Symbol `%m%p' is defined but never used",
+                           "Symbol '%m%p' is defined but never used",
                            GetSymName (S));
             }
 
             /* Assign an index to all imports */
-           if (S->Flags & SF_IMPORT) {
-               if ((S->Flags & (SF_REFERENCED | SF_FORCED)) == SF_NONE) {
-                   /* Imported symbol is not referenced */
-                   LIWarning (&S->DefLines, 2,
-                               "Symbol `%m%p' is imported but never used",
+            if (S->Flags & SF_IMPORT) {
+                if ((S->Flags & (SF_REFERENCED | SF_FORCED)) == SF_NONE) {
+                    /* Imported symbol is not referenced */
+                    LIWarning (&S->DefLines, 2,
+                               "Symbol '%m%p' is imported but never used",
                                GetSymName (S));
-               } else {
-                   /* Give the import an id, count imports */
-                   S->ImportId = ImportCount++;
-               }
-           }
+                } else {
+                    /* Give the import an id, count imports */
+                    S->ImportId = ImportCount++;
+                }
+            }
 
             /* Count exports, assign the export ID */
-           if (S->Flags & SF_EXPORT) {
+            if (S->Flags & SF_EXPORT) {
                 S->ExportId = ExportCount++;
-           }
+            }
 
             /* If the symbol is defined but has an unknown address size,
-             * recalculate it.
-             */
+            ** recalculate it.
+            */
             if (SymHasExpr (S) && S->AddrSize == ADDR_SIZE_DEFAULT) {
                 ExprDesc ED;
                 ED_Init (&ED);
@@ -635,7 +653,7 @@ void SymCheck (void)
                     } else if (S->AddrSize > S->ExportSize) {
                         /* We're exporting a symbol smaller than it actually is */
                         LIWarning (&S->DefLines, 1,
-                                   "Symbol `%m%p' is %s but exported %s",
+                                   "Symbol '%m%p' is %s but exported %s",
                                    GetSymName (S),
                                    AddrSizeToStr (S->AddrSize),
                                    AddrSizeToStr (S->ExportSize));
@@ -645,9 +663,9 @@ void SymCheck (void)
             }
 
             /* If the address size of the symbol was guessed, check the guess
-             * against the actual address size and print a warning if the two
-             * differ.
-             */
+            ** against the actual address size and print a warning if the two
+            ** differ.
+            */
             if (S->AddrSize != ADDR_SIZE_DEFAULT) {
                 /* Do we have data for this address size? */
                 if (S->AddrSize <= sizeof (S->GuessedUse) / sizeof (S->GuessedUse[0])) {
@@ -655,17 +673,17 @@ void SymCheck (void)
                     const FilePos* P = S->GuessedUse[S->AddrSize - 1];
                     if (P) {
                         PWarning (P, 0,
-                                  "Didn't use %s addressing for `%m%p'",
+                                  "Didn't use %s addressing for '%m%p'",
                                   AddrSizeToStr (S->AddrSize),
                                   GetSymName (S));
                     }
                 }
             }
 
-       }
+        }
 
-       /* Next symbol */
-       S = S->List;
+        /* Next symbol */
+        S = S->List;
     }
 }
 
@@ -677,19 +695,19 @@ void SymDump (FILE* F)
     SymEntry* S = SymList;
 
     while (S) {
-       /* Ignore unused symbols */
-       if ((S->Flags & SF_UNUSED) != 0) {
-           fprintf (F,
-                    "%m%-24p %s %s %s %s %s\n",
-                    GetSymName (S),
-                    (S->Flags & SF_DEFINED)? "DEF" : "---",
-                    (S->Flags & SF_REFERENCED)? "REF" : "---",
-                    (S->Flags & SF_IMPORT)? "IMP" : "---",
-                    (S->Flags & SF_EXPORT)? "EXP" : "---",
+        /* Ignore unused symbols */
+        if ((S->Flags & SF_UNUSED) == 0) {
+            fprintf (F,
+                     "%-24s %s %s %s %s %s\n",
+                     SB_GetConstBuf (GetSymName (S)),
+                     (S->Flags & SF_DEFINED)? "DEF" : "---",
+                     (S->Flags & SF_REFERENCED)? "REF" : "---",
+                     (S->Flags & SF_IMPORT)? "IMP" : "---",
+                     (S->Flags & SF_EXPORT)? "EXP" : "---",
                      AddrSizeToStr (S->AddrSize));
-       }
-       /* Next symbol */
-       S = S->List;
+        }
+        /* Next symbol */
+        S = S->List;
     }
 }
 
@@ -707,21 +725,21 @@ void WriteImports (void)
     ObjWriteVar (ImportCount);
 
     /* Walk throught list and write all valid imports to the file. An import
-     * is considered valid, if it is either referenced, or the forced bit is
-     * set. Otherwise, the import is ignored (no need to link in something
-     * that isn't used).
-     */
+    ** is considered valid, if it is either referenced, or the forced bit is
+    ** set. Otherwise, the import is ignored (no need to link in something
+    ** that isn't used).
+    */
     S = SymList;
     while (S) {
         if ((S->Flags & (SF_UNUSED | SF_IMPORT)) == SF_IMPORT &&
             (S->Flags & (SF_REFERENCED | SF_FORCED)) != 0) {
 
             ObjWrite8 (S->AddrSize);
-                   ObjWriteVar (S->Name);
-           WriteLineInfo (&S->DefLines);
+            ObjWriteVar (S->Name);
+            WriteLineInfo (&S->DefLines);
             WriteLineInfo (&S->RefLines);
-       }
-       S = S->List;
+        }
+        S = S->List;
     }
 
     /* Done writing imports */
@@ -745,52 +763,52 @@ void WriteExports (void)
     /* Walk throught list and write all exports to the file */
     S = SymList;
     while (S) {
-               if ((S->Flags & (SF_UNUSED | SF_EXPORT)) == SF_EXPORT) {
+        if ((S->Flags & (SF_UNUSED | SF_EXPORT)) == SF_EXPORT) {
 
-           /* Get the expression bits and the value */
+            /* Get the expression bits and the value */
             long ConstVal;
             unsigned SymFlags = GetSymInfoFlags (S, &ConstVal);
 
             /* Check if this symbol has a size. If so, remember it in the
-             * flags.
-             */
+            ** flags.
+            */
             long Size;
             SymEntry* SizeSym = FindSizeOfSymbol (S);
             if (SizeSym != 0 && SymIsConst (SizeSym, &Size)) {
                 SymFlags |= SYM_SIZE;
             }
 
-           /* Count the number of ConDes types */
-           for (Type = 0; Type < CD_TYPE_COUNT; ++Type) {
-               if (S->ConDesPrio[Type] != CD_PRIO_NONE) {
-                   SYM_INC_CONDES_COUNT (SymFlags);
-               }
-           }
+            /* Count the number of ConDes types */
+            for (Type = 0; Type < CD_TYPE_COUNT; ++Type) {
+                if (S->ConDesPrio[Type] != CD_PRIO_NONE) {
+                    SYM_INC_CONDES_COUNT (SymFlags);
+                }
+            }
 
-           /* Write the type and the export size */
-           ObjWriteVar (SymFlags);
+            /* Write the type and the export size */
+            ObjWriteVar (SymFlags);
             ObjWrite8 (S->ExportSize);
 
-           /* Write any ConDes declarations */
-           if (SYM_GET_CONDES_COUNT (SymFlags) > 0) {
-               for (Type = 0; Type < CD_TYPE_COUNT; ++Type) {
-                   unsigned char Prio = S->ConDesPrio[Type];
-                   if (Prio != CD_PRIO_NONE) {
-                       ObjWrite8 (CD_BUILD (Type, Prio));
-                   }
-               }
-           }
-
-           /* Write the name */
-                   ObjWriteVar (S->Name);
-
-           /* Write the value */
-           if (SYM_IS_CONST (SymFlags)) {
-               /* Constant value */
-               ObjWrite32 (ConstVal);
-           } else {
-               /* Expression involved */
-               WriteExpr (S->Expr);
+            /* Write any ConDes declarations */
+            if (SYM_GET_CONDES_COUNT (SymFlags) > 0) {
+                for (Type = 0; Type < CD_TYPE_COUNT; ++Type) {
+                    unsigned char Prio = S->ConDesPrio[Type];
+                    if (Prio != CD_PRIO_NONE) {
+                        ObjWrite8 (CD_BUILD (Type, Prio));
+                    }
+                }
+            }
+
+            /* Write the name */
+            ObjWriteVar (S->Name);
+
+            /* Write the value */
+            if (SYM_IS_CONST (SymFlags)) {
+                /* Constant value */
+                ObjWrite32 (ConstVal);
+            } else {
+                /* Expression involved */
+                WriteExpr (S->Expr);
             }
 
             /* If the symbol has a size, write it to the file */
@@ -798,11 +816,11 @@ void WriteExports (void)
                 ObjWriteVar (Size);
             }
 
-           /* Write the line infos */
+            /* Write the line infos */
             WriteLineInfo (&S->DefLines);
-           WriteLineInfo (&S->RefLines);
-       }
-       S = S->List;
+            WriteLineInfo (&S->RefLines);
+        }
+        S = S->List;
     }
 
     /* Done writing exports */
@@ -823,65 +841,65 @@ void WriteDbgSyms (void)
     /* Check if debug info is requested */
     if (DbgSyms) {
 
-       /* Walk through the list, give each symbol an id and count them */
-       Count = 0;
-       S = SymList;
-       while (S) {
-           if (IsDbgSym (S)) {
+        /* Walk through the list, give each symbol an id and count them */
+        Count = 0;
+        S = SymList;
+        while (S) {
+            if (IsDbgSym (S)) {
                 S->DebugSymId = Count++;
-           }
-           S = S->List;
-       }
+            }
+            S = S->List;
+        }
 
-       /* Write the symbol count to the list */
-               ObjWriteVar (Count);
+        /* Write the symbol count to the list */
+        ObjWriteVar (Count);
 
-               /* Walk through list and write all symbols to the file. Ignore size
-         * symbols.
-         */
-       S = SymList;
-       while (S) {
-           if (IsDbgSym (S)) {
+        /* Walk through list and write all symbols to the file. Ignore size
+        ** symbols.
+        */
+        S = SymList;
+        while (S) {
+            if (IsDbgSym (S)) {
 
                 /* Get the expression bits and the value */
                 long ConstVal;
                 unsigned SymFlags = GetSymInfoFlags (S, &ConstVal);
 
                 /* Check if this symbol has a size. If so, remember it in the
-                 * flags.
-                 */
+                ** flags.
+                */
                 long Size;
                 SymEntry* SizeSym = FindSizeOfSymbol (S);
                 if (SizeSym != 0 && SymIsConst (SizeSym, &Size)) {
                     SymFlags |= SYM_SIZE;
                 }
 
-               /* Write the type */
-               ObjWriteVar (SymFlags);
+                /* Write the type */
+                ObjWriteVar (SymFlags);
 
                 /* Write the address size */
                 ObjWrite8 (S->AddrSize);
 
                 /* Write the id of the parent. For normal symbols, this is a
-                 * scope (symbol table), for cheap locals, it's a symbol.
-                 */
+                ** scope (symbol table), for cheap locals, it's a symbol.
+                */
                 if (SYM_IS_STD (SymFlags)) {
                     ObjWriteVar (S->Sym.Tab->Id);
                 } else {
                     ObjWriteVar (S->Sym.Entry->DebugSymId);
                 }
 
-               /* Write the name */
-                       ObjWriteVar (S->Name);
+                /* Write the name */
+                ObjWriteVar (S->Name);
 
-               /* Write the value */
-               if (SYM_IS_CONST (SymFlags)) {
-                   /* Constant value */
-                   ObjWrite32 (ConstVal);
-               } else {
-                   /* Expression involved */
-                   WriteExpr (S->Expr);
-               }
+                /* Write the value */
+                if (SYM_IS_CONST (SymFlags)) {
+                    /* Constant value */
+                    ObjWrite32 (ConstVal);
+                } else {
+                    /* Expression involved */
+                    WriteExpr (S->Expr);
+                }
 
                 /* If the symbol has a size, write it to the file */
                 if (SYM_HAS_SIZE (SymFlags)) {
@@ -896,22 +914,22 @@ void WriteDbgSyms (void)
                     ObjWriteVar (GetSymExportId (S));
                 }
 
-               /* Write the line infos */
+                /* Write the line infos */
                 WriteLineInfo (&S->DefLines);
-               WriteLineInfo (&S->RefLines);
-           }
-           S = S->List;
-       }
+                WriteLineInfo (&S->RefLines);
+            }
+            S = S->List;
+        }
 
     } else {
 
-       /* No debug symbols */
-       ObjWriteVar (0);
+        /* No debug symbols */
+        ObjWriteVar (0);
 
     }
 
     /* Write the high level symbols */
-    WriteHLDbgSyms ();
+    WriteHLLDbgSyms ();
 
     /* Done writing debug symbols */
     ObjEndDbgSyms ();
@@ -941,8 +959,8 @@ void WriteScopes (void)
             unsigned Flags = 0;
 
             /* Check if this scope has a size. If so, remember it in the
-             * flags.
-             */
+            ** flags.
+            */
             long Size;
             SymEntry* SizeSym = FindSizeOfScope (S);
             if (SizeSym != 0 && SymIsConst (SizeSym, &Size)) {
@@ -1003,6 +1021,3 @@ void WriteScopes (void)
     /* Done writing the scopes */
     ObjEndScopes ();
 }
-
-
-