OSDN Git Service

* cpphash.c (timestamp): Delete.
authorzack <zack@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 10 Apr 2000 03:27:21 +0000 (03:27 +0000)
committerzack <zack@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 10 Apr 2000 03:27:21 +0000 (03:27 +0000)
(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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@33047 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/cpphash.c
gcc/cpphash.h
gcc/cppinit.c
gcc/cpplib.h

index 952ba80..c18abd6 100644 (file)
@@ -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
index 4578ca7..c4cf5f4 100644 (file)
@@ -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)
 }
 \f
 
-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.
index abf0d2b..35d48e8 100644 (file)
@@ -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' */
index f4391ff..32293f6 100644 (file)
@@ -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
index 8133d69..c28cf3a 100644 (file)
@@ -352,8 +352,6 @@ struct cpp_reader
 
   long lineno;
 
-  struct tm *timebuf;
-
   /* Buffer of -M output.  */
   struct deps *deps;