1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// This artificial program allocates and deallocates a lot of large objects 2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// on the stack. It is a stress test for Memcheck's set_address_range_perms 3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// (sarp) function. Pretty much all Valgrind versions up to 3.1.X do very 4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// badly on it, ie. a slowdown of at least 100x. 5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// 6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// It is representative of tsim_arch, the simulator for the University of 7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Texas's TRIPS processor, whose performance under Valgrind is dominated by 8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// the handling of one frequently-called function that allocates 8348 bytes 9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// on the stack. 10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <assert.h> 12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <time.h> 13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define REPS 1000*1000*10 15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown__attribute__((noinline)) 17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint f(int i) 18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // This nonsense is just to ensure that the compiler does not optimise 20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // away the stack allocation. 21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown char big_array[500]; 22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown big_array[ 0] = 12; 23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown big_array[ 23] = 34; 24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown big_array[256] = 56; 25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown big_array[434] = 78; 26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown assert( 480 == (&big_array[490] - &big_array[10]) ); 27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return big_array[i]; 28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint main(void) 31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int i, sum = 0; 33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 34b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov struct timespec req __attribute__((unused)); 35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown req.tv_sec = 0; 36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown req.tv_nsec = 100*1000*1000; // 0.1s 37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Pause for a bit so that the native run-time is not 0.00, which leads 39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // to ridiculous slow-down figures. 40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown //nanosleep(&req, NULL); 41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown for (i = 0; i < REPS; i++) { 43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown sum += f(i & 0xff); 44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return ( sum == 0xdeadbeef ? 1 : 0 ); 46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 48