aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/c-lex.c55
-rw-r--r--gcc/c-pragma.c39
2 files changed, 50 insertions, 44 deletions
diff --git a/gcc/c-lex.c b/gcc/c-lex.c
index 75a7f4d..8d91eb1 100644
--- a/gcc/c-lex.c
+++ b/gcc/c-lex.c
@@ -482,13 +482,7 @@ check_newline ()
&& ((c = getc (finput)) == ' ' || c == '\t' || c == '\n'))
{
#ifdef HANDLE_SYSV_PRAGMA
- c = handle_sysv_pragma (finput, c);
- if (c >= 0)
- ;
- else if (nextchar >= 0)
- c = nextchar, nextchar = -1;
- else
- c = getc (finput);
+ return handle_sysv_pragma (finput, c);
#endif /* HANDLE_SYSV_PRAGMA */
#ifdef HANDLE_PRAGMA
HANDLE_PRAGMA (finput);
@@ -741,9 +735,8 @@ linenum:
#ifdef HANDLE_SYSV_PRAGMA
/* Handle a #pragma directive. INPUT is the current input stream,
- and C is a character to reread.
- Returns a character for the caller to reread,
- or -1 meaning there isn't one. */
+ and C is a character to reread. Processes the entire input line
+ and returns a character for the caller to reread: either \n or EOF. */
/* This function has to be in this file, in order to get at
the token types. */
@@ -753,26 +746,32 @@ handle_sysv_pragma (input, c)
FILE *input;
int c;
{
- while (c == ' ' || c == '\t')
- c = getc (input);
- if (c == '\n' || c == EOF)
- {
- handle_pragma_token (0, 0);
- return c;
- }
- ungetc (c, input);
- switch (yylex ())
+ for (;;)
{
- case IDENTIFIER:
- case TYPENAME:
- case STRING:
- case CONSTANT:
- handle_pragma_token (token_buffer, yylval.ttype);
- break;
- default:
- handle_pragma_token (token_buffer, 0);
+ while (c == ' ' || c == '\t')
+ c = getc (input);
+ if (c == '\n' || c == EOF)
+ {
+ handle_pragma_token (0, 0);
+ return c;
+ }
+ ungetc (c, input);
+ switch (yylex ())
+ {
+ case IDENTIFIER:
+ case TYPENAME:
+ case STRING:
+ case CONSTANT:
+ handle_pragma_token (token_buffer, yylval.ttype);
+ break;
+ default:
+ handle_pragma_token (token_buffer, 0);
+ }
+ if (nextchar >= 0)
+ c = nextchar, nextchar = -1;
+ else
+ c = getc (input);
}
- return -1;
}
#endif /* HANDLE_SYSV_PRAGMA */
diff --git a/gcc/c-pragma.c b/gcc/c-pragma.c
index e8324ca..934318e 100644
--- a/gcc/c-pragma.c
+++ b/gcc/c-pragma.c
@@ -23,12 +23,20 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#ifdef HANDLE_SYSV_PRAGMA
+/* Support #pragma weak by default if WEAK_ASM_OP is defined. */
+#if !defined (HANDLE_PRAGMA_WEAK) && defined (WEAK_ASM_OP)
+#define HANDLE_PRAGMA_WEAK 1
+#endif
+
/* When structure field packing is in effect, this variable is the
number of bits to use as the maximum alignment. When packing is not
in effect, this is zero. */
extern int maximum_field_alignment;
+/* File used for outputting assembler code. */
+extern FILE *asm_out_file;
+
/* Handle one token of a pragma directive. TOKEN is the
current token, and STRING is its printable form. */
@@ -64,27 +72,30 @@ handle_pragma_token (string, token)
else
warning ("malformed `#pragma pack'");
}
-#ifdef WEAK_ASM_OP
else if (type == ps_weak)
{
- if (state == ps_name || state == ps_value)
+#ifdef HANDLE_PRAGMA_WEAK
+ if (HANDLE_PRAGMA_WEAK)
{
- fprintf (asm_out_file, "\t%s\t", WEAK_ASM_OP);
- ASM_OUTPUT_LABELREF (asm_out_file, name);
- fputc ('\n', asm_out_file);
- if (state == ps_value)
+ if (state == ps_name || state == ps_value)
{
- fprintf (asm_out_file, "\t%s\t", SET_ASM_OP);
+ fprintf (asm_out_file, "\t%s\t", WEAK_ASM_OP);
ASM_OUTPUT_LABELREF (asm_out_file, name);
- fputc (',', asm_out_file);
- ASM_OUTPUT_LABELREF (asm_out_file, value);
fputc ('\n', asm_out_file);
+ if (state == ps_value)
+ {
+ fprintf (asm_out_file, "\t%s\t", SET_ASM_OP);
+ ASM_OUTPUT_LABELREF (asm_out_file, name);
+ fputc (',', asm_out_file);
+ ASM_OUTPUT_LABELREF (asm_out_file, value);
+ fputc ('\n', asm_out_file);
+ }
}
+ else if (! (state == ps_done || state == ps_start))
+ warning ("malformed `#pragma weak'");
}
- else if (! (state == ps_done || state == ps_start))
- warning ("malformed `#pragma weak'");
+#endif /* HANDLE_PRAMA_WEAK */
}
-#endif /* WEAK_ASM_OP */
type = state = ps_start;
return;
@@ -97,10 +108,8 @@ handle_pragma_token (string, token)
{
if (strcmp (IDENTIFIER_POINTER (token), "pack") == 0)
type = state = ps_pack;
-#ifdef WEAK_ASM_OP
else if (strcmp (IDENTIFIER_POINTER (token), "weak") == 0)
type = state = ps_weak;
-#endif
else
type = state = ps_done;
}
@@ -108,7 +117,6 @@ handle_pragma_token (string, token)
type = state = ps_done;
break;
-#ifdef WEAK_ASM_OP
case ps_weak:
if (token && TREE_CODE (token) == IDENTIFIER_NODE)
{
@@ -136,7 +144,6 @@ handle_pragma_token (string, token)
case ps_value:
state = ps_bad;
break;
-#endif /* WEAK_ASM_OP */
case ps_pack:
if (strcmp (string, "(") == 0)