Blame src/testlib/test_utils.c

Packit 577717
#include <stdio.h>
Packit 577717
#include <stdlib.h>
Packit 577717
#include <unistd.h>
Packit 577717
#include <string.h>
Packit 577717
Packit 577717
#include "papi.h"
Packit 577717
#include "papi_test.h"
Packit 577717
Packit 577717
#define TOLERANCE       .2
Packit 577717
Packit 577717
Packit 577717
/*  Variable to hold reporting status
Packit 577717
	if TRUE, output is suppressed
Packit 577717
	if FALSE output is sent to stdout
Packit 577717
	initialized to FALSE
Packit 577717
	declared here so it can be available globally
Packit 577717
*/
Packit 577717
int TESTS_QUIET = 0;
Packit 577717
static int TESTS_COLOR = 1;
Packit 577717
static int TEST_WARN = 0;
Packit 577717
Packit 577717
void
Packit 577717
validate_string( const char *name, char *s )
Packit 577717
{
Packit 577717
	if ( ( s == NULL ) || ( strlen( s ) == 0 ) ) {
Packit 577717
		char s2[1024] = "";
Packit 577717
		sprintf( s2, "%s was NULL or length 0", name );
Packit 577717
		test_fail( __FILE__, __LINE__, s2, 0 );
Packit 577717
	}
Packit 577717
}
Packit 577717
Packit 577717
int
Packit 577717
approx_equals( double a, double b )
Packit 577717
{
Packit 577717
	if ( ( a >= b * ( 1.0 - TOLERANCE ) ) && ( a <= b * ( 1.0 + TOLERANCE ) ) )
Packit 577717
		return 1;
Packit 577717
	else {
Packit 577717
		printf( "Out of tolerance range %2.2f: %.0f vs %.0f [%.0f,%.0f]\n",
Packit 577717
				TOLERANCE, a, b, b * ( 1.0 - TOLERANCE ),
Packit 577717
				b * ( 1.0 + TOLERANCE ) );
Packit 577717
		return 0;
Packit 577717
	}
Packit 577717
}
Packit 577717
Packit 577717
long long **
Packit 577717
allocate_test_space( int num_tests, int num_events )
Packit 577717
{
Packit 577717
	long long **values;
Packit 577717
	int i;
Packit 577717
Packit 577717
	values =
Packit 577717
		( long long ** ) malloc( ( size_t ) num_tests *
Packit 577717
								 sizeof ( long long * ) );
Packit 577717
	if ( values == NULL )
Packit 577717
		exit( 1 );
Packit 577717
	memset( values, 0x0, ( size_t ) num_tests * sizeof ( long long * ) );
Packit 577717
Packit 577717
	for ( i = 0; i < num_tests; i++ ) {
Packit 577717
		values[i] =
Packit 577717
			( long long * ) malloc( ( size_t ) num_events *
Packit 577717
									sizeof ( long long ) );
Packit 577717
		if ( values[i] == NULL )
Packit 577717
			exit( 1 );
Packit 577717
		memset( values[i], 0x00, ( size_t ) num_events * sizeof ( long long ) );
Packit 577717
	}
Packit 577717
	return ( values );
Packit 577717
}
Packit 577717
Packit 577717
void
Packit 577717
free_test_space( long long **values, int num_tests )
Packit 577717
{
Packit 577717
	int i;
Packit 577717
Packit 577717
	for ( i = 0; i < num_tests; i++ )
Packit 577717
		free( values[i] );
Packit 577717
	free( values );
Packit 577717
}
Packit 577717
Packit 577717
Packit 577717
Packit 577717
int is_event_derived(unsigned int event) {
Packit 577717
Packit 577717
  PAPI_event_info_t info;
Packit 577717
Packit 577717
  if (event & PAPI_PRESET_MASK) {
Packit 577717
Packit 577717
     PAPI_get_event_info(event,&info;;
Packit 577717
Packit 577717
     if (strcmp(info.derived,"NOT_DERIVED")) {
Packit 577717
       //       printf("%#x is derived\n",event);
Packit 577717
        return 1;
Packit 577717
     }
Packit 577717
  }
Packit 577717
  return 0;
Packit 577717
}
Packit 577717
Packit 577717
Packit 577717
int find_nonderived_event( void )
Packit 577717
{
Packit 577717
	/* query and set up the right event to monitor */
Packit 577717
	PAPI_event_info_t info;
Packit 577717
	int potential_evt_to_add[3] = { PAPI_FP_OPS, PAPI_FP_INS, PAPI_TOT_INS };
Packit 577717
	int i;
Packit 577717
Packit 577717
	for ( i = 0; i < 3; i++ ) {
Packit 577717
		if ( PAPI_query_event( potential_evt_to_add[i] ) == PAPI_OK ) {
Packit 577717
			if ( PAPI_get_event_info( potential_evt_to_add[i], &info ) ==
Packit 577717
				 PAPI_OK ) {
Packit 577717
				if ( ( info.count > 0 ) &&
Packit 577717
					 !strcmp( info.derived, "NOT_DERIVED" ) )
Packit 577717
					return ( potential_evt_to_add[i] );
Packit 577717
			}
Packit 577717
		}
Packit 577717
	}
Packit 577717
	return ( 0 );
Packit 577717
}
Packit 577717
Packit 577717
Packit 577717
/* Add events to an EventSet, as specified by a mask.
Packit 577717
Packit 577717
   Returns: number = number of events added
Packit 577717
Packit 577717
*/
Packit 577717
Packit 577717
//struct test_events_t {
Packit 577717
//  unsigned int mask;
Packit 577717
//  unsigned int event;
Packit 577717
//};
Packit 577717
Packit 577717
struct test_events_t test_events[MAX_TEST_EVENTS] = {
Packit 577717
  { MASK_TOT_CYC, PAPI_TOT_CYC },
Packit 577717
  { MASK_TOT_INS, PAPI_TOT_INS },
Packit 577717
  { MASK_FP_INS,  PAPI_FP_INS },
Packit 577717
  { MASK_L1_TCM,  PAPI_L1_TCM },
Packit 577717
  { MASK_L1_ICM,  PAPI_L1_ICM },
Packit 577717
  { MASK_L1_DCM,  PAPI_L1_DCM },
Packit 577717
  { MASK_L2_TCM,  PAPI_L2_TCM },
Packit 577717
  { MASK_L2_TCA,  PAPI_L2_TCA },
Packit 577717
  { MASK_L2_TCH,  PAPI_L2_TCH },
Packit 577717
  { MASK_BR_CN,   PAPI_BR_CN  },
Packit 577717
  { MASK_BR_MSP,  PAPI_BR_MSP },
Packit 577717
  { MASK_BR_PRC,  PAPI_BR_PRC },
Packit 577717
  { MASK_TOT_IIS, PAPI_TOT_IIS},
Packit 577717
  { MASK_L1_DCR,  PAPI_L1_DCR},
Packit 577717
  { MASK_L1_DCW,  PAPI_L1_DCW},
Packit 577717
  { MASK_L1_DCA,  PAPI_L1_DCA},
Packit 577717
  { MASK_FP_OPS,  PAPI_FP_OPS},
Packit 577717
};
Packit 577717
Packit 577717
Packit 577717
int
Packit 577717
add_test_events( int *number, int *mask, int allow_derived )
Packit 577717
{
Packit 577717
	int retval,i;
Packit 577717
	int EventSet = PAPI_NULL;
Packit 577717
	char name_string[BUFSIZ];
Packit 577717
Packit 577717
	*number = 0;
Packit 577717
Packit 577717
	/* create the eventset */
Packit 577717
	retval = PAPI_create_eventset( &EventSet );
Packit 577717
	if ( retval != PAPI_OK ) {
Packit 577717
		test_fail(__FILE__,__LINE__,"Trouble creating eventset",retval);
Packit 577717
	}
Packit 577717
Packit 577717
Packit 577717
	/* check all the masks */
Packit 577717
	for(i=0;i
Packit 577717
Packit 577717
		if ( *mask & test_events[i].mask ) {
Packit 577717
Packit 577717
			/* remove any derived events if told to */
Packit 577717
			if ((is_event_derived(test_events[i].event)) &&
Packit 577717
				(!allow_derived)) {
Packit 577717
				*mask = *mask ^ test_events[i].mask;
Packit 577717
				continue;
Packit 577717
			}
Packit 577717
Packit 577717
			retval = PAPI_add_event( EventSet,
Packit 577717
				test_events[i].event );
Packit 577717
Packit 577717
			if ( retval == PAPI_OK ) {
Packit 577717
				( *number )++;
Packit 577717
			}
Packit 577717
			else {
Packit 577717
				if ( !TESTS_QUIET ) {
Packit 577717
				PAPI_event_code_to_name(test_events[i].event,
Packit 577717
							name_string);
Packit 577717
				fprintf( stdout, "%#x %s is not available.\n",
Packit 577717
					test_events[i].event,name_string);
Packit 577717
				}
Packit 577717
				*mask = *mask ^ test_events[i].mask;
Packit 577717
			}
Packit 577717
		}
Packit 577717
	}
Packit 577717
Packit 577717
	return EventSet;
Packit 577717
}
Packit 577717
Packit 577717
int
Packit 577717
remove_test_events( int *EventSet, int mask )
Packit 577717
{
Packit 577717
	int retval = PAPI_OK;
Packit 577717
Packit 577717
	if ( mask & MASK_L1_DCA ) {
Packit 577717
		retval = PAPI_remove_event( *EventSet, PAPI_L1_DCA );
Packit 577717
		if ( retval < PAPI_OK )
Packit 577717
			return ( retval );
Packit 577717
	}
Packit 577717
Packit 577717
	if ( mask & MASK_L1_DCW ) {
Packit 577717
		retval = PAPI_remove_event( *EventSet, PAPI_L1_DCW );
Packit 577717
		if ( retval < PAPI_OK )
Packit 577717
			return ( retval );
Packit 577717
	}
Packit 577717
Packit 577717
	if ( mask & MASK_L1_DCR ) {
Packit 577717
		retval = PAPI_remove_event( *EventSet, PAPI_L1_DCR );
Packit 577717
		if ( retval < PAPI_OK )
Packit 577717
			return ( retval );
Packit 577717
	}
Packit 577717
Packit 577717
	if ( mask & MASK_L2_TCH ) {
Packit 577717
		retval = PAPI_remove_event( *EventSet, PAPI_L2_TCH );
Packit 577717
		if ( retval < PAPI_OK )
Packit 577717
			return ( retval );
Packit 577717
	}
Packit 577717
Packit 577717
	if ( mask & MASK_L2_TCA ) {
Packit 577717
		retval = PAPI_remove_event( *EventSet, PAPI_L2_TCA );
Packit 577717
		if ( retval < PAPI_OK )
Packit 577717
			return ( retval );
Packit 577717
	}
Packit 577717
Packit 577717
	if ( mask & MASK_L2_TCM ) {
Packit 577717
		retval = PAPI_remove_event( *EventSet, PAPI_L2_TCM );
Packit 577717
		if ( retval < PAPI_OK )
Packit 577717
			return ( retval );
Packit 577717
	}
Packit 577717
Packit 577717
	if ( mask & MASK_L1_DCM ) {
Packit 577717
		retval = PAPI_remove_event( *EventSet, PAPI_L1_DCM );
Packit 577717
		if ( retval < PAPI_OK )
Packit 577717
			return ( retval );
Packit 577717
	}
Packit 577717
Packit 577717
	if ( mask & MASK_L1_ICM ) {
Packit 577717
		retval = PAPI_remove_event( *EventSet, PAPI_L1_ICM );
Packit 577717
		if ( retval < PAPI_OK )
Packit 577717
			return ( retval );
Packit 577717
	}
Packit 577717
Packit 577717
	if ( mask & MASK_L1_TCM ) {
Packit 577717
		retval = PAPI_remove_event( *EventSet, PAPI_L1_TCM );
Packit 577717
		if ( retval < PAPI_OK )
Packit 577717
			return ( retval );
Packit 577717
	}
Packit 577717
Packit 577717
	if ( mask & MASK_FP_OPS ) {
Packit 577717
		retval = PAPI_remove_event( *EventSet, PAPI_FP_OPS );
Packit 577717
		if ( retval < PAPI_OK )
Packit 577717
			return ( retval );
Packit 577717
	}
Packit 577717
Packit 577717
	if ( mask & MASK_FP_INS ) {
Packit 577717
		retval = PAPI_remove_event( *EventSet, PAPI_FP_INS );
Packit 577717
		if ( retval < PAPI_OK )
Packit 577717
			return ( retval );
Packit 577717
	}
Packit 577717
Packit 577717
	if ( mask & MASK_TOT_INS ) {
Packit 577717
		retval = PAPI_remove_event( *EventSet, PAPI_TOT_INS );
Packit 577717
		if ( retval < PAPI_OK )
Packit 577717
			return ( retval );
Packit 577717
	}
Packit 577717
Packit 577717
	if ( mask & MASK_TOT_IIS ) {
Packit 577717
		retval = PAPI_remove_event( *EventSet, PAPI_TOT_IIS );
Packit 577717
		if ( retval < PAPI_OK )
Packit 577717
			return ( retval );
Packit 577717
	}
Packit 577717
Packit 577717
	if ( mask & MASK_TOT_CYC ) {
Packit 577717
		retval = PAPI_remove_event( *EventSet, PAPI_TOT_CYC );
Packit 577717
		if ( retval < PAPI_OK )
Packit 577717
			return ( retval );
Packit 577717
	}
Packit 577717
Packit 577717
	return ( PAPI_destroy_eventset( EventSet ) );
Packit 577717
}
Packit 577717
Packit 577717
char *
Packit 577717
stringify_all_domains( int domains )
Packit 577717
{
Packit 577717
	static char buf[PAPI_HUGE_STR_LEN];
Packit 577717
	int i, did = 0;
Packit 577717
	buf[0] = '\0';
Packit 577717
Packit 577717
	for ( i = PAPI_DOM_MIN; i <= PAPI_DOM_MAX; i = i << 1 )
Packit 577717
		if ( domains & i ) {
Packit 577717
			if ( did )
Packit 577717
				strcpy( buf + strlen( buf ), "|" );
Packit 577717
			strcpy( buf + strlen( buf ), stringify_domain( domains & i ) );
Packit 577717
			did++;
Packit 577717
		}
Packit 577717
	if ( did == 0 )
Packit 577717
		test_fail( __FILE__, __LINE__, "Unrecognized domains!", 0 );
Packit 577717
	return ( buf );
Packit 577717
}
Packit 577717
Packit 577717
char *
Packit 577717
stringify_domain( int domain )
Packit 577717
{
Packit 577717
	switch ( domain ) {
Packit 577717
	case PAPI_DOM_SUPERVISOR:
Packit 577717
		return ( "PAPI_DOM_SUPERVISOR" );
Packit 577717
	case PAPI_DOM_USER:
Packit 577717
		return ( "PAPI_DOM_USER" );
Packit 577717
	case PAPI_DOM_KERNEL:
Packit 577717
		return ( "PAPI_DOM_KERNEL" );
Packit 577717
	case PAPI_DOM_OTHER:
Packit 577717
		return ( "PAPI_DOM_OTHER" );
Packit 577717
	case PAPI_DOM_ALL:
Packit 577717
		return ( "PAPI_DOM_ALL" );
Packit 577717
	default:
Packit 577717
		test_fail( __FILE__, __LINE__, "Unrecognized domains!", 0 );
Packit 577717
	}
Packit 577717
	return ( NULL );
Packit 577717
}
Packit 577717
Packit 577717
char *
Packit 577717
stringify_all_granularities( int granularities )
Packit 577717
{
Packit 577717
	static char buf[PAPI_HUGE_STR_LEN];
Packit 577717
	int i, did = 0;
Packit 577717
Packit 577717
	buf[0] = '\0';
Packit 577717
	for ( i = PAPI_GRN_MIN; i <= PAPI_GRN_MAX; i = i << 1 )
Packit 577717
		if ( granularities & i ) {
Packit 577717
			if ( did )
Packit 577717
				strcpy( buf + strlen( buf ), "|" );
Packit 577717
			strcpy( buf + strlen( buf ),
Packit 577717
					stringify_granularity( granularities & i ) );
Packit 577717
			did++;
Packit 577717
		}
Packit 577717
	if ( did == 0 )
Packit 577717
		test_fail( __FILE__, __LINE__, "Unrecognized granularity!", 0 );
Packit 577717
Packit 577717
	return ( buf );
Packit 577717
}
Packit 577717
Packit 577717
char *
Packit 577717
stringify_granularity( int granularity )
Packit 577717
{
Packit 577717
	switch ( granularity ) {
Packit 577717
	case PAPI_GRN_THR:
Packit 577717
		return ( "PAPI_GRN_THR" );
Packit 577717
	case PAPI_GRN_PROC:
Packit 577717
		return ( "PAPI_GRN_PROC" );
Packit 577717
	case PAPI_GRN_PROCG:
Packit 577717
		return ( "PAPI_GRN_PROCG" );
Packit 577717
	case PAPI_GRN_SYS_CPU:
Packit 577717
		return ( "PAPI_GRN_SYS_CPU" );
Packit 577717
	case PAPI_GRN_SYS:
Packit 577717
		return ( "PAPI_GRN_SYS" );
Packit 577717
	default:
Packit 577717
		test_fail( __FILE__, __LINE__, "Unrecognized granularity!", 0 );
Packit 577717
	}
Packit 577717
	return ( NULL );
Packit 577717
}
Packit 577717
Packit 577717
/* Checks for TESTS_QUIET or -q command line variable	*/
Packit 577717
/* Sets the TESTS_QUIET global variable			*/
Packit 577717
/* Also returns the value.				*/
Packit 577717
int
Packit 577717
tests_quiet( int argc, char **argv )
Packit 577717
{
Packit 577717
	char *value;
Packit 577717
	int retval;
Packit 577717
Packit 577717
	if ( ( argc > 1 )
Packit 577717
		 && ( ( strcasecmp( argv[1], "TESTS_QUIET" ) == 0 )
Packit 577717
			  || ( strcasecmp( argv[1], "-q" ) == 0 ) ) ) {
Packit 577717
		TESTS_QUIET = 1;
Packit 577717
	}
Packit 577717
Packit 577717
	/* Always report PAPI errors when testing */
Packit 577717
	/* Even in quiet mode */
Packit 577717
	retval = PAPI_set_debug( PAPI_VERB_ECONT );
Packit 577717
	if ( retval != PAPI_OK ) {
Packit 577717
		test_fail( __FILE__, __LINE__, "PAPI_set_debug", retval );
Packit 577717
	}
Packit 577717
Packit 577717
	value=getenv("TESTS_COLOR");
Packit 577717
	if (value!=NULL) {
Packit 577717
		if (value[0]=='y') {
Packit 577717
			TESTS_COLOR=1;
Packit 577717
		}
Packit 577717
		else {
Packit 577717
			TESTS_COLOR=0;
Packit 577717
		}
Packit 577717
	}
Packit 577717
Packit 577717
	/* Disable colors if sending to a file */
Packit 577717
	if (!isatty(fileno(stdout))) {
Packit 577717
		TESTS_COLOR=0;
Packit 577717
	}
Packit 577717
Packit 577717
	return TESTS_QUIET;
Packit 577717
}
Packit 577717
Packit 577717
#define RED    "\033[1;31m"
Packit 577717
#define YELLOW "\033[1;33m"
Packit 577717
#define GREEN  "\033[1;32m"
Packit 577717
#define NORMAL "\033[0m"
Packit 577717
Packit 577717
Packit 577717
static void print_spaces(int count) {
Packit 577717
	int i;
Packit 577717
Packit 577717
	for(i=0;i
Packit 577717
		fprintf(stdout, " ");
Packit 577717
	}
Packit 577717
}
Packit 577717
Packit 577717
Packit 577717
/* Ugh, all these "fprintf(stdout)" are due to the */
Packit 577717
/* TESTS_QUIET #define printf hack		*/
Packit 577717
/* FIXME! Revert to printf once we are done converting */
Packit 577717
Packit 577717
void
Packit 577717
test_pass( const char *filename )
Packit 577717
{
Packit 577717
	(void)filename;
Packit 577717
Packit 577717
//	int line_pad;
Packit 577717
Packit 577717
//	line_pad=60-strlen(filename);
Packit 577717
//	if (line_pad<0) line_pad=0;
Packit 577717
Packit 577717
//	fprintf(stdout,"%s",filename);
Packit 577717
//	print_spaces(line_pad);
Packit 577717
Packit 577717
	if ( TEST_WARN ) {
Packit 577717
		print_spaces(59);
Packit 577717
		if (TESTS_COLOR) fprintf( stdout, "%s", YELLOW);
Packit 577717
		fprintf( stdout, "PASSED with WARNING");
Packit 577717
		if (TESTS_COLOR) fprintf( stdout, "%s", NORMAL);
Packit 577717
		fprintf( stdout, "\n");
Packit 577717
	}
Packit 577717
	else {
Packit 577717
		if (TESTS_COLOR) fprintf( stdout, "%s",GREEN);
Packit 577717
		fprintf( stdout, "PASSED");
Packit 577717
		if (TESTS_COLOR) fprintf( stdout, "%s",NORMAL);
Packit 577717
		fprintf( stdout, "\n");
Packit 577717
	}
Packit 577717
Packit 577717
	if ( PAPI_is_initialized(  ) ) {
Packit 577717
		PAPI_shutdown(  );
Packit 577717
	}
Packit 577717
Packit 577717
	exit( 0 );
Packit 577717
Packit 577717
}
Packit 577717
Packit 577717
/* Use a positive value of retval to simply print an error message */
Packit 577717
void
Packit 577717
test_fail( const char *file, int line, const char *call, int retval )
Packit 577717
{
Packit 577717
//	int line_pad;
Packit 577717
	char buf[128];
Packit 577717
Packit 577717
	(void)file;
Packit 577717
Packit 577717
//	line_pad=(60-strlen(file));
Packit 577717
//	if (line_pad<0) line_pad=0;
Packit 577717
Packit 577717
//	fprintf(stdout,"%s",file);
Packit 577717
//	print_spaces(line_pad);
Packit 577717
Packit 577717
	memset( buf, '\0', sizeof ( buf ) );
Packit 577717
Packit 577717
	if (TESTS_COLOR) fprintf(stdout,"%s",RED);
Packit 577717
	fprintf( stdout, "FAILED!!!");
Packit 577717
	if (TESTS_COLOR) fprintf(stdout,"%s",NORMAL);
Packit 577717
	fprintf( stdout, "\nLine # %d ", line );
Packit 577717
Packit 577717
	if ( retval == PAPI_ESYS ) {
Packit 577717
		sprintf( buf, "System error in %s", call );
Packit 577717
		perror( buf );
Packit 577717
	} else if ( retval > 0 ) {
Packit 577717
		fprintf( stdout, "Error: %s\n", call );
Packit 577717
	} else if ( retval == 0 ) {
Packit 577717
#if defined(sgi)
Packit 577717
		fprintf( stdout, "SGI requires root permissions for this test\n" );
Packit 577717
#else
Packit 577717
		fprintf( stdout, "Error: %s\n", call );
Packit 577717
#endif
Packit 577717
	} else {
Packit 577717
		fprintf( stdout, "Error in %s: %s\n", call, PAPI_strerror( retval ) );
Packit 577717
	}
Packit 577717
Packit 577717
//	fprintf( stdout, "\n" );
Packit 577717
Packit 577717
	/* NOTE: Because test_fail is called from thread functions,
Packit 577717
	   calling PAPI_shutdown here could prevent some threads
Packit 577717
	   from being able to free memory they have allocated.
Packit 577717
	 */
Packit 577717
	if ( PAPI_is_initialized(  ) ) {
Packit 577717
		PAPI_shutdown(  );
Packit 577717
	}
Packit 577717
Packit 577717
	/* This is stupid.  Threads are the rare case */
Packit 577717
	/* and in any case an exit() should clear everything out */
Packit 577717
	/* adding back the exit() call */
Packit 577717
Packit 577717
	exit(1);
Packit 577717
}
Packit 577717
Packit 577717
/* Use a positive value of retval to simply print an error message */
Packit 577717
void
Packit 577717
test_warn( const char *file, int line, const char *call, int retval )
Packit 577717
{
Packit 577717
Packit 577717
	(void)file;
Packit 577717
Packit 577717
//	int line_pad;
Packit 577717
Packit 577717
//	line_pad=60-strlen(file);
Packit 577717
//	if (line_pad<0) line_pad=0;
Packit 577717
Packit 577717
	char buf[128];
Packit 577717
	memset( buf, '\0', sizeof ( buf ) );
Packit 577717
Packit 577717
//	fprintf(stdout,"%s",file);
Packit 577717
//	print_spaces(line_pad);
Packit 577717
Packit 577717
	if (TEST_WARN==0) fprintf(stdout,"\n");
Packit 577717
	if (TESTS_COLOR) fprintf( stdout, "%s", YELLOW);
Packit 577717
	fprintf( stdout, "WARNING ");
Packit 577717
	if (TESTS_COLOR) fprintf( stdout, "%s", NORMAL);
Packit 577717
	fprintf( stdout, "Line # %d ", line );
Packit 577717
Packit 577717
	if ( retval == PAPI_ESYS ) {
Packit 577717
		sprintf( buf, "System warning in %s", call );
Packit 577717
		perror( buf );
Packit 577717
	} else if ( retval > 0 ) {
Packit 577717
		fprintf( stdout, "Warning: %s\n", call );
Packit 577717
	} else if ( retval == 0 ) {
Packit 577717
		fprintf( stdout, "Warning: %s\n", call );
Packit 577717
	} else {
Packit 577717
		fprintf( stdout, "Warning in %s: %s\n", call, PAPI_strerror( retval ));
Packit 577717
	}
Packit 577717
Packit 577717
	TEST_WARN++;
Packit 577717
}
Packit 577717
Packit 577717
void
Packit 577717
test_skip( const char *file, int line, const char *call, int retval )
Packit 577717
{
Packit 577717
//	int line_pad;
Packit 577717
Packit 577717
	(void)file;
Packit 577717
	(void)line;
Packit 577717
	(void)call;
Packit 577717
	(void)retval;
Packit 577717
Packit 577717
//	line_pad=(60-strlen(file));
Packit 577717
Packit 577717
//	fprintf(stdout,"%s",file);
Packit 577717
//	print_spaces(line_pad);
Packit 577717
Packit 577717
	fprintf( stdout, "SKIPPED\n");
Packit 577717
Packit 577717
	exit( 0 );
Packit 577717
}
Packit 577717
Packit 577717
Packit 577717
void
Packit 577717
test_print_event_header( const char *call, int evset )
Packit 577717
{
Packit 577717
        int *ev_ids;
Packit 577717
	int i, nev;
Packit 577717
	int retval;
Packit 577717
	char evname[PAPI_MAX_STR_LEN];
Packit 577717
Packit 577717
	if ( *call )
Packit 577717
		fprintf( stdout, "%s", call );
Packit 577717
Packit 577717
	if ((nev = PAPI_get_cmp_opt(PAPI_MAX_MPX_CTRS,NULL,0)) <= 0) {
Packit 577717
		fprintf( stdout, "Can not list event names.\n" );
Packit 577717
		return;
Packit 577717
	}
Packit 577717
Packit 577717
	if ((ev_ids = calloc(nev,sizeof(int))) == NULL) {
Packit 577717
		fprintf( stdout, "Can not list event names.\n" );
Packit 577717
		return;
Packit 577717
	}
Packit 577717
Packit 577717
	retval = PAPI_list_events( evset, ev_ids, &nev );
Packit 577717
Packit 577717
	if ( retval == PAPI_OK ) {
Packit 577717
		for ( i = 0; i < nev; i++ ) {
Packit 577717
			PAPI_event_code_to_name( ev_ids[i], evname );
Packit 577717
			printf( ONEHDR, evname );
Packit 577717
		}
Packit 577717
	} else {
Packit 577717
		fprintf( stdout, "Can not list event names." );
Packit 577717
	}
Packit 577717
	fprintf( stdout, "\n" );
Packit 577717
	free(ev_ids);
Packit 577717
}
Packit 577717
Packit 577717
int
Packit 577717
add_two_events( int *num_events, int *papi_event, int *mask ) {
Packit 577717
Packit 577717
	int retval;
Packit 577717
	int EventSet = PAPI_NULL;
Packit 577717
Packit 577717
	*num_events=2;
Packit 577717
	*papi_event=PAPI_TOT_INS;
Packit 577717
	(void)mask;
Packit 577717
Packit 577717
	/* create the eventset */
Packit 577717
	retval = PAPI_create_eventset( &EventSet );
Packit 577717
	if ( retval != PAPI_OK ) {
Packit 577717
		test_fail( __FILE__, __LINE__, "PAPI_create_eventset", retval );
Packit 577717
	}
Packit 577717
Packit 577717
	retval = PAPI_add_named_event( EventSet, "PAPI_TOT_CYC");
Packit 577717
	if ( retval != PAPI_OK ) {
Packit 577717
		if (!TESTS_QUIET) printf("Couldn't add PAPI_TOT_CYC\n");
Packit 577717
		test_skip(__FILE__,__LINE__,"Couldn't add PAPI_TOT_CYC",0);
Packit 577717
	}
Packit 577717
Packit 577717
	retval = PAPI_add_named_event( EventSet, "PAPI_TOT_INS");
Packit 577717
	if ( retval != PAPI_OK ) {
Packit 577717
		if (!TESTS_QUIET) printf("Couldn't add PAPI_TOT_CYC\n");
Packit 577717
		test_skip(__FILE__,__LINE__,"Couldn't add PAPI_TOT_CYC",0);
Packit 577717
	}
Packit 577717
Packit 577717
	return EventSet;
Packit 577717
}
Packit 577717
Packit 577717
int
Packit 577717
add_two_nonderived_events( int *num_events, int *papi_event, int *mask ) {
Packit 577717
Packit 577717
	/* query and set up the right event to monitor */
Packit 577717
	int EventSet = PAPI_NULL;
Packit 577717
	int retval;
Packit 577717
Packit 577717
	*num_events=0;
Packit 577717
Packit 577717
#define POTENTIAL_EVENTS 3
Packit 577717
Packit 577717
	unsigned int potential_evt_to_add[POTENTIAL_EVENTS][2] =
Packit 577717
		{ {( unsigned int ) PAPI_FP_INS, MASK_FP_INS},
Packit 577717
		  {( unsigned int ) PAPI_FP_OPS, MASK_FP_OPS},
Packit 577717
		  {( unsigned int ) PAPI_TOT_INS, MASK_TOT_INS}
Packit 577717
		};
Packit 577717
Packit 577717
	int i;
Packit 577717
Packit 577717
	*mask = 0;
Packit 577717
Packit 577717
	/* could leak up to two event sets. */
Packit 577717
	for(i=0;i
Packit 577717
		retval = PAPI_query_event( ( int ) potential_evt_to_add[i][0] );
Packit 577717
		if (retval  == PAPI_OK ) {
Packit 577717
			if ( !is_event_derived(potential_evt_to_add[i][0])) {
Packit 577717
		 		*papi_event = ( int ) potential_evt_to_add[i][0];
Packit 577717
		 		*mask = ( int ) potential_evt_to_add[i][1] | MASK_TOT_CYC;
Packit 577717
		 		EventSet = add_test_events( num_events, mask, 0 );
Packit 577717
		 		if ( *num_events == 2 ) break;
Packit 577717
			}
Packit 577717
		}
Packit 577717
	}
Packit 577717
Packit 577717
	return EventSet;
Packit 577717
}
Packit 577717
Packit 577717
/* add native events to use all counters */
Packit 577717
int
Packit 577717
enum_add_native_events( int *num_events, int **evtcodes,
Packit 577717
			int need_interrupt, int no_software_events,
Packit 577717
			int cidx)
Packit 577717
{
Packit 577717
	/* query and set up the right event to monitor */
Packit 577717
Packit 577717
	int EventSet = PAPI_NULL;
Packit 577717
	int i = 0, k, event_code, retval;
Packit 577717
	int counters, event_found = 0;
Packit 577717
	PAPI_event_info_t info;
Packit 577717
	const PAPI_component_info_t *s = NULL;
Packit 577717
	const PAPI_hw_info_t *hw_info = NULL;
Packit 577717
Packit 577717
	*num_events=0;
Packit 577717
Packit 577717
	s = PAPI_get_component_info( cidx );
Packit 577717
	if ( s == NULL ) {
Packit 577717
		test_fail( __FILE__, __LINE__,
Packit 577717
				"PAPI_get_component_info", PAPI_ECMP );
Packit 577717
	}
Packit 577717
Packit 577717
	hw_info = PAPI_get_hardware_info(  );
Packit 577717
	if ( hw_info == NULL ) {
Packit 577717
		test_fail( __FILE__, __LINE__, "PAPI_get_hardware_info", 2 );
Packit 577717
	}
Packit 577717
Packit 577717
	counters = PAPI_num_hwctrs(  );
Packit 577717
	if (counters<1) {
Packit 577717
		if (!TESTS_QUIET) printf("No counters available\n");
Packit 577717
		return EventSet;
Packit 577717
	}
Packit 577717
Packit 577717
	if (!TESTS_QUIET) {
Packit 577717
		printf("Trying to fill %d hardware counters...\n", counters);
Packit 577717
	}
Packit 577717
Packit 577717
	if (need_interrupt) {
Packit 577717
		if ( (!strcmp(hw_info->model_string,"POWER6")) ||
Packit 577717
			(!strcmp(hw_info->model_string,"POWER5")) ) {
Packit 577717
Packit 577717
			test_warn(__FILE__, __LINE__,
Packit 577717
					"Limiting num_counters because of "
Packit 577717
					"LIMITED_PMC on Power5 and Power6",1);
Packit 577717
			counters=4;
Packit 577717
		}
Packit 577717
	}
Packit 577717
Packit 577717
	( *evtcodes ) = ( int * ) calloc( counters, sizeof ( int ) );
Packit 577717
Packit 577717
	retval = PAPI_create_eventset( &EventSet );
Packit 577717
	if ( retval != PAPI_OK ) {
Packit 577717
		test_fail( __FILE__, __LINE__, "PAPI_create_eventset", retval );
Packit 577717
	}
Packit 577717
Packit 577717
	/* For platform independence, always ASK FOR the first event */
Packit 577717
	/* Don't just assume it'll be the first numeric value */
Packit 577717
	i = 0 | PAPI_NATIVE_MASK;
Packit 577717
	retval = PAPI_enum_cmp_event( &i, PAPI_ENUM_FIRST, cidx );
Packit 577717
	if ( retval != PAPI_OK ) {
Packit 577717
		test_fail( __FILE__, __LINE__, "PAPI_enum_cmp_event", retval );
Packit 577717
	}
Packit 577717
Packit 577717
     do {
Packit 577717
        retval = PAPI_get_event_info( i, &info );
Packit 577717
Packit 577717
	/* HACK! FIXME */
Packit 577717
        if (no_software_events && ( strstr(info.symbol,"PERF_COUNT_SW") || strstr(info.long_descr, "PERF_COUNT_SW") ) ) {
Packit 577717
	   if (!TESTS_QUIET) {
Packit 577717
	      printf("Blocking event %s as a SW event\n", info.symbol);
Packit 577717
	   }
Packit 577717
	   continue;
Packit 577717
	}
Packit 577717
Packit 577717
	if ( s->cntr_umasks ) {
Packit 577717
	   k = i;
Packit 577717
Packit 577717
	   if ( PAPI_enum_cmp_event( &k, PAPI_NTV_ENUM_UMASKS, cidx ) == PAPI_OK ) {
Packit 577717
	      do {
Packit 577717
	         retval = PAPI_get_event_info( k, &info );
Packit 577717
		 event_code = ( int ) info.event_code;
Packit 577717
Packit 577717
		 retval = PAPI_add_event( EventSet, event_code );
Packit 577717
		 if ( retval == PAPI_OK ) {
Packit 577717
		    ( *evtcodes )[event_found] = event_code;
Packit 577717
		    if ( !TESTS_QUIET ) {
Packit 577717
		       printf( "event_code[%d] = %#x (%s)\n",
Packit 577717
			       event_found, event_code, info.symbol );
Packit 577717
		    }
Packit 577717
		    event_found++;
Packit 577717
		 } else {
Packit 577717
		    if ( !TESTS_QUIET ) {
Packit 577717
		       printf( "%#x (%s) can't be added to the EventSet.\n",
Packit 577717
			       event_code, info.symbol );
Packit 577717
		    }
Packit 577717
		 }
Packit 577717
	      } while ( PAPI_enum_cmp_event( &k, PAPI_NTV_ENUM_UMASKS, cidx ) == PAPI_OK
Packit 577717
						&& event_found < counters );
Packit 577717
	   } else {
Packit 577717
	      event_code = ( int ) info.event_code;
Packit 577717
	      retval = PAPI_add_event( EventSet, event_code );
Packit 577717
	      if ( retval == PAPI_OK ) {
Packit 577717
		  ( *evtcodes )[event_found] = event_code;
Packit 577717
		  if ( !TESTS_QUIET ) {
Packit 577717
		     printf( "event_code[%d] = %#x (%s)\n",
Packit 577717
			       event_found, event_code, info.symbol );
Packit 577717
		  }
Packit 577717
		  event_found++;
Packit 577717
	      }
Packit 577717
	   }
Packit 577717
	   if ( !TESTS_QUIET && retval == PAPI_OK ) {
Packit 577717
	     /* */
Packit 577717
	   }
Packit 577717
	} else {
Packit 577717
			event_code = ( int ) info.event_code;
Packit 577717
			retval = PAPI_add_event( EventSet, event_code );
Packit 577717
			if ( retval == PAPI_OK ) {
Packit 577717
				( *evtcodes )[event_found] = event_code;
Packit 577717
				event_found++;
Packit 577717
			} else {
Packit 577717
				if ( !TESTS_QUIET )
Packit 577717
					fprintf( stdout, "%#x is not available.\n", event_code );
Packit 577717
			}
Packit 577717
		}
Packit 577717
	}
Packit 577717
     while ( PAPI_enum_cmp_event( &i, PAPI_ENUM_EVENTS, cidx ) == PAPI_OK &&
Packit 577717
			event_found < counters );
Packit 577717
Packit 577717
	*num_events = ( int ) event_found;
Packit 577717
Packit 577717
	if (!TESTS_QUIET) printf("Tried to fill %d counters with events, "
Packit 577717
				 "found %d\n",counters,event_found);
Packit 577717
Packit 577717
	return EventSet;
Packit 577717
}