This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: PING: [PATCH] PR driver/70192: Properly set flag_pie and flag_pic
- From: "H.J. Lu" <hjl dot tools at gmail dot com>
- To: Bernd Schmidt <bschmidt at redhat dot com>
- Cc: GCC Patches <gcc-patches at gcc dot gnu dot org>, Joseph Myers <joseph at codesourcery dot com>
- Date: Thu, 17 Mar 2016 08:06:45 -0700
- Subject: Re: PING: [PATCH] PR driver/70192: Properly set flag_pie and flag_pic
- Authentication-results: sourceware.org; auth=none
- References: <CAMe9rOpcNKKO0f-YwLcmAV+CXDwErrdevRKi3a638kDm3XhtUw at mail dot gmail dot com> <56EABCA9 dot 80505 at redhat dot com> <CAMe9rOojkNqd18U4pFZ3EP_upHn4BjUb4CwYJ5mpAFgDxyiVrg at mail dot gmail dot com>
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