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: [PATCH, x86, 63534] Fix '-p' profile for 32 bit PIC mode


On Fri, Oct 24, 2014 at 06:12:15PM +0400, Evgeny Stupachenko wrote:
> The following patch align stack for mcount and there should be no
> problems with unwind as ix86_frame_pointer_required is true when
> crtl->profile is true and flag_fentry is false (we call mcount after
> function prolog).
> When flag_fentry is true it is set to false in 32bit PIC mode:
>   if (!TARGET_64BIT_P (opts->x_ix86_isa_flags) && opts->x_flag_pic)
>     {
>       if (opts->x_flag_fentry > 0)
>         sorry ("-mfentry isn%'t supported for 32-bit in combination "
>       "with -fpic");
>       opts->x_flag_fentry = 0;
>     }

What is wrong in emitting the set_got right before the PROLOGUE_END
note and that way sharing a single load from both?
This looks just as a hack.

> 2014-10-24  Evgeny Stupachenko  <evstupac@gmail.com>
> 
>         PR target/63534
>         * config/i386/i386.c (x86_function_profiler): Add GOT register init
>         for mcount call.
> 
> diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
> index 6235c4f..2dff29c 100644
> --- a/gcc/config/i386/i386.c
> +++ b/gcc/config/i386/i386.c
> @@ -39124,13 +39124,22 @@ x86_function_profiler (FILE *file, int
> labelno ATTRIBUTE_UNUSED)
>        else
>         x86_print_call_or_nop (file, mcount_name);
>      }
> +  /* At this stage we can't detrmine where GOT register is, as RA can allocate
> +     it to any hard register.  Therefore we need to set it once again.  */
>    else if (flag_pic)
>      {
> +      pic_labels_used |= 1 << BX_REG;
> +      fprintf (file,"\tsub\t$16, %%esp\n");
> +      fprintf (file,"\tmovl\t%%ebx, (%%esp)\n");
> +      fprintf (file,"\tcall\t__x86.get_pc_thunk.bx\n");
> +      fprintf (file,"\taddl\t$_GLOBAL_OFFSET_TABLE_, %%ebx\n");
>  #ifndef NO_PROFILE_COUNTERS
>        fprintf (file, "\tleal\t%sP%d@GOTOFF(%%ebx),%%"
> PROFILE_COUNT_REGISTER "\n",
>                LPREFIX, labelno);
>  #endif
>        fprintf (file, "1:\tcall\t*%s@GOT(%%ebx)\n", mcount_name);
> +      fprintf (file,"\tmovl\t(%%esp), %%ebx\n");
> +      fprintf (file,"\tadd\t$16, %%esp\n");
>      }
>    else
>      {
> 

	Jakub


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