X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gas%2Fapp.c;h=00c31bbf3906fe5ca85a191b9350cedf8a9072d9;hb=58920b5be048726fca38e4e6ddcaa02ae6d9c1b8;hp=1a7ce95289bb75def8cfac775b70d7bf53a6b53d;hpb=cf3f45fad7811e89d6b586a1a429a314e3db9f53;p=deliverable%2Fbinutils-gdb.git diff --git a/gas/app.c b/gas/app.c index 1a7ce95289..00c31bbf39 100644 --- a/gas/app.c +++ b/gas/app.c @@ -1,7 +1,5 @@ /* This is the Assembler Pre-Processor - Copyright 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, - 1999, 2000, 2001, 2002, 2003, 2005, 2006, 2007, 2008, 2009, 2010, 2012 - Free Software Foundation, Inc. + Copyright (C) 1987-2020 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. @@ -57,6 +55,9 @@ static const char mri_pseudo[] = ".mri 0"; static const char symver_pseudo[] = ".symver"; static const char * symver_state; #endif +#ifdef TC_ARM +static char last_char; +#endif static char lex[256]; static const char symbol_chars[] = @@ -119,8 +120,7 @@ do_scrub_begin (int m68k_mri ATTRIBUTE_UNUSED) { lex['"'] = LEX_IS_STRINGQUOTE; -#if ! defined (TC_HPPA) && ! defined (TC_I370) - /* I370 uses single-quotes to delimit integer, float constants. */ +#if ! defined (TC_HPPA) lex['\''] = LEX_IS_ONECHAR_QUOTE; #endif @@ -160,7 +160,10 @@ do_scrub_begin (int m68k_mri ATTRIBUTE_UNUSED) for (p = line_comment_chars; *p; p++) lex[(unsigned char) *p] = LEX_IS_LINE_COMMENT_START; - for (p = line_separator_chars; *p; p++) +#ifndef tc_line_separator_chars +#define tc_line_separator_chars line_separator_chars +#endif + for (p = tc_line_separator_chars; *p; p++) lex[(unsigned char) *p] = LEX_IS_LINE_SEPARATOR; #ifdef tc_parallel_separator_chars @@ -210,7 +213,7 @@ do_scrub_begin (int m68k_mri ATTRIBUTE_UNUSED) /* Saved state of the scrubber. */ static int state; static int old_state; -static char *out_string; +static const char *out_string; static char out_buf[20]; static int add_newlines; static char *saved_input; @@ -228,7 +231,7 @@ struct app_save { int state; int old_state; - char * out_string; + const char * out_string; char out_buf[sizeof (out_buf)]; int add_newlines; char * saved_input; @@ -241,14 +244,17 @@ struct app_save #if defined TC_ARM && defined OBJ_ELF const char * symver_state; #endif +#ifdef TC_ARM + char last_char; +#endif }; char * app_push (void) { - register struct app_save *saved; + struct app_save *saved; - saved = (struct app_save *) xmalloc (sizeof (*saved)); + saved = XNEW (struct app_save); saved->state = state; saved->old_state = old_state; saved->out_string = out_string; @@ -258,7 +264,7 @@ app_push (void) saved->saved_input = NULL; else { - saved->saved_input = (char *) xmalloc (saved_input_len); + saved->saved_input = XNEWVEC (char, saved_input_len); memcpy (saved->saved_input, saved_input, saved_input_len); saved->saved_input_len = saved_input_len; } @@ -270,6 +276,9 @@ app_push (void) #if defined TC_ARM && defined OBJ_ELF saved->symver_state = symver_state; #endif +#ifdef TC_ARM + saved->last_char = last_char; +#endif /* do_scrub_begin() is not useful, just wastes time. */ @@ -283,7 +292,7 @@ app_push (void) void app_pop (char *arg) { - register struct app_save *saved = (struct app_save *) arg; + struct app_save *saved = (struct app_save *) arg; /* There is no do_scrub_end (). */ state = saved->state; @@ -309,6 +318,9 @@ app_pop (char *arg) #if defined TC_ARM && defined OBJ_ELF symver_state = saved->symver_state; #endif +#ifdef TC_ARM + last_char = saved->last_char; +#endif free (arg); } @@ -359,7 +371,7 @@ do_scrub_chars (size_t (*get) (char *, size_t), char *tostart, size_t tolen) char *from; char *fromend; size_t fromlen; - register int ch, ch2 = 0; + int ch, ch2 = 0; /* Character that started the string we're working on. */ static char quotechar; @@ -590,13 +602,11 @@ do_scrub_chars (size_t (*get) (char *, size_t), char *tostart, size_t tolen) state = old_state; PUT (ch); } -#ifndef NO_STRING_ESCAPES - else if (ch == '\\') + else if (TC_STRING_ESCAPES && ch == '\\') { state = 6; PUT (ch); } -#endif else if (scrub_m68k_mri && ch == '\n') { /* Just quietly terminate the string. This permits lines like @@ -694,6 +704,7 @@ do_scrub_chars (size_t (*get) (char *, size_t), char *tostart, size_t tolen) state = 9; break; } + /* Fall through. */ case 17: /* We have seen "af" at the start of a symbol, a ' here is a part of that symbol. */ @@ -1039,7 +1050,6 @@ do_scrub_chars (size_t (*get) (char *, size_t), char *tostart, size_t tolen) PUT (ch); break; -#ifndef IEEE_STYLE case LEX_IS_ONECHAR_QUOTE: #ifdef H_TICK_HEX if (state == 9 && enable_h_tick_hex) @@ -1101,7 +1111,6 @@ do_scrub_chars (size_t (*get) (char *, size_t), char *tostart, size_t tolen) out_string = out_buf; PUT (*out_string++); break; -#endif case LEX_IS_COLON: #ifdef KEEP_WHITE_AROUND_COLON @@ -1186,7 +1195,7 @@ do_scrub_chars (size_t (*get) (char *, size_t), char *tostart, size_t tolen) state = -2; break; } - else + else if (ch2 != EOF) { UNGET (ch2); } @@ -1283,14 +1292,14 @@ do_scrub_chars (size_t (*get) (char *, size_t), char *tostart, size_t tolen) #ifdef TC_ARM /* For the ARM, care is needed not to damage occurrences of \@ by stripping the @ onwards. Yuck. */ - if (to > tostart && *(to - 1) == '\\') + if ((to > tostart ? to[-1] : last_char) == '\\') /* Do not treat the @ as a start-of-comment. */ goto de_fault; #endif #ifdef WARN_COMMENTS if (!found_comment) - as_where (&found_comment_file, &found_comment); + found_comment_file = as_where (&found_comment); #endif do { @@ -1320,8 +1329,8 @@ do_scrub_chars (size_t (*get) (char *, size_t), char *tostart, size_t tolen) else UNGET (quot); } - /* FALL THROUGH */ #endif + /* Fall through. */ case LEX_IS_SYMBOL_COMPONENT: if (state == 10) @@ -1463,6 +1472,10 @@ do_scrub_chars (size_t (*get) (char *, size_t), char *tostart, size_t tolen) fromeof: /* We have reached the end of the input. */ +#ifdef TC_ARM + if (to > tostart) + last_char = to[-1]; +#endif return to - tostart; tofull: @@ -1476,5 +1489,9 @@ do_scrub_chars (size_t (*get) (char *, size_t), char *tostart, size_t tolen) else saved_input = NULL; +#ifdef TC_ARM + if (to > tostart) + last_char = to[-1]; +#endif return to - tostart; }