Re: [PATCH] arm: Force flag_pic for FDPIC

2024-09-27 Thread rep . dot . nop
On 26 September 2024 20:51:55 CEST, Fangrui Song  wrote:
>On Thu, Sep 26, 2024 at 11:21 AM Ramana Radhakrishnan
> wrote:
>>
>> On Mon, Mar 4, 2024 at 1:43 PM Fangrui Song  wrote:
>> >
>> > From: Fangrui Song 
>> >
>> > -fno-pic -mfdpic generated code is like regular -fno-pic, not suitable
>> > for FDPIC (absolute addressing for symbol references and no function
>> > descriptor).  The sh port simply upgrades -fno-pic to -fpie by setting
>> > flag_pic.  Let's follow suit.
>> >
>> > Link: 
>> > https://inbox.sourceware.org/gcc-patches/20150913165303.gc17...@brightrain.aerifal.cx/
>> >
>> > gcc/ChangeLog:
>> >
>> > * config/arm/arm.cc (arm_option_override): Set flag_pic if
>> >   TARGET_FDPIC.
>> >
>> > gcc/testsuite/ChangeLog:
>> >
>> > * gcc.target/arm/fdpic-pie.c: New test.
>> > ---
>> >  gcc/config/arm/arm.cc|  6 +
>> >  gcc/testsuite/gcc.target/arm/fdpic-pie.c | 30 
>> >  2 files changed, 36 insertions(+)
>> >  create mode 100644 gcc/testsuite/gcc.target/arm/fdpic-pie.c
>> >
>> > diff --git a/gcc/config/arm/arm.cc b/gcc/config/arm/arm.cc
>> > index 1cd69268ee9..f2fd3cce48c 100644
>> > --- a/gcc/config/arm/arm.cc
>> > +++ b/gcc/config/arm/arm.cc
>> > @@ -3682,6 +3682,12 @@ arm_option_override (void)
>> >arm_pic_register = FDPIC_REGNUM;
>> >if (TARGET_THUMB1)
>> > sorry ("FDPIC mode is not supported in Thumb-1 mode");
>> > +
>> > +  /* FDPIC code is a special form of PIC, and the vast majority of 
>> > code
>> > +generation constraints that apply to PIC also apply to FDPIC, so 
>> > we
>> > + set flag_pic to avoid the need to check TARGET_FDPIC everywhere
>> > + flag_pic is checked. */
>> > +  flag_pic = 2;
>> >  }
>>
>> Been a while since I looked at this stuff but should this not be
>> flag_pie being set rather than flag_pic here if the expectation is to
>> turn -fno-PIC -mfdpic into fPIE ?
>
>I think flag_pic determines the PIC/PIE vs no-PIC difference
>while flag_shlib determines the PIC vs PIE difference (whether
>non-local default linkage symbol might bind externally).
>
>Setting flag_pic here is correct.

indeed.
pic 2 lgtm
thanks

>
>>
>> >
>> >if (arm_pic_register_string != NULL)
>> > diff --git a/gcc/testsuite/gcc.target/arm/fdpic-pie.c 
>> > b/gcc/testsuite/gcc.target/arm/fdpic-pie.c
>> > new file mode 100644
>> > index 000..909db8bce74
>> > --- /dev/null
>> > +++ b/gcc/testsuite/gcc.target/arm/fdpic-pie.c
>> > @@ -0,0 +1,30 @@
>> > +// { dg-do compile }
>> > +// { dg-options "-O2 -fno-pic -mfdpic" }
>> > +// { dg-skip-if "-mpure-code and -fPIC incompatible" { *-*-* } { 
>> > "-mpure-code" } }
>> > +
>> > +__attribute__((visibility("hidden"))) void hidden_fun(void);
>> > +void fun(void);
>> > +__attribute__((visibility("hidden"))) extern int hidden_var;
>> > +extern int var;
>> > +__attribute__((visibility("hidden"))) const int ro_hidden_var = 42;
>> > +
>> > +// { dg-final { scan-assembler "hidden_fun\\(GOTOFFFUNCDESC\\)" } }
>> > +void *addr_hidden_fun(void) { return hidden_fun; }
>> > +
>> > +// { dg-final { scan-assembler "fun\\(GOTFUNCDESC\\)" } }
>> > +void *addr_fun(void) { return fun; }
>> > +
>> > +// { dg-final { scan-assembler "hidden_var\\(GOT\\)" } }
>> > +void *addr_hidden_var(void) { return &hidden_var; }
>> > +
>> > +// { dg-final { scan-assembler "var\\(GOT\\)" } }
>> > +void *addr_var(void) { return &var; }
>> > +
>> > +// { dg-final { scan-assembler ".LANCHOR0\\(GOT\\)" } }
>> > +const int *addr_ro_hidden_var(void) { return &ro_hidden_var; }
>> > +
>> > +// { dg-final { scan-assembler "hidden_var\\(GOT\\)" } }
>> > +int read_hidden_var(void) { return hidden_var; }
>> > +
>> > +// { dg-final { scan-assembler "var\\(GOT\\)" } }
>> > +int read_var(void) { return var; }
>> > --
>> > 2.44.0.rc1.240.g4c46232300-goog
>> >
>
>
>



Re: [PATCH] arm: Force flag_pic for FDPIC

2024-09-27 Thread rep . dot . nop
On 27 September 2024 16:05:01 CEST, "Richard Earnshaw (lists)" 
 wrote:
