| /* Test strncmp builtin expansion for compilation and proper execution. */ |
| /* { dg-do run { target *-*-linux* *-*-gnu* *-*-uclinux* } } */ |
| /* { dg-options "-O2" } */ |
| /* { dg-require-effective-target ptr32plus } */ |
| |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| #include <sys/mman.h> |
| #include <unistd.h> |
| #include <stdlib.h> |
| |
| int lib_memcmp(const void *a, const void *b, size_t n) asm("memcmp"); |
| int lib_strncmp(const char *a, const char *b, size_t n) asm("strncmp"); |
| |
| static void test_driver_strncmp (void (test_strncmp)(const char *, const char *, int), |
| void (test_memcmp)(const void *, const void *, int), |
| size_t sz) |
| { |
| long pgsz = sysconf(_SC_PAGESIZE); |
| char buf1[sz+1]; |
| char *buf2; |
| #if _POSIX_C_SOURCE >= 200112L |
| if ( posix_memalign ((void **)&buf2, pgsz, 2*pgsz) ) abort (); |
| #else |
| if ( !(buf2 = valloc(2*pgsz))) abort (); |
| #endif |
| char *p2; |
| int r,i,e; |
| |
| r = mprotect (buf2+pgsz,pgsz,PROT_NONE); |
| if (r < 0) abort(); |
| |
| memset(buf1,'A',sz); |
| for(i=10; i>=0; i--) { |
| p2 = buf2+pgsz-sz-i; |
| memset(p2,'A',sz); |
| e = lib_strncmp(buf1,p2,sz); |
| (*test_strncmp)(buf1,p2,e); |
| e = lib_memcmp(buf1,p2,sz); |
| (*test_memcmp)(buf1,p2,e); |
| } |
| mprotect (buf2+pgsz,pgsz,PROT_READ|PROT_WRITE); |
| free(buf2); |
| } |
| |
| #define RUN_TEST(SZ) test_driver_strncmp (test_strncmp_ ## SZ, test_memcmp_ ## SZ, SZ); |
| |
| #define DEF_TEST(SZ) \ |
| __attribute__((noinline)) \ |
| void test_strncmp_ ## SZ (const char *str1, const char *str2, int expect) \ |
| { \ |
| int r; \ |
| r = strncmp(str1,str2,SZ); \ |
| if ( r < 0 && !(expect < 0) ) abort(); \ |
| if ( r > 0 && !(expect > 0) ) abort(); \ |
| if ( r == 0 && !(expect == 0) ) abort(); \ |
| } \ |
| __attribute__((noinline)) \ |
| void test_memcmp_ ## SZ (const void *p1, const void *p2, int expect) \ |
| { \ |
| int r; \ |
| r = memcmp(p1,p2,SZ); \ |
| if ( r < 0 && !(expect < 0) ) abort(); \ |
| if ( r > 0 && !(expect > 0) ) abort(); \ |
| if ( r == 0 && !(expect == 0) ) abort(); \ |
| } |
| |
| DEF_TEST(1) |
| DEF_TEST(2) |
| DEF_TEST(3) |
| DEF_TEST(4) |
| DEF_TEST(5) |
| DEF_TEST(6) |
| DEF_TEST(7) |
| DEF_TEST(8) |
| DEF_TEST(9) |
| DEF_TEST(10) |
| DEF_TEST(11) |
| DEF_TEST(12) |
| DEF_TEST(13) |
| DEF_TEST(14) |
| DEF_TEST(15) |
| DEF_TEST(16) |
| DEF_TEST(32) |
| DEF_TEST(64) |
| DEF_TEST(65) |
| DEF_TEST(66) |
| DEF_TEST(67) |
| DEF_TEST(68) |
| DEF_TEST(69) |
| DEF_TEST(70) |
| DEF_TEST(71) |
| |
| int |
| main(int argc, char **argv) |
| { |
| RUN_TEST(1) ; |
| RUN_TEST(2) ; |
| RUN_TEST(3) ; |
| RUN_TEST(4) ; |
| RUN_TEST(5) ; |
| RUN_TEST(6) ; |
| RUN_TEST(7) ; |
| RUN_TEST(8) ; |
| RUN_TEST(9) ; |
| RUN_TEST(10); |
| RUN_TEST(11); |
| RUN_TEST(12); |
| RUN_TEST(13); |
| RUN_TEST(14); |
| RUN_TEST(15); |
| RUN_TEST(16); |
| RUN_TEST(32); |
| RUN_TEST(64); |
| RUN_TEST(65); |
| RUN_TEST(66); |
| RUN_TEST(67); |
| RUN_TEST(68); |
| RUN_TEST(69); |
| RUN_TEST(70); |
| RUN_TEST(71); |
| return 0; |
| } |