xref: /llvm-project/clang/test/CodeGen/no-builtin-2.c (revision ae80024fbe51339afabfa2ff43ae532356fa3c93)
1 // RUN: %clang_cc1 -emit-llvm -o - %s | FileCheck %s
2 
3 typedef typeof(sizeof(0)) size_t;
4 
5 void bar(char *s);
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);
9 
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
foo1(char * s,char * d,size_t n)15 void foo1(char *s, char *d, size_t n) {
16   bar(s);
17   memset(s, 0, n);
18   memcpy(d, s, n);
19   memmove(d, s, n);
20 }
21 
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
foo2(char * s,char * d,size_t n)27 void foo2(char *s, char *d, size_t n) __attribute__((no_builtin("memset"))) {
28   bar(s);
29   memset(s, 1, n);
30   memcpy(d, s, n);
31   memmove(d, s, n);
32 }
33 
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
foo3(char * s,char * d,size_t n)39 void foo3(char *s, char *d, size_t n) __attribute__((no_builtin("memset", "memcpy"))) {
40   bar(s);
41   memset(s, 2, n);
42   memcpy(d, s, n);
43   memmove(d, s, n);
44 }
45 
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
foo4(char * s,char * d,size_t n)51 void foo4(char *s, char *d, size_t n) __attribute__((no_builtin)) {
52   bar(s);
53   memset(s, 2, n);
54   memcpy(d, s, n);
55   memmove(s, d, n);
56 }
57 
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"{{.*}}}
64