modernc.org/ccgo/v3@v3.16.14/lib/testdata/gcc-9.1.0/gcc/testsuite/gcc.c-torture/execute/builtins/memops-asm.c (about)

     1  /* Copyright (C) 2003 Free Software Foundation.
     2  
     3     Test memcpy and memset in presence of redirect.  */
     4  
     5  #define ASMNAME(cname)  ASMNAME2 (__USER_LABEL_PREFIX__, cname)
     6  #define ASMNAME2(prefix, cname) STRING (prefix) cname
     7  #define STRING(x)    #x
     8  
     9  typedef __SIZE_TYPE__ size_t;
    10  extern void abort (void);
    11  extern void *memcpy (void *, const void *, size_t)
    12    __asm (ASMNAME ("my_memcpy"));
    13  extern void bcopy (const void *, void *, size_t)
    14    __asm (ASMNAME ("my_bcopy"));
    15  extern void *memmove (void *, const void *, size_t)
    16    __asm (ASMNAME ("my_memmove"));
    17  extern void *memset (void *, int, size_t)
    18    __asm (ASMNAME ("my_memset"));
    19  extern void bzero (void *, size_t)
    20    __asm (ASMNAME ("my_bzero"));
    21  extern int memcmp (const void *, const void *, size_t);
    22  
    23  struct A { char c[32]; } a = { "foobar" };
    24  char x[64] = "foobar", y[64];
    25  int i = 39, j = 6, k = 4;
    26  
    27  extern int inside_main;
    28  
    29  void
    30  main_test (void)
    31  {
    32    struct A b = a;
    33    struct A c = { { 'x' } };
    34  
    35    inside_main = 1;
    36    
    37    if (memcmp (b.c, x, 32) || c.c[0] != 'x' || memcmp (c.c + 1, x + 32, 31))
    38      abort ();
    39    if (__builtin_memcpy (y, x, i) != y || memcmp (x, y, 64))
    40      abort ();
    41    if (memcpy (y + 6, x, j) != y + 6
    42        || memcmp (x, y, 6) || memcmp (x, y + 6, 58))
    43      abort ();
    44    if (__builtin_memset (y + 2, 'X', k) != y + 2
    45        || memcmp (y, "foXXXXfoobar", 13))
    46      abort ();
    47    bcopy (y + 1, y + 2, 6);
    48    if (memcmp (y, "fooXXXXfobar", 13))
    49      abort ();
    50    __builtin_bzero (y + 4, 2);
    51    if (memcmp (y, "fooX\0\0Xfobar", 13))
    52      abort ();
    53  }