If main() takes arguments, generate a forced import to a special module
constructor which will setup command line arguments. git-svn-id: svn://svn.cc65.org/cc65/trunk@2011 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
parent
9257570050
commit
065b8f2596
3 changed files with 34 additions and 7 deletions
|
@ -157,16 +157,16 @@ void g_preamble (void)
|
||||||
/* Identify the compiler version */
|
/* Identify the compiler version */
|
||||||
AddTextLine (";");
|
AddTextLine (";");
|
||||||
AddTextLine ("; File generated by cc65 v %u.%u.%u",
|
AddTextLine ("; File generated by cc65 v %u.%u.%u",
|
||||||
VER_MAJOR, VER_MINOR, VER_PATCH);
|
VER_MAJOR, VER_MINOR, VER_PATCH);
|
||||||
AddTextLine (";");
|
AddTextLine (";");
|
||||||
|
|
||||||
/* Insert some object file options */
|
/* Insert some object file options */
|
||||||
AddTextLine ("\t.fopt\t\tcompiler,\"cc65 v %u.%u.%u\"",
|
AddTextLine ("\t.fopt\t\tcompiler,\"cc65 v %u.%u.%u\"",
|
||||||
VER_MAJOR, VER_MINOR, VER_PATCH);
|
VER_MAJOR, VER_MINOR, VER_PATCH);
|
||||||
|
|
||||||
/* If we're producing code for some other CPU, switch the command set */
|
/* If we're producing code for some other CPU, switch the command set */
|
||||||
if (CPU == CPU_65C02) {
|
if (CPU == CPU_65C02) {
|
||||||
AddTextLine ("\t.pc02");
|
AddTextLine ("\t.pc02");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Allow auto import for runtime library routines */
|
/* Allow auto import for runtime library routines */
|
||||||
|
@ -189,7 +189,7 @@ void g_preamble (void)
|
||||||
|
|
||||||
void g_fileinfo (const char* Name, unsigned long Size, unsigned long MTime)
|
void g_fileinfo (const char* Name, unsigned long Size, unsigned long MTime)
|
||||||
/* If debug info is enabled, place a file info into the source */
|
/* If debug info is enabled, place a file info into the source */
|
||||||
{
|
{
|
||||||
if (DebugInfo) {
|
if (DebugInfo) {
|
||||||
/* We have to place this into the global text segment, so it will
|
/* We have to place this into the global text segment, so it will
|
||||||
* appear before all .dbg line statements.
|
* appear before all .dbg line statements.
|
||||||
|
@ -387,6 +387,14 @@ void g_defimport (const char* Name, int ZP)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void g_importmainargs (void)
|
||||||
|
/* Forced import of a special symbol that handles arguments to main */
|
||||||
|
{
|
||||||
|
AddTextLine ("\t.forceimport\tinitmainargs");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* Load functions for various registers */
|
/* Load functions for various registers */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
|
@ -155,6 +155,9 @@ void g_defexport (const char* Name, int ZP);
|
||||||
void g_defimport (const char* Name, int ZP);
|
void g_defimport (const char* Name, int ZP);
|
||||||
/* Import the given label */
|
/* Import the given label */
|
||||||
|
|
||||||
|
void g_importmainargs (void);
|
||||||
|
/* Forced import of a special symbol that handles arguments to main */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
|
@ -6,9 +6,9 @@
|
||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* (C) 2000-2002 Ullrich von Bassewitz */
|
/* (C) 2000-2003 Ullrich von Bassewitz */
|
||||||
/* Wacholderweg 14 */
|
/* Römerstrasse 52 */
|
||||||
/* D-70597 Stuttgart */
|
/* D-70794 Filderstadt */
|
||||||
/* EMail: uz@cc65.org */
|
/* EMail: uz@cc65.org */
|
||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
|
@ -369,6 +369,22 @@ void NewFunc (SymEntry* Func)
|
||||||
/* Allocate code and data segments for this function */
|
/* Allocate code and data segments for this function */
|
||||||
Func->V.F.Seg = PushSegments (Func);
|
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 this is a fastcall function, push the last parameter onto the stack */
|
||||||
if (IsFastCallFunc (Func->Type) && D->ParamCount > 0) {
|
if (IsFastCallFunc (Func->Type) && D->ParamCount > 0) {
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue