nickdesaulniers added a subscriber: nathanchance.
nickdesaulniers added a comment.

Yes; GCC does behave this way.  It does not consider a non-gnu-inline 
redefinition an error, and it does seem to prefer the non-gnu-inline 
redeclaration when both are present, AFAICT.  The test is verifying that 
behavior correctly.  This patch is fixing the test case, the reported reduced 
cases from @manojgupta link <https://reviews.llvm.org/D111009#3068566>, 
@nathanchance link 
<https://github.com/ClangBuiltLinux/linux/issues/1477#issuecomment-943650477>, 
and myself link 
<https://github.com/ClangBuiltLinux/linux/issues/1477#issuecomment-944811052>, 
and fixing the kernel builds link 
<https://github.com/ClangBuiltLinux/continuous-integration2/runs/3854281995?check_suite_focus=true>.

Further, I did a build+boot tests of:

1. mainline x86_64 + CONFIG_FORTIFY_SOURCE=y
2. mainline x86_64 + CONFIG_FORTIFY_SOURCE=y + CONFIG_LTO_CLANG_FULL=y
3. mainline x86_64 + CONFIG_FORTIFY_SOURCE=y + CONFIG_LTO_CLANG_THIN=y



================
Comment at: clang/lib/CodeGen/CodeGenFunction.cpp:1318
+    // external one. That's GCC behavior too.
+    else {
+      for (auto const *Redecl : FD->redecls()) {
----------------
do we really want to be iterating every redaclaration like this, even for 
non-inline builtin declarations? Is there a way to avoid the below loop for 
most functions? Perhaps we should be doing this when we hit a redeclaration 
instead? Or wrap all this work in a check that there's a builtin ID associated 
with the FD?


================
Comment at: clang/lib/CodeGen/CodeGenFunction.cpp:1328
+          }
+        }
+      }
----------------
If there are multiple redeclarations, do we want to be erasing the clone each 
time, or can we `break` out of this loop?


================
Comment at: clang/test/CodeGen/strlen-inline-builtin-redecl.c:10-12
+extern inline __attribute__((always_inline))
+__attribute__((gnu_inline)) unsigned long
+strlen(const char *p) {
----------------
Has this example been formatted? Does rotating the attributes to the front help?


================
Comment at: clang/test/CodeGen/strlen-inline-builtin-redecl.c:42
+}
+extern typeof(strlen) strlen;
----------------
I think this line can be dropped without affecting the test. Or consider using 
any of the further reduced test cases?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D112059

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

Reply via email to