gengtype.c (create_option): New function.
authorZack Weinberg <zack@gcc.gnu.org>
Tue, 30 Mar 2004 19:19:06 +0000 (19:19 +0000)
committerZack Weinberg <zack@gcc.gnu.org>
Tue, 30 Mar 2004 19:19:06 +0000 (19:19 +0000)
* gengtype.c (create_option): New function.
* gengtype.h: Prototype it.
* gengtype-yacc.y (stringseq): New rule.
(option): Use create_option.  Add new bare ID production.  Use
stringseq, not STRING directly.

* alias.c, bitmap.c, c-decl.c, cgraph.h, cpplib.h, cselib.h
* dwarf2out.c, emit-rtl.c, function.h, lists.c, tree.h
* varray.h, config/alpha/alpha.c, cp/name-lookup.c, cp/parser.c
* f/com.c, java/builtins.c, java/expr.c, java/jcf.h, java/parse.h:
Use new shorter form of GTY markers.

* doc/gty.texi: Rewrite.

From-SVN: r80091

28 files changed:
gcc/ChangeLog
gcc/alias.c
gcc/bitmap.c
gcc/c-decl.c
gcc/cgraph.h
gcc/config/alpha/alpha.c
gcc/cp/ChangeLog
gcc/cp/name-lookup.c
gcc/cp/parser.c
gcc/cpplib.h
gcc/cselib.h
gcc/doc/gty.texi
gcc/dwarf2out.c
gcc/emit-rtl.c
gcc/f/ChangeLog
gcc/f/com.c
gcc/function.h
gcc/gengtype-yacc.y
gcc/gengtype.c
gcc/gengtype.h
gcc/java/ChangeLog
gcc/java/builtins.c
gcc/java/expr.c
gcc/java/jcf.h
gcc/java/parse.h
gcc/lists.c
gcc/tree.h
gcc/varray.h

index 2ef034877dc6f92613e71d2a11bdf04917725bda..7500a8c7311c2b139082d285edb85bc7d91dc0c5 100644 (file)
@@ -1,3 +1,18 @@
+2004-03-30  Zack Weinberg  <zack@codesourcery.com>
+
+       * gengtype.c (create_option): New function.
+       * gengtype.h: Prototype it.
+       * gengtype-yacc.y (stringseq): New rule.
+       (option): Use create_option.  Add new bare ID production.  Use
+       stringseq, not STRING directly.
+
+       * alias.c, bitmap.c, c-decl.c, cgraph.h, cpplib.h, cselib.h
+       * dwarf2out.c, emit-rtl.c, function.h, lists.c, tree.h
+       * varray.h, config/alpha/alpha.c:
+       Use new shorter form of GTY markers.
+
+       * doc/gty.texi: Rewrite.
+
 2004-03-30  Andrew Pinski  <pinskia@physics.uc.edu>
 
        * config/darwin.c (machopic_function_base_name):
 
 2004-03-30  Hartmut Penner  <hpenner@de.ibm.com>
 
-        * config/rs6000/rs6000.c (output_vec_const_move):
-        Find all cases of EASY_VECTOR_15_ADD_SELF.
-        (easy_vector_constant_add_self): Accept
-        all vector constant loadable by vsplt* and vadd*.
+       * config/rs6000/rs6000.c (output_vec_const_move):
+       Find all cases of EASY_VECTOR_15_ADD_SELF.
+       (easy_vector_constant_add_self): Accept
+       all vector constant loadable by vsplt* and vadd*.
        (easy_vector_same): Use easy_vector_splat_const.
        (easy_vector_const): Use easy_vector_splat_const.
-        (easy_vector_splat_const): New function.
+       (easy_vector_splat_const): New function.
        (gen_easy_vector_constant_add_self): New function.
-       
+
        * config/rs6000/rs6000-protos.c (gen_easy_vector_constant_add_self):
        New prototype.
 
-        * config/rs6000/altivec.md (movv4si splitter): Change to
+       * config/rs6000/altivec.md (movv4si splitter): Change to
        emit move insn with halfed vector constant.
        (*movv8hi splitter): Likewise.
        (*movv16qi splitter): Likewise.
-       
+
 2004-03-30  Hartmut Penner  <hpenner@de.ibm.com>
 
-       PR 11591        
-       * config/rs6000/rs6000.c (rs6000_legitimate_address): 
+       PR 11591
+       * config/rs6000/rs6000.c (rs6000_legitimate_address):
        Allow any offset to argument pointer in no-strict case.
 
 2004-03-30  Jan Hubicka  <jh@suse.cz>
index f2bf80661f6001fb88f7bdc30facfede9fa5c7fa..46d1dca0168c5879b89e079e945293c97c6636f7 100644 (file)
@@ -163,7 +163,7 @@ static rtx *new_reg_base_value;
 /* We preserve the copy of old array around to avoid amount of garbage
    produced.  About 8% of garbage produced were attributed to this
    array.  */
-static GTY((deletable (""))) varray_type old_reg_base_value;
+static GTY((deletable)) varray_type old_reg_base_value;
 
 /* Static hunks of RTL used by the aliasing code; these are initialized
    once per function to avoid unnecessary RTL allocations.  */
index bffd9154aee374577be7c5fecb61c5a12424b5b2..70e0a93d086f38d98b11f156bef4c98c8b21cc10 100644 (file)
@@ -44,7 +44,7 @@ static int bitmap_obstack_init = FALSE;
 /* Global data */
 bitmap_element bitmap_zero_bits;       /* An element of all zero bits.  */
 static bitmap_element *bitmap_free;    /* Freelist of bitmap elements.  */
-static GTY((deletable (""))) bitmap_element *bitmap_ggc_free;
+static GTY((deletable)) bitmap_element *bitmap_ggc_free;
 
 static void bitmap_elem_to_freelist (bitmap, bitmap_element *);
 static void bitmap_element_free (bitmap, bitmap_element *);
