/* */
/* */
/* */
-/* (C) 2000-2001 Ullrich von Bassewitz */
-/* Wacholderweg 14 */
-/* D-70597 Stuttgart */
+/* (C) 2000-2003 Ullrich von Bassewitz */
+/* Römerstrasse 52 */
+/* D-70794 Filderstadt */
/* EMail: uz@cc65.org */
/* */
/* */
/* common */
#include "check.h"
+#include "debugflag.h"
#include "hashstr.h"
#include "xmalloc.h"
#define SYMTAB_SIZE_STRUCT 19U
#define SYMTAB_SIZE_LABEL 7U
-/* Predefined lexical levels */
-#define LEX_LEVEL_GLOBAL 1U
-
/* The current and root symbol tables */
static unsigned LexicalLevel = 0; /* For safety checks */
static SymTable* SymTab0 = 0;
* defined but not used.
*/
if (((Flags & SC_AUTO) || (Flags & SC_STATIC)) && (Flags & SC_EXTERN) == 0) {
- if ((Flags & SC_DEF) && !(Flags & SC_REF)) {
+ if (SymIsDef (Entry) && !SymIsRef (Entry)) {
if (Flags & SC_PARAM) {
Warning ("Parameter `%s' is never used", Entry->Name);
} else {
/* If the entry is a label, check if it was defined in the function */
if (Flags & SC_LABEL) {
- if ((Flags & SC_DEF) == 0) {
+ if (!SymIsDef (Entry)) {
/* Undefined label */
Error ("Undefined label: `%s'", Entry->Name);
- } else if ((Flags & SC_REF) == 0) {
+ } else if (!SymIsRef (Entry)) {
/* Defined but not used */
Warning ("`%s' is defined but never used", Entry->Name);
}
+unsigned GetLexicalLevel (void)
+/* Return the current lexical level */
+{
+ return LexicalLevel;
+}
+
+
+
void EnterGlobalLevel (void)
/* Enter the program global lexical level */
{
SymEntry* Entry = FindSymInTable (LabelTab, Name, HashStr (Name));
if (Entry) {
- if ((Entry->Flags & SC_DEF) != 0 && (Flags & SC_DEF) != 0) {
+ if (SymIsDef (Entry) && (Flags & SC_DEF) != 0) {
/* Trying to define the label more than once */
Error ("Label `%s' is defined more than once", Name);
}
/* Set the symbol attributes */
Entry->Type = TypeDup (Type);
- Entry->V.Offs = Offs;
+ if ((Flags & SC_AUTO) == SC_AUTO) {
+ Entry->V.Offs = Offs;
+ } else if ((Flags & SC_REGISTER) == SC_REGISTER) {
+ Entry->V.R.RegOffs = Offs;
+ Entry->V.R.SaveOffs = oursp; /* ### Cleaner! */
+ } else if ((Flags & SC_STATIC) == SC_STATIC) {
+ Entry->V.Label = Offs;
+ } else if ((Flags & SC_STRUCTFIELD) == SC_STRUCTFIELD) {
+ Entry->V.Offs = Offs;
+ } else {
+ Internal ("Invalid flags in AddLocalSym: %04X", Flags);
+ }
/* Add the entry to the symbol table */
AddSymEntry (SymTab, Entry);
if (IsTypeArray (Type) && IsTypeArray (EType)) {
/* Get the array sizes */
- unsigned Size = Decode (Type + 1);
- unsigned ESize = Decode (EType + 1);
+ long Size = GetElementCount (Type);
+ long ESize = GetElementCount (EType);
- if ((Size != 0 && ESize != 0 && Size != ESize) ||
+ if ((Size != UNSPECIFIED && ESize != UNSPECIFIED && Size != ESize) ||
TypeCmp (Type+DECODE_SIZE+1, EType+DECODE_SIZE+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 == 0) {
+ if (ESize == UNSPECIFIED) {
/* Existing, size not given, use size from new def */
Encode (EType + 1, Size);
}
unsigned Flags = Entry->Flags;
if (Flags & SC_EXTERN) {
/* Only defined or referenced externs */
- if ((Flags & SC_REF) != 0 && (Flags & SC_DEF) == 0) {
+ if (SymIsRef (Entry) && !SymIsDef (Entry)) {
/* An import */
g_defimport (Entry->Name, Flags & SC_ZEROPAGE);
- } else if (Flags & SC_DEF) {
+ } else if (SymIsDef (Entry)) {
/* An export */
g_defexport (Entry->Name, Flags & SC_ZEROPAGE);
}