mirror of
https://github.com/cc65/cc65.git
synced 2025-08-09 13:25:06 +00:00
Merge pull request #2492 from kugelfuhr/kugelfuhr/alternative-pragma-names
Allow alternative names for pragmas that contain underlines instead of dashes
This commit is contained in:
@@ -1273,6 +1273,12 @@ If the first parameter is <tt/push/, the old value is saved onto a stack
|
|||||||
before changing it. The value may later be restored by using the <tt/pop/
|
before changing it. The value may later be restored by using the <tt/pop/
|
||||||
parameter with the <tt/#pragma/.
|
parameter with the <tt/#pragma/.
|
||||||
|
|
||||||
|
For all pragma names that contain hyphens, the same name using underlines
|
||||||
|
instead of the hyphens is available as an alternative. While the former
|
||||||
|
resembles the corresponding command line option and is more orthogonal, the
|
||||||
|
latter may be more compatible with external tools that rewrite the token
|
||||||
|
sequences of the input.
|
||||||
|
|
||||||
|
|
||||||
<sect1><tt>#pragma allow-eager-inline ([push,] on|off)</tt><label id="pragma-allow-eager-inline"><p>
|
<sect1><tt>#pragma allow-eager-inline ([push,] on|off)</tt><label id="pragma-allow-eager-inline"><p>
|
||||||
|
|
||||||
|
@@ -68,70 +68,67 @@ typedef enum {
|
|||||||
PRAGMA_ALIGN,
|
PRAGMA_ALIGN,
|
||||||
PRAGMA_ALLOW_EAGER_INLINE,
|
PRAGMA_ALLOW_EAGER_INLINE,
|
||||||
PRAGMA_BSS_NAME,
|
PRAGMA_BSS_NAME,
|
||||||
PRAGMA_BSSSEG, /* obsolete */
|
|
||||||
PRAGMA_CHARMAP,
|
PRAGMA_CHARMAP,
|
||||||
PRAGMA_CHECK_STACK,
|
PRAGMA_CHECK_STACK,
|
||||||
PRAGMA_CHECKSTACK, /* obsolete */
|
|
||||||
PRAGMA_CODE_NAME,
|
PRAGMA_CODE_NAME,
|
||||||
PRAGMA_CODESEG, /* obsolete */
|
|
||||||
PRAGMA_CODESIZE,
|
PRAGMA_CODESIZE,
|
||||||
PRAGMA_DATA_NAME,
|
PRAGMA_DATA_NAME,
|
||||||
PRAGMA_DATASEG, /* obsolete */
|
|
||||||
PRAGMA_INLINE_STDFUNCS,
|
PRAGMA_INLINE_STDFUNCS,
|
||||||
PRAGMA_LOCAL_STRINGS,
|
PRAGMA_LOCAL_STRINGS,
|
||||||
PRAGMA_MESSAGE,
|
PRAGMA_MESSAGE,
|
||||||
PRAGMA_OPTIMIZE,
|
PRAGMA_OPTIMIZE,
|
||||||
PRAGMA_REGISTER_VARS,
|
PRAGMA_REGISTER_VARS,
|
||||||
PRAGMA_REGVARADDR,
|
PRAGMA_REGVARADDR,
|
||||||
PRAGMA_REGVARS, /* obsolete */
|
|
||||||
PRAGMA_RODATA_NAME,
|
PRAGMA_RODATA_NAME,
|
||||||
PRAGMA_RODATASEG, /* obsolete */
|
|
||||||
PRAGMA_SIGNED_CHARS,
|
PRAGMA_SIGNED_CHARS,
|
||||||
PRAGMA_SIGNEDCHARS, /* obsolete */
|
|
||||||
PRAGMA_STATIC_LOCALS,
|
PRAGMA_STATIC_LOCALS,
|
||||||
PRAGMA_STATICLOCALS, /* obsolete */
|
|
||||||
PRAGMA_WARN,
|
PRAGMA_WARN,
|
||||||
PRAGMA_WRAPPED_CALL,
|
PRAGMA_WRAPPED_CALL,
|
||||||
PRAGMA_WRITABLE_STRINGS,
|
PRAGMA_WRITABLE_STRINGS,
|
||||||
PRAGMA_ZPSYM,
|
PRAGMA_ZPSYM,
|
||||||
PRAGMA_COUNT
|
|
||||||
} pragma_t;
|
} pragma_t;
|
||||||
|
|
||||||
/* Pragma table */
|
/* Pragma table */
|
||||||
static const struct Pragma {
|
static const struct Pragma {
|
||||||
const char* Key; /* Keyword */
|
const char* Key; /* Keyword */
|
||||||
pragma_t Tok; /* Token */
|
pragma_t Tok; /* Token */
|
||||||
} Pragmas[PRAGMA_COUNT] = {
|
} Pragmas[] = {
|
||||||
{ "align", PRAGMA_ALIGN },
|
{ "align", PRAGMA_ALIGN },
|
||||||
{ "allow-eager-inline", PRAGMA_ALLOW_EAGER_INLINE },
|
{ "allow-eager-inline", PRAGMA_ALLOW_EAGER_INLINE },
|
||||||
|
{ "allow_eager_inline", PRAGMA_ALLOW_EAGER_INLINE },
|
||||||
{ "bss-name", PRAGMA_BSS_NAME },
|
{ "bss-name", PRAGMA_BSS_NAME },
|
||||||
{ "bssseg", PRAGMA_BSSSEG }, /* obsolete */
|
{ "bss_name", PRAGMA_BSS_NAME },
|
||||||
{ "charmap", PRAGMA_CHARMAP },
|
{ "charmap", PRAGMA_CHARMAP },
|
||||||
{ "check-stack", PRAGMA_CHECK_STACK },
|
{ "check-stack", PRAGMA_CHECK_STACK },
|
||||||
{ "checkstack", PRAGMA_CHECKSTACK }, /* obsolete */
|
{ "check_stack", PRAGMA_CHECK_STACK },
|
||||||
{ "code-name", PRAGMA_CODE_NAME },
|
{ "code-name", PRAGMA_CODE_NAME },
|
||||||
{ "codeseg", PRAGMA_CODESEG }, /* obsolete */
|
{ "code_name", PRAGMA_CODE_NAME },
|
||||||
{ "codesize", PRAGMA_CODESIZE },
|
{ "codesize", PRAGMA_CODESIZE },
|
||||||
{ "data-name", PRAGMA_DATA_NAME },
|
{ "data-name", PRAGMA_DATA_NAME },
|
||||||
{ "dataseg", PRAGMA_DATASEG }, /* obsolete */
|
{ "data_name", PRAGMA_DATA_NAME },
|
||||||
{ "inline-stdfuncs", PRAGMA_INLINE_STDFUNCS },
|
{ "inline-stdfuncs", PRAGMA_INLINE_STDFUNCS },
|
||||||
|
{ "inline_stdfuncs", PRAGMA_INLINE_STDFUNCS },
|
||||||
{ "local-strings", PRAGMA_LOCAL_STRINGS },
|
{ "local-strings", PRAGMA_LOCAL_STRINGS },
|
||||||
|
{ "local_strings", PRAGMA_LOCAL_STRINGS },
|
||||||
{ "message", PRAGMA_MESSAGE },
|
{ "message", PRAGMA_MESSAGE },
|
||||||
{ "optimize", PRAGMA_OPTIMIZE },
|
{ "optimize", PRAGMA_OPTIMIZE },
|
||||||
{ "register-vars", PRAGMA_REGISTER_VARS },
|
{ "register-vars", PRAGMA_REGISTER_VARS },
|
||||||
|
{ "register_vars", PRAGMA_REGISTER_VARS },
|
||||||
{ "regvaraddr", PRAGMA_REGVARADDR },
|
{ "regvaraddr", PRAGMA_REGVARADDR },
|
||||||
{ "regvars", PRAGMA_REGVARS }, /* obsolete */
|
|
||||||
{ "rodata-name", PRAGMA_RODATA_NAME },
|
{ "rodata-name", PRAGMA_RODATA_NAME },
|
||||||
{ "rodataseg", PRAGMA_RODATASEG }, /* obsolete */
|
{ "rodata_name", PRAGMA_RODATA_NAME },
|
||||||
{ "signed-chars", PRAGMA_SIGNED_CHARS },
|
{ "signed-chars", PRAGMA_SIGNED_CHARS },
|
||||||
{ "signedchars", PRAGMA_SIGNEDCHARS }, /* obsolete */
|
{ "signed_chars", PRAGMA_SIGNED_CHARS },
|
||||||
{ "static-locals", PRAGMA_STATIC_LOCALS },
|
{ "static-locals", PRAGMA_STATIC_LOCALS },
|
||||||
{ "staticlocals", PRAGMA_STATICLOCALS }, /* obsolete */
|
{ "static_locals", PRAGMA_STATIC_LOCALS },
|
||||||
{ "warn", PRAGMA_WARN },
|
{ "warn", PRAGMA_WARN },
|
||||||
{ "wrapped-call", PRAGMA_WRAPPED_CALL },
|
{ "wrapped-call", PRAGMA_WRAPPED_CALL },
|
||||||
|
{ "wrapped_call", PRAGMA_WRAPPED_CALL },
|
||||||
{ "writable-strings", PRAGMA_WRITABLE_STRINGS },
|
{ "writable-strings", PRAGMA_WRITABLE_STRINGS },
|
||||||
|
{ "writable_strings", PRAGMA_WRITABLE_STRINGS },
|
||||||
{ "zpsym", PRAGMA_ZPSYM },
|
{ "zpsym", PRAGMA_ZPSYM },
|
||||||
};
|
};
|
||||||
|
#define PRAGMA_COUNT (sizeof (Pragmas) / sizeof (Pragmas[0]))
|
||||||
|
|
||||||
/* Result of ParsePushPop */
|
/* Result of ParsePushPop */
|
||||||
typedef enum {
|
typedef enum {
|
||||||
@@ -402,22 +399,18 @@ static void ApplySegNamePragma (pragma_t Token, int PushPop, const char* Name, u
|
|||||||
|
|
||||||
switch (Token) {
|
switch (Token) {
|
||||||
case PRAGMA_CODE_NAME:
|
case PRAGMA_CODE_NAME:
|
||||||
case PRAGMA_CODESEG:
|
|
||||||
Seg = SEG_CODE;
|
Seg = SEG_CODE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PRAGMA_RODATA_NAME:
|
case PRAGMA_RODATA_NAME:
|
||||||
case PRAGMA_RODATASEG:
|
|
||||||
Seg = SEG_RODATA;
|
Seg = SEG_RODATA;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PRAGMA_DATA_NAME:
|
case PRAGMA_DATA_NAME:
|
||||||
case PRAGMA_DATASEG:
|
|
||||||
Seg = SEG_DATA;
|
Seg = SEG_DATA;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PRAGMA_BSS_NAME:
|
case PRAGMA_BSS_NAME:
|
||||||
case PRAGMA_BSSSEG:
|
|
||||||
Seg = SEG_BSS;
|
Seg = SEG_BSS;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -933,9 +926,6 @@ static void ParsePragmaString (void)
|
|||||||
FlagPragma (PES_STMT, Pragma, &B, &EagerlyInlineFuncs);
|
FlagPragma (PES_STMT, Pragma, &B, &EagerlyInlineFuncs);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PRAGMA_BSSSEG:
|
|
||||||
Warning ("#pragma bssseg is obsolete, please use #pragma bss-name instead");
|
|
||||||
/* FALLTHROUGH */
|
|
||||||
case PRAGMA_BSS_NAME:
|
case PRAGMA_BSS_NAME:
|
||||||
/* TODO: PES_STMT or even PES_EXPR (PES_DECL) maybe? */
|
/* TODO: PES_STMT or even PES_EXPR (PES_DECL) maybe? */
|
||||||
SegNamePragma (PES_FUNC, PRAGMA_BSS_NAME, &B);
|
SegNamePragma (PES_FUNC, PRAGMA_BSS_NAME, &B);
|
||||||
@@ -945,17 +935,11 @@ static void ParsePragmaString (void)
|
|||||||
CharMapPragma (PES_IMM, &B);
|
CharMapPragma (PES_IMM, &B);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PRAGMA_CHECKSTACK:
|
|
||||||
Warning ("#pragma checkstack is obsolete, please use #pragma check-stack instead");
|
|
||||||
/* FALLTHROUGH */
|
|
||||||
case PRAGMA_CHECK_STACK:
|
case PRAGMA_CHECK_STACK:
|
||||||
/* TODO: PES_SCOPE maybe? */
|
/* TODO: PES_SCOPE maybe? */
|
||||||
FlagPragma (PES_FUNC, Pragma, &B, &CheckStack);
|
FlagPragma (PES_FUNC, Pragma, &B, &CheckStack);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PRAGMA_CODESEG:
|
|
||||||
Warning ("#pragma codeseg is obsolete, please use #pragma code-name instead");
|
|
||||||
/* FALLTHROUGH */
|
|
||||||
case PRAGMA_CODE_NAME:
|
case PRAGMA_CODE_NAME:
|
||||||
/* PES_FUNC is the only sensible option so far */
|
/* PES_FUNC is the only sensible option so far */
|
||||||
SegNamePragma (PES_FUNC, PRAGMA_CODE_NAME, &B);
|
SegNamePragma (PES_FUNC, PRAGMA_CODE_NAME, &B);
|
||||||
@@ -966,9 +950,6 @@ static void ParsePragmaString (void)
|
|||||||
IntPragma (PES_STMT, Pragma, &B, &CodeSizeFactor, 10, 1000);
|
IntPragma (PES_STMT, Pragma, &B, &CodeSizeFactor, 10, 1000);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PRAGMA_DATASEG:
|
|
||||||
Warning ("#pragma dataseg is obsolete, please use #pragma data-name instead");
|
|
||||||
/* FALLTHROUGH */
|
|
||||||
case PRAGMA_DATA_NAME:
|
case PRAGMA_DATA_NAME:
|
||||||
/* TODO: PES_STMT or even PES_EXPR (PES_DECL) maybe? */
|
/* TODO: PES_STMT or even PES_EXPR (PES_DECL) maybe? */
|
||||||
SegNamePragma (PES_FUNC, PRAGMA_DATA_NAME, &B);
|
SegNamePragma (PES_FUNC, PRAGMA_DATA_NAME, &B);
|
||||||
@@ -999,33 +980,21 @@ static void ParsePragmaString (void)
|
|||||||
FlagPragma (PES_FUNC, Pragma, &B, &AllowRegVarAddr);
|
FlagPragma (PES_FUNC, Pragma, &B, &AllowRegVarAddr);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PRAGMA_REGVARS:
|
|
||||||
Warning ("#pragma regvars is obsolete, please use #pragma register-vars instead");
|
|
||||||
/* FALLTHROUGH */
|
|
||||||
case PRAGMA_REGISTER_VARS:
|
case PRAGMA_REGISTER_VARS:
|
||||||
/* TODO: PES_STMT or even PES_EXPR (PES_DECL) maybe? */
|
/* TODO: PES_STMT or even PES_EXPR (PES_DECL) maybe? */
|
||||||
FlagPragma (PES_FUNC, Pragma, &B, &EnableRegVars);
|
FlagPragma (PES_FUNC, Pragma, &B, &EnableRegVars);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PRAGMA_RODATASEG:
|
|
||||||
Warning ("#pragma rodataseg is obsolete, please use #pragma rodata-name instead");
|
|
||||||
/* FALLTHROUGH */
|
|
||||||
case PRAGMA_RODATA_NAME:
|
case PRAGMA_RODATA_NAME:
|
||||||
/* TODO: PES_STMT or even PES_EXPR maybe? */
|
/* TODO: PES_STMT or even PES_EXPR maybe? */
|
||||||
SegNamePragma (PES_FUNC, PRAGMA_RODATA_NAME, &B);
|
SegNamePragma (PES_FUNC, PRAGMA_RODATA_NAME, &B);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PRAGMA_SIGNEDCHARS:
|
|
||||||
Warning ("#pragma signedchars is obsolete, please use #pragma signed-chars instead");
|
|
||||||
/* FALLTHROUGH */
|
|
||||||
case PRAGMA_SIGNED_CHARS:
|
case PRAGMA_SIGNED_CHARS:
|
||||||
/* TODO: PES_STMT or even PES_EXPR maybe? */
|
/* TODO: PES_STMT or even PES_EXPR maybe? */
|
||||||
FlagPragma (PES_FUNC, Pragma, &B, &SignedChars);
|
FlagPragma (PES_FUNC, Pragma, &B, &SignedChars);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PRAGMA_STATICLOCALS:
|
|
||||||
Warning ("#pragma staticlocals is obsolete, please use #pragma static-locals instead");
|
|
||||||
/* FALLTHROUGH */
|
|
||||||
case PRAGMA_STATIC_LOCALS:
|
case PRAGMA_STATIC_LOCALS:
|
||||||
/* TODO: PES_STMT or even PES_EXPR (PES_DECL) maybe? */
|
/* TODO: PES_STMT or even PES_EXPR (PES_DECL) maybe? */
|
||||||
FlagPragma (PES_FUNC, Pragma, &B, &StaticLocals);
|
FlagPragma (PES_FUNC, Pragma, &B, &StaticLocals);
|
||||||
|
44
test/val/pragmas.c
Normal file
44
test/val/pragmas.c
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
/* Note: This tests just if the #pragmas are understood. It doesn't test if
|
||||||
|
** they do really work. This would require much more work.
|
||||||
|
*/
|
||||||
|
|
||||||
|
void func(void);
|
||||||
|
#pragma align(push, 1024)
|
||||||
|
#pragma allow-eager-inline(push, on)
|
||||||
|
#pragma allow_eager_inline(pop)
|
||||||
|
#pragma bss-name(push, "BSS")
|
||||||
|
#pragma bss_name(pop)
|
||||||
|
#pragma charmap(1, 1)
|
||||||
|
#pragma check-stack(on)
|
||||||
|
#pragma check_stack(off)
|
||||||
|
#pragma code-name(push, "CODE")
|
||||||
|
#pragma code_name("CODE")
|
||||||
|
#pragma codesize(200)
|
||||||
|
#pragma data-name("DATA")
|
||||||
|
#pragma data_name("DATA")
|
||||||
|
#pragma inline-stdfuncs(off)
|
||||||
|
#pragma inline_stdfuncs(on)
|
||||||
|
#pragma local-strings(off)
|
||||||
|
#pragma local_strings(off)
|
||||||
|
#pragma message("in a bottle")
|
||||||
|
#pragma optimize(off)
|
||||||
|
#pragma register-vars(off)
|
||||||
|
#pragma register_vars(on)
|
||||||
|
#pragma regvaraddr(on)
|
||||||
|
#pragma rodata-name("RODATA")
|
||||||
|
#pragma rodata_name("RODATA")
|
||||||
|
#pragma signed-chars(off)
|
||||||
|
#pragma signed_chars(on)
|
||||||
|
#pragma static-locals(off)
|
||||||
|
#pragma static_locals(on)
|
||||||
|
#pragma warn(unused-param, on)
|
||||||
|
#pragma wrapped-call(push, func, 0) // push is required for this #pragma
|
||||||
|
#pragma wrapped_call(push, func, 1)
|
||||||
|
#pragma writable-strings(on)
|
||||||
|
#pragma writable_strings(off)
|
||||||
|
#pragma zpsym("func")
|
||||||
|
|
||||||
|
int main ()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
Reference in New Issue
Block a user