/*****************************************************************************/
/* */
-/* symtab.c */
+/* symtab.c */
/* */
-/* Symbol table management for the cc65 C compiler */
+/* Symbol table management for the cc65 C compiler */
/* */
/* */
/* */
-/* (C) 2000-2011, Ullrich von Bassewitz */
+/* (C) 2000-2013, Ullrich von Bassewitz */
/* Roemerstrasse 52 */
/* D-70794 Filderstadt */
/* EMail: uz@cc65.org */
/*****************************************************************************/
-/* Data */
+/* Data */
/*****************************************************************************/
/* An empty symbol table */
-SymTable EmptySymTab = {
- 0, /* PrevTab */
- 0, /* SymHead */
- 0, /* SymTail */
- 0, /* SymCount */
- 1, /* Size */
- { 0 } /* Tab[1] */
+SymTable EmptySymTab = {
+ 0, /* PrevTab */
+ 0, /* SymHead */
+ 0, /* SymTail */
+ 0, /* SymCount */
+ 1, /* Size */
+ { 0 } /* Tab[1] */
};
/* Symbol table sizes */
-#define SYMTAB_SIZE_GLOBAL 211U
-#define SYMTAB_SIZE_FUNCTION 29U
-#define SYMTAB_SIZE_BLOCK 13U
-#define SYMTAB_SIZE_STRUCT 19U
-#define SYMTAB_SIZE_LABEL 7U
+#define SYMTAB_SIZE_GLOBAL 211U
+#define SYMTAB_SIZE_FUNCTION 29U
+#define SYMTAB_SIZE_BLOCK 13U
+#define SYMTAB_SIZE_STRUCT 19U
+#define SYMTAB_SIZE_LABEL 7U
/* The current and root symbol tables */
-static unsigned LexicalLevel = 0; /* For safety checks */
-static SymTable* SymTab0 = 0;
-static SymTable* SymTab = 0;
-static SymTable* TagTab0 = 0;
-static SymTable* TagTab = 0;
-static SymTable* LabelTab = 0;
+static unsigned LexicalLevel = 0; /* For safety checks */
+static SymTable* SymTab0 = 0;
+static SymTable* SymTab = 0;
+static SymTable* TagTab0 = 0;
+static SymTable* TagTab = 0;
+static SymTable* LabelTab = 0;
/*****************************************************************************/
-/* struct SymTable */
+/* struct SymTable */
/*****************************************************************************/
SymTable* S = xmalloc (sizeof (SymTable) + (Size-1) * sizeof (SymEntry*));
/* Initialize the symbol table structure */
- S->PrevTab = 0;
- S->SymHead = 0;
- S->SymTail = 0;
- S->SymCount = 0;
- S->Size = Size;
+ S->PrevTab = 0;
+ S->SymHead = 0;
+ S->SymTail = 0;
+ S->SymCount = 0;
+ S->Size = Size;
for (I = 0; I < Size; ++I) {
- S->Tab[I] = 0;
+ S->Tab[I] = 0;
}
/* Return the symbol table */
/* Free all symbols */
SymEntry* Sym = S->SymHead;
while (Sym) {
- SymEntry* NextSym = Sym->NextSym;
- FreeSymEntry (Sym);
- Sym = NextSym;
+ SymEntry* NextSym = Sym->NextSym;
+ FreeSymEntry (Sym);
+ Sym = NextSym;
}
/* Free the table itself */
/*****************************************************************************/
-/* Check symbols in a table */
+/* Check symbols in a table */
/*****************************************************************************/
SymEntry* Entry = Tab->SymHead;
while (Entry) {
- /* Get the storage flags for tne entry */
- unsigned Flags = Entry->Flags;
+ /* Get the storage flags for tne entry */
+ unsigned Flags = Entry->Flags;
- /* Ignore typedef entries */
- if (!SymIsTypeDef (Entry)) {
+ /* Ignore typedef entries */
+ if (!SymIsTypeDef (Entry)) {
- /* Check if the symbol is one with storage, and it if it was
- * defined but not used.
- */
- if (((Flags & SC_AUTO) || (Flags & SC_STATIC)) && (Flags & SC_EXTERN) == 0) {
- if (SymIsDef (Entry) && !SymIsRef (Entry) &&
+ /* Check if the symbol is one with storage, and it if it was
+ ** defined but not used.
+ */
+ if (((Flags & SC_AUTO) || (Flags & SC_STATIC)) && (Flags & SC_EXTERN) == 0) {
+ if (SymIsDef (Entry) && !SymIsRef (Entry) &&
!SymHasAttr (Entry, atUnused)) {
- if (Flags & SC_PARAM) {
+ if (Flags & SC_PARAM) {
if (IS_Get (&WarnUnusedParam)) {
- Warning ("Parameter `%s' is never used", Entry->Name);
+ Warning ("Parameter `%s' is never used", Entry->Name);
}
- } else {
+ } else {
if (IS_Get (&WarnUnusedVar)) {
Warning ("`%s' is defined but never used", Entry->Name);
}
- }
- }
- }
-
- /* If the entry is a label, check if it was defined in the function */
- if (Flags & SC_LABEL) {
- if (!SymIsDef (Entry)) {
- /* Undefined label */
- Error ("Undefined label: `%s'", Entry->Name);
- } else if (!SymIsRef (Entry)) {
- /* Defined but not used */
+ }
+ }
+ }
+
+ /* If the entry is a label, check if it was defined in the function */
+ if (Flags & SC_LABEL) {
+ if (!SymIsDef (Entry)) {
+ /* Undefined label */
+ Error ("Undefined label: `%s'", Entry->Name);
+ } else if (!SymIsRef (Entry)) {
+ /* Defined but not used */
if (IS_Get (&WarnUnusedLabel)) {
- Warning ("`%s' is defined but never used", Entry->Name);
+ Warning ("`%s' is defined but never used", Entry->Name);
}
- }
- }
+ }
+ }
- }
+ }
- /* Next entry */
- Entry = Entry->NextSym;
+ /* Next entry */
+ Entry = Entry->NextSym;
}
}
/*****************************************************************************/
-/* Handling of lexical levels */
+/* Handling of lexical levels */
/*****************************************************************************/
/* Dump the tables if requested */
if (Debug) {
- PrintSymTable (SymTab0, stdout, "Global symbol table");
- PrintSymTable (TagTab0, stdout, "Global tag table");
+ PrintSymTable (SymTab0, stdout, "Global symbol table");
+ PrintSymTable (TagTab0, stdout, "Global tag table");
}
/* Don't delete the symbol and struct tables! */
TagTab = S;
/* Create and assign a new label table */
- LabelTab = NewSymTable (SYMTAB_SIZE_LABEL);
+ S = NewSymTable (SYMTAB_SIZE_LABEL);
+ S->PrevTab = LabelTab;
+ LabelTab = S;
}
/* Don't delete the tables */
SymTab = SymTab->PrevTab;
TagTab = TagTab->PrevTab;
+ LabelTab = LabelTab->PrevTab;
}
/* Drop the label table if it is empty */
if (LabelTab->SymCount == 0) {
- FreeSymTable (LabelTab);
+ FreeSymTable (LabelTab);
}
/* Don't delete the tables */
/* Get a new symbol table and make it current */
S = NewSymTable (SYMTAB_SIZE_BLOCK);
- S->PrevTab = SymTab;
- SymTab = S;
+ S->PrevTab = SymTab;
+ SymTab = S;
/* Get a new tag table and make it current */
S = NewSymTable (SYMTAB_SIZE_BLOCK);
SymTable* S;
/* Get a new symbol table and make it current. Note: Structs and enums
- * nested in struct scope are NOT local to the struct but visible in the
- * outside scope. So we will NOT create a new struct or enum table.
- */
+ ** nested in struct scope are NOT local to the struct but visible in the
+ ** outside scope. So we will NOT create a new struct or enum table.
+ */
S = NewSymTable (SYMTAB_SIZE_BLOCK);
- S->PrevTab = SymTab;
- SymTab = S;
+ S->PrevTab = SymTab;
+ SymTab = S;
}
/*****************************************************************************/
-/* Find functions */
+/* Find functions */
/*****************************************************************************/
/* Get the start of the hash chain */
SymEntry* E = T->Tab [Hash % T->Size];
while (E) {
- /* Compare the name */
- if (strcmp (E->Name, Name) == 0) {
- /* Found */
- return E;
- }
- /* Not found, next entry in hash chain */
- E = E->NextHash;
+ /* Compare the name */
+ if (strcmp (E->Name, Name) == 0) {
+ /* Found */
+ return E;
+ }
+ /* Not found, next entry in hash chain */
+ E = E->NextHash;
}
/* Not found */
/* Check all symbol tables for the symbol */
while (Tab) {
- /* Try to find the symbol in this table */
- SymEntry* E = FindSymInTable (Tab, Name, Hash);
+ /* Try to find the symbol in this table */
+ SymEntry* E = FindSymInTable (Tab, Name, Hash);
- /* Bail out if we found it */
- if (E != 0) {
- return E;
- }
+ /* Bail out if we found it */
+ if (E != 0) {
+ return E;
+ }
- /* Repeat the search in the next higher lexical level */
- Tab = Tab->PrevTab;
+ /* Repeat the search in the next higher lexical level */
+ Tab = Tab->PrevTab;
}
/* Not found */
/* The given type may actually be a pointer to struct */
if (IsTypePtr (T)) {
- ++T;
+ ++T;
}
/* Non-structs do not have any struct fields... */
if (IsClassStruct (T)) {
- /* Get a pointer to the struct/union type */
- const SymEntry* Struct = GetSymEntry (T);
- CHECK (Struct != 0);
+ /* Get a pointer to the struct/union type */
+ const SymEntry* Struct = GetSymEntry (T);
+ CHECK (Struct != 0);
- /* Now search in the struct symbol table. Beware: The table may not
- * exist.
- */
- if (Struct->V.S.SymTab) {
- Field = FindSymInTable (Struct->V.S.SymTab, Name, HashStr (Name));
- }
+ /* Now search in the struct symbol table. Beware: The table may not
+ ** exist.
+ */
+ if (Struct->V.S.SymTab) {
+ Field = FindSymInTable (Struct->V.S.SymTab, Name, HashStr (Name));
+ }
}
return Field;
/*****************************************************************************/
-/* Add stuff to the symbol table */
+/* Add stuff to the symbol table */
/*****************************************************************************/
/* Insert the symbol into the list of all symbols in this level */
if (T->SymTail) {
- T->SymTail->NextSym = S;
+ T->SymTail->NextSym = S;
}
S->PrevSym = T->SymTail;
T->SymTail = S;
if (T->SymHead == 0) {
- /* First symbol */
- T->SymHead = S;
+ /* First symbol */
+ T->SymHead = S;
}
++T->SymCount;
-SymEntry* AddStructSym (const char* Name, unsigned Size, SymTable* Tab)
+SymEntry* AddStructSym (const char* Name, unsigned Type, unsigned Size, SymTable* Tab)
/* Add a struct/union entry and return it */
{
+ SymEntry* Entry;
+
+ /* Type must be struct or union */
+ PRECONDITION (Type == SC_STRUCT || Type == SC_UNION);
+
/* Do we have an entry with this name already? */
- SymEntry* Entry = FindSymInTable (TagTab, Name, HashStr (Name));
+ Entry = FindSymInTable (TagTab, Name, HashStr (Name));
if (Entry) {
- /* We do have an entry. This may be a forward, so check it. */
- if ((Entry->Flags & SC_STRUCT) == 0) {
- /* Existing symbol is not a struct */
- Error ("Symbol `%s' is already different kind", Name);
- } else if (Size > 0 && Entry->V.S.Size > 0) {
- /* Both structs are definitions. */
- Error ("Multiple definition for `%s'", Name);
- } else {
- /* Define the struct size if it is given */
- if (Size > 0) {
- Entry->V.S.SymTab = Tab;
- Entry->V.S.Size = Size;
- }
- }
+ /* We do have an entry. This may be a forward, so check it. */
+ if ((Entry->Flags & SC_TYPEMASK) != Type) {
+ /* Existing symbol is not a struct */
+ Error ("Symbol `%s' is already different kind", Name);
+ } else if (Size > 0 && Entry->V.S.Size > 0) {
+ /* Both structs are definitions. */
+ Error ("Multiple definition for `%s'", Name);
+ } else {
+ /* Define the struct size if it is given */
+ if (Size > 0) {
+ Entry->V.S.SymTab = Tab;
+ Entry->V.S.Size = Size;
+ }
+ }
} else {
- /* Create a new entry */
- Entry = NewSymEntry (Name, SC_STRUCT);
+ /* Create a new entry */
+ Entry = NewSymEntry (Name, Type);
- /* Set the struct data */
- Entry->V.S.SymTab = Tab;
- Entry->V.S.Size = Size;
+ /* Set the struct data */
+ Entry->V.S.SymTab = Tab;
+ Entry->V.S.Size = Size;
- /* Add it to the current table */
- AddSymEntry (TagTab, Entry);
+ /* Add it to the current table */
+ AddSymEntry (TagTab, Entry);
}
/* Return the entry */
SymEntry* Entry = FindSymInTable (SymTab, Name, HashStr (Name));
if (Entry) {
- /* We have a symbol with this name already */
- Error ("Multiple definition for `%s'", Name);
+ /* We have a symbol with this name already */
+ Error ("Multiple definition for `%s'", Name);
} else {
- /* Create a new entry */
- Entry = NewSymEntry (Name, SC_BITFIELD);
+ /* Create a new entry */
+ Entry = NewSymEntry (Name, SC_BITFIELD);
- /* Set the symbol attributes. Bit-fields are always of type unsigned */
- Entry->Type = type_uint;
+ /* Set the symbol attributes. Bit-fields are always of type unsigned */
+ Entry->Type = type_uint;
Entry->V.B.Offs = Offs;
Entry->V.B.BitOffs = BitOffs;
Entry->V.B.BitWidth = Width;
- /* Add the entry to the symbol table */
- AddSymEntry (SymTab, Entry);
+ /* Add the entry to the symbol table */
+ AddSymEntry (SymTab, Entry);
}
/* Do we have an entry with this name already? */
SymEntry* Entry = FindSymInTable (Tab, Name, HashStr (Name));
if (Entry) {
- if ((Entry->Flags & SC_CONST) != SC_CONST) {
- Error ("Symbol `%s' is already different kind", Name);
- } else {
- Error ("Multiple definition for `%s'", Name);
- }
- return Entry;
+ if ((Entry->Flags & SC_CONST) != SC_CONST) {
+ Error ("Symbol `%s' is already different kind", Name);
+ } else {
+ Error ("Multiple definition for `%s'", Name);
+ }
+ return Entry;
}
/* Create a new entry */
Entry = NewSymEntry (Name, Flags);
/* Enum values are ints */
- Entry->Type = TypeDup (T);
+ Entry->Type = TypeDup (T);
/* Set the enum data */
Entry->V.ConstVal = Val;
SymEntry* Entry = FindSymInTable (LabelTab, Name, HashStr (Name));
if (Entry) {
- if (SymIsDef (Entry) && (Flags & SC_DEF) != 0) {
- /* Trying to define the label more than once */
- Error ("Label `%s' is defined more than once", Name);
- }
- Entry->Flags |= Flags;
+ if (SymIsDef (Entry) && (Flags & SC_DEF) != 0) {
+ /* Trying to define the label more than once */
+ Error ("Label `%s' is defined more than once", Name);
+ }
+ Entry->Flags |= Flags;
} else {
- /* Create a new entry */
- Entry = NewSymEntry (Name, SC_LABEL | Flags);
+ /* Create a new entry */
+ Entry = NewSymEntry (Name, SC_LABEL | Flags);
- /* Set a new label number */
- Entry->V.Label = GetLocalLabel ();
+ /* Set a new label number */
+ Entry->V.Label = GetLocalLabel ();
/* Generate the assembler name of the label */
Entry->AsmName = xstrdup (LocalLabelName (Entry->V.Label));
- /* Add the entry to the label table */
- AddSymEntry (LabelTab, Entry);
+ /* Add the entry to the label table */
+ AddSymEntry (LabelTab, Entry);
}
SymEntry* Entry = FindSymInTable (SymTab, Name, HashStr (Name));
if (Entry) {
- /* We have a symbol with this name already */
- Error ("Multiple definition for `%s'", Name);
+ /* We have a symbol with this name already */
+ Error ("Multiple definition for `%s'", Name);
} else {
- /* Create a new entry */
- Entry = NewSymEntry (Name, Flags);
+ /* Create a new entry */
+ Entry = NewSymEntry (Name, Flags);
- /* Set the symbol attributes */
- Entry->Type = TypeDup (T);
+ /* Set the symbol attributes */
+ Entry->Type = TypeDup (T);
if ((Flags & SC_AUTO) == SC_AUTO) {
Entry->V.Offs = Offs;
} else if ((Flags & SC_REGISTER) == SC_REGISTER) {
Internal ("Invalid flags in AddLocalSym: %04X", Flags);
}
- /* Add the entry to the symbol table */
- AddSymEntry (SymTab, Entry);
+ /* Add the entry to the symbol table */
+ AddSymEntry (SymTab, Entry);
}
SymEntry* Entry = FindSymInTable (Tab, Name, HashStr (Name));
if (Entry) {
- Type* EType;
-
- /* We have a symbol with this name already */
- if (Entry->Flags & SC_TYPE) {
- Error ("Multiple definition for `%s'", Name);
- return Entry;
- }
-
- /* Get the type string of the existing symbol */
- EType = Entry->Type;
-
- /* If we are handling arrays, the old entry or the new entry may be an
- * incomplete declaration. Accept this, and if the exsting entry is
- * incomplete, complete it.
- */
- if (IsTypeArray (T) && IsTypeArray (EType)) {
-
- /* Get the array sizes */
- long Size = GetElementCount (T);
- long ESize = GetElementCount (EType);
-
- if ((Size != UNSPECIFIED && ESize != UNSPECIFIED && Size != ESize) ||
- TypeCmp (T + 1, EType + 1) < TC_EQUAL) {
- /* Types not identical: Conflicting types */
- Error ("Conflicting types for `%s'", Name);
- return Entry;
- } else {
- /* Check if we have a size in the existing definition */
- if (ESize == UNSPECIFIED) {
- /* Existing, size not given, use size from new def */
- SetElementCount (EType, Size);
- }
- }
-
- } else {
- /* New type must be identical */
- if (TypeCmp (EType, T) < TC_EQUAL) {
- Error ("Conflicting types for `%s'", Name);
- return Entry;
- }
-
- /* In case of a function, use the new type descriptor, since it
- * contains pointers to the new symbol tables that are needed if
- * an actual function definition follows. Be sure not to use the
- * new descriptor if it contains a function declaration with an
- * empty parameter list.
- */
- if (IsFunc) {
- /* Get the function descriptor from the new type */
- FuncDesc* F = GetFuncDesc (T);
- /* Use this new function descriptor if it doesn't contain
- * an empty parameter list.
- */
+ Type* EType;
+
+ /* We have a symbol with this name already */
+ if (Entry->Flags & SC_TYPE) {
+ Error ("Multiple definition for `%s'", Name);
+ return Entry;
+ }
+
+ /* Get the type string of the existing symbol */
+ EType = Entry->Type;
+
+ /* If we are handling arrays, the old entry or the new entry may be an
+ ** incomplete declaration. Accept this, and if the exsting entry is
+ ** incomplete, complete it.
+ */
+ if (IsTypeArray (T) && IsTypeArray (EType)) {
+
+ /* Get the array sizes */
+ long Size = GetElementCount (T);
+ long ESize = GetElementCount (EType);
+
+ if ((Size != UNSPECIFIED && ESize != UNSPECIFIED && Size != ESize) ||
+ TypeCmp (T + 1, EType + 1) < TC_EQUAL) {
+ /* Types not identical: Conflicting types */
+ Error ("Conflicting types for `%s'", Name);
+ return Entry;
+ } else {
+ /* Check if we have a size in the existing definition */
+ if (ESize == UNSPECIFIED) {
+ /* Existing, size not given, use size from new def */
+ SetElementCount (EType, Size);
+ }
+ }
+
+ } else {
+ /* New type must be identical */
+ if (TypeCmp (EType, T) < TC_EQUAL) {
+ Error ("Conflicting types for `%s'", Name);
+ return Entry;
+ }
+
+ /* In case of a function, use the new type descriptor, since it
+ ** contains pointers to the new symbol tables that are needed if
+ ** an actual function definition follows. Be sure not to use the
+ ** new descriptor if it contains a function declaration with an
+ ** empty parameter list.
+ */
+ if (IsFunc) {
+ /* Get the function descriptor from the new type */
+ FuncDesc* F = GetFuncDesc (T);
+ /* Use this new function descriptor if it doesn't contain
+ ** an empty parameter list.
+ */
if ((F->Flags & FD_EMPTY) == 0) {
Entry->V.F.Func = F;
SetFuncDesc (EType, F);
}
- }
- }
+ }
+ }
+
+ /* If a static declaration follows a non-static declaration, then
+ ** warn about the conflict. (It will compile a public declaration.)
+ */
+ if ((Flags & SC_EXTERN) == 0 && (Entry->Flags & SC_EXTERN) != 0) {
+ Warning ("static declaration follows non-static declaration of `%s'.", Name);
+ }
- /* Add the new flags */
- Entry->Flags |= Flags;
+ /* An extern declaration must not change the current linkage. */
+ if (IsFunc || (Flags & (SC_EXTERN | SC_STORAGE)) == SC_EXTERN) {
+ Flags &= ~SC_EXTERN;
+ }
+
+ /* If a public declaration follows a static declaration, then
+ ** warn about the conflict. (It will compile a public declaration.)
+ */
+ if ((Flags & SC_EXTERN) != 0 && (Entry->Flags & SC_EXTERN) == 0) {
+ Warning ("public declaration follows static declaration of `%s'.", Name);
+ }
+
+ /* Add the new flags */
+ Entry->Flags |= Flags;
} else {
- /* Create a new entry */
- Entry = NewSymEntry (Name, Flags);
+ /* Create a new entry */
+ Entry = NewSymEntry (Name, Flags);
- /* Set the symbol attributes */
- Entry->Type = TypeDup (T);
+ /* Set the symbol attributes */
+ Entry->Type = TypeDup (T);
- /* If this is a function, set the function descriptor and clear
- * additional fields.
- */
- if (IsFunc) {
- Entry->V.F.Func = GetFuncDesc (Entry->Type);
- Entry->V.F.Seg = 0;
- }
+ /* If this is a function, set the function descriptor and clear
+ ** additional fields.
+ */
+ if (IsFunc) {
+ Entry->V.F.Func = GetFuncDesc (Entry->Type);
+ Entry->V.F.Seg = 0;
+ }
/* Add the assembler name of the symbol */
SymSetAsmName (Entry);
- /* Add the entry to the symbol table */
- AddSymEntry (Tab, Entry);
+ /* Add the entry to the symbol table */
+ AddSymEntry (Tab, Entry);
}
/* Return the entry */
/*****************************************************************************/
-/* Code */
+/* Code */
/*****************************************************************************/
/* Mark the symbol as zeropage */
if (Entry) {
- Entry->Flags |= SC_ZEROPAGE;
+ Entry->Flags |= SC_ZEROPAGE;
} else {
- Error ("Undefined symbol: `%s'", Name);
+ Error ("Undefined symbol: `%s'", Name);
}
}
/* Underline the header */
while (Len--) {
- fputc ('=', F);
+ fputc ('=', F);
}
fputc ('\n', F);
/* Dump the table */
Entry = Tab->SymHead;
if (Entry == 0) {
- fprintf (F, "(empty)\n");
+ fprintf (F, "(empty)\n");
} else {
- while (Entry) {
- DumpSymEntry (F, Entry);
- Entry = Entry->NextSym;
- }
+ while (Entry) {
+ DumpSymEntry (F, Entry);
+ Entry = Entry->NextSym;
+ }
}
fprintf (F, "\n\n\n");
}
Entry = SymTab->SymHead;
while (Entry) {
- unsigned Flags = Entry->Flags;
- if (Flags & SC_EXTERN) {
- /* Only defined or referenced externs */
- if (SymIsRef (Entry) && !SymIsDef (Entry)) {
- /* An import */
- g_defimport (Entry->Name, Flags & SC_ZEROPAGE);
- } else if (SymIsDef (Entry)) {
- /* An export */
- g_defexport (Entry->Name, Flags & SC_ZEROPAGE);
- }
- }
- Entry = Entry->NextSym;
+ unsigned Flags = Entry->Flags;
+ if (Flags & SC_EXTERN) {
+ /* Only defined or referenced externs */
+ if (SymIsRef (Entry) && !SymIsDef (Entry)) {
+ /* An import */
+ g_defimport (Entry->Name, Flags & SC_ZEROPAGE);
+ } else if (SymIsDef (Entry)) {
+ /* An export */
+ g_defexport (Entry->Name, Flags & SC_ZEROPAGE);
+ }
+ }
+ Entry = Entry->NextSym;
}
}
/* Output info for locals if enabled */
if (DebugInfo) {
/* For cosmetic reasons in the output file, we will insert two tabs
- * on global level and just one on local level.
- */
+ ** on global level and just one on local level.
+ */
if (LexicalLevel == LEX_LEVEL_GLOBAL) {
Head = "\t.dbg\t\tsym";
} else {
}
}
}
-
-
-