index 05bc8beb59ad6b68676effbfd2010a779a337b2d..a2cd9cb5042beaf8f1c5b32abe8d92cbf62d945b 100644 (file)
@@ -317,11 +317,11 @@ static GTY(()) struct c_scope *external_scope;
 
 /* A chain of c_scope structures awaiting reuse.  */
 
-static GTY((deletable (""))) struct c_scope *scope_freelist;
+static GTY((deletable)) struct c_scope *scope_freelist;
 
 /* A chain of c_binding structures awaiting reuse.  */
 
-static GTY((deletable (""))) struct c_binding *binding_freelist;
+static GTY((deletable)) struct c_binding *binding_freelist;
 
 /* Append VAR to LIST in scope SCOPE.  */
 #define SCOPE_LIST_APPEND(scope, list, decl) do {      \
index b845ef7b597389cb077c7c564a790dd6f8d03c16..adbac3b48e799b680c5018fbaa3c3c94e44c0786 100644 (file)
@@ -97,7 +97,7 @@ struct cgraph_node GTY((chain_next ("%h.next"), chain_prev ("%h.previous")))
   struct cgraph_node *next_nested;
   /* Pointer to the next function in cgraph_nodes_queue.  */
   struct cgraph_node *next_needed;
-  PTR GTY ((skip (""))) aux;
+  PTR GTY ((skip)) aux;
 
   struct cgraph_local_info local;
   struct cgraph_global_info global;
