* Add varpool node removal/insertion hooks
@ 2013-09-08 14:58 Jan Hubicka
2013-09-08 15:08 ` Gabriel Dos Reis
0 siblings, 1 reply; 4+ messages in thread
From: Jan Hubicka @ 2013-09-08 14:58 UTC (permalink / raw)
To: gcc-patches
Hi,
this patch adds API for varpool node removal/insertion hooks that are fully symmetric
to cgraph code.
Bootstrapped/regtested x86_64-linux after working around PR58340, will commit it shortly.
Honza
* cgraph.h (varpool_node_hook, varpool_node_hook_list,
varpool_add_node_removal_hook, varpool_add_variable_insertion_hook,
varpool_remove_variable_insertion_hook): Declare.
* varpool.c (varpool_node_hook_list): New structure.
(first_varpool_node_removal_hook,
first_varpool_variable_insertion_hook): New variables.
(varpool_add_node_removal_hook, varpool_remove_node_removal_hook,
varpool_call_node_removal_hooks, varpool_add_variable_insertion_hook,
varpool_remove_variable_insertion_hook,
varpool_call_variable_insertion_hooks): New functions.
(varpool_remove_node): Use it.
Index: cgraph.h
===================================================================
--- cgraph.h (revision 202364)
+++ cgraph.h (working copy)
@@ -701,12 +701,14 @@ void cgraph_mark_address_taken_node (str
typedef void (*cgraph_edge_hook)(struct cgraph_edge *, void *);
typedef void (*cgraph_node_hook)(struct cgraph_node *, void *);
+typedef void (*varpool_node_hook)(struct varpool_node *, void *);
typedef void (*cgraph_2edge_hook)(struct cgraph_edge *, struct cgraph_edge *,
void *);
typedef void (*cgraph_2node_hook)(struct cgraph_node *, struct cgraph_node *,
void *);
struct cgraph_edge_hook_list;
struct cgraph_node_hook_list;
+struct varpool_node_hook_list;
struct cgraph_2edge_hook_list;
struct cgraph_2node_hook_list;
struct cgraph_edge_hook_list *cgraph_add_edge_removal_hook (cgraph_edge_hook, void *);
@@ -714,9 +716,15 @@ void cgraph_remove_edge_removal_hook (st
struct cgraph_node_hook_list *cgraph_add_node_removal_hook (cgraph_node_hook,
void *);
void cgraph_remove_node_removal_hook (struct cgraph_node_hook_list *);
+struct varpool_node_hook_list *varpool_add_node_removal_hook (varpool_node_hook,
+ void *);
+void varpool_remove_node_removal_hook (struct varpool_node_hook_list *);
struct cgraph_node_hook_list *cgraph_add_function_insertion_hook (cgraph_node_hook,
void *);
void cgraph_remove_function_insertion_hook (struct cgraph_node_hook_list *);
+struct varpool_node_hook_list *varpool_add_variable_insertion_hook (varpool_node_hook,
+ void *);
+void varpool_remove_variable_insertion_hook (struct varpool_node_hook_list *);
void cgraph_call_function_insertion_hooks (struct cgraph_node *node);
struct cgraph_2edge_hook_list *cgraph_add_edge_duplication_hook (cgraph_2edge_hook, void *);
void cgraph_remove_edge_duplication_hook (struct cgraph_2edge_hook_list *);
Index: varpool.c
===================================================================
--- varpool.c (revision 202364)
+++ varpool.c (working copy)
@@ -36,6 +36,100 @@ along with GCC; see the file COPYING3.
#include "tree-flow.h"
#include "flags.h"
+/* List of hooks triggered on varpool_node events. */
+struct varpool_node_hook_list {
+ varpool_node_hook hook;
+ void *data;
+ struct varpool_node_hook_list *next;
+};
+
+/* List of hooks triggered when a node is removed. */
+struct varpool_node_hook_list *first_varpool_node_removal_hook;
+/* List of hooks triggered when an variable is inserted. */
+struct varpool_node_hook_list *first_varpool_variable_insertion_hook;
+
+/* Register HOOK to be called with DATA on each removed node. */
+struct varpool_node_hook_list *
+varpool_add_node_removal_hook (varpool_node_hook hook, void *data)
+{
+ struct varpool_node_hook_list *entry;
+ struct varpool_node_hook_list **ptr = &first_varpool_node_removal_hook;
+
+ entry = (struct varpool_node_hook_list *) xmalloc (sizeof (*entry));
+ entry->hook = hook;
+ entry->data = data;
+ entry->next = NULL;
+ while (*ptr)
+ ptr = &(*ptr)->next;
+ *ptr = entry;
+ return entry;
+}
+
+/* Remove ENTRY from the list of hooks called on removing nodes. */
+void
+varpool_remove_node_removal_hook (struct varpool_node_hook_list *entry)
+{
+ struct varpool_node_hook_list **ptr = &first_varpool_node_removal_hook;
+
+ while (*ptr != entry)
+ ptr = &(*ptr)->next;
+ *ptr = entry->next;
+ free (entry);
+}
+
+/* Call all node removal hooks. */
+static void
+varpool_call_node_removal_hooks (struct varpool_node *node)
+{
+ struct varpool_node_hook_list *entry = first_varpool_node_removal_hook;
+ while (entry)
+ {
+ entry->hook (node, entry->data);
+ entry = entry->next;
+ }
+}
+
+/* Register HOOK to be called with DATA on each inserted node. */
+struct varpool_node_hook_list *
+varpool_add_variable_insertion_hook (varpool_node_hook hook, void *data)
+{
+ struct varpool_node_hook_list *entry;
+ struct varpool_node_hook_list **ptr = &first_varpool_variable_insertion_hook;
+
+ entry = (struct varpool_node_hook_list *) xmalloc (sizeof (*entry));
+ entry->hook = hook;
+ entry->data = data;
+ entry->next = NULL;
+ while (*ptr)
+ ptr = &(*ptr)->next;
+ *ptr = entry;
+ return entry;
+}
+
+/* Remove ENTRY from the list of hooks called on inserted nodes. */
+void
+varpool_remove_variable_insertion_hook (struct varpool_node_hook_list *entry)
+{
+ struct varpool_node_hook_list **ptr = &first_varpool_variable_insertion_hook;
+
+ while (*ptr != entry)
+ ptr = &(*ptr)->next;
+ *ptr = entry->next;
+ free (entry);
+}
+
+/* Call all node insertion hooks. */
+void
+varpool_call_variable_insertion_hooks (struct varpool_node *node)
+{
+ struct varpool_node_hook_list *entry = first_varpool_variable_insertion_hook;
+ while (entry)
+ {
+ entry->hook (node, entry->data);
+ entry = entry->next;
+ }
+}
+
/* Allocate new callgraph node and insert it into basic data structures. */
struct varpool_node *
@@ -65,8 +159,9 @@ varpool_node_for_decl (tree decl)
void
varpool_remove_node (struct varpool_node *node)
{
- symtab_unregister_node ((symtab_node)node);
tree init;
+ varpool_call_node_removal_hooks (node);
+ symtab_unregister_node ((symtab_node)node);
/* Because we remove references from external functions before final compilation,
we may end up removing useful constructors.
@@ -246,6 +341,7 @@ varpool_add_new_variable (tree decl)
struct varpool_node *node;
varpool_finalize_decl (decl);
node = varpool_node_for_decl (decl);
+ varpool_call_variable_insertion_hooks (node);
if (varpool_externally_visible_p (node))
node->symbol.externally_visible = true;
}
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: Add varpool node removal/insertion hooks
2013-09-08 14:58 Add varpool node removal/insertion hooks Jan Hubicka
@ 2013-09-08 15:08 ` Gabriel Dos Reis
2013-09-08 15:55 ` Jan Hubicka
0 siblings, 1 reply; 4+ messages in thread
From: Gabriel Dos Reis @ 2013-09-08 15:08 UTC (permalink / raw)
To: Jan Hubicka; +Cc: gcc-patches
On Sun, Sep 8, 2013 at 9:23 AM, Jan Hubicka <hubicka@ucw.cz> wrote:
> Hi,
> this patch adds API for varpool node removal/insertion hooks that are fully symmetric
> to cgraph code.
>
> Bootstrapped/regtested x86_64-linux after working around PR58340, will commit it shortly.
Hi Honza,
I can't bootstrap trunk at the moment on x86_64-linux. How did you
get past that?
-- Gaby
>
> Honza
>
> * cgraph.h (varpool_node_hook, varpool_node_hook_list,
> varpool_add_node_removal_hook, varpool_add_variable_insertion_hook,
> varpool_remove_variable_insertion_hook): Declare.
> * varpool.c (varpool_node_hook_list): New structure.
> (first_varpool_node_removal_hook,
> first_varpool_variable_insertion_hook): New variables.
> (varpool_add_node_removal_hook, varpool_remove_node_removal_hook,
> varpool_call_node_removal_hooks, varpool_add_variable_insertion_hook,
> varpool_remove_variable_insertion_hook,
> varpool_call_variable_insertion_hooks): New functions.
> (varpool_remove_node): Use it.
> Index: cgraph.h
> ===================================================================
> --- cgraph.h (revision 202364)
> +++ cgraph.h (working copy)
> @@ -701,12 +701,14 @@ void cgraph_mark_address_taken_node (str
>
> typedef void (*cgraph_edge_hook)(struct cgraph_edge *, void *);
> typedef void (*cgraph_node_hook)(struct cgraph_node *, void *);
> +typedef void (*varpool_node_hook)(struct varpool_node *, void *);
> typedef void (*cgraph_2edge_hook)(struct cgraph_edge *, struct cgraph_edge *,
> void *);
> typedef void (*cgraph_2node_hook)(struct cgraph_node *, struct cgraph_node *,
> void *);
> struct cgraph_edge_hook_list;
> struct cgraph_node_hook_list;
> +struct varpool_node_hook_list;
> struct cgraph_2edge_hook_list;
> struct cgraph_2node_hook_list;
> struct cgraph_edge_hook_list *cgraph_add_edge_removal_hook (cgraph_edge_hook, void *);
> @@ -714,9 +716,15 @@ void cgraph_remove_edge_removal_hook (st
> struct cgraph_node_hook_list *cgraph_add_node_removal_hook (cgraph_node_hook,
> void *);
> void cgraph_remove_node_removal_hook (struct cgraph_node_hook_list *);
> +struct varpool_node_hook_list *varpool_add_node_removal_hook (varpool_node_hook,
> + void *);
> +void varpool_remove_node_removal_hook (struct varpool_node_hook_list *);
> struct cgraph_node_hook_list *cgraph_add_function_insertion_hook (cgraph_node_hook,
> void *);
> void cgraph_remove_function_insertion_hook (struct cgraph_node_hook_list *);
> +struct varpool_node_hook_list *varpool_add_variable_insertion_hook (varpool_node_hook,
> + void *);
> +void varpool_remove_variable_insertion_hook (struct varpool_node_hook_list *);
> void cgraph_call_function_insertion_hooks (struct cgraph_node *node);
> struct cgraph_2edge_hook_list *cgraph_add_edge_duplication_hook (cgraph_2edge_hook, void *);
> void cgraph_remove_edge_duplication_hook (struct cgraph_2edge_hook_list *);
> Index: varpool.c
> ===================================================================
> --- varpool.c (revision 202364)
> +++ varpool.c (working copy)
> @@ -36,6 +36,100 @@ along with GCC; see the file COPYING3.
> #include "tree-flow.h"
> #include "flags.h"
>
> +/* List of hooks triggered on varpool_node events. */
> +struct varpool_node_hook_list {
> + varpool_node_hook hook;
> + void *data;
> + struct varpool_node_hook_list *next;
> +};
> +
> +/* List of hooks triggered when a node is removed. */
> +struct varpool_node_hook_list *first_varpool_node_removal_hook;
> +/* List of hooks triggered when an variable is inserted. */
> +struct varpool_node_hook_list *first_varpool_variable_insertion_hook;
> +
> +/* Register HOOK to be called with DATA on each removed node. */
> +struct varpool_node_hook_list *
> +varpool_add_node_removal_hook (varpool_node_hook hook, void *data)
> +{
> + struct varpool_node_hook_list *entry;
> + struct varpool_node_hook_list **ptr = &first_varpool_node_removal_hook;
> +
> + entry = (struct varpool_node_hook_list *) xmalloc (sizeof (*entry));
> + entry->hook = hook;
> + entry->data = data;
> + entry->next = NULL;
> + while (*ptr)
> + ptr = &(*ptr)->next;
> + *ptr = entry;
> + return entry;
> +}
> +
> +/* Remove ENTRY from the list of hooks called on removing nodes. */
> +void
> +varpool_remove_node_removal_hook (struct varpool_node_hook_list *entry)
> +{
> + struct varpool_node_hook_list **ptr = &first_varpool_node_removal_hook;
> +
> + while (*ptr != entry)
> + ptr = &(*ptr)->next;
> + *ptr = entry->next;
> + free (entry);
> +}
> +
> +/* Call all node removal hooks. */
> +static void
> +varpool_call_node_removal_hooks (struct varpool_node *node)
> +{
> + struct varpool_node_hook_list *entry = first_varpool_node_removal_hook;
> + while (entry)
> + {
> + entry->hook (node, entry->data);
> + entry = entry->next;
> + }
> +}
> +
> +/* Register HOOK to be called with DATA on each inserted node. */
> +struct varpool_node_hook_list *
> +varpool_add_variable_insertion_hook (varpool_node_hook hook, void *data)
> +{
> + struct varpool_node_hook_list *entry;
> + struct varpool_node_hook_list **ptr = &first_varpool_variable_insertion_hook;
> +
> + entry = (struct varpool_node_hook_list *) xmalloc (sizeof (*entry));
> + entry->hook = hook;
> + entry->data = data;
> + entry->next = NULL;
> + while (*ptr)
> + ptr = &(*ptr)->next;
> + *ptr = entry;
> + return entry;
> +}
> +
> +/* Remove ENTRY from the list of hooks called on inserted nodes. */
> +void
> +varpool_remove_variable_insertion_hook (struct varpool_node_hook_list *entry)
> +{
> + struct varpool_node_hook_list **ptr = &first_varpool_variable_insertion_hook;
> +
> + while (*ptr != entry)
> + ptr = &(*ptr)->next;
> + *ptr = entry->next;
> + free (entry);
> +}
> +
> +/* Call all node insertion hooks. */
> +void
> +varpool_call_variable_insertion_hooks (struct varpool_node *node)
> +{
> + struct varpool_node_hook_list *entry = first_varpool_variable_insertion_hook;
> + while (entry)
> + {
> + entry->hook (node, entry->data);
> + entry = entry->next;
> + }
> +}
> +
> /* Allocate new callgraph node and insert it into basic data structures. */
>
> struct varpool_node *
> @@ -65,8 +159,9 @@ varpool_node_for_decl (tree decl)
> void
> varpool_remove_node (struct varpool_node *node)
> {
> - symtab_unregister_node ((symtab_node)node);
> tree init;
> + varpool_call_node_removal_hooks (node);
> + symtab_unregister_node ((symtab_node)node);
>
> /* Because we remove references from external functions before final compilation,
> we may end up removing useful constructors.
> @@ -246,6 +341,7 @@ varpool_add_new_variable (tree decl)
> struct varpool_node *node;
> varpool_finalize_decl (decl);
> node = varpool_node_for_decl (decl);
> + varpool_call_variable_insertion_hooks (node);
> if (varpool_externally_visible_p (node))
> node->symbol.externally_visible = true;
> }
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: Add varpool node removal/insertion hooks
2013-09-08 15:08 ` Gabriel Dos Reis
@ 2013-09-08 15:55 ` Jan Hubicka
2013-09-08 16:13 ` Gabriel Dos Reis
0 siblings, 1 reply; 4+ messages in thread
From: Jan Hubicka @ 2013-09-08 15:55 UTC (permalink / raw)
To: Gabriel Dos Reis; +Cc: Jan Hubicka, gcc-patches
> On Sun, Sep 8, 2013 at 9:23 AM, Jan Hubicka <hubicka@ucw.cz> wrote:
> > Hi,
> > this patch adds API for varpool node removal/insertion hooks that are fully symmetric
> > to cgraph code.
> >
> > Bootstrapped/regtested x86_64-linux after working around PR58340, will commit it shortly.
>
> Hi Honza,
>
> I can't bootstrap trunk at the moment on x86_64-linux. How did you
> get past that?
I attached my workaround to http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58340
Honza
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: Add varpool node removal/insertion hooks
2013-09-08 15:55 ` Jan Hubicka
@ 2013-09-08 16:13 ` Gabriel Dos Reis
0 siblings, 0 replies; 4+ messages in thread
From: Gabriel Dos Reis @ 2013-09-08 16:13 UTC (permalink / raw)
To: Jan Hubicka; +Cc: gcc-patches
On Sun, Sep 8, 2013 at 9:58 AM, Jan Hubicka <hubicka@ucw.cz> wrote:
>> On Sun, Sep 8, 2013 at 9:23 AM, Jan Hubicka <hubicka@ucw.cz> wrote:
>> > Hi,
>> > this patch adds API for varpool node removal/insertion hooks that are fully symmetric
>> > to cgraph code.
>> >
>> > Bootstrapped/regtested x86_64-linux after working around PR58340, will commit it shortly.
>>
>> Hi Honza,
>>
>> I can't bootstrap trunk at the moment on x86_64-linux. How did you
>> get past that?
>
> I attached my workaround to http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58340
>
> Honza
Thank you.
-- Gaby
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2013-09-08 15:57 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-09-08 14:58 Add varpool node removal/insertion hooks Jan Hubicka
2013-09-08 15:08 ` Gabriel Dos Reis
2013-09-08 15:55 ` Jan Hubicka
2013-09-08 16:13 ` Gabriel Dos Reis
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).