X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fcc65%2Fsymtab.c;h=5a7c740d3316169b4cb2cc491e6d80f0ae30b180;hb=9b7c16ec4cbb5282642c377272224e3fc825f860;hp=0a03cabcaa0a426175e47ff3e98d9346435875af;hpb=63943c3f44a2ed21ac970cf26938d8782431a2ec;p=cc65 diff --git a/src/cc65/symtab.c b/src/cc65/symtab.c index 0a03cabca..5a7c740d3 100644 --- a/src/cc65/symtab.c +++ b/src/cc65/symtab.c @@ -6,10 +6,10 @@ /* */ /* */ /* */ -/* (C) 2000-2006 Ullrich von Bassewitz */ -/* Römerstrasse 52 */ -/* D-70794 Filderstadt */ -/* EMail: uz@cc65.org */ +/* (C) 2000-2009, Ullrich von Bassewitz */ +/* Roemerstrasse 52 */ +/* D-70794 Filderstadt */ +/* EMail: uz@cc65.org */ /* */ /* */ /* This software is provided 'as-is', without any expressed or implied */ @@ -156,17 +156,22 @@ static void CheckSymTable (SymTable* Tab) unsigned Flags = Entry->Flags; /* Ignore typedef entries */ - if ((Flags & SC_TYPEDEF) != SC_TYPEDEF) { + 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)) { + if (SymIsDef (Entry) && !SymIsRef (Entry) && + !SymHasAttr (Entry, atUnused)) { if (Flags & SC_PARAM) { - Warning ("Parameter `%s' is never used", Entry->Name); + if (IS_Get (&WarnUnusedParam)) { + Warning ("Parameter `%s' is never used", Entry->Name); + } } else { - Warning ("`%s' is defined but never used", Entry->Name); + if (IS_Get (&WarnUnusedVar)) { + Warning ("`%s' is defined but never used", Entry->Name); + } } } } @@ -178,7 +183,9 @@ static void CheckSymTable (SymTable* Tab) Error ("Undefined label: `%s'", Entry->Name); } else if (!SymIsRef (Entry)) { /* Defined but not used */ - Warning ("`%s' is defined but never used", Entry->Name); + if (IS_Get (&WarnUnusedLabel)) { + Warning ("`%s' is defined but never used", Entry->Name); + } } } @@ -485,19 +492,14 @@ SymEntry* FindStructField (const Type* T, const char* Name) /* Non-structs do not have any struct fields... */ if (IsClassStruct (T)) { - const SymTable* Tab; - /* Get a pointer to the struct/union type */ const SymEntry* Struct = GetSymEntry (T); CHECK (Struct != 0); - /* Get the field symbol table from the struct entry. - * Beware: The table may not exist. + /* Now search in the struct symbol table. Beware: The table may not + * exist. */ - Tab = Struct->V.S.SymTab; - - /* Now search in the struct symbol table */ - if (Tab) { + if (Struct->V.S.SymTab) { Field = FindSymInTable (Struct->V.S.SymTab, Name, HashStr (Name)); } } @@ -582,6 +584,38 @@ SymEntry* AddStructSym (const char* Name, unsigned Size, SymTable* Tab) +SymEntry* AddBitField (const char* Name, unsigned Offs, unsigned BitOffs, unsigned Width) +/* Add a bit field to the local symbol table and return the symbol entry */ +{ + /* Do we have an entry with this name already? */ + SymEntry* Entry = FindSymInTable (SymTab, Name, HashStr (Name)); + if (Entry) { + + /* We have a symbol with this name already */ + Error ("Multiple definition for `%s'", Name); + + } else { + + /* Create a new entry */ + Entry = NewSymEntry (Name, SC_BITFIELD); + + /* 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); + + } + + /* Return the entry */ + return Entry; +} + + + SymEntry* AddConstSym (const char* Name, const Type* T, unsigned Flags, long Val) /* Add an constant symbol to the symbol table and return it */ { @@ -735,7 +769,7 @@ SymEntry* AddGlobalSym (const char* Name, const Type* T, unsigned Flags) TypeCmp (T + 1, EType + 1) < TC_EQUAL) { /* Types not identical: Conflicting types */ Error ("Conflicting types for `%s'", Name); - return Entry; + return Entry; } else { /* Check if we have a size in the existing definition */ if (ESize == UNSPECIFIED) { @@ -748,7 +782,7 @@ SymEntry* AddGlobalSym (const char* Name, const Type* T, unsigned Flags) /* New type must be identical */ if (TypeCmp (EType, T) < TC_EQUAL) { Error ("Conflicting types for `%s'", Name); - return Entry; + return Entry; } /* In case of a function, use the new type descriptor, since it @@ -758,9 +792,9 @@ SymEntry* AddGlobalSym (const char* Name, const Type* T, unsigned Flags) * 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 + /* 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) {