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

Zamyatin, Igor igor.zamyatin@intel.com
Fri Nov 14 17:01:00 GMT 2014


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



More information about the Gcc-patches mailing list