X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gas%2Fapp.c;h=b40411537088c538c5e82d3a3f52c8bb2b0efedd;hb=b2e818b70d26c7336ef4798b7beb97916ef044ac;hp=57bc8083ee9162a7f604317569b1c7f357fac27d;hpb=204cd129d1c24b926d8194422b8621ca48134b46;p=deliverable%2Fbinutils-gdb.git diff --git a/gas/app.c b/gas/app.c index 57bc8083ee..b404115370 100644 --- a/gas/app.c +++ b/gas/app.c @@ -1,6 +1,6 @@ /* This is the Assembler Pre-Processor Copyright 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, - 1999, 2000, 2002, 2003 + 1999, 2000, 2001, 2002, 2003, 2006 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. @@ -17,8 +17,8 @@ You should have received a copy of the GNU General Public License along with GAS; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ + Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA + 02110-1301, USA. */ /* Modified by Allen Wirfs-Brock, Instantiations Inc 2/90. */ /* App, the assembler pre-processor. This pre-processor strips out excess @@ -26,8 +26,7 @@ # into a .line \n.file pair. This needs better error-handling. */ -#include -#include "as.h" /* For BAD_CASE() only */ +#include "as.h" #if (__STDC__ != 1) #ifndef const @@ -87,15 +86,14 @@ static const char symbol_chars[] = #define IS_LINE_COMMENT(c) (lex[c] == LEX_IS_LINE_COMMENT_START) #define IS_NEWLINE(c) (lex[c] == LEX_IS_NEWLINE) -static int process_escape PARAMS ((int)); +static int process_escape (int); /* FIXME-soon: The entire lexer/parser thingy should be built statically at compile time rather than dynamically each and every time the assembler is run. xoxorich. */ void -do_scrub_begin (m68k_mri) - int m68k_mri ATTRIBUTE_UNUSED; +do_scrub_begin (int m68k_mri ATTRIBUTE_UNUSED) { const char *p; int c; @@ -231,7 +229,7 @@ struct app_save }; char * -app_push () +app_push (void) { register struct app_save *saved; @@ -267,8 +265,7 @@ app_push () } void -app_pop (arg) - char *arg; +app_pop (char *arg) { register struct app_save *saved = (struct app_save *) arg; @@ -304,8 +301,7 @@ app_pop (arg) necessarily true. */ static int -process_escape (ch) - int ch; +process_escape (int ch) { switch (ch) { @@ -340,10 +336,7 @@ process_escape (ch) This is the way the old code used to work. */ int -do_scrub_chars (get, tostart, tolen) - int (*get) PARAMS ((char *, int)); - char *tostart; - int tolen; +do_scrub_chars (int (*get) (char *, int), char *tostart, int tolen) { char *to = tostart; char *toend = tostart + tolen; @@ -351,6 +344,8 @@ do_scrub_chars (get, tostart, tolen) char *fromend; int fromlen; register int ch, ch2 = 0; + /* Character that started the string we're working on. */ + static char quotechar; /*State 0: beginning of normal line 1: After first whitespace on line (flush more white) @@ -373,6 +368,16 @@ do_scrub_chars (get, tostart, tolen) #ifdef DOUBLEBAR_PARALLEL 13: After seeing a vertical bar, looking for a second vertical bar as a parallel expression separator. +#endif +#ifdef TC_IA64 + 14: After seeing a `(' at state 0, looking for a `)' as + predicate. + 15: After seeing a `(' at state 1, looking for a `)' as + predicate. +#endif +#ifdef TC_Z80 + 16: After seeing an 'a' or an 'A' at the start of a symbol + 17: After seeing an 'f' or an 'F' in state 16 #endif */ @@ -536,11 +541,8 @@ do_scrub_chars (get, tostart, tolen) for (s = from; s < fromend; s++) { ch = *s; - /* This condition must be changed if the type of any - other character can be LEX_IS_STRINGQUOTE. */ if (ch == '\\' - || ch == '"' - || ch == '\'' + || ch == quotechar || ch == '\n') break; } @@ -558,12 +560,12 @@ do_scrub_chars (get, tostart, tolen) ch = GET (); if (ch == EOF) { - as_warn (_("end of file in string; inserted '\"'")); + as_warn (_("end of file in string; '%c' inserted"), quotechar); state = old_state; UNGET ('\n'); - PUT ('"'); + PUT (quotechar); } - else if (lex[ch] == LEX_IS_STRINGQUOTE) + else if (ch == quotechar) { state = old_state; PUT (ch); @@ -603,8 +605,8 @@ do_scrub_chars (get, tostart, tolen) continue; case EOF: - as_warn (_("end of file in string; '\"' inserted")); - PUT ('"'); + as_warn (_("end of file in string; '%c' inserted"), quotechar); + PUT (quotechar); continue; case '"': @@ -638,10 +640,9 @@ do_scrub_chars (get, tostart, tolen) case 7: ch = GET (); + quotechar = ch; state = 5; old_state = 8; - if (ch == EOF) - goto fromeof; PUT (ch); continue; @@ -666,6 +667,32 @@ do_scrub_chars (get, tostart, tolen) state = 1; PUT ('|'); continue; +#endif +#ifdef TC_Z80 + case 16: + /* We have seen an 'a' at the start of a symbol, look for an 'f'. */ + ch = GET (); + if (ch == 'f' || ch == 'F') + { + state = 17; + PUT (ch); + } + else + { + state = 9; + break; + } + case 17: + /* We have seen "af" at the start of a symbol, + a ' here is a part of that symbol. */ + ch = GET (); + state = 9; + if (ch == '\'') + /* Change to avoid warning about unclosed string. */ + PUT ('`'); + else + UNGET (ch); + break; #endif } @@ -674,6 +701,29 @@ do_scrub_chars (get, tostart, tolen) /* flushchar: */ ch = GET (); +#ifdef TC_IA64 + if (ch == '(' && (state == 0 || state == 1)) + { + state += 14; + PUT (ch); + continue; + } + else if (state == 14 || state == 15) + { + if (ch == ')') + { + state -= 14; + PUT (ch); + ch = GET (); + } + else + { + PUT (ch); + continue; + } + } +#endif + recycle: #if defined TC_ARM && defined OBJ_ELF @@ -837,9 +887,6 @@ do_scrub_chars (get, tostart, tolen) switch (state) { - case 0: - state++; - goto recycle; /* Punted leading sp */ case 1: /* We can arrive here if we leave a leading whitespace character at the beginning of a line. */ @@ -952,6 +999,7 @@ do_scrub_chars (get, tostart, tolen) break; case LEX_IS_STRINGQUOTE: + quotechar = ch; if (state == 10) { /* Preserve the whitespace in foo "bar". */ @@ -1220,6 +1268,30 @@ do_scrub_chars (get, tostart, tolen) break; } +#ifdef TC_Z80 + /* "af'" is a symbol containing '\''. */ + if (state == 3 && (ch == 'a' || ch == 'A')) + { + state = 16; + PUT (ch); + ch = GET (); + if (ch == 'f' || ch == 'F') + { + state = 17; + PUT (ch); + break; + } + else + { + state = 9; + if (!IS_SYMBOL_COMPONENT (ch)) + { + UNGET (ch); + break; + } + } + } +#endif if (state == 3) state = 9; @@ -1259,26 +1331,11 @@ do_scrub_chars (get, tostart, tolen) if (len > 0) { PUT (ch); - if (len > 8) - { - memcpy (to, from, len); - to += len; - from += len; - } - else - { - switch (len) - { - case 8: *to++ = *from++; - case 7: *to++ = *from++; - case 6: *to++ = *from++; - case 5: *to++ = *from++; - case 4: *to++ = *from++; - case 3: *to++ = *from++; - case 2: *to++ = *from++; - case 1: *to++ = *from++; - } - } + memcpy (to, from, len); + to += len; + from += len; + if (to >= toend) + goto tofull; ch = GET (); } } @@ -1289,13 +1346,11 @@ do_scrub_chars (get, tostart, tolen) /* Some relatively `normal' character. */ if (state == 0) { - if (IS_SYMBOL_COMPONENT (ch)) - state = 11; /* Now seeing label definition. */ + state = 11; /* Now seeing label definition. */ } else if (state == 1) { - if (IS_SYMBOL_COMPONENT (ch)) - state = 2; /* Ditto. */ + state = 2; /* Ditto. */ } else if (state == 9) {