This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
RE: [PATCH, i686] Fix for asan test failures with -m32 happened after EBX enabling in PIC mode
- From: "Zamyatin, Igor" <igor dot zamyatin at intel dot com>
- To: "H.J. Lu" <hjl dot tools at gmail dot com>
- Cc: Jeff Law <law at redhat dot com>, "GCC Patches (gcc-patches at gcc dot gnu dot org)" <gcc-patches at gcc dot gnu dot org>
- Date: Fri, 14 Nov 2014 17:05:57 +0000
- Subject: RE: [PATCH, i686] Fix for asan test failures with -m32 happened after EBX enabling in PIC mode
- Authentication-results: sourceware.org; auth=none
- References: <0EFAB2BDD0F67E4FB6CCC8B9F87D756969C18BCF at IRSMSX101 dot ger dot corp dot intel dot com> <5453D872 dot 3070402 at redhat dot com> <0EFAB2BDD0F67E4FB6CCC8B9F87D756969C25D63 at IRSMSX101 dot ger dot corp dot intel dot com> <CAMe9rOqpMiQ_=4QfyFGkhgr6S8JEj4midmDgEoWss=Nj4wNnjw at mail dot gmail dot com> <0EFAB2BDD0F67E4FB6CCC8B9F87D756969C5240E at IRSMSX101 dot ger dot corp dot intel dot com> <CAMe9rOr4_qFMaH8hPW401Z+S73rpGsr=58hUferw2Sr6iVtoGg at mail dot gmail dot com>
> On Fri, Nov 14, 2014 at 8:59 AM, Zamyatin, Igor <igor.zamyatin@intel.com>
> wrote:
> >> >> >
> >> >> > ChangeLog:
> >> >> >
> >> >> > 2014-10-30 Igor Zamyatin <igor.zamyatin@intel.com>
> >> >> >
> >> >> > * function.c (assign_parms): Move init of pic_offset_table_rtx
> >> >> > from here to...
> >> >> > * cfgexpand.c (expand_used_vars): ...here.
> >> >> The patch is probably fine. However, it would be good to have the
> >> >> analysis why you want to move initialization of the PIC register earlier.
> >> >
> >> > Asan (and anybody else can) emits global variable(s) in
> >> > expand_used_vars
> >> during function expanding while pic reg is currently initialized
> >> later, during expand_function_start in assign_parms thus to be late
> >> in asan case in PIC mode.
> >> >
> >> > So to avoid such cases we put pic reg initialization in the
> >> > beginning of
> >> expand_used_vars. This seems to be early enough.
> >> >
> >>
> >> Please mention PR in ChangeLog and add a few testcases so that the
> >> fix will be tested on Linux.
> >>
> >
> > Bootstrapped and regtested on x86_64 and i686 incl pic mode.
> > Is it ok?
> >
> > Thanks,
> > Igor
> >
> > gcc/Changelog:
> >
> > 2014-11-14 Igor Zamyatin <igor.zamyatin@intel.com>
> >
> > PR sanitizer/63845
> > * function.c (assign_parms): Move init of pic_offset_table_rtx
> > from here to...
> > * cfgexpand.c (expand_used_vars): ...here.
> >
> > gcc/testsuite/Changelog:
> >
> > 2014-11-14 Igor Zamyatin <igor.zamyatin@intel.com>
> >
> > PR sanitizer/63845
> > * gcc.target/i386/pr63845.c: New test.
> >
> >
> >
> > diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c index 15d7638..bcd3b35
> > 100644
> > --- a/gcc/cfgexpand.c
> > +++ b/gcc/cfgexpand.c
> > @@ -1722,6 +1722,9 @@ expand_used_vars (void)
> >
> > init_vars_expansion ();
> >
> > + if (targetm.use_pseudo_pic_reg ())
> > + pic_offset_table_rtx = gen_reg_rtx (Pmode);
> > +
> > hash_map<tree, tree> ssa_name_decls;
> > for (i = 0; i < SA.map->num_partitions; i++)
> > {
> > diff --git a/gcc/function.c b/gcc/function.c index ef98091..97e0b79
> > 100644
> > --- a/gcc/function.c
> > +++ b/gcc/function.c
> > @@ -3679,11 +3679,6 @@ assign_parms (tree fndecl)
> >
> > fnargs.release ();
> >
> > - /* Initialize pic_offset_table_rtx with a pseudo register
> > - if required. */
> > - if (targetm.use_pseudo_pic_reg ())
> > - pic_offset_table_rtx = gen_reg_rtx (Pmode);
> > -
> > /* Output all parameter conversion instructions (possibly including calls)
> > now that all parameters have been copied out of hard registers. */
> > emit_insn (all.first_conversion_insn); diff --git
> > a/gcc/testsuite/gcc.target/i386/pr63845.c
> > b/gcc/testsuite/gcc.target/i386/pr63845.c
> > new file mode 100644
> > index 0000000..4b675e0
> > --- /dev/null
> > +++ b/gcc/testsuite/gcc.target/i386/pr63845.c
> > @@ -0,0 +1,20 @@
> > +/* PR sanitizer/63845 */
> > +/* { dg-do compile } */
> > +/* { dg-require-effective-target ia32 } */
> > +/* { dg-require-effective-target fpic } */
> > +/* { dg-skip-if "No Windows PIC" { *-*-mingw* *-*-cygwin } { "*" } {
> > +"" } } */
> > +/* { dg-options "-fPIC" } */
> > +
> > +int __attribute__ ((noinline, noclone)) foo (void *p) {
> > + return *(int*)p;
> > +}
> > +
> > +int main ()
> > +{
> > + char a = 0;
> > + foo (&a);
> > + return 0;
> > +}
> > +
> >
>
> Will this test fail on Linux without your fix? Doesn't testcase need -
> fsanitize=address to fail?
Sure, you're right, will add it
Thanks,
Igor
>
>
> --
> H.J.