Commit b57e6e18 by H.J. Lu Committed by H.J. Lu

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.

From-SVN: r234295
parent 91106e84
2016-03-17 H.J. Lu <hongjiu.lu@intel.com>
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.
2016-03-17 Joern Rennecke <joern.rennecke@embecosm.com> 2016-03-17 Joern Rennecke <joern.rennecke@embecosm.com>
* config/i386/i386.md (*movv4qicc_insn+1..36): Pass * config/i386/i386.md (*movv4qicc_insn+1..36): Pass
......
...@@ -1840,7 +1840,7 @@ Common Report Var(flag_peephole2) Optimization ...@@ -1840,7 +1840,7 @@ Common Report Var(flag_peephole2) Optimization
Enable an RTL peephole pass before sched2. Enable an RTL peephole pass before sched2.
fPIC 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). Generate position-independent code if possible (large mode).
fPIE fPIE
...@@ -1848,7 +1848,7 @@ Common Report Var(flag_pie,2) Negative(fpic) Init(-1) ...@@ -1848,7 +1848,7 @@ Common Report Var(flag_pie,2) Negative(fpic) Init(-1)
Generate position-independent code for executables if possible (large mode). Generate position-independent code for executables if possible (large mode).
fpic 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). Generate position-independent code if possible (small mode).
fpie fpie
......
...@@ -766,13 +766,18 @@ finish_options (struct gcc_options *opts, struct gcc_options *opts_set, ...@@ -766,13 +766,18 @@ finish_options (struct gcc_options *opts, struct gcc_options *opts_set,
default value. */ default value. */
if (opts->x_flag_pie == -1) 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; opts->x_flag_pie = DEFAULT_FLAG_PIE;
else else
opts->x_flag_pie = 0; opts->x_flag_pie = 0;
} }
/* If -fPIE or -fpie is used, turn on PIC. */
if (opts->x_flag_pie) if (opts->x_flag_pie)
opts->x_flag_pic = 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) if (opts->x_flag_pic && !opts->x_flag_pie)
opts->x_flag_shlib = 1; opts->x_flag_shlib = 1;
opts->x_flag_opts_finished = true; opts->x_flag_opts_finished = true;
......
2016-03-17 H.J. Lu <hongjiu.lu@intel.com>
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.
2016-03-17 Tom de Vries <tom@codesourcery.com> 2016-03-17 Tom de Vries <tom@codesourcery.com>
* gfortran.dg/goacc/kernels-alias-3.f95: New test. * gfortran.dg/goacc/kernels-alias-3.f95: New test.
......
/* { dg-do compile { target { ! *-*-darwin* } } } */
/* { dg-options "-fpic" } */
#if __PIC__ != 1
# error __PIC__ is not 1!
#endif
#ifdef __PIE__
# error __PIE__ is defined!
#endif
/* { dg-do compile } */
/* { dg-options "-fPIC" } */
#if __PIC__ != 2
# error __PIC__ is not 2!
#endif
#ifdef __PIE__
# error __PIE__ is defined!
#endif
/* { dg-do compile { target { ! *-*-darwin* } } } */
/* { dg-options "-fno-pic" } */
#ifdef __PIC__
# error __PIC__ is defined!
#endif
#ifdef __PIE__
# error __PIE__ is defined!
#endif
/* { dg-do compile { target { ! *-*-darwin* } } } */
/* { dg-options "-fno-PIC" } */
#ifdef __PIC__
# error __PIC__ is defined!
#endif
#ifdef __PIE__
# error __PIE__ is defined!
#endif
/* { 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
/* { dg-do compile } */
/* { dg-options "-fPIE" } */
#if __PIC__ != 2
# error __PIC__ is not 2!
#endif
#if __PIE__ != 2
# error __PIE__ is not 2!
#endif
/* { dg-do compile { target { ! *-*-darwin* } } } */
/* { dg-options "-fno-pie" } */
#ifdef __PIC__
# error __PIC__ is defined!
#endif
#ifdef __PIE__
# error __PIE__ is defined!
#endif
/* { dg-do compile { target { ! *-*-darwin* } } } */
/* { dg-options "-fno-PIE" } */
#ifdef __PIC__
# error __PIC__ is defined!
#endif
#ifdef __PIE__
# error __PIE__ is defined!
#endif
/* { dg-do compile { target pie_enabled } } */
/* { dg-options "" } */
#ifndef __PIC__
# error __PIC__ is not defined!
#endif
#ifndef __PIE__
# error __PIE__ is not defined!
#endif
/* { dg-do compile { target { ! pie_enabled } } } */
/* { dg-options "" } */
#ifdef __PIE__
# error __PIE__ is defined!
#endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment