mirror of
https://github.com/cc65/cc65.git
synced 2024-10-15 20:25:22 +00:00
Make the -W flag stackable.
New pragmas codesize, optimize and warn. git-svn-id: svn://svn.cc65.org/cc65/trunk@3130 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
parent
d8279302a9
commit
ca2b070935
@ -6,10 +6,10 @@
|
|||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* (C) 1998-2000 Ullrich von Bassewitz */
|
/* (C) 1998-2004 Ullrich von Bassewitz */
|
||||||
/* Wacholderweg 14 */
|
/* Römerstraße 52 */
|
||||||
/* D-70597 Stuttgart */
|
/* D-70794 Filderstadt */
|
||||||
/* EMail: uz@musoftware.de */
|
/* EMail: uz@cc65.org */
|
||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* This software is provided 'as-is', without any expressed or implied */
|
/* This software is provided 'as-is', without any expressed or implied */
|
||||||
@ -71,7 +71,7 @@ unsigned WarningCount = 0;
|
|||||||
static void IntWarning (const char* Filename, unsigned Line, const char* Msg, va_list ap)
|
static void IntWarning (const char* Filename, unsigned Line, const char* Msg, va_list ap)
|
||||||
/* Print warning message - internal function. */
|
/* Print warning message - internal function. */
|
||||||
{
|
{
|
||||||
if (!NoWarn) {
|
if (!IS_Get (&WarnDisable)) {
|
||||||
fprintf (stderr, "%s(%u): Warning: ", Filename, Line);
|
fprintf (stderr, "%s(%u): Warning: ", Filename, Line);
|
||||||
vfprintf (stderr, Msg, ap);
|
vfprintf (stderr, Msg, ap);
|
||||||
fprintf (stderr, "\n");
|
fprintf (stderr, "\n");
|
||||||
|
@ -47,11 +47,11 @@ unsigned char AddSource = 0; /* Add source lines as comments */
|
|||||||
unsigned char DebugInfo = 0; /* Add debug info to the obj */
|
unsigned char DebugInfo = 0; /* Add debug info to the obj */
|
||||||
unsigned char CreateDep = 0; /* Create a dependency file */
|
unsigned char CreateDep = 0; /* Create a dependency file */
|
||||||
unsigned char ANSI = 0; /* Strict ANSI flag */
|
unsigned char ANSI = 0; /* Strict ANSI flag */
|
||||||
unsigned char NoWarn = 0; /* Suppress warnings */
|
|
||||||
unsigned long OptDisable = 0; /* Optimizer passes to disable */
|
unsigned long OptDisable = 0; /* Optimizer passes to disable */
|
||||||
unsigned RegisterSpace = 6; /* Space available for register vars */
|
unsigned RegisterSpace = 6; /* Space available for register vars */
|
||||||
|
|
||||||
/* Stackable options */
|
/* Stackable options */
|
||||||
|
IntStack WarnDisable = INTSTACK(0); /* Suppress warnings */
|
||||||
IntStack WritableStrings = INTSTACK(0); /* Literal strings are r/w */
|
IntStack WritableStrings = INTSTACK(0); /* Literal strings are r/w */
|
||||||
IntStack InlineStdFuncs = INTSTACK(0); /* Inline some known functions */
|
IntStack InlineStdFuncs = INTSTACK(0); /* Inline some known functions */
|
||||||
IntStack EnableRegVars = INTSTACK(0); /* Enable register variables */
|
IntStack EnableRegVars = INTSTACK(0); /* Enable register variables */
|
||||||
|
@ -53,11 +53,11 @@ extern unsigned char AddSource; /* Add source lines as comments */
|
|||||||
extern unsigned char DebugInfo; /* Add debug info to the obj */
|
extern unsigned char DebugInfo; /* Add debug info to the obj */
|
||||||
extern unsigned char CreateDep; /* Create a dependency file */
|
extern unsigned char CreateDep; /* Create a dependency file */
|
||||||
extern unsigned char ANSI; /* Strict ANSI flag */
|
extern unsigned char ANSI; /* Strict ANSI flag */
|
||||||
extern unsigned char NoWarn; /* Suppress warnings */
|
|
||||||
extern unsigned long OptDisable; /* Optimizer passes to disable */
|
extern unsigned long OptDisable; /* Optimizer passes to disable */
|
||||||
extern unsigned RegisterSpace; /* Space available for register vars */
|
extern unsigned RegisterSpace; /* Space available for register vars */
|
||||||
|
|
||||||
/* Stackable options */
|
/* Stackable options */
|
||||||
|
extern IntStack WarnDisable; /* Suppress warnings */
|
||||||
extern IntStack WritableStrings; /* Literal strings are r/w */
|
extern IntStack WritableStrings; /* Literal strings are r/w */
|
||||||
extern IntStack InlineStdFuncs; /* Inline some known functions */
|
extern IntStack InlineStdFuncs; /* Inline some known functions */
|
||||||
extern IntStack EnableRegVars; /* Enable register variables */
|
extern IntStack EnableRegVars; /* Enable register variables */
|
||||||
|
@ -833,7 +833,7 @@ int main (int argc, char* argv[])
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 'W':
|
case 'W':
|
||||||
NoWarn = 1;
|
IS_Set (&WarnDisable, 1);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -66,12 +66,15 @@ typedef enum {
|
|||||||
PR_CHARMAP,
|
PR_CHARMAP,
|
||||||
PR_CHECKSTACK,
|
PR_CHECKSTACK,
|
||||||
PR_CODESEG,
|
PR_CODESEG,
|
||||||
|
PR_CODESIZE,
|
||||||
PR_DATASEG,
|
PR_DATASEG,
|
||||||
|
PR_OPTIMIZE,
|
||||||
PR_REGVARADDR,
|
PR_REGVARADDR,
|
||||||
PR_REGVARS,
|
PR_REGVARS,
|
||||||
PR_RODATASEG,
|
PR_RODATASEG,
|
||||||
PR_SIGNEDCHARS,
|
PR_SIGNEDCHARS,
|
||||||
PR_STATICLOCALS,
|
PR_STATICLOCALS,
|
||||||
|
PR_WARN,
|
||||||
PR_ZPSYM,
|
PR_ZPSYM,
|
||||||
PR_COUNT
|
PR_COUNT
|
||||||
} pragma_t;
|
} pragma_t;
|
||||||
@ -85,12 +88,15 @@ static const struct Pragma {
|
|||||||
{ "charmap", PR_CHARMAP },
|
{ "charmap", PR_CHARMAP },
|
||||||
{ "checkstack", PR_CHECKSTACK },
|
{ "checkstack", PR_CHECKSTACK },
|
||||||
{ "codeseg", PR_CODESEG },
|
{ "codeseg", PR_CODESEG },
|
||||||
|
{ "codesize", PR_CODESIZE },
|
||||||
{ "dataseg", PR_DATASEG },
|
{ "dataseg", PR_DATASEG },
|
||||||
|
{ "optimize", PR_OPTIMIZE },
|
||||||
{ "regvaraddr", PR_REGVARADDR },
|
{ "regvaraddr", PR_REGVARADDR },
|
||||||
{ "regvars", PR_REGVARS },
|
{ "regvars", PR_REGVARS },
|
||||||
{ "rodataseg", PR_RODATASEG },
|
{ "rodataseg", PR_RODATASEG },
|
||||||
{ "signedchars", PR_SIGNEDCHARS },
|
{ "signedchars", PR_SIGNEDCHARS },
|
||||||
{ "staticlocals", PR_STATICLOCALS },
|
{ "staticlocals", PR_STATICLOCALS },
|
||||||
|
{ "warn", PR_WARN },
|
||||||
{ "zpsym", PR_ZPSYM },
|
{ "zpsym", PR_ZPSYM },
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -322,6 +328,67 @@ static void FlagPragma (StrBuf* B, IntStack* Stack)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static void IntPragma (StrBuf* B, IntStack* Stack, long Low, long High)
|
||||||
|
/* Handle a pragma that expects an int paramater */
|
||||||
|
{
|
||||||
|
ident Ident;
|
||||||
|
long Val;
|
||||||
|
int Push;
|
||||||
|
|
||||||
|
/* Try to read an identifier */
|
||||||
|
int IsIdent = SB_GetSym (B, Ident);
|
||||||
|
|
||||||
|
/* Check if we have a first argument named "pop" */
|
||||||
|
if (IsIdent && strcmp (Ident, "pop") == 0) {
|
||||||
|
if (IS_GetCount (Stack) < 2) {
|
||||||
|
Error ("Cannot pop, stack is empty");
|
||||||
|
} else {
|
||||||
|
IS_Drop (Stack);
|
||||||
|
}
|
||||||
|
/* No other arguments allowed */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check if we have a first argument named "push" */
|
||||||
|
if (IsIdent && strcmp (Ident, "push") == 0) {
|
||||||
|
Push = 1;
|
||||||
|
SB_SkipWhite (B);
|
||||||
|
if (SB_Get (B) != ',') {
|
||||||
|
Error ("Comma expected");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
SB_SkipWhite (B);
|
||||||
|
IsIdent = 0;
|
||||||
|
} else {
|
||||||
|
Push = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Integer argument follows */
|
||||||
|
if (IsIdent || !SB_GetNumber (B, &Val)) {
|
||||||
|
Error ("Pragma argument must be numeric");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check the argument */
|
||||||
|
if (Val < Low || Val > High) {
|
||||||
|
Error ("Pragma argument out of bounds (%ld-%ld)", Low, High);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set/push the new value */
|
||||||
|
if (Push) {
|
||||||
|
if (IS_IsFull (Stack)) {
|
||||||
|
Error ("Cannot push: stack overflow");
|
||||||
|
} else {
|
||||||
|
IS_Push (Stack, Val);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
IS_Set (Stack, Val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void ParsePragma (void)
|
static void ParsePragma (void)
|
||||||
/* Parse the contents of the _Pragma statement */
|
/* Parse the contents of the _Pragma statement */
|
||||||
{
|
{
|
||||||
@ -391,10 +458,18 @@ static void ParsePragma (void)
|
|||||||
SegNamePragma (&B, SEG_CODE);
|
SegNamePragma (&B, SEG_CODE);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case PR_CODESIZE:
|
||||||
|
IntPragma (&B, &CodeSizeFactor, 10, 1000);
|
||||||
|
break;
|
||||||
|
|
||||||
case PR_DATASEG:
|
case PR_DATASEG:
|
||||||
SegNamePragma (&B, SEG_DATA);
|
SegNamePragma (&B, SEG_DATA);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case PR_OPTIMIZE:
|
||||||
|
FlagPragma (&B, &Optimize);
|
||||||
|
break;
|
||||||
|
|
||||||
case PR_REGVARADDR:
|
case PR_REGVARADDR:
|
||||||
FlagPragma (&B, &AllowRegVarAddr);
|
FlagPragma (&B, &AllowRegVarAddr);
|
||||||
break;
|
break;
|
||||||
@ -415,6 +490,10 @@ static void ParsePragma (void)
|
|||||||
FlagPragma (&B, &StaticLocals);
|
FlagPragma (&B, &StaticLocals);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case PR_WARN:
|
||||||
|
FlagPragma (&B, &WarnDisable);
|
||||||
|
break;
|
||||||
|
|
||||||
case PR_ZPSYM:
|
case PR_ZPSYM:
|
||||||
StringPragma (&B, MakeZPSym);
|
StringPragma (&B, MakeZPSym);
|
||||||
break;
|
break;
|
||||||
|
Loading…
Reference in New Issue
Block a user