Thank you for your answer.
I did see that part of the code, but still I cannot understand, because the
TARGET_OPTION_OVERRIDE is called before the finalization.
So why doing a test on flag_pic before finalization?

Thank you
Best regards
Enrico Bragante

Il gio 26 set 2024, 23:43 Jakub Jelinek <ja...@redhat.com> ha scritto:

> On Thu, Sep 26, 2024 at 11:20:15PM +0200, Enrico via Gcc wrote:
> > I am trying to understand how 'flag_pic' works.
> > It is used extensively in TARGET_OPTION_OVERRIDE functions in the form
> 'if
> > (flag_pic) ... '.
> > The flags fPic and fpic have a default value of -1, so as far as I
> > understand, if the two flags are not set in the command line, all 'if
> > (flag_pic)' will be true because of the default value -1 (since I can see
> > that flag_pic is a define to global_options.x_flag_pic)
> >
> > It doesn't look correct to me, but this test is used so many times that I
> > am sure I am missing something.
>
> Yes, you are missing gcc/opts.cc (finish_options)
>   if (!opts->x_flag_opts_finished)
>     {
>       /* We initialize opts->x_flag_pie to -1 so that targets can set a
>          default value.  */
>       if (opts->x_flag_pie == -1)
>         {
>           /* 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 = (opts->x_flag_hardened
>                                 ? /*-fPIE*/ 2 : 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;
>     }
> The -1 value just means the state of this option hasn't been finalized yet.
>
>         Jakub
>
>

Reply via email to