Restore flag_pic in ix86_function_specific_restore
authorH.J. Lu <hongjiu.lu@intel.com>
Sat, 14 Dec 2013 17:01:49 +0000 (17:01 +0000)
committerH.J. Lu <hjl@gcc.gnu.org>
Sat, 14 Dec 2013 17:01:49 +0000 (09:01 -0800)
gcc/

PR target/59492
* config/i386/i386.c (ix86_function_specific_restore): Don't
change -fPIC.

2013-12-14   H.J. Lu  <hongjiu.lu@intel.com>

PR target/59492
* g++.dg/other/pr59492.C: New file.

From-SVN: r205989

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/other/pr59492.C [new file with mode: 0644]

index 1419f14..4c68beb 100644 (file)
@@ -1,3 +1,9 @@
+2013-12-14   H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR target/59492
+       * config/i386/i386.c (ix86_function_specific_restore): Don't
+       change -fPIC.
+
 2013-12-14  Eric Botcazou  <ebotcazou@adacore.com>
 
        * var-tracking.c (add_stores): Fix oversight in latest commit.
index 2606b3b..ecf5e0b 100644 (file)
@@ -4337,6 +4337,9 @@ ix86_function_specific_restore (struct gcc_options *opts,
   unsigned int ix86_arch_mask;
   int i;
 
+  /* We don't change -fPIC.  */
+  opts->x_flag_pic = flag_pic;
+
   ix86_arch = (enum processor_type) ptr->arch;
   ix86_schedule = (enum attr_cpu) ptr->schedule;
   ix86_tune = (enum processor_type) ptr->tune;
index 6b5e0e8..7820c93 100644 (file)
@@ -1,3 +1,8 @@
+2013-12-14   H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR target/59492
+       * g++.dg/other/pr59492.C: New file.
+
 2013-12-14  Andreas Schwab  <schwab@linux-m68k.org>
 
        * g++.dg/cilk-plus/cilk-plus.exp: Fix last change.
diff --git a/gcc/testsuite/g++.dg/other/pr59492.C b/gcc/testsuite/g++.dg/other/pr59492.C
new file mode 100644 (file)
index 0000000..84bd255
--- /dev/null
@@ -0,0 +1,18 @@
+// { dg-do assemble { target { { i?86-*-* x86_64-*-* } && fpic } } }
+// { dg-options "-mx32 -fPIC" }
+// { dg-require-ifunc "" }
+// { dg-require-effective-target maybe_x32 }
+
+void
+__throw_runtime_error(const char*) __attribute__((__noreturn__));
+unsigned int
+__attribute__ ((target("rdrnd")))
+__x86_rdrand(void)
+{
+  unsigned int retries = 100;
+  unsigned int val;
+  while (__builtin_ia32_rdrand32_step(&val) == 0)
+    if (--retries == 0)
+      __throw_runtime_error(("random_device::__x86_rdrand(void)"));
+  return val;
+}