diff options
-rw-r--r-- | gcc/ChangeLog | 18 | ||||
-rw-r--r-- | gcc/cpphash.c | 108 | ||||
-rw-r--r-- | gcc/cpphash.h | 2 | ||||
-rw-r--r-- | gcc/cppinit.c | 53 | ||||
-rw-r--r-- | gcc/cpplib.h | 2 |
5 files changed, 93 insertions, 90 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 952ba80..c18abd6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,21 @@ +2000-04-09 Zack Weinberg <zack@wolery.cumb.org> + + * cpphash.c (timestamp): Delete. + (del_HASHNODE): If type is T_MCONST, free value.cpval. + (special_symbol): Remove unnecessary braces. Remove + T_VERSION. Treat T_STDC like T_CONST unless + STDC_0_IN_SYSTEM_HEADERS. Render both __DATE__ and __TIME__ + when one is encountered, then convert them into T_MCONST + nodes. + * cppinit.c (builtin_array): version_string is T_MCONST. + __STDC__ has a "1" in its cpval. Don't have a terminator + entry. Clean up which entries are dumped. + (initialize_builtins): Only __STDC__ gets the special + -traditional treatment. Count the length of builtin_array. + Render version_string here. + * cpphash.h: Remove T_VERSION. Add T_MCONST. + * cpplib.h (struct cpp_reader): Remove timebuf. + 2000-04-09 Richard Henderson <rth@cygnus.com> * genrecog.c (pred): Update comparison_operator for the unordered diff --git a/gcc/cpphash.c b/gcc/cpphash.c index 4578ca7..c4cf5f4 100644 --- a/gcc/cpphash.c +++ b/gcc/cpphash.c @@ -42,7 +42,6 @@ static void push_macro_expansion PARAMS ((cpp_reader *, static int unsafe_chars PARAMS ((cpp_reader *, int, int)); static int macro_cleanup PARAMS ((cpp_buffer *, cpp_reader *)); static enum cpp_token macarg PARAMS ((cpp_reader *, int)); -static struct tm *timestamp PARAMS ((cpp_reader *)); static void special_symbol PARAMS ((HASHNODE *, cpp_reader *)); /* Initial hash table size. (It can grow if necessary - see hashtab.c.) */ @@ -141,6 +140,8 @@ del_HASHNODE (x) if (h->type == T_MACRO) _cpp_free_definition (h->value.defn); + else if (h->type == T_MCONST) + free ((void *) h->value.cpval); free ((void *) h->name); free (h); } @@ -794,18 +795,6 @@ macarg (pfile, rest_args) } -static struct tm * -timestamp (pfile) - cpp_reader *pfile; -{ - if (!pfile->timebuf) - { - time_t t = time ((time_t *) 0); - pfile->timebuf = localtime (&t); - } - return pfile->timebuf; -} - static const char * const monthnames[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", @@ -854,6 +843,7 @@ _cpp_quote_string (pfile, src) * buffer *without* rescanning. */ +#define DSC(str) (const U_CHAR *)str, sizeof str - 1 static void special_symbol (hp, pfile) HASHNODE *hp; @@ -867,22 +857,15 @@ special_symbol (hp, pfile) { case T_FILE: case T_BASE_FILE: - { - ip = cpp_file_buffer (pfile); - if (hp->type == T_BASE_FILE) - { - while (CPP_PREV_BUFFER (ip) != NULL) - ip = CPP_PREV_BUFFER (ip); - } - - buf = ip->nominal_fname; + ip = cpp_file_buffer (pfile); + if (hp->type == T_BASE_FILE) + while (CPP_PREV_BUFFER (ip) != NULL) + ip = CPP_PREV_BUFFER (ip); - if (!buf) - buf = ""; - CPP_RESERVE (pfile, 3 + 4 * strlen (buf)); - _cpp_quote_string (pfile, buf); - return; - } + buf = ip->nominal_fname; + CPP_RESERVE (pfile, 3 + 4 * strlen (buf)); + _cpp_quote_string (pfile, buf); + return; case T_INCLUDE_LEVEL: { @@ -897,16 +880,21 @@ special_symbol (hp, pfile) return; } - case T_VERSION: - len = strlen (hp->value.cpval); - CPP_RESERVE (pfile, 3 + len); - CPP_PUTC_Q (pfile, '"'); - CPP_PUTS_Q (pfile, hp->value.cpval, len); - CPP_PUTC_Q (pfile, '"'); - CPP_NUL_TERMINATE_Q (pfile); - return; - + case T_STDC: +#ifdef STDC_0_IN_SYSTEM_HEADERS + ip = cpp_file_buffer (pfile); + if (ip->system_header_p && !cpp_defined (pfile, DSC("__STRICT_ANSI__"))) + { + CPP_RESERVE (pfile, 2); + CPP_PUTC_Q (pfile, '0'); + CPP_NUL_TERMINATE_Q (pfile); + return; + } +#endif + /* else fall through */ case T_CONST: + case T_MCONST: + constant: buf = hp->value.cpval; if (!buf) return; @@ -919,19 +907,6 @@ special_symbol (hp, pfile) CPP_NUL_TERMINATE_Q (pfile); return; - case T_STDC: - CPP_RESERVE (pfile, 2); -#ifdef STDC_0_IN_SYSTEM_HEADERS - ip = cpp_file_buffer (pfile); - if (ip->system_header_p - && !cpp_defined (pfile, (const U_CHAR *) "__STRICT_ANSI__", 15)) - CPP_PUTC_Q (pfile, '0'); - else -#endif - CPP_PUTC_Q (pfile, '1'); - CPP_NUL_TERMINATE_Q (pfile); - return; - case T_SPECLINE: { long line; @@ -945,21 +920,31 @@ special_symbol (hp, pfile) case T_DATE: case T_TIME: + /* Generate both __DATE__ and __TIME__, stuff them into their + respective hash nodes, and mark the nodes T_MCONST so we + don't have to do this again. We don't generate these strings + at init time because time() and localtime() are very slow on + some systems. */ { - struct tm *timebuf; + time_t tt = time (NULL); + struct tm *tb = localtime (&tt); + HASHNODE *d, *t; - CPP_RESERVE (pfile, 20); - timebuf = timestamp (pfile); if (hp->type == T_DATE) - sprintf (CPP_PWRITTEN (pfile), "\"%s %2d %4d\"", - monthnames[timebuf->tm_mon], - timebuf->tm_mday, timebuf->tm_year + 1900); + d = hp, t = _cpp_lookup (pfile, DSC("__TIME__")); else - sprintf (CPP_PWRITTEN (pfile), "\"%02d:%02d:%02d\"", - timebuf->tm_hour, timebuf->tm_min, timebuf->tm_sec); - - CPP_ADJUST_WRITTEN (pfile, strlen (CPP_PWRITTEN (pfile))); - return; + t = hp, d = _cpp_lookup (pfile, DSC("__DATE__")); + + d->value.cpval = xmalloc (sizeof "'Oct 11 1347'"); + sprintf ((char *)d->value.cpval, "\"%s %2d %4d\"", + monthnames[tb->tm_mon], tb->tm_mday, tb->tm_year + 1900); + d->type = T_MCONST; + + t->value.cpval = xmalloc (sizeof "'12:34:56'"); + sprintf ((char *)t->value.cpval, "\"%02d:%02d:%02d\"", + tb->tm_hour, tb->tm_min, tb->tm_sec); + t->type = T_MCONST; + goto constant; } case T_POISON: @@ -974,6 +959,7 @@ special_symbol (hp, pfile) return; } } +#undef DSC /* Expand a macro call. HP points to the symbol that is the macro being called. diff --git a/gcc/cpphash.h b/gcc/cpphash.h index abf0d2b..35d48e8 100644 --- a/gcc/cpphash.h +++ b/gcc/cpphash.h @@ -91,10 +91,10 @@ enum node_type T_FILE, /* `__FILE__' */ T_BASE_FILE, /* `__BASE_FILE__' */ T_INCLUDE_LEVEL, /* `__INCLUDE_LEVEL__' */ - T_VERSION, /* `__VERSION__' */ T_TIME, /* `__TIME__' */ T_STDC, /* `__STDC__' */ T_CONST, /* Constant string, used by `__SIZE_TYPE__' etc */ + T_MCONST, /* Ditto, but the string is malloced memory */ T_MACRO, /* macro defined by `#define' */ T_DISABLED, /* macro temporarily turned off for rescan */ T_POISON, /* macro defined with `#pragma poison' */ diff --git a/gcc/cppinit.c b/gcc/cppinit.c index f4391ff..32293f6 100644 --- a/gcc/cppinit.c +++ b/gcc/cppinit.c @@ -588,9 +588,8 @@ cpp_cleanup (pfile) be entered in the macro hash table under the name NAME, with value VALUE (if any). FLAGS tweaks the behavior a little: DUMP write debug info for this macro - STDC define only if not -traditional - ULP value is the global user_label_prefix (which can't be - put directly into the table). + VERS value is the global version_string, quoted + ULP value is the global user_label_prefix */ struct builtin @@ -601,35 +600,35 @@ struct builtin unsigned short flags; }; #define DUMP 0x01 -#define STDC 0x02 -#define VERS 0x04 -#define ULP 0x08 +#define VERS 0x02 +#define ULP 0x04 static const struct builtin builtin_array[] = { - { "__TIME__", 0, T_TIME, DUMP }, - { "__DATE__", 0, T_DATE, DUMP }, - { "__FILE__", 0, T_FILE, 0 }, - { "__BASE_FILE__", 0, T_BASE_FILE, 0 }, - { "__LINE__", 0, T_SPECLINE, 0 }, - { "__INCLUDE_LEVEL__", 0, T_INCLUDE_LEVEL, 0 }, - { "__VERSION__", 0, T_VERSION, DUMP|VERS }, - { "__STDC__", 0, T_STDC, DUMP|STDC }, - - { "__USER_LABEL_PREFIX__", 0, T_CONST, ULP }, - { "__REGISTER_PREFIX__", REGISTER_PREFIX, T_CONST, 0 }, - { "__HAVE_BUILTIN_SETJMP__", "1", T_CONST, 0 }, + { "__TIME__", 0, T_TIME, 0 }, + { "__DATE__", 0, T_DATE, 0 }, + { "__FILE__", 0, T_FILE, 0 }, + { "__BASE_FILE__", 0, T_BASE_FILE, 0 }, + { "__LINE__", 0, T_SPECLINE, 0 }, + { "__INCLUDE_LEVEL__", 0, T_INCLUDE_LEVEL, 0 }, + + { "__VERSION__", 0, T_MCONST, DUMP|VERS }, + { "__USER_LABEL_PREFIX__", 0, T_CONST, DUMP|ULP }, + { "__STDC__", "1", T_STDC, DUMP }, + { "__REGISTER_PREFIX__", REGISTER_PREFIX, T_CONST, DUMP }, + { "__HAVE_BUILTIN_SETJMP__", "1", T_CONST, DUMP }, #ifndef NO_BUILTIN_SIZE_TYPE - { "__SIZE_TYPE__", SIZE_TYPE, T_CONST, DUMP }, + { "__SIZE_TYPE__", SIZE_TYPE, T_CONST, DUMP }, #endif #ifndef NO_BUILTIN_PTRDIFF_TYPE - { "__PTRDIFF_TYPE__", PTRDIFF_TYPE, T_CONST, DUMP }, + { "__PTRDIFF_TYPE__", PTRDIFF_TYPE, T_CONST, DUMP }, #endif #ifndef NO_BUILTIN_WCHAR_TYPE - { "__WCHAR_TYPE__", WCHAR_TYPE, T_CONST, DUMP }, + { "__WCHAR_TYPE__", WCHAR_TYPE, T_CONST, DUMP }, #endif - { 0, 0, 0, 0 } }; +#define builtin_array_end \ + builtin_array + sizeof(builtin_array)/sizeof(struct builtin) /* Subroutine of cpp_start_read; reads the builtins table above and enters the macros into the hash table. */ @@ -641,15 +640,18 @@ initialize_builtins (pfile) const struct builtin *b; const char *val; HASHNODE *hp; - for(b = builtin_array; b->name; b++) + for(b = builtin_array; b < builtin_array_end; b++) { - if ((b->flags & STDC) && CPP_TRADITIONAL (pfile)) + if (b->type == T_STDC && CPP_TRADITIONAL (pfile)) continue; if (b->flags & ULP) val = user_label_prefix; else if (b->flags & VERS) - val = version_string; + { + val = xmalloc (strlen (version_string) + 3); + sprintf ((char *)val, "\"%s\"", version_string); + } else val = b->value; @@ -662,7 +664,6 @@ initialize_builtins (pfile) if ((b->flags & DUMP) && CPP_OPTION (pfile, debug_output)) dump_special_to_buffer (pfile, b->name); } - } #undef DUMP #undef STDC diff --git a/gcc/cpplib.h b/gcc/cpplib.h index 8133d69..c28cf3a 100644 --- a/gcc/cpplib.h +++ b/gcc/cpplib.h @@ -352,8 +352,6 @@ struct cpp_reader long lineno; - struct tm *timebuf; - /* Buffer of -M output. */ struct deps *deps; |