index c9a87ebf31180c0ef3de33adeb1b7d41222bbe05..b37b311d55f84cd2fecb8c82b069aca3ab39e078 100644 (file)
@@ -3567,8 +3567,8 @@ alpha_split_conditional_move (enum rtx_code code, rtx dest, rtx cond,
 struct xfloating_op GTY(())
 {
   const enum rtx_code code;
-  const char *const GTY((skip(""))) osf_func;
-  const char *const GTY((skip(""))) vms_func;
+  const char *const GTY((skip)) osf_func;
+  const char *const GTY((skip)) vms_func;
   rtx libcall;
 };
 
index 28ac7515306f196c2aedf380c9592ac5335cf3f7..6e3f71a1950156c52bdcf094aa75b563d73e6120 100644 (file)
@@ -1,3 +1,7 @@
+2004-03-30  Zack Weinberg  <zack@codesourcery.com>
+
+       * name-lookup.c, parser.c: Use new shorter form of GTY markers.
+
 2004-03-29  Zack Weinberg  <zack@codesourcery.com>
 
        * error.c (dump_function_name): If T's DECL_LANG_SPECIFIC
index a23574248f7dabb913157f75ab24dc453f018a4f..612a7c171e7df475476ef3f818b2e3a7f032347d 100644 (file)
@@ -61,7 +61,7 @@ GTY(()) tree anonymous_namespace_name;
 
 /* A free list of "binding_entry"s awaiting for re-use.  */
 
-static GTY((deletable(""))) binding_entry free_binding_entry = NULL;
+static GTY((deletable)) binding_entry free_binding_entry = NULL;
 
 /* Create a binding_entry object for (NAME, TYPE).  */
 
@@ -317,7 +317,7 @@ binding_table_foreach (binding_table table, bt_foreach_proc proc, void *data)
 
 /* A free list of "cxx_binding"s, connected by their PREVIOUS.  */
 
-static GTY((deletable (""))) cxx_binding *free_bindings;
+static GTY((deletable)) cxx_binding *free_bindings;
 
 /* Zero out a cxx_binding pointed to by B.  */
 #define cxx_binding_clear(B) memset ((B), 0, sizeof (cxx_binding))
@@ -1232,7 +1232,7 @@ namespace_scope_ht_size (tree ns)
 
 /* A chain of binding_level structures awaiting reuse.  */
 
-static GTY((deletable (""))) struct cp_binding_level *free_binding_level;
+static GTY((deletable)) struct cp_binding_level *free_binding_level;
 
 /* Create a new KIND scope and make it the top of the active scopes stack.
    ENTITY is the scope of the associated C++ entity (namespace, class,
index e58fda4cc4fa73d35073fee566872b5e6410f1ea..a7f49e0fa12c05cb9ce1b60c4b4f64b6608b34d9 100644 (file)
@@ -167,19 +167,19 @@ typedef struct cp_lexer GTY (())
   /* The memory allocated for the buffer.  Never NULL.  */
   cp_token * GTY ((length ("(%h.buffer_end - %h.buffer)"))) buffer;
   /* A pointer just past the end of the memory allocated for the buffer.  */
-  cp_token * GTY ((skip (""))) buffer_end;
+  cp_token * GTY ((skip)) buffer_end;
   /* The first valid token in the buffer, or NULL if none.  */
-  cp_token * GTY ((skip (""))) first_token;
+  cp_token * GTY ((skip)) first_token;
   /* The next available token.  If NEXT_TOKEN is NULL, then there are
      no more available tokens.  */
-  cp_token * GTY ((skip (""))) next_token;
+  cp_token * GTY ((skip)) next_token;
   /* A pointer just past the last available token.  If FIRST_TOKEN is
      NULL, however, there are no available tokens, and then this
      location is simply the place in which the next token read will be
      placed.  If LAST_TOKEN == FIRST_TOKEN, then the buffer is full.
      When the LAST_TOKEN == BUFFER, then the last token is at the
      highest memory address in the BUFFER.  */
-  cp_token * GTY ((skip (""))) last_token;
+  cp_token * GTY ((skip)) last_token;
 
   /* A stack indicating positions at which cp_lexer_save_tokens was
      called.  The top entry is the most recent position at which we
@@ -1126,7 +1126,7 @@ static cp_parser_context *cp_parser_context_new
 
 /* Class variables.  */
 
-static GTY((deletable (""))) cp_parser_context* cp_parser_context_free_list;
+static GTY((deletable)) cp_parser_context* cp_parser_context_free_list;
 
 /* Constructors and destructors.  */
 
index c53375d413885298becfc410bdf1bc564c7c604b..905ca5d5e0e55c2ad40eaa006a1439a342a42ec3 100644 (file)
@@ -508,9 +508,9 @@ struct cpp_hashnode GTY(())
   union _cpp_hashnode_value
   {
     /* If a macro.  */
-    cpp_macro * GTY((skip (""))) macro;
+    cpp_macro * GTY((skip)) macro;
     /* Answers to an assertion.  */
-    struct answer * GTY ((skip (""))) answers;
+    struct answer * GTY ((skip)) answers;
     /* Code for a builtin macro.  */
     enum builtin_type GTY ((tag ("1"))) builtin;
     /* Macro argument index.  */
index 3dea471ad354badf2bc5cd08636ac0d012217793..1efbaa7b22483eaf95371a62c73dfd4a8d839ac1 100644 (file)
@@ -29,7 +29,7 @@ typedef struct cselib_val_struct GTY(())
     /* A VALUE rtx that points back to this structure.  */
     rtx GTY ((tag ("1"))) val_rtx;
     /* Used to keep a list of free cselib_val structures.  */
-    struct cselib_val_struct * GTY ((skip (""))) next_free;
+    struct cselib_val_struct * GTY ((skip)) next_free;
   } GTY ((desc ("1"))) u;
 
   /* All rtl expressions that hold this value at the current time during a
index 2dc5b86dce3a467b0f9807d1a3617ec210f0b3e8..05d9b9e6699df4fa9850b9a1704552d2b788031b 100644 (file)
@@ -13,37 +13,26 @@ involve determining information about GCC's data structures from GCC's
 source code and using this information to perform garbage collection and
 implement precompiled headers.
 
-A full C parser would be too overcomplicated for this task, so a limited
+A full C parser would be too complicated for this task, so a limited
 subset of C is interpreted and special markers are used to determine
-what parts of the source to look at.  The parser can also detect
-simple typedefs of the form @code{typedef struct ID1 *ID2;} and
-@code{typedef int ID3;}, and these don't need to be specially marked.
-
-The two forms that do need to be marked are:
-@verbatim
-struct ID1 GTY(([options]))
-{
-  [fields]
-};
-
-typedef struct ID2 GTY(([options]))
-{
-  [fields]
-} ID3;
-@end verbatim
-
-@menu
-* GTY Options::                What goes inside a @code{GTY(())}.
-* GGC Roots::          Making global variables GGC roots.
-* Files::              How the generated files work.
-@end menu
-
-@node GTY Options
-@section The Inside of a @code{GTY(())}
+what parts of the source to look at.  All @code{struct} and
+@code{union} declarations that define data structures that are
+allocated under control of the garbage collector must be marked.  All
+global variables that hold pointers to garbage-collected memory must
+also be marked.  Finally, all global variables that need to be saved
+and restored by a precompiled header must be marked.  (The precompiled
+header mechanism can only save static variables if they're scalar.
+Complex data structures must be allocated in garbage-collected memory
+to be saved in a precompiled header.)
+
+The full format of a marker is
+@smallexample
+GTY (([@var{option}] [(@var{param})], [@var{option}] [(@var{param})] @dots{}))
+@end smallexample
+@noindent
+but in most cases no options are needed.  The outer double parentheses
+are still necessary, though: @code{GTY(())}.  Markers can appear:
 
-Sometimes the C code is not enough to fully describe the type structure.
-Extra information can be provided by using more @code{GTY} markers.
-These markers can be placed:
 @itemize @bullet
 @item
 In a structure definition, before the open brace;
@@ -54,46 +43,104 @@ In a global variable declaration, after the keyword @code{static} or
 In a structure field definition, before the name of the field.
 @end itemize
 
-The format of a marker is
-@verbatim
-GTY (([name] ([param]), [name] ([param]) ...))
-@end verbatim
-The parameter is either a string or a type name.
+Here are some examples of marking simple data structures and globals.
+
+@smallexample
+struct @var{tag} GTY(())
+@{
+  @var{fields}@dots{}
+@};
+
+typedef struct @var{tag} GTY(())
+@{
+  @var{fields}@dots{}
+@} *@var{typename};
+
+static GTY(()) struct @var{tag} *@var{list};   /* @r{points to GC memory} */
+static GTY(()) int @var{counter};        /* @r{save counter in a PCH} */
+@end smallexample
+
+The parser understands simple typedefs such as
+@code{typedef struct @var{tag} *@var{name};} and 
+@code{typedef int @var{name};}.
+These don't need to be marked.
+
+@menu
+* GTY Options::                What goes inside a @code{GTY(())}.
+* GGC Roots::          Making global variables GGC roots.
+* Files::              How the generated files work.
+@end menu
+
+@node GTY Options
+@section The Inside of a @code{GTY(())}
+
+Sometimes the C code is not enough to fully describe the type
+structure.  Extra information can be provided with @code{GTY} options
+and additional markers.  Some options take a parameter, which may be
+either a string or a type name, depending on the parameter.  If an
+option takes no parameter, it is acceptable either to omit the
+parameter entirely, or to provide an empty string as a parameter.  For
+example, @code{@w{GTY ((skip))}} and @code{@w{GTY ((skip ("")))}} are
+equivalent.
 
-When the parameter is a string, often it is a fragment of C code.  Three
-special escapes may be available:
+When the parameter is a string, often it is a fragment of C code.  Four
+special escapes may be used in these strings, to refer to pieces of
+the data structure being marked:
 
 @cindex % in GTY option
 @table @code
 @item %h
-This expands to an expression that evaluates to the current structure.
+The current structure.
 @item %1
-This expands to an expression that evaluates to the structure that
-immediately contains the current structure.
+The structure that immediately contains the current structure.
 @item %0
-This expands to an expression that evaluates to the outermost structure
-that contains the current structure.
+The outermost structure that contains the current structure.
 @item %a
-This expands to the string of the form @code{[i1][i2]...} that indexes
-the array item currently being marked.  For instance, if the field
-being marked is @code{foo}, then @code{%1.foo%a} is the same as @code{%h}.
+A partial expression of the form @code{[i1][i2]...} that indexes
+the array item currently being marked.
 @end table
 
+For instance, suppose that you have a structure of the form
+@smallexample
+struct A @{
+  ...
+@};
+struct B @{
+  struct A foo[12];
+@};
+@end smallexample
+@noindent
+and @code{b} is a variable of type @code{struct B}.  When marking
+@samp{b.foo[11]}, @code{%h} would expand to @samp{b.foo[11]},
+@code{%0} and @code{%1} would both expand to @samp{b}, and @code{%a}
+would expand to @samp{[11]}.
+
+As in ordinary C, adjacent strings will be concatenated; this is
+helpful when you have a complicated expression.
+@smallexample
+@group
+GTY ((chain_next ("TREE_CODE (&%h.generic) == INTEGER_TYPE"
+                  " ? TYPE_NEXT_VARIANT (&%h.generic)"
+                  " : TREE_CHAIN (&%h.generic)")))
+@end group
+@end smallexample
+
 The available options are:
 
 @table @code
 @findex length
-@item length
+@item length ("@var{expression}")
 
 There are two places the type machinery will need to be explicitly told
 the length of an array.  The first case is when a structure ends in a
 variable-length array, like this:
-@verbatim
-struct rtvec_def GTY(()) {
-  int num_elem;                /* number of elements */
+@smallexample
+struct rtvec_def GTY(()) @{
+  int num_elem;                /* @r{number of elements} */
   rtx GTY ((length ("%h.num_elem"))) elem[1];
-};
-@end verbatim
+@};
+@end smallexample
+
 In this case, the @code{length} option is used to override the specified
 array length (which should usually be @code{1}).  The parameter of the
 option is a fragment of C code that calculates the length.
@@ -127,8 +174,8 @@ field really isn't ever used.
 @findex desc
 @findex tag
 @findex default
-@item desc
-@itemx tag
+@item desc ("@var{expression}")
+@itemx tag ("@var{constant}")
 @itemx default
 
 The type machinery needs to be told which field of a @code{union} is
@@ -141,8 +188,8 @@ there is one, otherwise no field in the union will be marked.
 
 In the @code{desc} option, the ``current structure'' is the union that
 it discriminates.  Use @code{%1} to mean the structure containing it.
-(There are no escapes available to the @code{tag} option, since it's
-supposed to be a constant.)
+There are no escapes available to the @code{tag} option, since it is a
+constant.
 
 For example,
 @smallexample
@@ -164,7 +211,7 @@ will treat the field @code{scope} as being present.
 
 @findex param_is
 @findex use_param
-@item param_is
+@item param_is (@var{type})
 @itemx use_param
 
 Sometimes it's convenient to define some data structure to work on
@@ -173,14 +220,23 @@ type.  @code{param_is} specifies the real type pointed to, and
 @code{use_param} says where in the generic data structure that type
 should be put.
 
-For instance, to have a @code{htab_t} that points to trees, one should write
-@verbatim
+For instance, to have a @code{htab_t} that points to trees, one would
+write the definition of @code{htab_t} like this:
+@smallexample
+typedef struct GTY(()) @{
+  @dots{}
+  void ** GTY ((use_param, @dots{})) entries;
+  @dots{}
+@} htab_t;
+@end smallexample
+and then declare variables like this:
+@smallexample
   htab_t GTY ((param_is (union tree_node))) ict;
-@end verbatim
+@end smallexample
 
 @findex param@var{n}_is
 @findex use_param@var{n}
-@item param@var{n}_is
+@item param@var{n}_is (@var{type})
 @itemx use_param@var{n}
 
 In more complicated cases, the data structure might need to work on
@@ -210,7 +266,7 @@ by this variable, it can just be set to @code{NULL} instead.  This is used
 to keep a list of free structures around for re-use.
 
 @findex if_marked
-@item if_marked
+@item if_marked ("@var{expression}")
 
 Suppose you want some kinds of object to be unique, and so you put them
 in a hash table.  If garbage collection marks the hash table, these
@@ -237,43 +293,46 @@ language frontends.
 
 @findex chain_next
 @findex chain_prev
-@item chain_next
-@itemx chain_prev
+@item chain_next ("@var{expression}")
+@itemx chain_prev ("@var{expression}")
 
 It's helpful for the type machinery to know if objects are often
 chained together in long lists; this lets it generate code that uses
 less stack space by iterating along the list instead of recursing down
 it.  @code{chain_next} is an expression for the next item in the list,
-@code{chain_prev} is an expression for the previous item.  The
-machinery requires that taking the next item of the previous item
-gives the original item.
+@code{chain_prev} is an expression for the previous item.  For singly
+linked lists, use only @code{chain_next}; for doubly linked lists, use
+both.  The machinery requires that taking the next item of the
+previous item gives the original item.
 
 @findex reorder
-@item reorder
+@item reorder ("@var{function name}")
 
 Some data structures depend on the relative ordering of pointers.  If
-the type machinery needs to change that ordering, it will call the
-function referenced by the @code{reorder} option, before changing the
-pointers in the object that's pointed to by the field the option
-applies to.  The function must be of the type @code{void ()(void *,
-void *, gt_pointer_operator, void *)}.  The second parameter is the
-pointed-to object; the third parameter is a routine that, given a
-pointer, can update it to its new value.  The fourth parameter is a
-cookie to be passed to the third parameter.  The first parameter is
-the structure that contains the object, or the object itself if it is
-a structure.
-
-No data structure may depend on the absolute value of pointers.  Even
-relying on relative orderings and using @code{reorder} functions can
-be expensive.  It is better to depend on properties of the data, like
-an ID number or the hash of a string instead.
+the precompiled header machinery needs to change that ordering, it
+will call the function referenced by the @code{reorder} option, before
+changing the pointers in the object that's pointed to by the field the
+option applies to.  The function must take four arguments, with the
+signature @samp{@w{void *, void *, gt_pointer_operator, void *}}.
+The first parameter is a pointer to the structure that contains the
+object being updated, or the object itself if there is no containing
+structure.  The second parameter is a cookie that should be ignored.
+The third parameter is a routine that, given a pointer, will update it
+to its correct new value.  The fourth parameter is a cookie that must
+be passed to the second parameter.
+
+PCH cannot handle data structures that depend on the absolute values
+of pointers.  @code{reorder} functions can be expensive.  When
+possible, it is better to depend on properties of the data, like an ID
+number or the hash of a string instead.
 
 @findex special
-@item special
-
-The @code{special} option is used for those bizarre cases that are just
-too hard to deal with otherwise.  Don't use it for new code.
+@item special ("@var{name}")
 
+The @code{special} option is used to mark types that have to be dealt
+with by special case machinery.  The parameter is the name of the
+special case.  See @file{gengtype.c} for further details.  Avoid
+adding new special cases unless there is no other alternative.
 @end table
 
 @node GGC Roots
@@ -282,36 +341,40 @@ too hard to deal with otherwise.  Don't use it for new code.
 @cindex marking roots
 
 In addition to keeping track of types, the type machinery also locates
-the global variables that the garbage collector starts at.  There are
-two syntaxes it accepts to indicate a root:
+the global variables (@dfn{roots}) that the garbage collector starts
+at.  Roots must be declared using one of the following syntaxes:
 
-@enumerate
+@itemize @bullet
 @item
-@verb{|extern GTY (([options])) [type] ID;|}
+@code{extern GTY(([@var{options}])) @var{type} @var{name};}
 @item
-@verb{|static GTY (([options])) [type] ID;|}
-@end enumerate
-
-These are the only syntaxes that are accepted.  In particular, if you
-want to mark a variable that is only declared as
-@verbatim
-int ID;
-@end verbatim
-or similar, you should either make it @code{static} or you should create
-a @code{extern} declaration in a header file somewhere.
+@code{static GTY(([@var{options}])) @var{type} @var{name};}
+@end itemize
+@noindent
+The syntax
+@itemize @bullet
+@item
+@code{GTY(([@var{options}])) @var{type} @var{name};}
+@end itemize
+@noindent
+is @emph{not} accepted.  There should be an @code{extern} declaration
+of such a variable in a header somewhere---mark that, not the
+definition.  Or, if the variable is only used in one file, make it
+@code{static}.
 
 @node Files
 @section Source Files Containing Type Information
 @cindex generated files
 @cindex files, generated
 
-Whenever you add @code{GTY} markers to a new source file, there are three
-things you need to do:
+Whenever you add @code{GTY} markers to a source file that previously
+had none, or create a new source file containing @code{GTY} markers,
+there are three things you need to do:
 
 @enumerate
 @item
 You need to add the file to the list of source files the type
-machinery scans.  There are three cases:
+machinery scans.  There are four cases:
 
 @enumerate a
 @item
@@ -320,19 +383,18 @@ automatically; if not, you should add it to @code{target_gtfiles} in
 the appropriate port's entries in @file{config.gcc}.
 
 @item
-For files shared by all front ends, this is done by adding the
-filename to the @code{GTFILES} variable in @file{Makefile.in}.
+For files shared by all front ends, add the filename to the
+@code{GTFILES} variable in @file{Makefile.in}.
 
 @item
-For any other file used by a front end, this is done by adding the
-filename to the @code{gtfiles} variable defined in
+For files that are part of one front end, add the filename to the
+@code{gtfiles} variable defined in the appropriate
 @file{config-lang.in}.  For C, the file is @file{c-config-lang.in}.
-This list should include all files that have GTY macros in them that
-are used in that front end, other than those defined in the previous
-list items.  For example, it is common for front end writers to use
-@file{c-common.c} and other files from the C front end, and these
-should be included in the @file{gtfiles} variable for such front ends.
 
+@item
+For files that are part of some but not all front ends, add the
+filename to the @code{gtfiles} variable of @emph{all} the front ends
+that use it.
 @end enumerate
 
 @item
index 4a1745353c4b50b00c2726f56ed52feadf82c7cc..9181546052f8100b2174a5da731c3c38f2eb0301 100644 (file)
@@ -2419,7 +2419,7 @@ typedef struct dw_val_struct GTY(())
       unsigned HOST_WIDE_INT GTY ((tag ("dw_val_class_offset"))) val_offset;
       dw_loc_list_ref GTY ((tag ("dw_val_class_loc_list"))) val_loc_list;
       dw_loc_descr_ref GTY ((tag ("dw_val_class_loc"))) val_loc;
-      HOST_WIDE_INT GTY ((default (""))) val_int;
+      HOST_WIDE_INT GTY ((default)) val_int;
       unsigned HOST_WIDE_INT GTY ((tag ("dw_val_class_unsigned_const"))) val_unsigned;
       dw_long_long_const GTY ((tag ("dw_val_class_long_long"))) val_long_long;
       dw_vec_const GTY ((tag ("dw_val_class_vec"))) val_vec;
index cb6f4cb639ca49f7c219dbe303795bb06a415ed6..399bf2310baaf08571d98cab4223520a03a16803 100644 (file)
@@ -4751,7 +4751,7 @@ emit (rtx x)
 }
 \f
 /* Space for free sequence stack entries.  */