>On 26/09/2024 19:21, Ramana Radhakrishnan wrote:
>> On Mon, Mar 4, 2024 at 1:43 PM Fangrui Song  wrote:
>>>
>>> From: Fangrui Song 
>>>
>>> -fno-pic -mfdpic generated code is like regular -fno-pic, not suitable
>>> for FDPIC (absolute addressing for symbol references and no function
>>> descriptor).  The sh port simply upgrades -fno-pic to -fpie by setting
>>> flag_pic.  Let's follow suit.
>>>
>>> Link: 
>>> https://inbox.sourceware.org/gcc-patches/20150913165303.gc17...@brightrain.aerifal.cx/
>>>
>>> gcc/ChangeLog:
>>>
>>> * config/arm/arm.cc (arm_option_override): Set flag_pic if
>>>   TARGET_FDPIC.
>>>
>>> gcc/testsuite/ChangeLog:
>>>
>>> * gcc.target/arm/fdpic-pie.c: New test.
>>> ---
>>>  gcc/config/arm/arm.cc|  6 +
>>>  gcc/testsuite/gcc.target/arm/fdpic-pie.c | 30 
>>>  2 files changed, 36 insertions(+)
>>>  create mode 100644 gcc/testsuite/gcc.target/arm/fdpic-pie.c
>>>
>>> diff --git a/gcc/config/arm/arm.cc b/gcc/config/arm/arm.cc
>>> index 1cd69268ee9..f2fd3cce48c 100644
>>> --- a/gcc/config/arm/arm.cc
>>> +++ b/gcc/config/arm/arm.cc
>>> @@ -3682,6 +3682,12 @@ arm_option_override (void)
>>>arm_pic_register = FDPIC_REGNUM;
>>>if (TARGET_THUMB1)
>>> sorry ("FDPIC mode is not supported in Thumb-1 mode");
>>> +
>>> +  /* FDPIC code is a special form of PIC, and the vast majority of code
>>> +generation constraints that apply to PIC also apply to FDPIC, so we
>>> + set flag_pic to avoid the need to check TARGET_FDPIC everywhere
>>> + flag_pic is checked. */
>>> +  flag_pic = 2;
>>>  }
>> 
>> Been a while since I looked at this stuff but should this not be
>> flag_pie being set rather than flag_pic here if the expectation is to
>> turn -fno-PIC -mfdpic into fPIE ?
>
>-fPIE implies -fPIC, but has the added implication that any definition of an 
>object we see is the one true definition and cannot be pre-empted during 
>loading (in a shared library, a definition of X may be pre-empted by another 
>definition of X in either the application itself or another shared library 
>that was loaded first).
>
>Part of the confusion comes from the manual, though:
>
>Select the FDPIC ABI, which uses 64-bit function descriptors to
>represent pointers to functions.  When the compiler is configured for
>@code{arm-*-uclinuxfdpiceabi} targets, this option is on by default
>and implies @option{-fPIE} if none of the PIC/PIE-related options is
>provided.  On other targets, it only enables the FDPIC-specific code
>generation features, and the user should explicitly provide the
>PIC/PIE-related options as needed.
>
>Which conflates things relating to the option flag and the compiler 
>configuration.  I think that needs clearing up as well.  Something like
>
>Select the FDPIC ABI, which uses 64-bit function descriptors to
>represent pointers to functions.  @option{-mfdpic} implies @option{-fPIC}.
>
>When the compiler is configured for @code{arm-*-uclinuxfdpiceabi} targets, 
>this option is on by default and the compiler defaults to @option{-fPIE}, 
>unless @option{-fPIC} is explicitly specified.
>
>might cover it, but I'm not sure I've fully untangled the web of option 
>permutations here.  Perhaps someone could tabulate the expected options 
>somewhere for clarity.

yep, I think that's about it. fore please  TIA

>
>The other option would be to error if flag_pic is not set, when -mfdpic is 
>set, which would force the user to be explicit as to which pic options they 
>want (technically the explicit combination -mno-pic -mfdpic has no meaning).

nod

>
>R.
>
>> 
>> 
>>>
>>>if (arm_pic_register_string != NULL)
>>> diff --git a/gcc/testsuite/gcc.target/arm/fdpic-pie.c 
>>> b/gcc/testsuite/gcc.target/arm/fdpic-pie.c
>>> new file mode 100644
>>> index 000..909db8bce74
>>> --- /dev/null
>>> +++ b/gcc/testsuite/gcc.target/arm/fdpic-pie.c
>>> @@ -0,0 +1,30 @@
>>> +// { dg-do compile }
>>> +// { dg-options "-O2 -fno-pic -mfdpic" }
>>> +// { dg-skip-if "-mpure-code and -fPIC incompatible" { *-*-* } { 
>>> "-mpure-code" } }
>>> +
>>> +__attribute__((visibility("hidden"))) void hidden_fun(void);
>>> +void fun(void);
>>> +__attribute__((visibility("hidden"))) extern int hidden_var;
>>> +extern int var;
>>> +__attribute__((visibility("hidden"))) const int ro_hidden_var = 42;
>>> +
>>> +// { dg-final { scan-assembler "hidden_fun\\(GOTOFFFUNCDESC\\)" } }
>>> +void *addr_hidden_fun(void) { return hidden_fun; }
>>> +
>>> +// { dg-final { scan-assembler "fun\\(GOTFUNCDESC\\)" } }
>>> +void *addr_fun(void) { return fun; }
>>> +
>>> +// { dg-final { scan-assembler "hidden_var\\(GOT\\)" } }
>>> +void *addr_hidden_var(void) { return &hidden_var; }
>>> +
>>> +// { dg-final { scan-assembler "var\\(GOT\\)" } }
>>> +void *addr_var(void) { return &var; }
>>> +
>>> +// { dg-final { scan-assembler ".LANCHOR0\\(GOT\\)" } }
>>> +const int *addr_

