Ping. 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. > > OK for trunk? > > > H.J. > --- > 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 | 10 ++++++++++ > 12 files changed, 108 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..7eb0765 > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/pic-1.c > @@ -0,0 +1,10 @@ > +/* { dg-do compile } */ > +/* { 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..d7d861b > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/pic-3.c > @@ -0,0 +1,10 @@ > +/* { dg-do compile } */ > +/* { 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..732f61f > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/pic-4.c > @@ -0,0 +1,10 @@ > +/* { dg-do compile } */ > +/* { 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..ff6281f > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/pie-1.c > @@ -0,0 +1,10 @@ > +/* { dg-do compile } */ > +/* { 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..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-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..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 > -- > 2.5.0 >
-- H.J.