diff options
| -rw-r--r-- | gcc/ChangeLog | 5 | ||||
| -rw-r--r-- | gcc/passes.c | 17 |
2 files changed, 20 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 24e65e1..cf0c2e8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2009-12-11 Duncan Sands <baldrick@free.fr> + + * passes.c (make_pass_instance): Allocate and copy the right amount of + memory for ipa passes, which are not the same size as other passes. + 2009-12-11 Joern Rennecke <amylaar@spamcop.net> * plugin.c (get_named_event_id): Fix hash table rebuild to include diff --git a/gcc/passes.c b/gcc/passes.c index 818adde..a373a00 100644 --- a/gcc/passes.c +++ b/gcc/passes.c @@ -460,8 +460,21 @@ make_pass_instance (struct opt_pass *pass, bool track_duplicates) { struct opt_pass *new_pass; - new_pass = XNEW (struct opt_pass); - memcpy (new_pass, pass, sizeof (*new_pass)); + if (pass->type == GIMPLE_PASS + || pass->type == RTL_PASS + || pass->type == SIMPLE_IPA_PASS) + { + new_pass = XNEW (struct opt_pass); + memcpy (new_pass, pass, sizeof (struct opt_pass)); + } + else if (pass->type == IPA_PASS) + { + new_pass = (struct opt_pass *)XNEW (struct ipa_opt_pass_d); + memcpy (new_pass, pass, sizeof (struct ipa_opt_pass_d)); + } + else + gcc_unreachable (); + new_pass->next = NULL; new_pass->todo_flags_start &= ~TODO_mark_first_instance; |
