MaskRay accepted this revision.
MaskRay added a comment.
This revision is now accepted and ready to land.

In D74698#1881111 <https://reviews.llvm.org/D74698#1881111>, @nickdesaulniers 
wrote:

> In D74698#1881034 <https://reviews.llvm.org/D74698#1881034>, @MaskRay wrote:
>
> > When -mfentry is specified, why should frame pointers be disabled?
>
>
> It doesn't disable them; `-pg` was force enabling them for all functions, 
> when in GCC does not enable them for the combination of `-pg -mfentry`.  This 
> patch is simply matching the behavior of GCC.  If you want the existing 
> behavior, then `-pg -mfentry -fno-omit-frame-pointer` works with this patch 
> applied.  `-pg` should not be setting `-fno-omit-frame-pointers` in the 
> presence of `-mfentry`.
>
> > Is that because the Linux kernel has assumption about the exact code 
> > sequence? `call __fentry__` is the first instruction. Isn't that sufficient?
>
> It's not that the current implementation is broken or doesn't work, it's that 
> it's inefficient from the Kernel's perspective.  The kernel does not want 
> frame pointers as it has its own means for unwinding (though there are many 
> unwinders in the kernel, sometimes per architecture, some do rely on frame 
> pointers but explicitly add `-fno-omit-frame-pointer` if necessary). When 
> configuring a kernel to be able to trace kernel execution at runtime, `-pg 
> -mfentry` are added for x86_64, specifically because they don't add frame 
> pointers.  So it seems like Clang is strictly worse than GCC in this regard, 
> as when enabling kernel tracing, suddenly clang starts emitting unwanted 
> frame pointer instructions.
>
> > (This may be another example demonstrating that piggybacking an option 
> > (-mfentry) on top of an existing one (-pg) can turn out to be a bad idea...)
>
> Agreed.
>
> Also, more context:
>  https://www.linuxjournal.com/content/simplifying-function-tracing-modern-gcc
>  https://lore.kernel.org/patchwork/patch/1072232/
>  
> https://linux.kernel.narkive.com/X1y4Jcj4/rfc-how-to-handle-function-tracing-frame-pointers-and-mfentry


(I happened to have investigated these stuff 2 weeks ago... 
https://maskray.me/blog/2020-02-01-fpatchable-function-entry in case someone 
can read Chinese)

I believe -pg was invented in 1980s or earlier. I can find it in the first few 
commits of GCC SVN (circa 1990, after the repository was converted from RCS).

-pg has a good reason that it needs to retain frame pointers. Implementations 
usually read the caller return address via the frame pointer, e.g. 
`glibc/sysdeps/x86_64/_mcount.S`

        /* Get frompc via the frame pointer.  */
        movq    8(%rbp),%rdi
        call C_SYMBOL_NAME(__mcount_internal)

I really hope GCC r162651 (2010) (GCC 4.6) 
<https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=3c5273a96ba8dbf98c40bc6d9d0a1587b4cfedb2>
 did not piggyback -mfentry on top of -pg...
Anyway, it is too late to change anything...

The patch matches gcc/config/i386/i386.c

  static bool
  ix86_frame_pointer_required (void)
  {
  ...
    if (crtl->profile && !flag_fentry) /// -pg but not -mfentry
      return true;
  
    return false;
  }



================
Comment at: clang/test/CodeGen/fentry.c:5
 // RUN: %clang_cc1 -mfentry -triple x86_64-unknown-linux-gnu -emit-llvm -o - 
%s | FileCheck -check-prefix=NOPG %s
+// RUN: %clang_cc1 -pg -mfentry -emit-llvm -o - %s | FileCheck 
-check-prefix=NOFP  %s
 
----------------
`--implicit-check-not='"frame-pointer"="all"'` may be better


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D74698/new/

https://reviews.llvm.org/D74698



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to