X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fcc65%2Ffunction.c;h=c4f30ca499bdac676ad0443ec17c5d802c7c108a;hb=f7dfcbcc3daf8426770842b5e6ed3634e0d50c82;hp=edf795b8d6bb514bf314b995d8fdee5859f02597;hpb=70755921a959d71bbf94f4fc0425cdb3ba26d71c;p=cc65 diff --git a/src/cc65/function.c b/src/cc65/function.c index edf795b8d..c4f30ca49 100644 --- a/src/cc65/function.c +++ b/src/cc65/function.c @@ -6,9 +6,9 @@ /* */ /* */ /* */ -/* (C) 2000-2002 Ullrich von Bassewitz */ -/* Wacholderweg 14 */ -/* D-70597 Stuttgart */ +/* (C) 2000-2003 Ullrich von Bassewitz */ +/* Römerstrasse 52 */ +/* D-70794 Filderstadt */ /* EMail: uz@cc65.org */ /* */ /* */ @@ -60,9 +60,6 @@ -/* Maximum register variable size */ -#define MAX_REG_SPACE 6 - /* Structure that holds all data needed for function activation */ struct Function { struct SymEntry* FuncEntry; /* Symbol table entry */ @@ -98,7 +95,7 @@ static Function* NewFunction (struct SymEntry* Sym) F->Reserved = 0; F->RetLab = GetLocalLabel (); F->TopLevelSP = 0; - F->RegOffs = MAX_REG_SPACE; + F->RegOffs = RegisterSpace; /* Return the new structure */ return F; @@ -260,7 +257,7 @@ static void F_RestoreRegVars (Function* F) const SymEntry* Sym; /* If we don't have register variables in this function, bail out early */ - if (F->RegOffs == MAX_REG_SPACE) { + if (F->RegOffs == RegisterSpace) { return; } @@ -372,6 +369,22 @@ void NewFunc (SymEntry* Func) /* Allocate code and data segments for this function */ Func->V.F.Seg = PushSegments (Func); + /* Special handling for main() */ + if (strcmp (Func->Name, "main") == 0) { + /* Main cannot be a fastcall function */ + if (IsFastCallFunc (Func->Type)) { + Error ("`main' cannot be declared as __fastcall__"); + } + + /* If main() takes parameters, generate a forced import to a function + * that will setup these parameters. This way, programs that do not + * need the additional code will not get it. + */ + if (D->ParamCount > 0 || (D->Flags & FD_VARIADIC) != 0) { + g_importmainargs (); + } + } + /* If this is a fastcall function, push the last parameter onto the stack */ if (IsFastCallFunc (Func->Type) && D->ParamCount > 0) { @@ -398,6 +411,9 @@ void NewFunc (SymEntry* Func) g_stackcheck (); } + /* Setup the stack */ + oursp = 0; + /* Walk through the parameter list and allocate register variable space * for parameters declared as register. Generate code to swap the contents * of the register bank with the save area on the stack. @@ -429,9 +445,6 @@ void NewFunc (SymEntry* Func) Param = Param->NextSym; } - /* Setup the stack */ - oursp = 0; - /* Need a starting curly brace */ ConsumeLCurly ();