Re: [PATCH] arm: Force flag_pic for FDPIC

2024-09-27 Thread Richard Earnshaw (lists)
On 26/09/2024 19:21, Ramana Radhakrishnan wrote:
> On Mon, Mar 4, 2024 at 1:43 PM Fangrui Song  wrote:
>>
>> From: Fangrui Song 
>>
>> -fno-pic -mfdpic generated code is like regular -fno-pic, not suitable
>> for FDPIC (absolute addressing for symbol references and no function
>> descriptor).  The sh port simply upgrades -fno-pic to -fpie by setting
>> flag_pic.  Let's follow suit.
>>
>> Link: 
>> https://inbox.sourceware.org/gcc-patches/20150913165303.gc17...@brightrain.aerifal.cx/
>>
>> gcc/ChangeLog:
>>
>> * config/arm/arm.cc (arm_option_override): Set flag_pic if
>>   TARGET_FDPIC.
>>
>> gcc/testsuite/ChangeLog:
>>
>> * gcc.target/arm/fdpic-pie.c: New test.
>> ---
>>  gcc/config/arm/arm.cc|  6 +
>>  gcc/testsuite/gcc.target/arm/fdpic-pie.c | 30 
>>  2 files changed, 36 insertions(+)
>>  create mode 100644 gcc/testsuite/gcc.target/arm/fdpic-pie.c
>>
>> diff --git a/gcc/config/arm/arm.cc b/gcc/config/arm/arm.cc
>> index 1cd69268ee9..f2fd3cce48c 100644
>> --- a/gcc/config/arm/arm.cc
>> +++ b/gcc/config/arm/arm.cc
>> @@ -3682,6 +3682,12 @@ arm_option_override (void)
>>arm_pic_register = FDPIC_REGNUM;
>>if (TARGET_THUMB1)
>> sorry ("FDPIC mode is not supported in Thumb-1 mode");
>> +
>> +  /* FDPIC code is a special form of PIC, and the vast majority of code
>> +generation constraints that apply to PIC also apply to FDPIC, so we
>> + set flag_pic to avoid the need to check TARGET_FDPIC everywhere
>> + flag_pic is checked. */
>> +  flag_pic = 2;
>>  }
> 
> Been a while since I looked at this stuff but should this not be
> flag_pie being set rather than flag_pic here if the expectation is to
> turn -fno-PIC -mfdpic into fPIE ?

-fPIE implies -fPIC, but has the added implication that any definition of an 
object we see is the one true definition and cannot be pre-empted during 
loading (in a shared library, a definition of X may be pre-empted by another 
definition of X in either the application itself or another shared library that 
was loaded first).

Part of the confusion comes from the manual, though:

Select the FDPIC ABI, which uses 64-bit function descriptors to
represent pointers to functions.  When the compiler is configured for
@code{arm-*-uclinuxfdpiceabi} targets, this option is on by default
and implies @option{-fPIE} if none of the PIC/PIE-related options is
provided.  On other targets, it only enables the FDPIC-specific code
generation features, and the user should explicitly provide the
PIC/PIE-related options as needed.

Which conflates things relating to the option flag and the compiler 
configuration.  I think that needs clearing up as well.  Something like

Select the FDPIC ABI, which uses 64-bit function descriptors to
represent pointers to functions.  @option{-mfdpic} implies @option{-fPIC}.

When the compiler is configured for @code{arm-*-uclinuxfdpiceabi} targets, 
this option is on by default and the compiler defaults to @option{-fPIE}, 
unless @option{-fPIC} is explicitly specified.

might cover it, but I'm not sure I've fully untangled the web of option 
permutations here.  Perhaps someone could tabulate the expected options 
somewhere for clarity.

The other option would be to error if flag_pic is not set, when -mfdpic is set, 
which would force the user to be explicit as to which pic options they want 
(technically the explicit combination -mno-pic -mfdpic has no meaning).

R.