-static GTY ((deletable (""))) struct sequence_stack *free_sequence_stack;
+static GTY ((deletable)) struct sequence_stack *free_sequence_stack;
 
 /* Begin emitting insns to a sequence which can be packaged in an
    RTL_EXPR.  If this sequence will contain something that might cause
@@ -5483,7 +5483,7 @@ emit_copy_of_insn_after (rtx insn, rtx after)
   return new;
 }
 
-static GTY((deletable(""))) rtx hard_reg_clobbers [NUM_MACHINE_MODES][FIRST_PSEUDO_REGISTER];
+static GTY((deletable)) rtx hard_reg_clobbers [NUM_MACHINE_MODES][FIRST_PSEUDO_REGISTER];
 rtx
 gen_hard_reg_clobber (enum machine_mode mode, unsigned int regno)
 {
index 18c33b76a4f1dab18c4ee4775f798c7ca555f4d3..c2eefad81cddd8057988d0acf91519779545f71d 100644 (file)
@@ -1,3 +1,7 @@
+2004-03-30  Zack Weinberg  <zack@codesourcery.com>
+
+       * com.c: Use new shorter form of GTY markers.
+
 2004-03-21  Joseph S. Myers  <jsm@polyomino.org.uk>
 
        * g77.texi: Update link to "G++ and GCC".
        ftp://alpha.gnu.org/gnu/g77/projects/.
        (Trouble): Remove obsolete paragraph including a broken link to
        ftp://alpha.gnu.org/g77.plan.
-       
+
        * invoke.texi (Overall Options): Remove broken reference to
        rat7.uue (which was of dubious copyright status anyways).
 
        * root.texi (www-burley): Fix URL.
-       
+
 2004-02-29  Roger Sayle  <roger@eyesopen.com>
 
        * parse.c (ffe_parse_file): Handle the case that main_input_filename
@@ -61,7 +65,7 @@
 
 2004-01-30  Kelley Cook  <kcook@gcc.gnu.org>
 
-       * Make-lang.in (doc/g77.dvi): Use $(abs_docdir). 
+       * Make-lang.in (doc/g77.dvi): Use $(abs_docdir).
 
 2004-01-28  Ian Lance Taylor  <ian@wasabisystems.com>
 
index ebfce0a567011e2678b4a433925d3ed350544c93..e81d844d156de40b9a7a337e478ed46088d37239 100644 (file)
@@ -558,7 +558,7 @@ static GTY(()) struct f_binding_level *current_binding_level;
 
 /* A chain of binding_level structures awaiting reuse.  */
 
