/** * Finds a variable in a specific variable list or returns -1 for no variable found */ static unsigned short findVariable(struct variable_node * root, char * name) { while (root != NULL) { if (areStringsEqualIgnoreCase(root->name, name)) return root->id; root=root->next; } return 0; }
/** * Determines the active cores if the user supplied -c n, can be a single integer, a list, a range or * all to select all cores */ static void parseCoreActiveInfo(struct interpreterconfiguration* configuration, char * info) { int i; if (areStringsEqualIgnoreCase(info, "all")) { for (i=0;i<16;i++) configuration->intentActive[i]=1; } else { if (strchr(info, ',') != NULL) { char vn[5]; int s; for (i=0;i<16;i++) configuration->intentActive[i]=0; while (strchr(info, ',') != NULL) { s=strchr(info, ',')-info; memcpy(vn, info, s); vn[s]='\0'; configuration->intentActive[atoi(vn)]=1; info=strchr(info, ',')+1; } configuration->intentActive[atoi(info)]=1; } else if (strchr(info, ':') != NULL) { char vn[5]; int s; s=strchr(info, ':')-info; memcpy(vn, info, s); vn[s]='\0'; int from=atoi(vn); int to=atoi(strchr(info, ':')+1); for (i=0;i<16;i++) { if (i >= from && i<= to) { configuration->intentActive[i]=1; } else { configuration->intentActive[i]=0; } } } else { for (i=0;i<16;i++) configuration->intentActive[i]=0; configuration->intentActive[atoi(info)]=1; } } }
/** * Parses command line arguments */ static void parseCommandLineArguments(struct interpreterconfiguration* configuration, int argc, char *argv[]) { if (argc == 1) { displayHelp(); exit(0); } else { #ifdef HOST_STANDALONE configuration->hostProcs=1; #else configuration->hostProcs=0; #endif configuration->coreProcs=0; configuration->loadElf=1; configuration->loadSrec=0; int i, coreplacement=0; for (i=1;i<argc;i++) { if (areStringsEqualIgnoreCase(argv[i], "-s")) { configuration->displayStats=1; } else if (areStringsEqualIgnoreCase(argv[i], "-pp")) { configuration->displayPPCode=1; } else if (areStringsEqualIgnoreCase(argv[i], "-srec")) { configuration->loadElf=0; configuration->loadSrec=1; } else if (areStringsEqualIgnoreCase(argv[i], "-elf")) { configuration->loadElf=1; configuration->loadSrec=0; } else if (areStringsEqualIgnoreCase(argv[i], "-t")) { configuration->displayTiming=1; } else if (areStringsEqualIgnoreCase(argv[i], "-datashared")) { configuration->forceDataOnShared=1; } else if (areStringsEqualIgnoreCase(argv[i], "-codecore")) { configuration->forceCodeOnCore=1; } else if (areStringsEqualIgnoreCase(argv[i], "-codeshared")) { configuration->forceCodeOnShared=1; } else if (areStringsEqualIgnoreCase(argv[i], "-o")) { if (i+1 ==argc) { fprintf(stderr, "When specifying to output compiled bytes then you must provide a filename for this\n"); exit(0); } else { configuration->compiledByteFilename=argv[++i]; } } else if (areStringsEqualIgnoreCase(argv[i], "-l")) { if (i+1 ==argc) { fprintf(stderr, "When specifying to load from a byte file then you must provide a filename for this\n"); exit(0); } else { configuration->loadByteFilename=argv[++i]; } } else if (areStringsEqualIgnoreCase(argv[i], "-help")) { displayHelp(); exit(0); } else if (areStringsEqualIgnoreCase(argv[i], "-h")) { if (i+1 ==argc) { fprintf(stderr, "You must provide a number of host processes to use\n"); exit(0); } else { if (coreplacement) { fprintf(stderr, "Can not specify explicit core placement and have host virtual processes\n"); exit(0); } configuration->hostProcs=atoi(argv[++i]); } } else if (areStringsEqualIgnoreCase(argv[i], "-d")) { if (i+1 ==argc) { fprintf(stderr, "You must provide a number of device processes to use\n"); exit(0); } else { int j, device_procs=atoi(argv[++i]); for (j=0;j<16;j++) { configuration->intentActive[j]=j<device_procs ? 1 : 0; } } } else if (areStringsEqualIgnoreCase(argv[i], "-c")) { if (i+1 ==argc) { fprintf(stderr, "When specifying core placement you must provide arguments\n"); exit(0); } else { if (configuration->hostProcs > 0) { fprintf(stderr, "Can only specify explicit core placement with no host virtual processes\n"); exit(0); } coreplacement=1; parseCoreActiveInfo(configuration, argv[++i]); } } else { if (configuration->filename != NULL) { fprintf(stderr, "Only one filename can be provided, you have suppled '%s' and '%s'\n", configuration->filename, argv[i]); exit(0); } else { configuration->filename=argv[i]; } } } if (configuration->loadByteFilename == NULL && configuration->filename == NULL) { fprintf(stderr, "You must supply a file to run as an argument, see -h for details\n"); exit(0); } #ifndef HOST_STANDALONE for (i=0;i<16;i++) if (configuration->intentActive[i]) configuration->coreProcs++; #endif } }