X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fcc65%2Fsymentry.h;h=900d2ee5fbc8b1f18e52aa8bc4e833e19262cb59;hb=05f72963695f843cca3fd3dac1be0175b470b179;hp=2b69f7e1729e7b5c45858a5bea28702c4e343dce;hpb=59bcc726b6ecf668aa1b8805cba84ec880bbf61e;p=cc65 diff --git a/src/cc65/symentry.h b/src/cc65/symentry.h index 2b69f7e17..900d2ee5f 100644 --- a/src/cc65/symentry.h +++ b/src/cc65/symentry.h @@ -6,10 +6,10 @@ /* */ /* */ /* */ -/* (C) 2000 Ullrich von Bassewitz */ -/* Wacholderweg 14 */ -/* D-70597 Stuttgart */ -/* EMail: uz@musoftware.de */ +/* (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 */ @@ -40,40 +40,61 @@ #include +/* common */ +#include "coll.h" +#include "inline.h" + +/* cc65 */ #include "datatype.h" +#include "declattr.h" /*****************************************************************************/ -/* struct SymEntry */ +/* Forwards */ +/*****************************************************************************/ + + + +struct Segments; +struct LiteralPool; + + + +/*****************************************************************************/ +/* struct SymEntry */ /*****************************************************************************/ /* Storage classes and flags */ -#define SC_AUTO 0x0001U -#define SC_REGISTER 0x0002U /* Register variable, is in static storage */ -#define SC_STATIC 0x0004U -#define SC_EXTERN 0x0008U +#define SC_AUTO 0x0001U /* Auto variable */ +#define SC_REGISTER 0x0002U /* Register variable */ +#define SC_STATIC 0x0004U /* Static */ +#define SC_EXTERN 0x0008U /* Extern linkage */ + +#define SC_ENUM 0x0030U /* An enum */ +#define SC_CONST 0x0020U /* A numeric constant with a type */ +#define SC_LABEL 0x0040U /* A goto label */ +#define SC_PARAM 0x0080U /* A function parameter */ +#define SC_FUNC 0x0100U /* A function */ -#define SC_ENUM 0x0030U /* An enum (numeric constant) */ -#define SC_CONST 0x0020U /* A numeric constant with a type */ -#define SC_LABEL 0x0040U /* A goto label */ -#define SC_PARAM 0x0080U /* This is a function parameter */ -#define SC_FUNC 0x0100U /* Function entry */ +#define SC_DEFTYPE 0x0200U /* Parameter has default type (=int, old style) */ +#define SC_STORAGE 0x0400U /* Symbol with associated storage */ +#define SC_DEFAULT 0x0800U /* Flag: default storage class was used */ -#define SC_STORAGE 0x0400U /* Symbol with associated storage */ -#define SC_DEFAULT 0x0800U /* Flag: default storage class was used */ +#define SC_DEF 0x1000U /* Symbol is defined */ +#define SC_REF 0x2000U /* Symbol is referenced */ -#define SC_DEF 0x1000U /* Symbol is defined */ -#define SC_REF 0x2000U /* Symbol is referenced */ +#define SC_TYPE 0x4000U /* This is a type, struct, typedef, etc. */ +#define SC_STRUCT 0x4001U /* Struct or union */ +#define SC_STRUCTFIELD 0x4002U /* Struct or union field */ +#define SC_BITFIELD 0x4004U /* A bit-field inside a struct or union */ +#define SC_TYPEDEF 0x4008U /* A typedef */ -#define SC_TYPE 0x4000U /* This is a type, struct, typedef, etc. */ -#define SC_STRUCT 0x4001U /* Struct or union */ -#define SC_SFLD 0x4002U /* Struct or union field */ -#define SC_TYPEDEF 0x4003U /* A typedef */ +#define SC_ZEROPAGE 0x8000U /* Symbol marked as zeropage */ -#define SC_ZEROPAGE 0x8000U /* Symbol marked as zeropage */ +#define SC_HAVEATTR 0x10000U /* Symbol has attributes */ @@ -83,21 +104,31 @@ struct SymEntry { SymEntry* NextHash; /* Next entry in hash list */ SymEntry* PrevSym; /* Previous symbol in dl list */ SymEntry* NextSym; /* Next symbol double linked list */ - SymEntry* Link; /* General purpose single linked list */ + SymEntry* Link; /* General purpose single linked list */ struct SymTable* Owner; /* Symbol table the symbol is in */ unsigned Flags; /* Symbol flags */ - type* Type; /* Symbol type */ + Type* Type; /* Symbol type */ + Collection* Attr; /* Attribute list if any */ + char* AsmName; /* Assembler name if any */ /* Data that differs for the different symbol types */ union { - /* Offset for locals or struct members */ - int Offs; + /* Offset for locals or struct members */ + int Offs; - /* Label name for static symbols */ - unsigned Label; + /* Label name for static symbols */ + unsigned Label; - /* Value for constants (including enums) */ + /* Register bank offset and offset of the saved copy on stack for + * register variables. + */ + struct { + int RegOffs; + int SaveOffs; + } R; + + /* Value for constants (including enums) */ long ConstVal; /* Data for structs/unions */ @@ -106,17 +137,28 @@ struct SymEntry { unsigned Size; /* Size of the union/struct */ } S; + /* Data for bit fields */ + struct { + unsigned Offs; /* Byte offset into struct */ + unsigned BitOffs; /* Bit offset into storage unit */ + unsigned BitWidth; /* Width in bits */ + } B; + /* Data for functions */ - struct FuncDesc* Func; /* Function descriptor */ + struct { + struct FuncDesc* Func; /* Function descriptor */ + struct Segments* Seg; /* Segments for this function */ + struct LiteralPool* LitPool; /* Literal pool for this function */ + } F; } V; - char Name[1]; /* Name, dynamically allocated */ + char Name[1]; /* Name, dynamically allocated */ }; /*****************************************************************************/ -/* Code */ +/* Code */ /*****************************************************************************/ @@ -130,12 +172,98 @@ void FreeSymEntry (SymEntry* E); void DumpSymEntry (FILE* F, const SymEntry* E); /* Dump the given symbol table entry to the file in readable form */ -int IsTypeDef (const SymEntry* E); +#if defined(HAVE_INLINE) +INLINE int SymIsBitField (const SymEntry* Sym) +/* Return true if the given entry is a bit-field entry */ +{ + return ((Sym->Flags & SC_BITFIELD) == SC_BITFIELD); +} +#else +# define SymIsBitField(Sym) (((Sym)->Flags & SC_BITFIELD) == SC_BITFIELD) +#endif + +#if defined(HAVE_INLINE) +INLINE int SymIsTypeDef (const SymEntry* Sym) /* Return true if the given entry is a typedef entry */ +{ + return ((Sym->Flags & SC_TYPEDEF) == SC_TYPEDEF); +} +#else +# define SymIsTypeDef(Sym) (((Sym)->Flags & SC_TYPEDEF) == SC_TYPEDEF) +#endif + +#if defined(HAVE_INLINE) +INLINE int SymIsDef (const SymEntry* Sym) +/* Return true if the given entry is defined */ +{ + return ((Sym->Flags & SC_DEF) == SC_DEF); +} +#else +# define SymIsDef(Sym) (((Sym)->Flags & SC_DEF) == SC_DEF) +#endif + +#if defined(HAVE_INLINE) +INLINE int SymIsRef (const SymEntry* Sym) +/* Return true if the given entry is referenced */ +{ + return ((Sym->Flags & SC_REF) == SC_REF); +} +#else +# define SymIsRef(Sym) (((Sym)->Flags & SC_REF) == SC_REF) +#endif + +#if defined(HAVE_INLINE) +INLINE int SymIsRegVar (const SymEntry* Sym) +/* Return true if the given entry is a register variable */ +/* ### HACK! Fix the ugly type flags! */ +{ + return ((Sym->Flags & (SC_REGISTER|SC_TYPE)) == SC_REGISTER); +} +#else +# define SymIsRegVar(Sym) (((Sym)->Flags & (SC_REGISTER|SC_TYPE)) == SC_REGISTER) +#endif -void ChangeSymType (SymEntry* Entry, type* Type); +int SymIsOutputFunc (const SymEntry* Sym); +/* Return true if this is a function that must be output */ + +#if defined(HAVE_INLINE) +INLINE const char* SymGetAsmName (const SymEntry* Sym) +/* Return the assembler label name for the symbol (beware: may be NULL!) */ +{ + return Sym->AsmName; +} +#else +# define SymGetAsmName(Sym) ((Sym)->AsmName) +#endif + +const DeclAttr* SymGetAttr (const SymEntry* Sym, DeclAttrType AttrType); +/* Return an attribute for this symbol or NULL if the attribute does not exist */ + +#if defined(HAVE_INLINE) +INLINE int SymHasAttr (const SymEntry* Sym, DeclAttrType A) +/* Return true if the symbol has the given attribute */ +{ + return (SymGetAttr (Sym, A) != 0); +} +#else +# define SymHasAttr(Sym, A) (SymGetAttr (Sym, A) != 0) +#endif + +void SymUseAttr (SymEntry* Sym, struct Declaration* D); +/* Use the attributes from the declaration for this symbol */ + +void CvtRegVarToAuto (SymEntry* Sym); +/* Convert a register variable to an auto variable */ + +void ChangeSymType (SymEntry* Entry, Type* T); /* Change the type of the given symbol */ +void ChangeAsmName (SymEntry* Entry, const char* NewAsmName); +/* Change the assembler name of the symbol */ + +int HasAnonName (const SymEntry* Entry); +/* Return true if the symbol entry has an anonymous name */ + /* End of symentry.h */