> 
> 
>>
>>if (arm_pic_register_string != NULL)
>> diff --git a/gcc/testsuite/gcc.target/arm/fdpic-pie.c 
>> b/gcc/testsuite/gcc.target/arm/fdpic-pie.c
>> new file mode 100644
>> index 000..909db8bce74
>> --- /dev/null
>> +++ b/gcc/testsuite/gcc.target/arm/fdpic-pie.c
>> @@ -0,0 +1,30 @@
>> +// { dg-do compile }
>> +// { dg-options "-O2 -fno-pic -mfdpic" }
>> +// { dg-skip-if "-mpure-code and -fPIC incompatible" { *-*-* } { 
>> "-mpure-code" } }
>> +
>> +__attribute__((visibility("hidden"))) void hidden_fun(void);
>> +void fun(void);
>> +__attribute__((visibility("hidden"))) extern int hidden_var;
>> +extern int var;
>> +__attribute__((visibility("hidden"))) const int ro_hidden_var = 42;
>> +
>> +// { dg-final { scan-assembler "hidden_fun\\(GOTOFFFUNCDESC\\)" } }
>> +void *addr_hidden_fun(void) { return hidden_fun; }
>> +
>> +// { dg-final { scan-assembler "fun\\(GOTFUNCDESC\\)" } }
>> +void *addr_fun(void) { return fun; }
>> +
>> +// { dg-final { scan-assembler "hidden_var\\(GOT\\)" } }
>> +void *addr_hidden_var(void) { return &hidden_var; }
>> +
>> +// { dg-final { scan-assembler "var\\(GOT\\)" } }
>> +void *addr_var(void) { return &var; }
>> +
>> +// { dg-final { scan-assembler ".LANCHOR0\\(GOT\\)" } }
>> +const int *addr_ro_hidden_var(void) { return &ro_hidden_var; }
>> +
>> +// { dg-final { scan-assembler "hidden_var\\(GOT\\)" } }
>> +int read_hidden_var(void) { return hidden_var; }
>> +
>> +// { dg-final { scan-assembler "var\\(GOT\\)" } }
>> +int read_var(void

Re: [PATCH] arm: Force flag_pic for FDPIC

2024-09-26 Thread Fangrui Song
On Thu, Sep 26, 2024 at 11:21 AM Ramana Radhakrishnan
 wrote:
>
> On Mon, Mar 4, 2024 at 1:43 PM Fangrui Song  wrote:
> >
> > From: Fangrui Song 
> >
> > -fno-pic -mfdpic generated code is like regular -fno-pic, not suitable
> > for FDPIC (absolute addressing for symbol references and no function
> > descriptor).  The sh port simply upgrades -fno-pic to -fpie by setting
> > flag_pic.  Let's follow suit.
> >
> > Link: 
> > https://inbox.sourceware.org/gcc-patches/20150913165303.gc17...@brightrain.aerifal.cx/
> >
> > gcc/ChangeLog:
> >
> > * config/arm/arm.cc (arm_option_override): Set flag_pic if
> >   TARGET_FDPIC.
> >
> > gcc/testsuite/ChangeLog:
> >
> > * gcc.target/arm/fdpic-pie.c: New test.
> > ---
> >  gcc/config/arm/arm.cc|  6 +
> >  gcc/testsuite/gcc.target/arm/fdpic-pie.c | 30 
> >  2 files changed, 36 insertions(+)
> >  create mode 100644 gcc/testsuite/gcc.target/arm/fdpic-pie.c
> >
> > diff --git a/gcc/config/arm/arm.cc b/gcc/config/arm/arm.cc
> > index 1cd69268ee9..f2fd3cce48c 100644
> > --- a/gcc/config/arm/arm.cc
> > +++ b/gcc/config/arm/arm.cc
> > @@ -3682,6 +3682,12 @@ arm_option_override (void)
> >arm_pic_register = FDPIC_REGNUM;
> >if (TARGET_THUMB1)
> > sorry ("FDPIC mode is not supported in Thumb-1 mode");
> > +
> > +  /* FDPIC code is a special form of PIC, and the vast majority of code
> > +generation constraints that apply to PIC also apply to FDPIC, so we
> > + set flag_pic to avoid the need to check TARGET_FDPIC everywhere
> > + flag_pic is checked. */
> > +  flag_pic = 2;
> >  }
>
> Been a while since I looked at this stuff but should this not be
> flag_pie being set rather than flag_pic here if the expectation is to
> turn -fno-PIC -mfdpic into fPIE ?

I think flag_pic determines the PIC/PIE vs no-PIC difference
while flag_shlib determines the PIC vs PIE difference (whether
non-local default linkage symbol might bind externally).

Setting flag_pic here is correct.

>
> >
> >if (arm_pic_register_string != NULL)
> > diff --git a/gcc/testsuite/gcc.target/arm/fdpic-pie.c 
> > b/gcc/testsuite/gcc.target/arm/fdpic-pie.c
> > new file mode 100644
> > index 000..909db8bce74
> > --- /dev/null
> > +++ b/gcc/testsuite/gcc.target/arm/fdpic-pie.c
> > @@ -0,0 +1,30 @@
> > +// { dg-do compile }
> > +// { dg-options "-O2 -fno-pic -mfdpic" }
> > +// { dg-skip-if "-mpure-code and -fPIC incompatible" { *-*-* } { 
> > "-mpure-code" } }
> > +
> > +__attribute__((visibility("hidden"))) void hidden_fun(void);
> > +void fun(void);
> > +__attribute__((visibility("hidden"))) extern int hidden_var;
> > +extern int var;
> > +__attribute__((visibility("hidden"))) const int ro_hidden_var = 42;
> > +
> > +// { dg-final { scan-assembler "hidden_fun\\(GOTOFFFUNCDESC\\)" } }
> > +void *addr_hidden_fun(void) { return hidden_fun; }
> > +
> > +// { dg-final { scan-assembler "fun\\(GOTFUNCDESC\\)" } }
> > +void *addr_fun(void) { return fun; }
> > +
> > +// { dg-final { scan-assembler "hidden_var\\(GOT\\)" } }
> > +void *addr_hidden_var(void) { return &hidden_var; }
> > +
> > +// { dg-final { scan-assembler "var\\(GOT\\)" } }
> > +void *addr_var(void) { return &var; }
> > +
> > +// { dg-final { scan-assembler ".LANCHOR0\\(GOT\\)" } }
> > +const int *addr_ro_hidden_var(void) { return &ro_hidden_var; }
> > +
> > +// { dg-final { scan-assembler "hidden_var\\(GOT\\)" } }
> > +int read_hidden_var(void) { return hidden_var; }
> > +
> > +// { dg-final { scan-assembler "var\\(GOT\\)" } }
> > +int read_var(void) { return var; }
> > --
> > 2.44.0.rc1.240.g4c46232300-goog
> >



