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