1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* This exercises the code that was causing this bug:
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     valgrind: vg_cachesim.c:389 (get_BBCC): Assertion `((Bool)0) == remove'
4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     failed.
5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   in Cachegrind 1.0.0 and 1.0.1, that was caused by unloading symbols before
7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   invalidating translations.
8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdio.h>
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdlib.h>
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <dlfcn.h>
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint main(int argc, char **argv) {
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   void *handle;
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   void (*myprint)(void);
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   char *error;
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   handle = dlopen ("./myprint.so", RTLD_LAZY);
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!handle) {
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       fputs (dlerror(), stderr);
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       exit(1);
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   myprint = dlsym(handle, "myprint");
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if ((error = dlerror()) != NULL)  {
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       fprintf (stderr, "%s\n", error);
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       exit(1);
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (*myprint)();
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Assertion failure was happening here */
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   dlclose(handle);
35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return 0;
37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
39