-- 
宋方睿


Re: [PATCH] arm: Force flag_pic for FDPIC

2024-09-26 Thread Ramana Radhakrishnan
On Mon, Mar 4, 2024 at 1:43 PM Fangrui Song  wrote:
>
> From: Fangrui Song 
>
> -fno-pic -mfdpic generated code is like regular -fno-pic, not suitable
> for FDPIC (absolute addressing for symbol references and no function
> descriptor).  The sh port simply upgrades -fno-pic to -fpie by setting
> flag_pic.  Let's follow suit.
>
> Link: 
> https://inbox.sourceware.org/gcc-patches/20150913165303.gc17...@brightrain.aerifal.cx/
>
> gcc/ChangeLog:
>
> * config/arm/arm.cc (arm_option_override): Set flag_pic if
>   TARGET_FDPIC.
>
> gcc/testsuite/ChangeLog:
>
> * gcc.target/arm/fdpic-pie.c: New test.
> ---
>  gcc/config/arm/arm.cc|  6 +
>  gcc/testsuite/gcc.target/arm/fdpic-pie.c | 30 
>  2 files changed, 36 insertions(+)
>  create mode 100644 gcc/testsuite/gcc.target/arm/fdpic-pie.c
>
> diff --git a/gcc/config/arm/arm.cc b/gcc/config/arm/arm.cc
> index 1cd69268ee9..f2fd3cce48c 100644
> --- a/gcc/config/arm/arm.cc
> +++ b/gcc/config/arm/arm.cc
> @@ -3682,6 +3682,12 @@ arm_option_override (void)
>arm_pic_register = FDPIC_REGNUM;
>if (TARGET_THUMB1)
> sorry ("FDPIC mode is not supported in Thumb-1 mode");
> +
> +  /* FDPIC code is a special form of PIC, and the vast majority of code
> +generation constraints that apply to PIC also apply to FDPIC, so we
> + set flag_pic to avoid the need to check TARGET_FDPIC everywhere
> + flag_pic is checked. */
> +  flag_pic = 2;
>  }

Been a while since I looked at this stuff but should this not be
flag_pie being set rather than flag_pic here if the expectation is to
turn -fno-PIC -mfdpic into fPIE ?


>
>if (arm_pic_register_string != NULL)
> diff --git a/gcc/testsuite/gcc.target/arm/fdpic-pie.c 
> b/gcc/testsuite/gcc.target/arm/fdpic-pie.c
> new file mode 100644
> index 000..909db8bce74
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/arm/fdpic-pie.c
> @@ -0,0 +1,30 @@
> +// { dg-do compile }
> +// { dg-options "-O2 -fno-pic -mfdpic" }
> +// { dg-skip-if "-mpure-code and -fPIC incompatible" { *-*-* } { 
> "-mpure-code" } }
> +
> +__attribute__((visibility("hidden"))) void hidden_fun(void);
> +void fun(void);
> +__attribute__((visibility("hidden"))) extern int hidden_var;
> +extern int var;
> +__attribute__((visibility("hidden"))) const int ro_hidden_var = 42;
> +
> +// { dg-final { scan-assembler "hidden_fun\\(GOTOFFFUNCDESC\\)" } }
> +void *addr_hidden_fun(void) { return hidden_fun; }
> +
> +// { dg-final { scan-assembler "fun\\(GOTFUNCDESC\\)" } }
> +void *addr_fun(void) { return fun; }
> +
> +// { dg-final { scan-assembler "hidden_var\\(GOT\\)" } }
> +void *addr_hidden_var(void) { return &hidden_var; }
> +
> +// { dg-final { scan-assembler "var\\(GOT\\)" } }
> +void *addr_var(void) { return &var; }
> +
> +// { dg-final { scan-assembler ".LANCHOR0\\(GOT\\)" } }
> +const int *addr_ro_hidden_var(void) { return &ro_hidden_var; }
> +
> +// { dg-final { scan-assembler "hidden_var\\(GOT\\)" } }
> +int read_hidden_var(void) { return hidden_var; }
> +
> +// { dg-final { scan-assembler "var\\(GOT\\)" } }
> +int read_var(void) { return var; }
> --
> 2.44.0.rc1.240.g4c46232300-goog
>


Re: [PATCH] arm: Force flag_pic for FDPIC

2024-09-16 Thread Fangrui Song
Friendly ping :)

