nickdesaulniers requested changes to this revision.
nickdesaulniers added a comment.
This revision now requires changes to proceed.

In D147714#4249274 <https://reviews.llvm.org/D147714#4249274>, @efriedma wrote:

> Any thoughts on diagnostics here?  If I'm not mistaken, with this patch, if 
> you request an impossible tail call, you get a crash with very little useful 
> information.  (Although, see 
> https://discourse.llvm.org/t/rfc-improving-clangs-middle-and-back-end-diagnostics/69261
>  )

Patching this in, and running through the original test cases as reported in 
https://github.com/llvm/llvm-project/issues/54964#issue-1207256071:

  $ clang++ x.cpp
  x.cpp:5:32: error: cannot perform a tail call to function 'base' because its 
signature is incompatible with the calling function
  int f1() { [[clang::musttail]] return base(5); }
                                 ^
  x.cpp:1:1: note: target function has different number of parameters (expected 
0 but has 1)
  int base(int);
  ^
  x.cpp:5:14: note: tail call required by 'musttail' attribute here
  int f1() { [[clang::musttail]] return base(5); }
               ^
  x.cpp:6:57: error: cannot perform a tail call to function 'base' because its 
signature is incompatible with the calling function
  int f2(int x, int y /* unused */) { [[clang::musttail]] return base(5); }
                                                          ^
  x.cpp:1:1: note: target function has different number of parameters (expected 
2 but has 1)
  int base(int);
  ^
  x.cpp:6:39: note: tail call required by 'musttail' attribute here
  int f2(int x, int y /* unused */) { [[clang::musttail]] return base(5); }
                                        ^
  2 errors generated.

so that's pretty informative to the user. Changing `musttail` to 
`nonportable_musttail`:

  $ clang++ x.cpp
  cannot guarantee tail call due to mismatched parameter counts
    %call = musttail call noundef i32 @_Z4basei(i32 noundef 5)
  in function _Z2f1v
  fatal error: error in backend: Broken function found, compilation aborted!
  clang++: error: clang frontend command failed with exit code 70 (use -v to 
see invocation)
  clang version 17.0.0 (g...@github.com:llvm/llvm-project.git 
36e13ec194d1601499e0069b33b9bd8f69887e1f)
  Target: x86_64-unknown-linux-gnu
  Thread model: posix
  InstalledDir: /android0/llvm-project/llvm/build/bin
  clang++: note: diagnostic msg: 
  ********************
  
  PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:
  Preprocessed source(s) and associated run script(s) are located at:
  clang++: note: diagnostic msg: /tmp/x-299fe3.cpp
  clang++: note: diagnostic msg: /tmp/x-299fe3.sh
  clang++: note: diagnostic msg: 
  
  ********************

So at the very least, this should use the existing clang support for backend 
diagnostics rather than crashing. Please see how `!srcloc` works for inline asm 
and `__attribute__((warning("")))`.  It should be straightforward to attach 
that ad-hoc metadata to call sites with that statement attribute.

Also, "woof" to the attribute name.

Taking a step back: can't we just fix the backends or modify `CheckTypesMatch` 
(or add a new method) to detect partial matches?  Is there actually a safety 
issue on any known target? If not, creating a separate attribute feels like 
working around a possible bug in a particular backend when that should probably 
be fixed instead. Reading https://github.com/llvm/llvm-project/issues/54964, 
I'm curious if folks have pursued @efriedma 's suggestion #2 from 
https://github.com/llvm/llvm-project/issues/54964#issuecomment-1101612886?


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

https://reviews.llvm.org/D147714

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

Reply via email to