On Thu, Mar 17, 2016 at 7:55 AM, H.J. Lu <hjl.to...@gmail.com> wrote: > On Thu, Mar 17, 2016 at 7:18 AM, Bernd Schmidt <bschm...@redhat.com> wrote: >> On 03/17/2016 02:59 PM, H.J. Lu wrote: >>> >>> On Fri, Mar 11, 2016 at 9:09 AM, H.J. Lu <hongjiu...@intel.com> wrote: >>>> >>>> We can't set flag_pie to the default when flag_pic == 0, which may be >>>> set by -fno-pic or -fno-PIC, since the default value of flag_pie is >>>> non-zero when GCC is configured with --enable-default-pie. We need >>>> to initialize flag_pic to -1 so that we can tell if -fpic, -fPIC, >>>> -fno-pic or -fno-PIC is used. >> >> >>>> PR driver/70192 >>>> * opts.c (finish_options): Don't set flag_pie to the default if >>>> -fpic, -fPIC, -fno-pic or -fno-PIC is used. Set flag_pic to 0 >>>> if it is -1. >> >> >> I think this part is ok. >> >>>> diff --git a/gcc/testsuite/gcc.dg/pie-2.c b/gcc/testsuite/gcc.dg/pie-2.c >>>> new file mode 100644 >>>> index 0000000..e185e51 >>>> --- /dev/null >>>> +++ b/gcc/testsuite/gcc.dg/pie-2.c >>>> @@ -0,0 +1,10 @@ >>>> +/* { dg-do compile } */ >>>> +/* { dg-options "-fPIE" } */ >>>> + >>>> +#if __PIC__ != 2 >>>> +# error __PIC__ is not 2! >>>> +#endif >>>> + >>>> +#if __PIE__ != 2 >>>> +# error __PIE__ is not 2! >>>> +#endif >> >> >> In normal code that should probably use the "__PIC__ - 0" trick to guard >> against cases where the macro isn't defined, but I suppose we'd be getting >> an error in that case as well. >> >> >>>> diff --git a/gcc/testsuite/gcc.dg/pie-3.c b/gcc/testsuite/gcc.dg/pie-3.c >>>> new file mode 100644 >>>> index 0000000..fe46c98 >>>> --- /dev/null >>>> +++ b/gcc/testsuite/gcc.dg/pie-3.c >>>> @@ -0,0 +1,10 @@ >>>> +/* { dg-do compile } */ >>>> +/* { dg-options "-fno-pie" } */ >>>> + >>>> +#ifdef __PIC__ >>>> +# error __PIC__ is defined! >>>> +#endif >>>> + >>>> +#ifdef __PIE__ >>>> +# error __PIE__ is defined! >>>> +#endif >>>> diff --git a/gcc/testsuite/gcc.dg/pie-4.c b/gcc/testsuite/gcc.dg/pie-4.c >>>> new file mode 100644 >>>> index 0000000..977baf0 >>>> --- /dev/null >>>> +++ b/gcc/testsuite/gcc.dg/pie-4.c >>>> @@ -0,0 +1,10 @@ >>>> +/* { dg-do compile } */ >>>> +/* { dg-options "-fno-PIE" } */ >>>> + >>>> +#ifdef __PIC__ >>>> +# error __PIC__ is defined! >>>> +#endif >>>> + >>>> +#ifdef __PIE__ >>>> +# error __PIE__ is defined! >>>> +#endif >> >>>> diff --git a/gcc/testsuite/gcc.dg/pie-6.c b/gcc/testsuite/gcc.dg/pie-6.c >>>> new file mode 100644 >>>> index 0000000..85529a8 >>>> --- /dev/null >>>> +++ b/gcc/testsuite/gcc.dg/pie-6.c >>>> @@ -0,0 +1,10 @@ >>>> +/* { dg-do compile { target { ! pie_enabled } } } */ >>>> +/* { dg-options "" } */ >>>> + >>>> +#ifdef __PIC__ >>>> +# error __PIC__ is defined! >>>> +#endif >>>> + >>>> +#ifdef __PIE__ >>>> +# error __PIE__ is defined! >>>> +#endif >> >> These I'm not so sure about. I could imagine there are targets where pic is >> the default. I'd remove these tests or the test for __PIC__. So, ok with >> that change. > > Darwin is such a target. Here is a follow-up patch I was planning to > submit. But I will remove __PIC__ instead. >
This is the patch I am going to check in. Thanks. -- H.J.
From a19696e2f4e6f9734baa29c7833cd029eafa93fe Mon Sep 17 00:00:00 2001 From: "H.J. Lu" <hjl.to...@gmail.com> Date: Fri, 11 Mar 2016 09:02:56 -0800 Subject: [PATCH] Properly set flag_pie and flag_pic We can't set flag_pie to the default when flag_pic == 0, which may be set by -fno-pic or -fno-PIC, since the default value of flag_pie is non-zero when GCC is configured with --enable-default-pie. We need to initialize flag_pic to -1 so that we can tell if -fpic, -fPIC, -fno-pic or -fno-PIC is used. Since Darwin defaults to PIC (__PIC__ == 2) and the PIC setting can't be changed, skip tests of default __PIC__ and __PIE__ setting for *-*-darwin* targets. gcc/ PR driver/70192 * opts.c (finish_options): Don't set flag_pie to the default if -fpic, -fPIC, -fno-pic or -fno-PIC is used. Set flag_pic to 0 if it is -1. gcc/testsuite/ PR driver/70192 * gcc.dg/pic-1.c: New test. * gcc.dg/pic-2.c: Likewise. * gcc.dg/pic-3.c: Likewise. * gcc.dg/pic-4.c: Likewise. * gcc.dg/pie-1.c: Likewise. * gcc.dg/pie-2.c: Likewise. * gcc.dg/pie-3.c: Likewise. * gcc.dg/pie-4.c: Likewise. * gcc.dg/pie-5.c: Likewise. * gcc.dg/pie-6.c: Likewise. --- gcc/common.opt | 4 ++-- gcc/opts.c | 7 ++++++- gcc/testsuite/gcc.dg/pic-1.c | 10 ++++++++++ gcc/testsuite/gcc.dg/pic-2.c | 10 ++++++++++ gcc/testsuite/gcc.dg/pic-3.c | 10 ++++++++++ gcc/testsuite/gcc.dg/pic-4.c | 10 ++++++++++ gcc/testsuite/gcc.dg/pie-1.c | 10 ++++++++++ gcc/testsuite/gcc.dg/pie-2.c | 10 ++++++++++ gcc/testsuite/gcc.dg/pie-3.c | 10 ++++++++++ gcc/testsuite/gcc.dg/pie-4.c | 10 ++++++++++ gcc/testsuite/gcc.dg/pie-5.c | 10 ++++++++++ gcc/testsuite/gcc.dg/pie-6.c | 6 ++++++ 12 files changed, 104 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pic-1.c create mode 100644 gcc/testsuite/gcc.dg/pic-2.c create mode 100644 gcc/testsuite/gcc.dg/pic-3.c create mode 100644 gcc/testsuite/gcc.dg/pic-4.c create mode 100644 gcc/testsuite/gcc.dg/pie-1.c create mode 100644 gcc/testsuite/gcc.dg/pie-2.c create mode 100644 gcc/testsuite/gcc.dg/pie-3.c create mode 100644 gcc/testsuite/gcc.dg/pie-4.c create mode 100644 gcc/testsuite/gcc.dg/pie-5.c create mode 100644 gcc/testsuite/gcc.dg/pie-6.c diff --git a/gcc/common.opt b/gcc/common.opt index 1c8cc8e..67048db 100644 --- a/gcc/common.opt +++ b/gcc/common.opt @@ -1840,7 +1840,7 @@ Common Report Var(flag_peephole2) Optimization Enable an RTL peephole pass before sched2. fPIC -Common Report Var(flag_pic,2) Negative(fPIE) +Common Report Var(flag_pic,2) Negative(fPIE) Init(-1) Generate position-independent code if possible (large mode). fPIE @@ -1848,7 +1848,7 @@ Common Report Var(flag_pie,2) Negative(fpic) Init(-1) Generate position-independent code for executables if possible (large mode). fpic -Common Report Var(flag_pic,1) Negative(fpie) +Common Report Var(flag_pic,1) Negative(fpie) Init(-1) Generate position-independent code if possible (small mode). fpie diff --git a/gcc/opts.c b/gcc/opts.c index 2f45312..0f9431a 100644 --- a/gcc/opts.c +++ b/gcc/opts.c @@ -766,13 +766,18 @@ finish_options (struct gcc_options *opts, struct gcc_options *opts_set, default value. */ if (opts->x_flag_pie == -1) { - if (opts->x_flag_pic == 0) + /* We initialize opts->x_flag_pic to -1 so that we can tell if + -fpic, -fPIC, -fno-pic or -fno-PIC is used. */ + if (opts->x_flag_pic == -1) opts->x_flag_pie = DEFAULT_FLAG_PIE; else opts->x_flag_pie = 0; } + /* If -fPIE or -fpie is used, turn on PIC. */ if (opts->x_flag_pie) opts->x_flag_pic = opts->x_flag_pie; + else if (opts->x_flag_pic == -1) + opts->x_flag_pic = 0; if (opts->x_flag_pic && !opts->x_flag_pie) opts->x_flag_shlib = 1; opts->x_flag_opts_finished = true; diff --git a/gcc/testsuite/gcc.dg/pic-1.c b/gcc/testsuite/gcc.dg/pic-1.c new file mode 100644 index 0000000..86360aa --- /dev/null +++ b/gcc/testsuite/gcc.dg/pic-1.c @@ -0,0 +1,10 @@ +/* { dg-do compile { target { ! *-*-darwin* } } } */ +/* { dg-options "-fpic" } */ + +#if __PIC__ != 1 +# error __PIC__ is not 1! +#endif + +#ifdef __PIE__ +# error __PIE__ is defined! +#endif diff --git a/gcc/testsuite/gcc.dg/pic-2.c b/gcc/testsuite/gcc.dg/pic-2.c new file mode 100644 index 0000000..2c742e9 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pic-2.c @@ -0,0 +1,10 @@ +/* { dg-do compile } */ +/* { dg-options "-fPIC" } */ + +#if __PIC__ != 2 +# error __PIC__ is not 2! +#endif + +#ifdef __PIE__ +# error __PIE__ is defined! +#endif diff --git a/gcc/testsuite/gcc.dg/pic-3.c b/gcc/testsuite/gcc.dg/pic-3.c new file mode 100644 index 0000000..7c4bbce --- /dev/null +++ b/gcc/testsuite/gcc.dg/pic-3.c @@ -0,0 +1,10 @@ +/* { dg-do compile { target { ! *-*-darwin* } } } */ +/* { dg-options "-fno-pic" } */ + +#ifdef __PIC__ +# error __PIC__ is defined! +#endif + +#ifdef __PIE__ +# error __PIE__ is defined! +#endif diff --git a/gcc/testsuite/gcc.dg/pic-4.c b/gcc/testsuite/gcc.dg/pic-4.c new file mode 100644 index 0000000..727fe14 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pic-4.c @@ -0,0 +1,10 @@ +/* { dg-do compile { target { ! *-*-darwin* } } } */ +/* { dg-options "-fno-PIC" } */ + +#ifdef __PIC__ +# error __PIC__ is defined! +#endif + +#ifdef __PIE__ +# error __PIE__ is defined! +#endif diff --git a/gcc/testsuite/gcc.dg/pie-1.c b/gcc/testsuite/gcc.dg/pie-1.c new file mode 100644 index 0000000..ca43e8b --- /dev/null +++ b/gcc/testsuite/gcc.dg/pie-1.c @@ -0,0 +1,10 @@ +/* { dg-do compile { target { ! *-*-darwin* } } } */ +/* { dg-options "-fpie" } */ + +#if __PIC__ != 1 +# error __PIC__ is not 1! +#endif + +#if __PIE__ != 1 +# error __PIE__ is not 1! +#endif diff --git a/gcc/testsuite/gcc.dg/pie-2.c b/gcc/testsuite/gcc.dg/pie-2.c new file mode 100644 index 0000000..e185e51 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pie-2.c @@ -0,0 +1,10 @@ +/* { dg-do compile } */ +/* { dg-options "-fPIE" } */ + +#if __PIC__ != 2 +# error __PIC__ is not 2! +#endif + +#if __PIE__ != 2 +# error __PIE__ is not 2! +#endif diff --git a/gcc/testsuite/gcc.dg/pie-3.c b/gcc/testsuite/gcc.dg/pie-3.c new file mode 100644 index 0000000..0ccc56b --- /dev/null +++ b/gcc/testsuite/gcc.dg/pie-3.c @@ -0,0 +1,10 @@ +/* { dg-do compile { target { ! *-*-darwin* } } } */ +/* { dg-options "-fno-pie" } */ + +#ifdef __PIC__ +# error __PIC__ is defined! +#endif + +#ifdef __PIE__ +# error __PIE__ is defined! +#endif diff --git a/gcc/testsuite/gcc.dg/pie-4.c b/gcc/testsuite/gcc.dg/pie-4.c new file mode 100644 index 0000000..f42bad3 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pie-4.c @@ -0,0 +1,10 @@ +/* { dg-do compile { target { ! *-*-darwin* } } } */ +/* { dg-options "-fno-PIE" } */ + +#ifdef __PIC__ +# error __PIC__ is defined! +#endif + +#ifdef __PIE__ +# error __PIE__ is defined! +#endif diff --git a/gcc/testsuite/gcc.dg/pie-5.c b/gcc/testsuite/gcc.dg/pie-5.c new file mode 100644 index 0000000..d49554f --- /dev/null +++ b/gcc/testsuite/gcc.dg/pie-5.c @@ -0,0 +1,10 @@ +/* { dg-do compile { target pie_enabled } } */ +/* { dg-options "" } */ + +#ifndef __PIC__ +# error __PIC__ is not defined! +#endif + +#ifndef __PIE__ +# error __PIE__ is not defined! +#endif diff --git a/gcc/testsuite/gcc.dg/pie-6.c b/gcc/testsuite/gcc.dg/pie-6.c new file mode 100644 index 0000000..fac1e94 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pie-6.c @@ -0,0 +1,6 @@ +/* { dg-do compile { target { ! pie_enabled } } } */ +/* { dg-options "" } */ + +#ifdef __PIE__ +# error __PIE__ is defined! +#endif -- 2.5.0