-
Notifications
You must be signed in to change notification settings - Fork 10.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[clang] Use the appropriate definition when checking FunctionDecl::is…
…InlineBuiltinDeclaration This is a follow-up to https://reviews.llvm.org/D148723 and fixes the bug reported by @mstorsjo. Differential Revision: https://reviews.llvm.org/D151783
- Loading branch information
1 parent
cfc5c6c
commit 1676b1f
Showing
2 changed files
with
30 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
// RUN: %clang_cc1 -triple i686-w64-mingw32 -S -emit-llvm -disable-llvm-passes -o - %s | FileCheck %s | ||
// | ||
// Verifies that clang detects memcpy inline version and uses it instead of the builtin. | ||
// Checks that clang correctly walks through multiple forward declaration. | ||
|
||
typedef unsigned int size_t; | ||
|
||
void *memcpy(void *_Dst, const void *_Src, size_t _Size); | ||
|
||
extern __inline__ __attribute__((__always_inline__, __gnu_inline__)) __attribute__((__artificial__)) | ||
void *memcpy(void *__dst, const void *__src, size_t __n) | ||
{ | ||
return __builtin___memcpy_chk(__dst, __src, __n, __builtin_object_size((__dst), ((0) > 0) && (2 > 1))); | ||
} | ||
|
||
void *memcpy(void *_Dst, const void *_Src, size_t _Size); | ||
|
||
char *a, *b; | ||
void func(void) { | ||
memcpy(a, b, 42); | ||
} | ||
|
||
// CHECK-LABEL: define {{.*}} @func( | ||
// CHECK: call ptr @memcpy.inline | ||
|
||
// CHECK-LABEL: declare {{.*}} @memcpy( | ||
|
||
// CHECK-LABEL: define {{.*}} @memcpy.inline( | ||
// CHECK: call ptr @__memcpy_chk |