1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdio.h> 3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdlib.h> 4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <string.h> 5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// This program determines which architectures that this Valgrind installation 7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// supports, which depends on the what was chosen at configure-time. For 8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// example, if Valgrind is installed on an AMD64 machine but has been 9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// configured with --enable-only32bit then this program will match "x86" but 10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// not "amd64". 11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// 12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// We return: 13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// - 0 if the machine matches the asked-for arch 14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// - 1 if it doesn't match but does match the name of another arch 15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// - 2 if it doesn't match the name of any arch 16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// - 3 if there was a usage error (it also prints an error message) 17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Nb: When updating this file for a new architecture, add the name to 19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// 'all_archs' as well as adding go(). 20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define False 0 22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define True 1 23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef int Bool; 24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownchar* all_archs[] = { 26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "x86", 27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "amd64", 28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "ppc32", 29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "ppc64", 30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "arm", 31b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov "s390x", 32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown NULL 33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic Bool go(char* arch) 36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined(VGP_x86_linux) || defined(VGP_x86_darwin) 38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if ( 0 == strcmp( arch, "x86" ) ) return True; 39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#elif defined(VGP_amd64_linux) || defined(VGP_amd64_darwin) 41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if ( 0 == strcmp( arch, "x86" ) ) return True; 42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if ( 0 == strcmp( arch, "amd64" ) ) return True; 43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#elif defined(VGP_ppc32_linux) 45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if ( 0 == strcmp( arch, "ppc32" ) ) return True; 46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#elif defined(VGP_ppc64_linux) 48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if ( 0 == strcmp( arch, "ppc64" ) ) return True; 49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if ( 0 == strcmp( arch, "ppc32" ) ) return True; 50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 51b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#elif defined(VGP_s390x_linux) 52b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if ( 0 == strcmp( arch, "s390x" ) ) return True; 53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#elif defined(VGP_arm_linux) 55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if ( 0 == strcmp( arch, "arm" ) ) return True; 56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else 58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# error Unknown platform 59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // VGP_* 60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return False; 62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//--------------------------------------------------------------------------- 65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// main 66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//--------------------------------------------------------------------------- 67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint main(int argc, char **argv) 68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int i; 70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if ( argc != 2 ) { 71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown fprintf( stderr, "usage: arch_test <arch-type>\n" ); 72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown exit(3); // Usage error. 73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (go( argv[1] )) { 75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return 0; // Matched. 76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown for (i = 0; NULL != all_archs[i]; i++) { 78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if ( 0 == strcmp( argv[1], all_archs[i] ) ) 79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return 1; // Didn't match, but named another arch. 80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return 2; // Didn't match any archs. 82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 83