-static GTY((deletable (""))) struct f_binding_level *free_binding_level;
+static GTY((deletable)) struct f_binding_level *free_binding_level;
 
 /* The outermost binding level, for names of file scope.
    This is created when the compiler is started and exists
index 1e5c56fb84521ffe831c2ed82664db12057f5c01..c61944a51f43a8b4107124f999839a4b443434d8 100644 (file)
@@ -377,7 +377,7 @@ struct function GTY(())
   /* For md files.  */
 
   /* tm.h can use this to store whatever it likes.  */
-  struct machine_function * GTY ((maybe_undef (""))) machine;
+  struct machine_function * GTY ((maybe_undef)) machine;
   /* The largest alignment of slot allocated on the stack.  */
   int stack_alignment_needed;
   /* Preferred alignment of the end of stack frame.  */
index 928c962a584f6feea9a33a7b77227e3011326407..18b65f14c5cf7c6e3602db8b1268a541f50577a4 100644 (file)
@@ -57,7 +57,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 %type <p> struct_fields yacc_ids yacc_typematch
 %type <t> type lasttype
 %type <o> optionsopt options option optionseq optionseqopt
-%type <s> type_option
+%type <s> type_option stringseq
 
 %%
 
@@ -268,21 +268,12 @@ type_option : ALIAS
                { $$ = $1; }
              ;
 
