Hi, all.
I am tying to fix an issue with a global variable in the parallel gcc
project. For this, I am trying to move some global variables from
tree-ssa-operands to struct function. One of this variable is a
vec<tree*> type, and gengtype doesn't look so happy with it.
In this context, I am trying to add support to vec<tree*> to gengtype.
Therefore, I first fixed a problem where gengtype couldn't find the
tree union by:
diff --git a/gcc/gengtype.c b/gcc/gengtype.c
index 53317337cf8..6f4c77020ea 100644
--- a/gcc/gengtype.c
+++ b/gcc/gengtype.c
@@ -638,7 +638,10 @@ create_user_defined_type (const char *type_name, struct fil
eloc *pos)
/* Strip off the first '*' character (and any subsequent text). */
*(field_name + offset_to_star) = '\0';
- arg_type = find_structure (field_name, TYPE_STRUCT);
+ arg_type = resolve_typedef (field_name, pos);
+ if (!arg_type)
+ arg_type = find_structure (field_name, TYPE_STRUCT);
+
arg_type = create_pointer (arg_type);
}
else
After this patch, gengtype seems to correctly detect vec<tree*> types,
but then I face linking issues. At first, the compiler could not find
gt_ggc_mx (vec<T> *v) and gt_pch_mx (vec<T> *v), therefore I implemented
them both in gcc/vec.h:
diff --git a/gcc/vec.h b/gcc/vec.h
index 091056b37bc..dfa744b684e 100644
--- a/gcc/vec.h
+++ b/gcc/vec.h
@@ -1306,6 +1306,15 @@ vec<T, A, vl_embed>::quick_grow_cleared (unsigned len)
vec_default_construct (address () + oldlen, growby);
}
+template<typename T>
+void
+gt_ggc_mx (vec<T> *v)
+{
+ extern void gt_ggc_mx (T &);
+ for (unsigned i = 0; i < v->length (); i++)
+ gt_ggc_mx ((*v)[i]);
+}
+
/* Garbage collection support for vec<T, A, vl_embed>. */
template<typename T>
@@ -1328,6 +1337,15 @@ gt_ggc_mx (vec<T, va_gc_atomic, vl_embed> *v ATTRIBUTE_UNUSED)
/* PCH support for vec<T, A, vl_embed>. */
+template<typename T>
+void
+gt_pch_nx (vec<T> *v)
+{
+ extern void gt_pch_nx (T &);
+ for (unsigned i = 0; i < v->length (); i++)
+ gt_pch_nx ((*v)[i]);
+}
+
template<typename T, typename A>
void
gt_pch_nx (vec<T, A, vl_embed> *v)
@@ -1337,6 +1355,14 @@ gt_pch_nx (vec<T, A, vl_embed> *v)
gt_pch_nx ((*v)[i]);
}
+template<typename T>
+void
+gt_pch_nx (vec<T *> *v, gt_pointer_operator op, void *cookie)
+{
+ for (unsigned i = 0; i < v->length (); i++)
+ op (&((*v)[i]), cookie);
+}
+
template<typename T, typename A>
void
gt_pch_nx (vec<T *, A, vl_embed> *v, gt_pointer_operator op, void *cookie)
@@ -1354,6 +1380,15 @@ gt_pch_nx (vec<T, A, vl_embed> *v, gt_pointer_operator op, void *cookie)
gt_pch_nx (&((*v)[i]), op, cookie);
}
+template<typename T>
+void
+gt_pch_nx (vec<T> *v, gt_pointer_operator op, void *cookie)
+{
+ extern void gt_pch_nx (T *, gt_pointer_operator, void *);
+ for (unsigned i = 0; i < v->length (); i++)
+ gt_pch_nx (&((*v)[i]), op, cookie);
+}
+
After that, I get linking errors because the linker can not find
gt_ggc_mx (tree *&x) nor void gt_pch_nx (tree *&x). The thing
is: it doesn't matter where I implement them, or if I declare
them inline. I always get a linking error one way or another.
Therefore, what should I do to correctly implement the support
for vec<tree*> types?
Thank you,
Giuliano.