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
  • Loading branch information
gburgessiv committed Apr 16, 2020
1 parent b157ccb commit 505dbc0
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 @@ -1909,9 +1909,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 505dbc0

Please sign in to comment.