x86-64: Use R10 and R11 for profiling large model with PIC
authorH.J. Lu <hjl.tools@gmail.com>
Fri, 8 Jan 2021 13:20:19 +0000 (05:20 -0800)
committerH.J. Lu <hjl.tools@gmail.com>
Fri, 8 Jan 2021 14:46:04 +0000 (06:46 -0800)
For NO_PROFILE_COUNTERS targets, R11 is a scratch register.  We can use
R10 and R11 to call mcount in large model with PIC.

gcc/

PR target/98482
* config/i386/i386.c (x86_function_profiler): Use R10 and R11
to call mcount in large model with PIC for NO_PROFILE_COUNTERS
targets.

gcc/testsuite/

PR target/98482
* gcc.target/i386/pr98482-2.c: Updated.

gcc/config/i386/i386.c
gcc/testsuite/gcc.target/i386/pr98482-2.c

index d306846..d35af37 100644 (file)
@@ -20806,12 +20806,20 @@ x86_function_profiler (FILE *file, int labelno ATTRIBUTE_UNUSED)
                       mcount_name);
              break;
            case CM_LARGE_PIC:
+#ifdef NO_PROFILE_COUNTERS
+             fprintf (file, "1:\tmovabsq\t$_GLOBAL_OFFSET_TABLE_-1b, %%r11\n");
+             fprintf (file, "\tleaq\t1b(%%rip), %%r10\n");
+             fprintf (file, "\taddq\t%%r11, %%r10\n");
+             fprintf (file, "\tmovabsq\t$%s@PLTOFF, %%r11\n", mcount_name);
+             fprintf (file, "\taddq\t%%r11, %%r10\n");
+             fprintf (file, "\tcall\t*%%r10\n");
+#else
              sorry ("profiling %<-mcmodel=large%> with PIC is not supported");
+#endif
              break;
            case CM_SMALL_PIC:
            case CM_MEDIUM_PIC:
-             fprintf (file, "1:\tcall\t*%s@GOTPCREL(%%rip)\n",
-                      mcount_name);
+             fprintf (file, "1:\tcall\t*%s@GOTPCREL(%%rip)\n", mcount_name);
              break;
            default:
              x86_print_call_or_nop (file, mcount_name);
index aed3ca4..0ee142d 100644 (file)
@@ -2,8 +2,9 @@
 /* { dg-require-effective-target mfentry } */
 /* { dg-require-effective-target fpic } */
 /* { dg-options "-fpic -fprofile -mfentry -O2 -mcmodel=large" } */
+/* { dg-final { scan-assembler "movabsq\t\\\$__fentry__@PLTOFF, %r11\n\taddq\t%r11, %r10\n\tcall\t\\*%r10" } } */
 
 void
 func (void)
 {
-} /* { dg-message "sorry, unimplemented: profiling '-mcmodel=large' with PIC is not supported" } */
+}