Skip to content

Commit

Permalink
[CodeGen] fix inline builtin-related breakage from D78162
Browse files Browse the repository at this point in the history
In cases where we have multiple decls of an inline builtin, we may need
to go hunting for the one with a definition when setting function
attributes.

An additional test-case was provided on
ClangBuiltLinux/linux#979

(cherry picked from commit 9490808)
  • Loading branch information
gburgessiv authored and llvmbot committed May 6, 2020
1 parent 0c067d1 commit a3255f8
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 3 deletions.
12 changes: 9 additions & 3 deletions clang/lib/CodeGen/CodeGenModule.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1848,9 +1848,15 @@ void CodeGenModule::SetFunctionAttributes(GlobalDecl GD, llvm::Function *F,
F->setSection(SA->getName());

// If we plan on emitting this inline builtin, we can't treat it as a builtin.
if (FD->isInlineBuiltinDeclaration() && shouldEmitFunction(FD)) {
F->addAttribute(llvm::AttributeList::FunctionIndex,
llvm::Attribute::NoBuiltin);
if (FD->isInlineBuiltinDeclaration()) {
const FunctionDecl *FDBody;
bool HasBody = FD->hasBody(FDBody);
(void)HasBody;
assert(HasBody && "Inline builtin declarations should always have an "
"available body!");
if (shouldEmitFunction(FDBody))
F->addAttribute(llvm::AttributeList::FunctionIndex,
llvm::Attribute::NoBuiltin);
}

if (FD->isReplaceableGlobalAllocationFunction()) {
Expand Down
16 changes: 16 additions & 0 deletions clang/test/CodeGen/memcpy-no-nobuiltin-if-not-emitted.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// RUN: %clang_cc1 -triple i686-linux-gnu -std=c++11 -S -emit-llvm -o - %s | FileCheck %s
//
// Regression test for the issue reported at
// https://reviews.llvm.org/D78162#1986104

typedef unsigned long size_t;

extern "C" __inline__ __attribute__((__gnu_inline__)) void *memcpy(void *a, const void *b, unsigned c) {
return __builtin_memcpy(a, b, c);
}
void *memcpy(void *, const void *, unsigned);

// CHECK-LABEL: define void @_Z1av
void a() { (void)memcpy; }

// CHECK-NOT: nobuiltin

0 comments on commit a3255f8

Please sign in to comment.