-option:        type_option '(' type ')'
-          {
-            options_p o = xmalloc (sizeof (*o));
-            o->name = $1;
-            o->info = adjust_field_type ($3, NULL);
-            $$ = o;
-          }
-       | ID '(' STRING ')'
-          {
-            options_p o = xmalloc (sizeof (*o));
-            o->name = $1;
-            o->info = (void *)$3;
-            $$ = o;
-          }
-       ;
+option:   ID
+           { $$ = create_option ($1, (void *)""); }
+        | ID '(' stringseq ')'
+            { $$ = create_option ($1, (void *)$3); }
+       | type_option '(' type ')'
+           { $$ = create_option ($1, adjust_field_type ($3, NULL)); }
 
 optionseq: option
              {
@@ -299,4 +290,16 @@ optionseq: option
 optionseqopt: { $$ = NULL; }
              | optionseq { $$ = $1; }
              ;
+
+stringseq: STRING
+            { $$ = $1; }
+          | stringseq STRING
+            {
+              size_t l1 = strlen ($1);
+              size_t l2 = strlen ($2);
+              char *s = xrealloc ((char *)$1, l1 + l2 + 1);
+              memcpy (s + l1, $2, l2 + 1);
+              free ((void *)$2);
+              $$ = s;
+            }
 %%
index 86286c7cb22dfd650ad4ce9af1e970a41f1e16c9..1bad8e4e706909b54987fc6045012768bdfa3562 100644 (file)
@@ -308,6 +308,16 @@ create_array (type_p t, const char *len)
   return v;
 }
 
+/* Return an options structure with name NAME and info INFO.  */
+options_p
+create_option (const char *name, void *info)
+{
+  options_p o = xmalloc (sizeof (*o));
+  o->name = name;
+  o->info = info;
+  return o;
+}
+
 /* Add a variable named S of type T with options O defined at POS,
    to `variables'.  */
 
