]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gengtype.c (adjust_field_type): Diagnose duplicate "length" option applications and...
authorLaurynas Biveinis <laurynas.biveinis@gmail.com>
Mon, 30 Jul 2012 02:30:52 +0000 (02:30 +0000)
committerLaurynas Biveinis <lauras@gcc.gnu.org>
Mon, 30 Jul 2012 02:30:52 +0000 (02:30 +0000)
gcc:
2012-07-27  Laurynas Biveinis  <laurynas.biveinis@gmail.com>
    Steven Bosscher  <steven@gcc.gnu.org>

* gengtype.c (adjust_field_type): Diagnose duplicate "length"
option applications and option being applied to arrays of atomic
types.
(walk_type): Allow "atomic" option on strings too.
* dwarf2out.h (struct dw_vec_struct): Use the "atomic" GTY option
for the array field.
* vec.h: Describe the atomic object "A" type of the macros in
the header comment.
(VEC_T_GTY_ATOMIC, DEF_VEC_A, DEF_VEC_ALLOC_A): Define.
* emit-rtl.c (locations_locators_vals): use the atomic object
vector.
* doc/gty.texi: Clarify that GTY option "length" is only for
arrays of non-atomic objects.  Fix typo in the description of the
"atomic" option.

gcc/java:
2012-07-24  Laurynas Biveinis  <laurynas.biveinis@gmail.com>

* jcf.h (CPool): Use the "atomic" GTY option for the tags field.
(bootstrap_method): Likewise for the bootstrap_arguments field.

libcpp:
2012-07-24  Laurynas Biveinis  <laurynas.biveinis@gmail.com>

* include/line-map.h (line_map_macro): Use the "atomic" GTY option
for the macro_locations field.

Co-Authored-By: Steven Bosscher <steven@gcc.gnu.org>
From-SVN: r189951

gcc/ChangeLog
gcc/doc/gty.texi
gcc/dwarf2out.h
gcc/emit-rtl.c
gcc/gengtype.c
gcc/java/ChangeLog
gcc/java/jcf.h
gcc/vec.h
libcpp/ChangeLog
libcpp/include/line-map.h

index 6193d9415cf56aef8d8d339ad3cd0906e365f953..ec3d4d0a653fc35f9cbbdc8989fef048d5fe40e1 100644 (file)
@@ -1,3 +1,21 @@
+2012-07-30  Laurynas Biveinis  <laurynas.biveinis@gmail.com>
+           Steven Bosscher  <steven@gcc.gnu.org>
+
+       * gengtype.c (adjust_field_type): Diagnose duplicate "length"
+       option applications and option being applied to arrays of atomic
+       types.
+       (walk_type): Allow "atomic" option on strings too.
+       * dwarf2out.h (struct dw_vec_struct): Use the "atomic" GTY option
+       for the array field.
+       * vec.h: Describe the atomic object "A" type of the macros in
+       the header comment.
+       (VEC_T_GTY_ATOMIC, DEF_VEC_A, DEF_VEC_ALLOC_A): Define.
+       * emit-rtl.c (locations_locators_vals): use the atomic object
+       vector.
+       * doc/gty.texi: Clarify that GTY option "length" is only for
+       arrays of non-atomic objects.  Fix typo in the description of the
+       "atomic" option.
+
 2012-07-27  Uros Bizjak  <ubizjak@gmail.com>
 
        * config/i386/i386.c (ix86_avoid_lea_for_addr): Handle
index cff3ffdfc5dc2dc8378df785453a786cf6ea5d92..ad0423abc4210f7259ad0343d490229d00492bc6 100644 (file)
@@ -134,8 +134,8 @@ The available options are:
 @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:
