diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 41900540374..7a1772bb87e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,9 +1,25 @@ -2001-03-04 Laurynas Biveinis - - * gcc.c (convert_filename): Append executable suffix - if NO_AUTO_EXE_SUFFIX is not defined. - * gcc.texi: Document NO_AUTO_EXE_SUFFIX. - * config/i386/djgpp.h: Define NO_AUTO_EXE_SUFFIX. +2001-03-04 Neil Booth + + * cppfiles.c (_cpp_execute_include): Don't make a null-terminated + copy of the filename. Don't use CPP_PREV_BUFFER. Don't call + strlen or strcpy; we already know the length. + (_cpp_compare_file_date): Similarly. + * cpphash.h (struct cpp_reader): Delete done_initialising. + (CPP_PREV_BUFFER): Delete. + * cppinit.c (cpp_start_read): Don't set done_initialising. + * cpplex.c (parse_string): Guarantee null-termination. + (_cpp_equiv_toklists): Remove. + * cpplib.c (glue_header_name): Null-terminate. + (do_line): Don't leak memory. + * cpplib.h (BT_WEAK): Delete. + * cppmain.c (cb_ident): Strings are now null-terminated. + +2001-03-04 Laurynas Biveinis + + * gcc.c (convert_filename): Append executable suffix + if NO_AUTO_EXE_SUFFIX is not defined. + * gcc.texi: Document NO_AUTO_EXE_SUFFIX. + * config/i386/djgpp.h: Define NO_AUTO_EXE_SUFFIX. 2001-03-03 David O'Brien diff --git a/gcc/cppfiles.c b/gcc/cppfiles.c index 72af4333531..0dfd9d0db66 100644 --- a/gcc/cppfiles.c +++ b/gcc/cppfiles.c @@ -585,10 +585,9 @@ _cpp_execute_include (pfile, header, no_reinclude, include_next) int include_next; { struct search_path *search_start = 0; - unsigned int len = header->val.str.len; unsigned int angle_brackets = header->type == CPP_HEADER_NAME; + const char *fname = (const char *) header->val.str.text; struct include_file *inc; - char *fname; int print_dep; /* Help protect #include or similar from recursion. */ @@ -626,10 +625,6 @@ _cpp_execute_include (pfile, header, no_reinclude, include_next) } } - fname = alloca (len + 1); - memcpy (fname, header->val.str.text, len); - fname[len] = '\0'; - if (!search_start) { if (angle_brackets) @@ -660,8 +655,8 @@ _cpp_execute_include (pfile, header, no_reinclude, include_next) /* Handle -H option. */ if (CPP_OPTION (pfile, print_include_names)) { - cpp_buffer *fp = CPP_BUFFER (pfile); - while ((fp = CPP_PREV_BUFFER (fp)) != NULL) + cpp_buffer *fp = pfile->buffer; + while ((fp = fp->prev) != NULL) putc ('.', stderr); fprintf (stderr, " %s\n", inc->name); } @@ -692,13 +687,13 @@ _cpp_execute_include (pfile, header, no_reinclude, include_next) /* FIXME: ptr can be null, no? */ len = ptr->len; - p = (char *) alloca (len + strlen (fname) + 2); + p = (char *) alloca (len + header->val.str.len + 2); if (len) { memcpy (p, ptr->name, len); p[len++] = '/'; } - strcpy (p + len, fname); + memcpy (p + len, fname, header->val.str.len + 1); _cpp_simplify_pathname (p); deps_add_dep (pfile->deps, p); } @@ -722,8 +717,7 @@ _cpp_compare_file_date (pfile, f) cpp_reader *pfile; const cpp_token *f; { - unsigned int len = f->val.str.len; - char *fname; + const char *fname = (const char *) f->val.str.text; struct search_path *search_start; struct include_file *inc; @@ -732,9 +726,6 @@ _cpp_compare_file_date (pfile, f) else if (CPP_OPTION (pfile, ignore_srcdir)) search_start = pfile->buffer->search_from; - fname = alloca (len + 1); - memcpy (fname, f->val.str.text, len); - fname[len] = '\0'; inc = find_include_file (pfile, fname, search_start); if (!inc) diff --git a/gcc/cpphash.h b/gcc/cpphash.h index 5b2c24bd0ae..df27e7325b9 100644 --- a/gcc/cpphash.h +++ b/gcc/cpphash.h @@ -339,10 +339,6 @@ struct cpp_reader /* We're printed a warning recommending against using #import. */ unsigned char import_warning; - /* True after cpp_start_read completes. Used to inhibit some - warnings while parsing the command line. */ - unsigned char done_initializing; - /* True if we are skipping a failed conditional group. */ unsigned char skipping; @@ -380,7 +376,6 @@ extern unsigned char _cpp_trigraph_map[UCHAR_MAX + 1]; /* Macros. */ -#define CPP_PREV_BUFFER(BUFFER) ((BUFFER)->prev) #define CPP_PRINT_DEPS(PFILE) CPP_OPTION (PFILE, print_deps) #define CPP_IN_SYSTEM_HEADER(PFILE) \ (CPP_BUFFER (PFILE) && CPP_BUFFER (PFILE)->sysp) diff --git a/gcc/cppinit.c b/gcc/cppinit.c index 61f72b4544e..457d2662771 100644 --- a/gcc/cppinit.c +++ b/gcc/cppinit.c @@ -948,8 +948,6 @@ cpp_start_read (pfile, fname) p = q; } - pfile->done_initializing = 1; - /* The -imacros files can be scanned now, but the -include files have to be pushed onto the buffer stack and processed later, otherwise cppmain.c won't see the tokens. include_head was built diff --git a/gcc/cpplex.c b/gcc/cpplex.c index bd963038613..37a0c61e3a3 100644 --- a/gcc/cpplex.c +++ b/gcc/cpplex.c @@ -629,10 +629,11 @@ unescaped_terminator_p (pfile, dest) } /* Parses a string, character constant, or angle-bracketed header file - name. Handles embedded trigraphs and escaped newlines. + name. Handles embedded trigraphs and escaped newlines. The stored + string is guaranteed NUL-terminated, but it is not guaranteed that + this is the first NUL since embedded NULs are preserved. - Multi-line strings are allowed, but they are deprecated within - directives. */ + Multi-line strings are allowed, but they are deprecated. */ static void parse_string (pfile, token, terminator) cpp_reader *pfile; @@ -651,14 +652,21 @@ parse_string (pfile, token, terminator) for (;;) { if (buffer->cur == buffer->rlimit) + c = EOF; + else + c = *buffer->cur++; + + have_char: + /* We need space for the terminating NUL. */ + if (dest >= limit) + limit = _cpp_next_chunk (pool, 0, &dest); + + if (c == EOF) { - c = EOF; unterminated (pfile, terminator); break; } - c = *buffer->cur++; - have_char: /* Handle trigraphs, escaped newlines etc. */ if (c == '?' || c == '\\') c = skip_escaped_newlines (buffer, c); @@ -690,8 +698,9 @@ parse_string (pfile, token, terminator) if (pfile->mlstring_pos.line == 0) pfile->mlstring_pos = pfile->lexer_pos; - handle_newline (buffer, c); /* Stores to read_ahead. */ - c = '\n'; + c = handle_newline (buffer, c); + *dest++ = '\n'; + goto have_char; } else if (c == '\0') { @@ -699,25 +708,16 @@ parse_string (pfile, token, terminator) cpp_warning (pfile, "null character(s) preserved in literal"); } - /* No terminating null for strings - they could contain nulls. */ - if (dest >= limit) - limit = _cpp_next_chunk (pool, 0, &dest); *dest++ = c; - - /* If we had a new line, the next character is in read_ahead. */ - if (c != '\n') - continue; - c = buffer->read_ahead; - if (c != EOF) - goto have_char; } /* Remember the next character. */ buffer->read_ahead = c; + *dest = '\0'; token->val.str.text = POOL_FRONT (pool); token->val.str.len = dest - token->val.str.text; - POOL_COMMIT (pool, token->val.str.len); + POOL_COMMIT (pool, token->val.str.len + 1); } /* The stored comment includes the comment start and any terminator. */ @@ -1481,26 +1481,6 @@ _cpp_equiv_tokens (a, b) return 0; } -#if 0 -/* Compare two token lists. */ -int -_cpp_equiv_toklists (a, b) - const struct toklist *a, *b; -{ - unsigned int i, count; - - count = a->limit - a->first; - if (count != (b->limit - b->first)) - return 0; - - for (i = 0; i < count; i++) - if (! _cpp_equiv_tokens (&a->first[i], &b->first[i])) - return 0; - - return 1; -} -#endif - /* Determine whether two tokens can be pasted together, and if so, what the resulting token is. Returns CPP_EOF if the tokens cannot be pasted, or the appropriate type for the merged token if they diff --git a/gcc/cpplib.c b/gcc/cpplib.c index 07f8fad728b..571e20471c9 100644 --- a/gcc/cpplib.c +++ b/gcc/cpplib.c @@ -525,8 +525,9 @@ glue_header_name (pfile, header) cpp_error (pfile, "missing terminating > character"); else { - token_mem = _cpp_pool_alloc (&pfile->ident_pool, total_len); + token_mem = _cpp_pool_alloc (&pfile->ident_pool, total_len + 1); memcpy (token_mem, buffer, total_len); + token_mem[total_len] = '\0'; header->type = CPP_HEADER_NAME; header->flags &= ~PREV_WHITE; @@ -708,14 +709,10 @@ do_line (pfile) if (token.type == CPP_STRING) { char *fname; - unsigned int len; + unsigned int len = token.val.str.len + 1; - /* FIXME: memory leak. */ - len = token.val.str.len; - fname = xmalloc (len + 1); + fname = (char *) _cpp_pool_alloc (&pfile->ident_pool, len); memcpy (fname, token.val.str.text, len); - fname[len] = '\0'; - _cpp_simplify_pathname (fname); /* Only accept flags for the # 55 form. */ diff --git a/gcc/cpplib.h b/gcc/cpplib.h index eaa0ff9e2ba..c0c3ff3dc9f 100644 --- a/gcc/cpplib.h +++ b/gcc/cpplib.h @@ -463,9 +463,7 @@ enum builtin_type BT_BASE_FILE, /* `__BASE_FILE__' */ BT_INCLUDE_LEVEL, /* `__INCLUDE_LEVEL__' */ BT_TIME, /* `__TIME__' */ - BT_STDC, /* `__STDC__' */ - BT_WEAK /* Whether or not G++ supports weak - symbols. */ + BT_STDC /* `__STDC__' */ }; /* There is a slot in the hashnode for use by front ends when integrated diff --git a/gcc/cppmain.c b/gcc/cppmain.c index 6d3afe0147b..ceab9c992e7 100644 --- a/gcc/cppmain.c +++ b/gcc/cppmain.c @@ -347,7 +347,7 @@ cb_ident (pfile, str) const cpp_string * str; { maybe_print_line (cpp_get_line (pfile)->output_line); - fprintf (print.outf, "#ident \"%.*s\"\n", (int) str->len, str->text); + fprintf (print.outf, "#ident \"%s\"\n", str->text); print.lineno++; }