index 5fa7550eadd4b04baa862db866fa4d3d69edd8d4..55ece1150737ef91b837feb56f08e2c986fd286a 100644 (file)
@@ -130,6 +130,7 @@ extern type_p find_structure (const char *s, int isunion);
 extern type_p create_scalar_type (const char *name, size_t name_len);
 extern type_p create_pointer (type_p t);
 extern type_p create_array (type_p t, const char *len);
+extern options_p create_option (const char *name, void *info);
 extern type_p adjust_field_type (type_p, options_p);
 extern void note_variable (const char *s, type_p t, options_p o,
                           struct fileloc *pos);
index 7cb754ceb88475225ad87a78b90710c3bed35122..3843f9d2ab1581e60a1300f899a7a97d285a9768 100644 (file)
@@ -1,3 +1,8 @@
+2004-03-30  Zack Weinberg  <zack@codesourcery.com>
+
+       * builtins.c, expr.c, jcf.h, parse.h: Use new shorter
+       form of GTY markers.
+
 2004-03-25  Marcus Meissner  <meissner@suse.de>
 
        PR java/14689:
@@ -38,7 +43,7 @@
        * lang.c (java_handle_option):  Handle new options.
        * parse.y (build_incomplete_class_ref):  Handle class$ in an inner
        class in an interface - create helper class nested in outer interface.
-        (build_assertion):  Short-circuit if enable_assertions is false.
+       (build_assertion):  Short-circuit if enable_assertions is false.
 
 2004-03-18  Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
 
@@ -93,7 +98,7 @@
        !METHOD_INVISIBLE (iface_method).
        * class.c (layout_class_methods): Check for CLASS_INTERFACE as
        well as CLASS_ABSTRACT.
-       
+
 2004-02-25  Per Bothner  <per@bothner.com>
 
        * parse.y (build_assertion):  If we're in an inner class, create the
 
 2004-01-30  Kelley Cook  <kcook@gcc.gnu.org>
 
-       * Make-lang.in (doc/gcj.dvi): Use $(abs_docdir). 
+       * Make-lang.in (doc/gcj.dvi): Use $(abs_docdir).
 
 2004-01-28  Andrew Pinski  <pinskia@physics.uc.edu>
 
        * Make-lang.in: Replace $(docdir) with doc.
        (java.info, java.srcinfo, java.man, java.srcman): New rules.
        (java.install-man): Revamp rule.
-       
+
 2004-01-20  Kelley Cook  <kcook@gcc.gnu.org>
 
