diff mbox

[i686] Fix for asan test failures with -m32 happened after EBX enabling in PIC mode

Message ID 0EFAB2BDD0F67E4FB6CCC8B9F87D756969C5240E@IRSMSX101.ger.corp.intel.com
State New
Headers show

Commit Message

Zamyatin, Igor Nov. 14, 2014, 4:59 p.m. UTC
> >> >

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

Comments

H.J. Lu Nov. 14, 2014, 5:04 p.m. UTC | #1
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?
Zamyatin, Igor Nov. 14, 2014, 5:05 p.m. UTC | #2
> 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.
Jakub Jelinek Nov. 14, 2014, 5:10 p.m. UTC | #3
On Fri, Nov 14, 2014 at 05:05:57PM +0000, Zamyatin, Igor wrote:
> > > --- /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

It is not that easy, -fsanitize=address is not supported everywhere.
Better if you stick it into testsuite/gcc.dg/asan/
No point adding effective-target ia32/fpic, there is nothing i?86 specific,
not even ix86/x86_64 specific, nor pic specific in the test, just use
/* { dg-additional-options "-fPIC" { target fpic } } */

	Jakub
diff mbox

Patch

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;
+}
+