1 // RUN: %clang_cc1 -emit-llvm -o - %s | FileCheck %s
3 typedef typeof(sizeof(0)) size_t;
6 void *memset(void *s
, int c
, size_t n
);
7 void *memcpy(void *d
, const void *s
, size_t n
);
8 void *memmove(void *d
, const void *s
, size_t n
);
10 // CHECK: define{{.*}} void @foo1({{.*}}) #[[NO_NOBUILTIN:[0-9]+]]
11 // CHECK: call void @bar
12 // CHECK: call void @llvm.memset
13 // CHECK: call void @llvm.memcpy
14 // CHECK: call void @llvm.memmove
15 void foo1(char *s
, char *d
, size_t n
) {
22 // CHECK: define{{.*}} void @foo2({{.*}}) #[[NOBUILTIN_MEMSET:[0-9]+]]
23 // CHECK: call void @bar
24 // CHECK: {{.*}}call {{.*}} @memset
25 // CHECK: call void @llvm.memcpy
26 // CHECK: call void @llvm.memmove
27 void foo2(char *s
, char *d
, size_t n
) __attribute__((no_builtin("memset"))) {
34 // CHECK: define{{.*}} void @foo3({{.*}}) #[[NOBUILTIN_MEMSET_MEMCPY:[0-9]+]]
35 // CHECK: call void @bar
36 // CHECK: {{.*}}call {{.*}} @memset
37 // CHECK: {{.*}}call {{.*}} @memcpy
38 // CHECK: call void @llvm.memmove
39 void foo3(char *s
, char *d
, size_t n
) __attribute__((no_builtin("memset", "memcpy"))) {
46 // CHECK: define{{.*}} void @foo4({{.*}}) #[[NOBUILTINS:[0-9]+]]
47 // CHECK: call void @bar
48 // CHECK: {{.*}}call {{.*}} @memset
49 // CHECK: {{.*}}call {{.*}} @memcpy
50 // CHECK: {{.*}}call {{.*}} @memmove
51 void foo4(char *s
, char *d
, size_t n
) __attribute__((no_builtin
)) {
58 // CHECK-NOT: attributes #[[NO_NOBUILTIN]] = {{{.*}}"no-builtin-memset"{{.*}}}
59 // CHECK-NOT: attributes #[[NO_NOBUILTIN]] = {{{.*}}"no-builtin-memcpy"{{.*}}"no-builtin-memset"{{.*}}}
60 // CHECK-NOT: attributes #[[NO_NOBUILTIN]] = {{{.*}}"no-builtins"{{.*}}}
61 // CHECK: attributes #[[NOBUILTIN_MEMSET]] = {{{.*}}"no-builtin-memset"{{.*}}}
62 // CHECK: attributes #[[NOBUILTIN_MEMSET_MEMCPY]] = {{{.*}}"no-builtin-memcpy"{{.*}}"no-builtin-memset"{{.*}}}
63 // CHECK: attributes #[[NOBUILTINS]] = {{{.*}}"no-builtins"{{.*}}}