-       * Make-lang.in (JAVA_INSTALL_NAME, JAVA_TARGET_INSTALL_NAME, 
-       GCJH_TARGET_INSTALL_NAME): Define via a immediate $(shell) 
+       * Make-lang.in (JAVA_INSTALL_NAME, JAVA_TARGET_INSTALL_NAME,
+       GCJH_TARGET_INSTALL_NAME): Define via a immediate $(shell)
        instead of deferred backquote.
 
 2004-01-16  Andrew Pinski  <pinskia@physics.uc.edu>
        using indirect dis[atch.
        (java_decl_ok_for_sibcall): Use output_class, not current_class.
        (java_get_callee_fndecl): Use class local atable.
-       * jcf-parse.c 
+       * jcf-parse.c
        (always_initialize_class_p): Decl moved to java-tree.h.
        (HANDLE_CLASS_INFO): Set output_class.
        (read_class): Likewise.
        Make otable, atable, and ctable class local rather than global.
        (emit_catch_table): Make otable, atable, and ctable class local
        rather than global.
-               
+
 2003-12-25  Andrew Pinski  <pinskia@physics.uc.edu>
 
        * parse.y (catch_clause_parameter): Fix typo.
 
        PR java/13404
-       * parse.y: (catch_clause_parameter): Return early if $3, aka 
+       * parse.y: (catch_clause_parameter): Return early if $3, aka
        formal_parameter, is null.
 
 2003-12-20  Kazu Hirata  <kazu@cs.umass.edu>
index 65fb3e228c2f69ac4b2eddba8c14686b801425f9..563bd8daad29e2d467ea155d9fd948747590ed4c 100644 (file)
@@ -65,7 +65,7 @@ struct builtin_record GTY(())
 {
   union string_or_tree GTY ((desc ("1"))) class_name;
   union string_or_tree GTY ((desc ("1"))) method_name;
-  builtin_creator_function * GTY((skip (""))) creator;
+  builtin_creator_function * GTY((skip)) creator;
   enum built_in_function builtin_code;
 };
 
index a4356eb3e4841f631be43320849478015356d10c..95c3b69d7d9b7e5d8b8d2ea267f9059c433619e4 100644 (file)
@@ -126,7 +126,7 @@ int always_initialize_class_p;
 static GTY(()) tree quick_stack;
 
 /* A free-list of unused permanent TREE_LIST nodes.  */
-static GTY((deletable (""))) tree tree_list_free_list;
+static GTY((deletable)) tree tree_list_free_list;
 
 /* The stack pointer of the Java virtual machine.
    This does include the size of the quick_stack. */
index b7a6f38e236c86541ace194464eaa4f555cf4b7f..27e0761cf7de2e3e50e35bfac9a0fd3a8beb838d 100644 (file)
@@ -102,19 +102,19 @@ struct ZipDirectory;
 /* JCF encapsulates the state of reading a Java Class File. */
 
 typedef struct JCF GTY(()) {
-  unsigned char * GTY ((skip (""))) buffer;
-  unsigned char * GTY ((skip (""))) buffer_end;
-  unsigned char * GTY ((skip (""))) read_ptr;
-  unsigned char * GTY ((skip (""))) read_end;
+  unsigned char * GTY ((skip)) buffer;
+  unsigned char * GTY ((skip)) buffer_end;
+  unsigned char * GTY ((skip)) read_ptr;
+  unsigned char * GTY ((skip)) read_end;
   int java_source : 1;
   int right_zip : 1;
   int finished : 1;
   jcf_filbuf_t filbuf;
-  PTR GTY ((skip (""))) read_state;
+  PTR GTY ((skip)) read_state;
   const char *filename;
   const char *classname;
   /* Directory entry where it was found.  */
-  struct ZipDirectory * GTY ((skip (""))) zipd;
+  struct ZipDirectory * GTY ((skip)) zipd;
   JCF_u2 access_flags;
   JCF_u2 this_class;
   JCF_u2 super_class;
index f845ce2d26546a9397ff2de30cc3f9117d65e9c5..bedf70624d23acbfadef2a18bca78c7e1b75fc0e 100644 (file)
@@ -728,10 +728,10 @@ struct parser_ctxt GTY(()) {
   const char *filename;                    /* Current filename */
   struct parser_ctxt *next;
 
-  java_lexer * GTY((skip (""))) lexer; /* Current lexer state */
+  java_lexer * GTY((skip)) lexer; /* Current lexer state */
   char marker_begining;                     /* Marker. Should be a sub-struct */
-  struct java_line * GTY ((skip (""))) p_line; /* Previous line */
-  struct java_line * GTY ((skip (""))) c_line; /* Current line */
+  struct java_line * GTY ((skip)) p_line; /* Previous line */
+  struct java_line * GTY ((skip)) c_line; /* Current line */
   java_lc elc;                      /* Error's line column info */
   int ccb_indent;                   /* Keep track of {} indent, lexer */
   int first_ccb_indent1;            /* First { at ident level 1 */
@@ -739,7 +739,7 @@ struct parser_ctxt GTY(()) {
   int parser_ccb_indent;            /* Keep track of {} indent, parser */
   int osb_depth;                    /* Current depth of [ in an expression */
   int osb_limit;                    /* Limit of this depth */
-  int * GTY ((skip (""))) osb_number; /* Keep track of ['s */
+  int * GTY ((skip)) osb_number; /* Keep track of ['s */
   int lineno;                       /* Current lineno */
   char marker_end;                  /* End marker. Should be a sub-struct */
 
@@ -774,7 +774,7 @@ struct parser_ctxt GTY(()) {
 
   /* These two lists won't survive file traversal */
   tree  class_list;                /* List of classes in a CU */
-  jdeplist * GTY((skip (""))) classd_list; /* Classe dependencies in a CU */
+  jdeplist * GTY((skip)) classd_list; /* Classe dependencies in a CU */
   
   tree  current_parsed_class;      /* Class currently parsed */
   tree  current_parsed_class_un;    /* Curr. parsed class unqualified name */
index 1e4a57a160fdfa3eedc60bb3c626401c135f2ec8..c36e8cf3e5177b253bbaa388b2e54e0c09af33ec 100644 (file)
@@ -32,10 +32,10 @@ static void free_list (rtx *, rtx *);
 /* Functions for maintaining cache-able lists of EXPR_LIST and INSN_LISTs.  */
 
 /* An INSN_LIST containing all INSN_LISTs allocated but currently unused.  */
-static GTY ((deletable (""))) rtx unused_insn_list;
+static GTY ((deletable)) rtx unused_insn_list;
 
 /* An EXPR_LIST containing all EXPR_LISTs allocated but currently unused.  */
-static GTY ((deletable (""))) rtx unused_expr_list;
+static GTY ((deletable)) rtx unused_expr_list;
 
 
 /* This function will free an entire list of either EXPR_LIST or INSN_LIST
index 6d0813f621efa08646905b8db8c910e6d2e46066..8af963fd4c7e9b78bf66152dd12bd4a5205ddf40 100644 (file)
@@ -1831,7 +1831,7 @@ struct tree_decl GTY(())
       unsigned int align : 24;
       unsigned int off_align : 8;
     } a;
-  } GTY ((skip (""))) u1;
+  } GTY ((skip)) u1;
 
   tree size_unit;
   tree name;
index 194d10cd563de7309e01ceaca93470a807fe342e..57a3711bb22c68370e8e57d54cb74dd46d3f8706 100644 (file)
@@ -106,7 +106,7 @@ typedef union varray_data_tag GTY (()) {
                                tag ("VARRAY_DATA_HINT")))      hint[1];
   unsigned HOST_WIDE_INT  GTY ((length ("%0.num_elements"),
                                tag ("VARRAY_DATA_UHINT")))     uhint[1];
-  PTR                    GTY ((length ("%0.num_elements"), use_param (""),
+  PTR                    GTY ((length ("%0.num_elements"), use_param,
                                tag ("VARRAY_DATA_GENERIC")))   generic[1];
   char                  *GTY ((length ("%0.num_elements"),
                                tag ("VARRAY_DATA_CPTR")))      cptr[1];
@@ -118,11 +118,11 @@ typedef union varray_data_tag GTY (()) {
                                tag ("VARRAY_DATA_TREE")))      tree[1];
   struct bitmap_head_def *GTY ((length ("%0.num_elements"),
                                tag ("VARRAY_DATA_BITMAP")))    bitmap[1];
-  struct reg_info_def   *GTY ((length ("%0.num_elements"), skip (""),
+  struct reg_info_def   *GTY ((length ("%0.num_elements"), skip,
                                tag ("VARRAY_DATA_REG")))       reg[1];
   struct const_equiv_data GTY ((length ("%0.num_elements"),
                        tag ("VARRAY_DATA_CONST_EQUIV")))       const_equiv[1];
-  struct basic_block_def *GTY ((length ("%0.num_elements"), skip (""),
+  struct basic_block_def *GTY ((length ("%0.num_elements"), skip,
                                tag ("VARRAY_DATA_BB")))        bb[1];
   struct elt_list       *GTY ((length ("%0.num_elements"),
                                tag ("VARRAY_DATA_TE")))        te[1];