[PATCH] D111009: Update inline builtin handling to honor gnu inline attribute

Nick Desaulniers via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Sun Oct 3 15:37:33 PDT 2021


nickdesaulniers added a comment.

With Diff 376790

  inline __attribute__((__always_inline__)) __attribute__((gnu_inline)) void*
  memcpy() {}

`clang -O2` is producing undefined references to `memcpy.inline`. Please add that to the new unit tests added here.

  diff --git a/clang/lib/CodeGen/CodeGenFunction.cpp b/clang/lib/CodeGen/CodeGenFunction.cpp
  index a8ae5f5fc0de..132834516473 100644
  --- a/clang/lib/CodeGen/CodeGenFunction.cpp
  +++ b/clang/lib/CodeGen/CodeGenFunction.cpp
  @@ -1303,7 +1303,7 @@ void CodeGenFunction::GenerateCode(GlobalDecl GD, llvm::Function *Fn,
       llvm::Module *M = Fn->getParent();
       llvm::Function *Clone = M->getFunction(FDInlineName);
       if (!Clone) {
  -      Clone = llvm::Function::Create(Fn->getFunctionType(), Fn->getLinkage(),
  +      Clone = llvm::Function::Create(Fn->getFunctionType(), llvm::GlobalValue::AvailableExternallyLinkage,
                                        Fn->getAddressSpace(), FDInlineName, M);
         Clone->addFnAttr(llvm::Attribute::AlwaysInline);
       }

fixes that, but I don't think that's the right visibility.

  00000000000002a0 T memcpy.inline

should be `t` not `T` I think?  Because now the failure looks like

  ld.lld: error: duplicate symbol: memcpy.inline
  >>> defined at file.c
  >>>            fs/efivarfs/file.o:(memcpy.inline)
  >>> defined at super.c
  >>>            fs/efivarfs/super.o:(.text+0x800)

Perhaps `llvm::GlobalValue::InternalLinkage`?


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

https://reviews.llvm.org/D111009



More information about the cfe-commits mailing list