On Thu, Aug 22, 2024 at 7:09 PM Fangrui Song  wrote:
>
> On Mon, May 13, 2024 at 2:21 PM Fangrui Song  wrote:
> >
> > On Mon, Mar 4, 2024 at 12:13 AM Fangrui Song  wrote:
> > >
> > > From: Fangrui Song 
> > >
> > > -fno-pic -mfdpic generated code is like regular -fno-pic, not suitable
> > > for FDPIC (absolute addressing for symbol references and no function
> > > descriptor).  The sh port simply upgrades -fno-pic to -fpie by setting
> > > flag_pic.  Let's follow suit.
> > >
> > > Link: 
> > > https://inbox.sourceware.org/gcc-patches/20150913165303.gc17...@brightrain.aerifal.cx/
> > >
> > > gcc/ChangeLog:
> > >
> > > * config/arm/arm.cc (arm_option_override): Set flag_pic if
> > >   TARGET_FDPIC.
> > >
> > > gcc/testsuite/ChangeLog:
> > >
> > > * gcc.target/arm/fdpic-pie.c: New test.
> > > ---
> > >  gcc/config/arm/arm.cc|  6 +
> > >  gcc/testsuite/gcc.target/arm/fdpic-pie.c | 30 
> > >  2 files changed, 36 insertions(+)
> > >  create mode 100644 gcc/testsuite/gcc.target/arm/fdpic-pie.c
> > >
> > > diff --git a/gcc/config/arm/arm.cc b/gcc/config/arm/arm.cc
> > > index 1cd69268ee9..f2fd3cce48c 100644
> > > --- a/gcc/config/arm/arm.cc
> > > +++ b/gcc/config/arm/arm.cc
> > > @@ -3682,6 +3682,12 @@ arm_option_override (void)
> > >arm_pic_register = FDPIC_REGNUM;
> > >if (TARGET_THUMB1)
> > > sorry ("FDPIC mode is not supported in Thumb-1 mode");
> > > +
> > > +  /* FDPIC code is a special form of PIC, and the vast majority of 
> > > code
> > > +generation constraints that apply to PIC also apply to FDPIC, so 
> > > we
> > > + set flag_pic to avoid the need to check TARGET_FDPIC everywhere
> > > + flag_pic is checked. */
> > > +  flag_pic = 2;
> > >  }
> > >
> > >if (arm_pic_register_string != NULL)
> > > diff --git a/gcc/testsuite/gcc.target/arm/fdpic-pie.c 
> > > b/gcc/testsuite/gcc.target/arm/fdpic-pie.c
> > > new file mode 100644
> > > index 000..909db8bce74
> > > --- /dev/null
> > > +++ b/gcc/testsuite/gcc.target/arm/fdpic-pie.c
> > > @@ -0,0 +1,30 @@
> > > +// { dg-do compile }
> > > +// { dg-options "-O2 -fno-pic -mfdpic" }
> > > +// { dg-skip-if "-mpure-code and -fPIC incompatible" { *-*-* } { 
> > > "-mpure-code" } }
> > > +
> > > +__attribute__((visibility("hidden"))) void hidden_fun(void);
> > > +void fun(void);
> > > +__attribute__((visibility("hidden"))) extern int hidden_var;
> > > +extern int var;
> > > +__attribute__((visibility("hidden"))) const int ro_hidden_var = 42;
> > > +
> > > +// { dg-final { scan-assembler "hidden_fun\\(GOTOFFFUNCDESC\\)" } }
> > > +void *addr_hidden_fun(void) { return hidden_fun; }
> > > +
> > > +// { dg-final { scan-assembler "fun\\(GOTFUNCDESC\\)" } }
> > > +void *addr_fun(void) { return fun; }
> > > +
> > > +// { dg-final { scan-assembler "hidden_var\\(GOT\\)" } }
> > > +void *addr_hidden_var(void) { return &hidden_var; }
> > > +
> > > +// { dg-final { scan-assembler "var\\(GOT\\)" } }
> > > +void *addr_var(void) { return &var; }
> > > +
> > > +// { dg-final { scan-assembler ".LANCHOR0\\(GOT\\)" } }
> > > +const int *addr_ro_hidden_var(void) { return &ro_hidden_var; }
> > > +
> > > +// { dg-final { scan-assembler "hidden_var\\(GOT\\)" } }
> > > +int read_hidden_var(void) { return hidden_var; }
> > > +
> > > +// { dg-final { scan-assembler "var\\(GOT\\)" } }
> > > +int read_var(void) { return var; }
> > > --
> > > 2.44.0.rc1.240.g4c46232300-goog
> >
> > Ping:)
> >
> >
> > --
> > 宋方睿
>
> Friendly ping :)



-- 
宋方睿


Re: [PATCH] arm: Force flag_pic for FDPIC

