On 27 September 2024 16:05:01 CEST, "Richard Earnshaw (lists)"
<[email protected]> wrote:
>On 26/09/2024 19:21, Ramana Radhakrishnan wrote:
>> On Mon, Mar 4, 2024 at 1:43 PM Fangrui Song <[email protected]> wrote:
>>>
>>> From: Fangrui Song <[email protected]>
>>>
>>> -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/[email protected]/
>>>
>>> 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 00000000000..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
>>>
>