1 /* Copyright (C) 2003 Free Software Foundation.
3 Ensure that builtin mempcpy and stpcpy perform correctly.
5 Written by Jakub Jelinek, 21/05/2003. */
7 extern void abort (void);
8 typedef __SIZE_TYPE__
size_t;
9 extern void *mempcpy (void *, const void *, size_t);
10 extern int memcmp (const void *, const void *, size_t);
11 extern char *stpcpy (char *, const char *);
12 extern int inside_main
;
15 char *buf2
= (char *) (buf1
+ 32);
20 __attribute__((noinline
))
21 test (long *buf3
, char *buf4
, char *buf6
, int n
)
25 /* These should probably be handled by store_by_pieces on most arches. */
26 if (mempcpy (buf1
, "ABCDEFGHI", 9) != (char *) buf1
+ 9
27 || memcmp (buf1
, "ABCDEFGHI\0", 11))
30 if (mempcpy (buf1
, "abcdefghijklmnopq", 17) != (char *) buf1
+ 17
31 || memcmp (buf1
, "abcdefghijklmnopq\0", 19))
34 if (__builtin_mempcpy (buf3
, "ABCDEF", 6) != (char *) buf1
+ 6
35 || memcmp (buf1
, "ABCDEFghijklmnopq\0", 19))
38 if (__builtin_mempcpy (buf3
, "a", 1) != (char *) buf1
+ 1
39 || memcmp (buf1
, "aBCDEFghijklmnopq\0", 19))
42 if (mempcpy ((char *) buf3
+ 2, "bcd" + ++i
, 2) != (char *) buf1
+ 4
43 || memcmp (buf1
, "aBcdEFghijklmnopq\0", 19)
47 /* These should probably be handled by move_by_pieces on most arches. */
48 if (mempcpy ((char *) buf3
+ 4, buf5
, 6) != (char *) buf1
+ 10
49 || memcmp (buf1
, "aBcdRSTUVWklmnopq\0", 19))
52 if (__builtin_mempcpy ((char *) buf1
+ ++i
+ 8, (char *) buf5
+ 1, 1)
54 || memcmp (buf1
, "aBcdRSTUVWSlmnopq\0", 19)
58 if (mempcpy ((char *) buf3
+ 14, buf6
, 2) != (char *) buf1
+ 16
59 || memcmp (buf1
, "aBcdRSTUVWSlmnrsq\0", 19))
62 if (mempcpy (buf3
, buf5
, 8) != (char *) buf1
+ 8
63 || memcmp (buf1
, "RSTUVWXYVWSlmnrsq\0", 19))
66 if (mempcpy (buf3
, buf5
, 17) != (char *) buf1
+ 17
67 || memcmp (buf1
, "RSTUVWXYZ01234567\0", 19))
70 __builtin_memcpy (buf3
, "aBcdEFghijklmnopq\0", 19);
72 /* These should be handled either by movstrendM or mempcpy
74 if (mempcpy ((char *) buf3
+ 4, buf5
, n
+ 6) != (char *) buf1
+ 10
75 || memcmp (buf1
, "aBcdRSTUVWklmnopq\0", 19))
78 if (__builtin_mempcpy ((char *) buf1
+ ++i
+ 8, (char *) buf5
+ 1, n
+ 1)
80 || memcmp (buf1
, "aBcdRSTUVWkSmnopq\0", 19)
84 if (mempcpy ((char *) buf3
+ 14, buf6
, n
+ 2) != (char *) buf1
+ 16
85 || memcmp (buf1
, "aBcdRSTUVWkSmnrsq\0", 19))
90 /* These might be handled by store_by_pieces. */
91 if (mempcpy (buf2
, "ABCDEFGHI", 9) != buf2
+ 9
92 || memcmp (buf2
, "ABCDEFGHI\0", 11))
95 if (mempcpy (buf2
, "abcdefghijklmnopq", 17) != buf2
+ 17
96 || memcmp (buf2
, "abcdefghijklmnopq\0", 19))
99 if (__builtin_mempcpy (buf4
, "ABCDEF", 6) != buf2
+ 6
100 || memcmp (buf2
, "ABCDEFghijklmnopq\0", 19))
103 if (__builtin_mempcpy (buf4
, "a", 1) != buf2
+ 1
104 || memcmp (buf2
, "aBCDEFghijklmnopq\0", 19))
107 if (mempcpy (buf4
+ 2, "bcd" + i
++, 2) != buf2
+ 4
108 || memcmp (buf2
, "aBcdEFghijklmnopq\0", 19)
112 /* These might be handled by move_by_pieces. */
113 if (mempcpy (buf4
+ 4, buf7
, 6) != buf2
+ 10
114 || memcmp (buf2
, "aBcdRSTUVWklmnopq\0", 19))
117 if (__builtin_mempcpy (buf2
+ i
++ + 8, buf7
+ 1, 1)
119 || memcmp (buf2
, "aBcdRSTUVWSlmnopq\0", 19)
123 if (mempcpy (buf4
+ 14, buf6
, 2) != buf2
+ 16
124 || memcmp (buf2
, "aBcdRSTUVWSlmnrsq\0", 19))
127 __builtin_memcpy (buf4
, "aBcdEFghijklmnopq\0", 19);
129 /* These should be handled either by movstrendM or mempcpy
131 if (mempcpy (buf4
+ 4, buf7
, n
+ 6) != buf2
+ 10
132 || memcmp (buf2
, "aBcdRSTUVWklmnopq\0", 19))
135 if (__builtin_mempcpy (buf2
+ i
++ + 8, buf7
+ 1, n
+ 1)
137 || memcmp (buf2
, "aBcdRSTUVWkSmnopq\0", 19)
141 if (mempcpy (buf4
+ 14, buf6
, n
+ 2) != buf2
+ 16
142 || memcmp (buf2
, "aBcdRSTUVWkSmnrsq\0", 19))
145 /* Now stpcpy tests. */
146 if (stpcpy ((char *) buf3
, "abcdefghijklmnop") != (char *) buf1
+ 16
147 || memcmp (buf1
, "abcdefghijklmnop", 17))
150 if (__builtin_stpcpy ((char *) buf3
, "ABCDEFG") != (char *) buf1
+ 7
151 || memcmp (buf1
, "ABCDEFG\0ijklmnop", 17))
154 if (stpcpy ((char *) buf3
+ i
++, "x") != (char *) buf1
+ 5
155 || memcmp (buf1
, "ABCDx\0G\0ijklmnop", 17))
164 /* All these tests are allowed to call mempcpy/stpcpy. */
166 __builtin_memcpy (buf5
, "RSTUVWXYZ0123456789", 20);
167 __builtin_memcpy (buf7
, "RSTUVWXYZ0123456789", 20);
168 test (buf1
, buf2
, "rstuvwxyz", 0);