2024-08-22 Thread Fangrui Song
On Mon, May 13, 2024 at 2:21 PM Fangrui Song  wrote:
>
> On Mon, Mar 4, 2024 at 12:13 AM Fangrui Song  wrote:
> >
> > From: Fangrui Song 
> >
> > -fno-pic -mfdpic generated code is like regular -fno-pic, not suitable
> > for FDPIC (absolute addressing for symbol references and no function
> > descriptor).  The sh port simply upgrades -fno-pic to -fpie by setting
> > flag_pic.  Let's follow suit.
> >
> > Link: 
> > https://inbox.sourceware.org/gcc-patches/20150913165303.gc17...@brightrain.aerifal.cx/
> >
> > gcc/ChangeLog:
> >
> > * config/arm/arm.cc (arm_option_override): Set flag_pic if
> >   TARGET_FDPIC.
> >
> > gcc/testsuite/ChangeLog:
> >
> > * gcc.target/arm/fdpic-pie.c: New test.
> > ---
> >  gcc/config/arm/arm.cc|  6 +
> >  gcc/testsuite/gcc.target/arm/fdpic-pie.c | 30 
> >  2 files changed, 36 insertions(+)
> >  create mode 100644 gcc/testsuite/gcc.target/arm/fdpic-pie.c
> >
> > diff --git a/gcc/config/arm/arm.cc b/gcc/config/arm/arm.cc
> > index 1cd69268ee9..f2fd3cce48c 100644
> > --- a/gcc/config/arm/arm.cc
> > +++ b/gcc/config/arm/arm.cc
> > @@ -3682,6 +3682,12 @@ arm_option_override (void)
> >arm_pic_register = FDPIC_REGNUM;
> >if (TARGET_THUMB1)
> > sorry ("FDPIC mode is not supported in Thumb-1 mode");
> > +
> > +  /* FDPIC code is a special form of PIC, and the vast majority of code
> > +generation constraints that apply to PIC also apply to FDPIC, so we
> > + set flag_pic to avoid the need to check TARGET_FDPIC everywhere
> > + flag_pic is checked. */
> > +  flag_pic = 2;
> >  }
> >
> >if (arm_pic_register_string != NULL)
> > diff --git a/gcc/testsuite/gcc.target/arm/fdpic-pie.c 
> > b/gcc/testsuite/gcc.target/arm/fdpic-pie.c
> > new file mode 100644
> > index 000..909db8bce74
> > --- /dev/null
> > +++ b/gcc/testsuite/gcc.target/arm/fdpic-pie.c
> > @@ -0,0 +1,30 @@
> > +// { dg-do compile }
> > +// { dg-options "-O2 -fno-pic -mfdpic" }
> > +// { dg-skip-if "-mpure-code and -fPIC incompatible" { *-*-* } { 
> > "-mpure-code" } }
> > +
> > +__attribute__((visibility("hidden"))) void hidden_fun(void);
> > +void fun(void);
> > +__attribute__((visibility("hidden"))) extern int hidden_var;
> > +extern int var;
> > +__attribute__((visibility("hidden"))) const int ro_hidden_var = 42;
> > +
> > +// { dg-final { scan-assembler "hidden_fun\\(GOTOFFFUNCDESC\\)" } }
> > +void *addr_hidden_fun(void) { return hidden_fun; }
> > +
> > +// { dg-final { scan-assembler "fun\\(GOTFUNCDESC\\)" } }
> > +void *addr_fun(void) { return fun; }
> > +
> > +// { dg-final { scan-assembler "hidden_var\\(GOT\\)" } }
> > +void *addr_hidden_var(void) { return &hidden_var; }
> > +
> > +// { dg-final { scan-assembler "var\\(GOT\\)" } }
> > +void *addr_var(void) { return &var; }
> > +
> > +// { dg-final { scan-assembler ".LANCHOR0\\(GOT\\)" } }
> > +const int *addr_ro_hidden_var(void) { return &ro_hidden_var; }
> > +
> > +// { dg-final { scan-assembler "hidden_var\\(GOT\\)" } }
> > +int read_hidden_var(void) { return hidden_var; }
> > +
> > +// { dg-final { scan-assembler "var\\(GOT\\)" } }
> > +int read_var(void) { return var; }
> > --
> > 2.44.0.rc1.240.g4c46232300-goog
>
> Ping:)
>
>
> --
> 宋方睿

Friendly ping :)


Re: [PATCH] arm: Force flag_pic for FDPIC

2024-05-13 Thread Fangrui Song
On Mon, Mar 4, 2024 at 12:13 AM Fangrui Song  wrote:
>
> From: Fangrui Song 
>
> -fno-pic -mfdpic generated code is like regular -fno-pic, not suitable
> for FDPIC (absolute addressing for symbol references and no function
> descriptor).  The sh port simply upgrades -fno-pic to -fpie by setting
> flag_pic.  Let's follow suit.
>
> Link: 
> https://inbox.sourceware.org/gcc-patches/20150913165303.gc17...@brightrain.aerifal.cx/
>
> gcc/ChangeLog:
>
> * config/arm/arm.cc (arm_option_override): Set flag_pic if
>   TARGET_FDPIC.
>
> gcc/testsuite/ChangeLog:
>
> * gcc.target/arm/fdpic-pie.c: New test.
> ---
>  gcc/config/arm/arm.cc|  6 +
>  gcc/testsuite/gcc.target/arm/fdpic-pie.c | 30 
>  2 files changed, 36 insertions(+)
>  create mode 100644 gcc/testsuite/gcc.target/arm/fdpic-pie.c
>
> diff --git a/gcc/config/arm/arm.cc b/gcc/config/arm/arm.cc
> index 1cd69268ee9..f2fd3cce48c 100644
> --- a/gcc/config/arm/arm.cc
> +++ b/gcc/config/arm/arm.cc
> @@ -3682,6 +3682,12 @@ arm_option_override (void)
>arm_pic_register = FDPIC_REGNUM;
>if (TARGET_THUMB1)
> sorry ("FDPIC mode is not supported in Thumb-1 mode");
> +
> +  /* FDPIC code is a special form of PIC, and the vast majority of code
> +generation constraints that apply to PIC also apply to FDPIC, so we
> + set flag_pic to avoid the need to check TARGET_FDPIC everywhere
> + flag_pic is checked. */
> +  flag_pic = 2;
>  }
>
>if (arm_pic_register_string != NULL)
> diff --git a/gcc/testsuite/gcc.target/arm/fdpic-pie.c 
> b/gcc/testsuite/gcc.target/arm/fdpic-pie.c
> new file mode 100644
> index 000..909db8bce74
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/arm/fdpic-pie.c
> @@ -0,0 +1,30 @@
> +// { dg-do compile }
> +// { dg-options "-O2 -fno-pic -mfdpic" }
> +// { dg-skip-if "-mpure-code and -fPIC incompatible" { *-*-* } { 
> "-mpure-code" } }
> +
> +__attribute__((visibility("hidden"))) void hidden_fun(void);
> +void fun(void);
> +__attribute__((visibility("hidden"))) extern int hidden_var;
> +extern int var;
> +__attribute__((visibility("hidden"))) const int ro_hidden_var = 42;
> +
> +// { dg-final { scan-assembler "hidden_fun\\(GOTOFFFUNCDESC\\)" } }
> +void *addr_hidden_fun(void) { return hidden_fun; }
> +
> +// { dg-final { scan-assembler "fun\\(GOTFUNCDESC\\)" } }
> +void *addr_fun(void) { return fun; }
> +
> +// { dg-final { scan-assembler "hidden_var\\(GOT\\)" } }
> +void *addr_hidden_var(void) { return &hidden_var; }
> +
> +// { dg-final { scan-assembler "var\\(GOT\\)" } }
> +void *addr_var(void) { return &var; }
> +
> +// { dg-final { scan-assembler ".LANCHOR0\\(GOT\\)" } }
> +const int *addr_ro_hidden_var(void) { return &ro_hidden_var; }
> +
> +// { dg-final { scan-assembler "hidden_var\\(GOT\\)" } }
> +int read_hidden_var(void) { return hidden_var; }
> +
> +// { dg-final { scan-assembler "var\\(GOT\\)" } }
> +int read_var(void) { return var; }
> --
> 2.44.0.rc1.240.g4c46232300-goog

