Hi,
based on the discussion, this is change I would like to do to the
passmanager. I am sending the header change only first, because the
actual change will need updating all PM datastructure initializers and
compensate testsuite and documentation for the removal of RTL dump
letters so I would rather do that just once. Does this seem OK?
The patch include the read/write methods that will be just placeholders
on mainline. Naturally I can remove them for time being at least as
long as we think the RTL_PASS/TREE_PASS macros are good idea. I can
quite easilly see that those are stepping back from plan not making
passmanager poluted by ugly macros, but on the other hand since the PM
is now doing RTL/IPA/tree passes it needs at least a little of
flexibility to be able update API of one without affecting others.
Alternative would be some simple inheriatance scheme: have the common
fields in one structure and derrived tree/ipa/RTL pass structures.
It complicates passes.c somewhat but I can definitly do that.
Jan
Index: tree-pass.h
===================================================================
*** tree-pass.h (revision 133036)
--- tree-pass.h (working copy)
*************** extern const char *dump_file_name;
*** 88,93 ****
--- 88,97 ----
/* Return the dump_file_info for the given phase. */
extern struct dump_file_info *get_dump_file_info (enum tree_dump_index);
+ /* Forward declare so we don't need to bring in cgraph and varpool include.
*/
+ struct cgraph_node;
+ struct varpool_node;
+
/* Describe one pass. */
struct tree_opt_pass
{
*************** struct tree_opt_pass
*** 98,108 ****
--- 102,129 ----
the function returns true. */
bool (*gate) (void);
+ /* IPA passes can analyze function body and variable initializers using this
+ hook and produce summary. */
+ void (*function_generate_summary) (struct cgraph_node *);
+ void (*variable_generate_summary) (struct varpool_node *);
+
+ /* These hooks will be used to serialize IPA summaries on disk. For a
moment
+ they are just placeholders. */
+ void (*function_write_summary) (struct cgraph_node *);
+ void (*variable_write_summary) (struct varpool_node *);
+ void (*function_read_summary) (struct cgraph_node *);
+ void (*variable_read_summary) (struct varpool_node *);
+
/* This is the code to run. If null, then there should be sub-passes
otherwise this pass does nothing. The return value contains
TODOs to execute in addition to those in TODO_flags_finish. */
unsigned int (*execute) (void);
+ /* Results of interprocedural propagation of an IPA pass is applied to
+ function body via this hook. */
+ void (*function_transform) (struct cgraph_node *);
+ void (*variable_transform) (struct varpool_node *);
+
/* A list of sub-passes to run, dependent on gate predicate. */
struct tree_opt_pass *sub;
*************** struct tree_opt_pass
*** 124,134 ****
/* Flags indicating common sets things to do before and after. */
unsigned int todo_flags_start;
unsigned int todo_flags_finish;
-
- /* Letter for RTL dumps. */
- char letter;
};
/* Define a tree dump switch. */
struct dump_file_info
{
--- 145,166 ----
/* Flags indicating common sets things to do before and after. */
unsigned int todo_flags_start;
unsigned int todo_flags_finish;
};
+ /* RTL and tree passes are using just some of the hooks. The macros makes
+ it easier to add more hooks for different passes in future. */
+ #define RTL_PASS(execute) NULL, NULL, NULL, NULL, execute, NULL, NULL
+ #define TREE_PASS(execute) NULL, NULL, NULL, NULL, execute, NULL, NULL
+ /* IPA passes not using the generate_summary/execute/transform scheme and thus
+ not scalable for whole program optimization can use just execute hook. */
+ #define SIMPLE_IPA_PASS(execute) NULL, NULL, NULL, NULL, execute, NULL, NULL
+
+ #define IPA_PASS_GENERATE_SUMMARY(fun,var) fun,var,
+ #define IPA_PASS_WRITE(fun,var) fun,var,
+ #define IPA_PASS_READ(fun,var) fun,var,
+ #define IPA_PASS_EXECUTE(execute) execute
+ #define IPA_PASS_TRANSFORM(fun,var) fun,var,
+
/* Define a tree dump switch. */
struct dump_file_info
{
*************** struct dump_file_info
*** 138,144 ****
int flags; /* user flags */
int state; /* state of play */
int num; /* dump file number */
- int letter; /* enabling letter for RTL dumps */
};
/* Pass properties. */
--- 170,175 ----