(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
tree-prof/
indir-call-prof-malloc.c
       1  /* { dg-options "-O2 -ldl -fprofile-correction" } */
       2  
       3  #define _GNU_SOURCE
       4  #include <stdio.h>
       5  #include <stdint.h>
       6  #include <dlfcn.h>
       7  
       8  int global;
       9  int global2;
      10  
      11  void report1 (size_t size)
      12  {
      13    global++;
      14  }
      15  
      16  void report2 (size_t size)
      17  {
      18    global2++;
      19  }
      20  
      21  typedef void (*tp) (size_t);
      22  static tp fns[] = {report1, report2};
      23  
      24  void* malloc(size_t size)
      25  {
      26    static void* (*real_malloc)(size_t) = NULL;
      27    if (!real_malloc)
      28        real_malloc = dlsym(RTLD_NEXT, "malloc");
      29  
      30    void *p = real_malloc (size);
      31    fns[size % 2] (size);
      32    // fprintf(stderr, "malloc(%d) = %p\n", size, p);
      33    return p;
      34  }
      35  
      36  void *calloc (size_t n, size_t size)
      37  {
      38    void *ptr = malloc (n * size);
      39    __builtin_memset (ptr, 0, n * size);
      40    return ptr;
      41  }
      42  
      43  void *ptr;
      44  
      45  int main()
      46  {
      47    ptr = malloc (16);
      48    return 0;
      49  }