/* */
/* */
/* */
-/* (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 */
/* */
/* */
-/* 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 */
F->Reserved = 0;
F->RetLab = GetLocalLabel ();
F->TopLevelSP = 0;
- F->RegOffs = MAX_REG_SPACE;
+ F->RegOffs = RegisterSpace;
/* Return the new structure */
return 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;
}
/* 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) {
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.
Param = Param->NextSym;
}
- /* Setup the stack */
- oursp = 0;
-
/* Need a starting curly brace */
ConsumeLCurly ();