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 ----