+the length of an array of non-atomic objects.  The first case is when a
+structure ends in a variable-length array, like this:
 @smallexample
 struct GTY(()) rtvec_def @{
   int num_elem;         /* @r{number of elements} */
@@ -163,6 +163,11 @@ This second use of @code{length} also works on global variables, like:
 static GTY((length("reg_known_value_size"))) rtx *reg_known_value;
 @end verbatim
 
+Note that the @code{length} option is only meant for use with arrays of
+non-atomic objects, that is, objects that contain pointers pointing to
+other GTY-managed objects.  For other GC-allocated arrays and strings
+you should use @code{atomic}.
+
 @findex skip
 @item skip
 
@@ -411,7 +416,7 @@ Here is an example of how to use it:
 @smallexample
 struct GTY(()) my_struct @{
   int number_of_elements;
-  unsigned int GTY ((atomic)) * elements;
+  unsigned int * GTY ((atomic)) elements;
 @};
 @end smallexample
 In this case, @code{elements} is a pointer under GC, and the memory it
index 1bc83aa9ade16496582e27be44b8cb1bae02cf92..a9952910e3862f832b0e5da02d01b1268cf0c839 100644 (file)
@@ -160,7 +160,7 @@ enum dw_val_class
 /* Describe a floating point constant value, or a vector constant value.  */
 
 typedef struct GTY(()) dw_vec_struct {
-  unsigned char * GTY((length ("%h.length"))) array;
+  unsigned char * GTY((atomic)) array;
   unsigned length;
   unsigned elt_size;
 }
index 3431e98385b33cecb9d0b29e1764835f500f69e5..e0c4979246301e72fbe1f1da64461263f078c8c1 100644 (file)
@@ -5910,8 +5910,8 @@ gen_hard_reg_clobber (enum machine_mode mode, unsigned int regno)
 static VEC(int,heap) *block_locators_locs;
 static GTY(()) VEC(tree,gc) *block_locators_blocks;
 static VEC(int,heap) *locations_locators_locs;
-DEF_VEC_O(location_t);
-DEF_VEC_ALLOC_O(location_t,heap);
+DEF_VEC_A(location_t);
+DEF_VEC_ALLOC_A(location_t,heap);
 static VEC(location_t,heap) *locations_locators_vals;
 int prologue_locator;
 int epilogue_locator;
index 96c75b3ebb255661a023ca1d975cbd05a238e69b..ecb8378207ebb0b7f5ca15e26821a17a4d1c4b75 100644 (file)
@@ -1256,7 +1256,17 @@ adjust_field_type (type_p t, options_p opt)
 
   for (; opt; opt = opt->next)
     if (strcmp (opt->name, "length") == 0)
-      length_p = 1;
+      {
+       if (length_p)
+         error_at_line (&lexer_line, "duplicate `%s' option", opt->name);
+       if (t->u.p->kind == TYPE_SCALAR || t->u.p->kind == TYPE_STRING)
+         {
+           error_at_line (&lexer_line,
+                          "option `%s' may not be applied to "
+                          "arrays of atomic types", opt->name);
+         }
+       length_p = 1;
+      }
     else if ((strcmp (opt->name, "param_is") == 0
              || (strncmp (opt->name, "param", 5) == 0
                  && ISDIGIT (opt->name[5])
@@ -2495,7 +2505,7 @@ walk_type (type_p t, struct walk_type_data *d)
       return;
     }
 
-  if (atomic_p && (t->kind != TYPE_POINTER))
+  if (atomic_p && (t->kind != TYPE_POINTER) && (t->kind != TYPE_STRING))
     {
       error_at_line (d->line, "field `%s' has invalid option `atomic'\n", d->val);
       return;
index 78a34940b1f13fcecbb7ee423460539e0d1ae09b..8fd18aaee2cdd02929a5b5ba47aed280e98e0fad 100644 (file)
@@ -1,3 +1,8 @@
+2012-07-30  Laurynas Biveinis  <laurynas.biveinis@gmail.com>
+
+       * jcf.h (CPool): Use the "atomic" GTY option for the tags field.
+       (bootstrap_method): Likewise for the bootstrap_arguments field.
+
 2012-07-16  Steven Bosscher  <steven@gcc.gnu.org>
 
        * java-gimplify.c Include dumpfile.h instead of tree-dump.h
index 40b4ae2d27800084554d8bc8e063cccfa8d30872..38c035fe4390d051b787848eba96b0ed5aaa4766 100644 (file)
@@ -82,7 +82,7 @@ typedef struct GTY(()) CPool {
   /* The constant_pool_count. */
   int          count;
 
-  uint8* GTY((length ("%h.count")))    tags;
+  uint8 * GTY((atomic)) tags;
 
   union cpool_entry * GTY((length ("%h.count"),
                           desc ("cpool_entry_is_tree (%1.tags%a)")))   data;
@@ -91,7 +91,7 @@ typedef struct GTY(()) CPool {
 typedef struct GTY(()) bootstrap_method {
   unsigned method_ref;
   unsigned num_arguments;
-  unsigned* GTY((length ("%h.num_arguments"))) bootstrap_arguments;
+  unsigned * GTY((atomic)) bootstrap_arguments;
 } bootstrap_method;
 
 typedef struct GTY(()) BootstrapMethods {
index f38c763104fc8de68c1db47aea15a35f995c2568..cb871124ce2241402af05e4697a5e28904c462fb 100644 (file)
--- a/gcc/vec.h
+++ b/gcc/vec.h
@@ -95,24 +95,25 @@ along with GCC; see the file COPYING3.  If not see
    the 'space' predicate will tell you whether there is spare capacity
    in the vector.  You will not normally need to use these two functions.
 
-   Vector types are defined using a DEF_VEC_{O,P,I}(TYPEDEF) macro, to
+   Vector types are defined using a DEF_VEC_{O,A,P,I}(TYPEDEF) macro, to
    get the non-memory allocation version, and then a
-   DEF_VEC_ALLOC_{O,P,I}(TYPEDEF,ALLOC) macro to get memory managed
+   DEF_VEC_ALLOC_{O,A,P,I}(TYPEDEF,ALLOC) macro to get memory managed
    vectors.  Variables of vector type are declared using a
    VEC(TYPEDEF,ALLOC) macro.  The ALLOC argument specifies the
    allocation strategy, and can be either 'gc' or 'heap' for garbage
    collected and heap allocated respectively.  It can be 'none' to get
    a vector that must be explicitly allocated (for instance as a
-   trailing array of another structure).  The characters O, P and I
-   indicate whether TYPEDEF is a pointer (P), object (O) or integral
-   (I) type.  Be careful to pick the correct one, as you'll get an
-   awkward and inefficient API if you use the wrong one.  There is a
-   check, which results in a compile-time warning, for the P and I
-   versions, but there is no check for the O versions, as that is not
-   possible in plain C.  Due to the way GTY works, you must annotate
-   any structures you wish to insert or reference from a vector with a
-   GTY(()) tag.  You need to do this even if you never declare the GC
-   allocated variants.
+   trailing array of another structure).  The characters O, A, P and I
+   indicate whether TYPEDEF is a pointer (P), object (O), atomic object
+   (A) or integral (I) type.  Be careful to pick the correct one, as
+   you'll get an awkward and inefficient API if you use the wrong one or
+   a even a crash if you pick the atomic object version when the object
+   version should have been chosen instead.  There is a check, which
+   results in a compile-time warning, for the P and I versions, but there
+   is no check for the O versions, as that is not possible in plain C.
+   Due to the way GTY works, you must annotate any structures you wish to
+   insert or reference from a vector with a GTY(()) tag.  You need to do
+   this even if you never declare the GC allocated variants.
 
    An example of their use would be,
 
@@ -530,6 +531,13 @@ typedef struct GTY(()) VEC(T,B)                                              \
   T GTY ((length ("%h.prefix.num"))) vec[1];                             \
 } VEC(T,B)
 
+#define VEC_T_GTY_ATOMIC(T,B)                                            \
+typedef struct GTY(()) VEC(T,B)                                                  \
+{                                                                        \
+  struct vec_prefix prefix;                                              \
+  T GTY ((atomic)) vec[1];                                               \
+} VEC(T,B)
+
 /* Derived vector type, user visible.  */
 #define VEC_TA_GTY(T,B,A,GTY)                                            \
 typedef struct GTY VEC(T,A)                                              \
@@ -904,6 +912,14 @@ DEF_VEC_ALLOC_FUNC_O(T,A)                                            \
 DEF_VEC_NONALLOC_FUNCS_O(T,A)                                            \
 struct vec_swallow_trailing_semi
 
+/* Vector of atomic object.  */
+#define DEF_VEC_A(T)                                                     \
+VEC_T_GTY_ATOMIC(T,base);                                                \
+VEC_TA(T,base,none);                                                     \
+DEF_VEC_FUNC_O(T)                                                        \
+struct vec_swallow_trailing_semi
+#define DEF_VEC_ALLOC_A(T,A) DEF_VEC_ALLOC_O(T,A)
+
 #define DEF_VEC_FUNC_O(T)                                                \
 static inline unsigned VEC_OP (T,base,length) (const VEC(T,base) *vec_)          \
 {                                                                        \
index 312fd8d97b827ef4cfe2c48ae6d7685de88723e6..0ec30137b3b2f4f58d53f7fc7d9eaffe23828072 100644 (file)
@@ -1,3 +1,8 @@
+2012-07-30  Laurynas Biveinis  <laurynas.biveinis@gmail.com>
+
+       * include/line-map.h (line_map_macro): Use the "atomic" GTY option
+       for the macro_locations field.
+
 2011-06-19  Uros Bizjak  <ubizjak@gmail.com>
 
        * lex.c (search_line_sse42): Use __builtin_ia32_loaddqu and
index fe1a18e1fa5f34774e409b7128c33d05f2ad0c49..407ce4b0228641816ee032cf99d015995b142395 100644 (file)
@@ -165,7 +165,7 @@ struct GTY(()) line_map_macro {
      In the example above x1 (for token "+") is going to be the same
      as y1.  x0 is the spelling location for the argument token "1",
      and x2 is the spelling location for the argument token "2".  */
-  source_location * GTY((length ("2 * %h.n_tokens"))) macro_locations;
+  source_location * GTY((atomic)) macro_locations;
 
   /* This is the location of the expansion point of the current macro
      map.  It's the location of the macro name.  That location is held