On Sat, Dec 14, 2013 at 3:07 PM, H.J. Lu <hjl.to...@gmail.com> wrote:

>>> We can't change -fPIC underneath in x86 backend while middle-end is 
>>> unchanged.
>>> This patch restores opts->x_flag_pic from global flag_pic.  OK to install?
>>>
>>> 2013-12-12   H.J. Lu  <hongjiu...@intel.com>
>>>
>>>         PR target/59492
>>>         * config/i386/i386.c (ix86_function_specific_restore): Don't
>>>         change -fPIC.
>>
>> Is it possible to add x32 testcase from the PR without too much troubles?
>>
>
> Here is a patch with a testcase.  OK to install?
>
> 2013-12-14   H.J. Lu  <hongjiu...@intel.com>
>
>     PR target/59492
>     * config/i386/i386.c (ix86_function_specific_restore): Don't
>     change -fPIC.
>
> gcc/testsuite/
>
> 2013-12-14   H.J. Lu  <hongjiu...@intel.com>
>
>     PR target/59492
>     * g++.dg/ext/pr59492.C: New file.

OK for mainline, with some testcase changes below.

> diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
> index 1b962e1..b8172c3 100644
> --- a/gcc/config/i386/i386.c
> +++ b/gcc/config/i386/i386.c
> @@ -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;
> diff --git a/gcc/testsuite/g++.dg/ext/pr59492.C
> b/gcc/testsuite/g++.dg/ext/pr59492.C
> new file mode 100644
> index 0000000..f626b6b
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/ext/pr59492.C

Please put this test to g++.dg/other/... directory.

> @@ -0,0 +1,18 @@
> +// { dg-options "-mx32 -fPIC" }
> +// { dg-do assemble { target i?86-*-* x86_64-*-* } }

// { dg-do assemble { target { { i?86-*-* x86_64-*-* } && fpic } } }

(also, please put dg-options after dg-do directive).

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

Thanks,
Uros.

Reply via email to