This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: PING: [PATCH] PR driver/70192: Properly set flag_pie and flag_pic


On Thu, Mar 17, 2016 at 7:55 AM, H.J. Lu <hjl.tools@gmail.com> wrote:
> On Thu, Mar 17, 2016 at 7:18 AM, Bernd Schmidt <bschmidt@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.lu@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.tools@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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]