Ping:)


-- 
宋方睿


[PATCH] arm: Force flag_pic for FDPIC

2024-03-04 Thread Fangrui Song
From: Fangrui Song 

-fno-pic -mfdpic generated code is like regular -fno-pic, not suitable
for FDPIC (absolute addressing for symbol references and no function
descriptor).  The sh port simply upgrades -fno-pic to -fpie by setting
flag_pic.  Let's follow suit.

Link: 
https://inbox.sourceware.org/gcc-patches/20150913165303.gc17...@brightrain.aerifal.cx/

gcc/ChangeLog:

* config/arm/arm.cc (arm_option_override): Set flag_pic if
  TARGET_FDPIC.

gcc/testsuite/ChangeLog:

* gcc.target/arm/fdpic-pie.c: New test.
---
 gcc/config/arm/arm.cc|  6 +
 gcc/testsuite/gcc.target/arm/fdpic-pie.c | 30 
 2 files changed, 36 insertions(+)
 create mode 100644 gcc/testsuite/gcc.target/arm/fdpic-pie.c

diff --git a/gcc/config/arm/arm.cc b/gcc/config/arm/arm.cc
index 1cd69268ee9..f2fd3cce48c 100644
--- a/gcc/config/arm/arm.cc
+++ b/gcc/config/arm/arm.cc
@@ -3682,6 +3682,12 @@ arm_option_override (void)
   arm_pic_register = FDPIC_REGNUM;
   if (TARGET_THUMB1)
sorry ("FDPIC mode is not supported in Thumb-1 mode");
+
+  /* FDPIC code is a special form of PIC, and the vast majority of code
+generation constraints that apply to PIC also apply to FDPIC, so we
+ set flag_pic to avoid the need to check TARGET_FDPIC everywhere
+ flag_pic is checked. */
+  flag_pic = 2;
 }
 
   if (arm_pic_register_string != NULL)
diff --git a/gcc/testsuite/gcc.target/arm/fdpic-pie.c 
b/gcc/testsuite/gcc.target/arm/fdpic-pie.c
new file mode 100644
index 000..909db8bce74
--- /dev/null
+++ b/gcc/testsuite/gcc.target/arm/fdpic-pie.c
@@ -0,0 +1,30 @@
+// { dg-do compile }
+// { dg-options "-O2 -fno-pic -mfdpic" }
+// { dg-skip-if "-mpure-code and -fPIC incompatible" { *-*-* } { "-mpure-code" 
} }
+
+__attribute__((visibility("hidden"))) void hidden_fun(void);
+void fun(void);
+__attribute__((visibility("hidden"))) extern int hidden_var;
+extern int var;
+__attribute__((visibility("hidden"))) const int ro_hidden_var = 42;
+
+// { dg-final { scan-assembler "hidden_fun\\(GOTOFFFUNCDESC\\)" } }
+void *addr_hidden_fun(void) { return hidden_fun; }
+
+// { dg-final { scan-assembler "fun\\(GOTFUNCDESC\\)" } }
+void *addr_fun(void) { return fun; }
+
+// { dg-final { scan-assembler "hidden_var\\(GOT\\)" } }
+void *addr_hidden_var(void) { return &hidden_var; }
+
+// { dg-final { scan-assembler "var\\(GOT\\)" } }
+void *addr_var(void) { return &var; }
+
+// { dg-final { scan-assembler ".LANCHOR0\\(GOT\\)" } }
+const int *addr_ro_hidden_var(void) { return &ro_hidden_var; }
+
+// { dg-final { scan-assembler "hidden_var\\(GOT\\)" } }
+int read_hidden_var(void) { return hidden_var; }
+
+// { dg-final { scan-assembler "var\\(GOT\\)" } }
+int read_var(void) { return var; }
-- 
2.44.0.rc1.240.g4c46232300-goog