+
+static GTY(()) tree ic_void_ptr_var;
+static GTY(()) tree ic_gcov_type_ptr_var;
+static GTY(()) tree ptr_void;
+
+/* Do initialization work for the edge profiler. */
+
+/* Add code:
+ static gcov* __gcov_indirect_call_counters; // pointer to actual counter
+ static void* __gcov_indirect_call_callee; // actual callee addres
+*/
+static void
+tree_init_ic_make_global_vars (void)
+{
+ tree gcov_type_ptr;
+
+ ptr_void = build_pointer_type (void_type_node);
+
+ ic_void_ptr_var
+ = build_decl (VAR_DECL,
+ get_identifier ("__gcov_indirect_call_callee"),
+ ptr_void);
+ TREE_STATIC (ic_void_ptr_var) = 1;
+ TREE_PUBLIC (ic_void_ptr_var) = 0;
+ DECL_ARTIFICIAL (ic_void_ptr_var) = 1;
+ DECL_INITIAL (ic_void_ptr_var) = NULL;
+ assemble_variable (ic_void_ptr_var, 0, 0, 0);
+
+ gcov_type_ptr = build_pointer_type (get_gcov_type ());
+ ic_gcov_type_ptr_var
+ = build_decl (VAR_DECL,
+ get_identifier ("__gcov_indirect_call_counters"),
+ gcov_type_ptr);
+ TREE_STATIC (ic_gcov_type_ptr_var) = 1;
+ TREE_PUBLIC (ic_gcov_type_ptr_var) = 0;
+ DECL_ARTIFICIAL (ic_gcov_type_ptr_var) = 1;
+ DECL_INITIAL (ic_gcov_type_ptr_var) = NULL;
+ assemble_variable (ic_gcov_type_ptr_var, 0, 0, 0);
+}
+
+static void
+tree_init_edge_profiler (void)
+{
+ tree interval_profiler_fn_type;
+ tree pow2_profiler_fn_type;
+ tree one_value_profiler_fn_type;
+ tree gcov_type_ptr;
+ tree ic_profiler_fn_type;
+ tree average_profiler_fn_type;
+
+ if (!gcov_type_node)
+ {
+ gcov_type_node = get_gcov_type ();
+ gcov_type_ptr = build_pointer_type (gcov_type_node);
+
+ /* void (*) (gcov_type *, gcov_type, int, unsigned) */
+ interval_profiler_fn_type
+ = build_function_type_list (void_type_node,
+ gcov_type_ptr, gcov_type_node,
+ integer_type_node,
+ unsigned_type_node, NULL_TREE);
+ tree_interval_profiler_fn
+ = build_fn_decl ("__gcov_interval_profiler",
+ interval_profiler_fn_type);
+
+ /* void (*) (gcov_type *, gcov_type) */
+ pow2_profiler_fn_type
+ = build_function_type_list (void_type_node,
+ gcov_type_ptr, gcov_type_node,
+ NULL_TREE);
+ tree_pow2_profiler_fn = build_fn_decl ("__gcov_pow2_profiler",
+ pow2_profiler_fn_type);
+
+ /* void (*) (gcov_type *, gcov_type) */
+ one_value_profiler_fn_type
+ = build_function_type_list (void_type_node,
+ gcov_type_ptr, gcov_type_node,
+ NULL_TREE);
+ tree_one_value_profiler_fn
+ = build_fn_decl ("__gcov_one_value_profiler",
+ one_value_profiler_fn_type);
+
+ tree_init_ic_make_global_vars ();
+
+ /* void (*) (gcov_type *, gcov_type, void *, void *) */
+ ic_profiler_fn_type
+ = build_function_type_list (void_type_node,
+ gcov_type_ptr, gcov_type_node,
+ ptr_void,
+ ptr_void, NULL_TREE);
+ tree_indirect_call_profiler_fn
+ = build_fn_decl ("__gcov_indirect_call_profiler",
+ ic_profiler_fn_type);
+ /* void (*) (gcov_type *, gcov_type) */
+ average_profiler_fn_type
+ = build_function_type_list (void_type_node,
+ gcov_type_ptr, gcov_type_node, NULL_TREE);
+ tree_average_profiler_fn
+ = build_fn_decl ("__gcov_average_profiler",
+ average_profiler_fn_type);
+ tree_ior_profiler_fn
+ = build_fn_decl ("__gcov_ior_profiler",
+ average_profiler_fn_type);
+ }
+}
+