diff --git a/src/ca65/symentry.c b/src/ca65/symentry.c index 1f0420956..a1c86d802 100644 --- a/src/ca65/symentry.c +++ b/src/ca65/symentry.c @@ -6,7 +6,7 @@ /* */ /* */ /* */ -/* (C) 1998-2003 Ullrich von Bassewitz */ +/* (C) 1998-2004 Ullrich von Bassewitz */ /* Römerstraße 52 */ /* D-70794 Filderstadt */ /* EMail: uz@cc65.org */ @@ -474,6 +474,30 @@ void SymConDes (SymEntry* S, unsigned char AddrSize, unsigned Type, unsigned Pri +void SymExportFromGlobal (SymEntry* S) +/* Called at the end of assembly. Converts a global symbol that is defined + * into an export. + */ +{ + /* Remove the global flag and make the symbol an export */ + S->Flags &= ~SF_GLOBAL; + S->Flags |= SF_EXPORT; +} + + + +void SymImportFromGlobal (SymEntry* S) +/* Called at the end of assembly. Converts a global symbol that is undefined + * into an import. + */ +{ + /* Remove the global flag and make it an import */ + S->Flags &= ~SF_GLOBAL; + S->Flags |= SF_IMPORT; +} + + + int SymIsConst (SymEntry* S, long* Val) /* Return true if the given symbol has a constant value. If Val is not NULL * and the symbol has a constant value, store it's value there. diff --git a/src/ca65/symentry.h b/src/ca65/symentry.h index 9ff6475a3..c9772a99e 100644 --- a/src/ca65/symentry.h +++ b/src/ca65/symentry.h @@ -6,7 +6,7 @@ /* */ /* */ /* */ -/* (C) 1998-2003 Ullrich von Bassewitz */ +/* (C) 1998-2004 Ullrich von Bassewitz */ /* Römerstraße 52 */ /* D-70794 Filderstadt */ /* EMail: uz@cc65.org */ @@ -165,6 +165,16 @@ void SymConDes (SymEntry* Sym, unsigned char AddrSize, unsigned Type, unsigned P * mark the symbol as an export. Initializers may never be zero page symbols. */ +void SymExportFromGlobal (SymEntry* S); +/* Called at the end of assembly. Converts a global symbol that is defined + * into an export. + */ + +void SymImportFromGlobal (SymEntry* S); +/* Called at the end of assembly. Converts a global symbol that is undefined + * into an import. + */ + #if defined(HAVE_INLINE) INLINE int SymIsDef (const SymEntry* S) /* Return true if the given symbol is already defined */ @@ -196,6 +206,17 @@ INLINE int SymIsImport (const SymEntry* S) # define SymIsImport(S) (((S)->Flags & SF_IMPORT) != 0) #endif +#if defined(HAVE_INLINE) +INLINE int SymIsExport (const SymEntry* S) +/* Return true if the given symbol is marked as export */ +{ + /* Check the export flag */ + return (S->Flags & SF_EXPORT) != 0; +} +#else +# define SymIsExport(S) (((S)->Flags & SF_EXPORT) != 0) +#endif + int SymIsConst (SymEntry* Sym, long* Val); /* Return true if the given symbol has a constant value. If Val is not NULL * and the symbol has a constant value, store it's value there. diff --git a/src/ca65/symtab.c b/src/ca65/symtab.c index 5d7e864c6..bfc1ef9b2 100644 --- a/src/ca65/symtab.c +++ b/src/ca65/symtab.c @@ -6,7 +6,7 @@ /* */ /* */ /* */ -/* (C) 1998-2003 Ullrich von Bassewitz */ +/* (C) 1998-2004 Ullrich von Bassewitz */ /* Römerstraße 52 */ /* D-70794 Filderstadt */ /* EMail: uz@cc65.org */ @@ -520,11 +520,10 @@ void SymCheck (void) * already defined, otherwise mark it as import. */ if (S->Flags & SF_GLOBAL) { - S->Flags &= ~SF_GLOBAL; if (S->Flags & SF_DEFINED) { - S->Flags |= SF_EXPORT; + SymExportFromGlobal (S); } else { - S->Flags |= SF_IMPORT; + SymImportFromGlobal (S); } } @@ -584,6 +583,18 @@ void SymCheck (void) ED_Init (&ED); StudyExpr (S->Expr, &ED); S->AddrSize = ED.AddrSize; + if (SymIsExport (S)) { + if (S->ExportSize == ADDR_SIZE_DEFAULT) { + /* Use the real export size */ + S->ExportSize = S->AddrSize; + } else if (S->AddrSize > S->ExportSize) { + /* We're exporting a symbol smaller than it actually is */ + PWarning (&S->Pos, 1, + "Symbol `%s' is %s but exported %s", + GetSymName (S), AddrSizeToStr (S->AddrSize), + AddrSizeToStr (S->ExportSize)); + } + } ED_Done (&ED); } }