aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.dg/tree-prof/indir-call-prof-malloc.c
blob: 454e224c95fdc87fab954974050a9966535a94d3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
/* { dg-options "-O2 -ldl" } */

#define _GNU_SOURCE
#include <stdio.h>
#include <stdint.h>
#include <dlfcn.h>

int global;
int global2;

void report1 (size_t size)
{
  global++;
}

void report2 (size_t size)
{
  global2++;
}

typedef void (*tp) (size_t);
static tp fns[] = {report1, report2};

void* malloc(size_t size)
{
  static void* (*real_malloc)(size_t) = NULL;
  if (!real_malloc)
      real_malloc = dlsym(RTLD_NEXT, "malloc");

  void *p = real_malloc (size);
  fns[size % 2] (size);
  // fprintf(stderr, "malloc(%d) = %p\n", size, p);
  return p;
}

void *calloc (size_t n, size_t size)
{
  void *ptr = malloc (n * size);
  __builtin_memset (ptr, 0, n * size);
  return ptr;
}

void *ptr;

int main()
{
  ptr = malloc (16);
  return 0;
}