https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85774

--- Comment #9 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
So, can't we somewhere in:
              /* Find best representative of the partition.
                 Prefer those with DECL_NAME, even better
                 satisfying asan_protect_stack_decl predicate.  */
              for (j = i; j != EOC; j = stack_vars[j].next)
                if (asan_protect_stack_decl (stack_vars[j].decl)
                    && DECL_NAME (stack_vars[j].decl))
                  {
                    repr_decl = stack_vars[j].decl;
                    break;
                  }
                else if (repr_decl == NULL_TREE
                         && DECL_P (stack_vars[j].decl)
                         && DECL_NAME (stack_vars[j].decl))
                  repr_decl = stack_vars[j].decl;
              if (repr_decl == NULL_TREE)
                repr_decl = stack_vars[i].decl;
              data->asan_decl_vec.safe_push (repr_decl);
code tell the asan.c code about the whole partition, essentially
after picking up the representative, essentially do:
              if (asan_handled_variables
                  && !asan_handled_variables->contains (repr_decl))
                {
                  for (j = i; j != EOC; j = stack_vars[j].next)
                    if (asan_handled_variables->contains (stack_vars[j].decl))
                      break;
                  if (j != EOC)
                    asan_handled_variables->add (repr_decl);
                }
, i.e. if any variable in the partition was ever poisoned, make sure the
representative is unpoisoned?
Of course, asan_handled_variables is private to asan.c and EOC and the way the
vars are chained is cfgexpand.c's private thing, so it might need some wrapping
into asan.c APIs that cfgexpand.c can call.

Reply via email to