/* create a unique file */ string make_temp_file (string name, char suffix) { char path[PATH_MAX]; int len; int count = 1; len = strlen (name); if (len+4 >= PATH_MAX) { fprintf(stderr,"%s %s\n","path name too long:", name); exit(1); } strcpy (path, name); if (suffix && len >= 2) { /* remove the original suffix */ if (path[len-2] == '.') { len -= 2; path[len] = 0; } } if (suffix) { path[len] = '.'; path[len+1] = suffix; path[len+2] = 0; } if (access (path, F_OK) != 0) return ipa_copy_of (path); do { if (suffix) sprintf (&(path[len]), ".%d.%c", count, suffix); else sprintf (&(path[len]), "%d", count); count++; } while (access (path, F_OK) == 0); return ipa_copy_of (path); } /* make_temp_file */
/******************************************************* Function: ipa_opt *******************************************************/ static int ipa_opt (char **argv ) { if (ipa_argc == 0) { ipa_argv = (string *) MALLOC (orig_iargc_size * sizeof (string)); MALLOC_ASSERT (ipa_argv); } else if (ipa_argc >= orig_iargc_size) { orig_iargc_size *=2; ipa_argv = (string *) REALLOC (ipa_argv, (orig_iargc_size * sizeof(string))); MALLOC_ASSERT (ipa_argv); } ipa_argv[ipa_argc++] = ipa_copy_of(argv[0]); return 1; } /* ipa_opt */
static void add_Y_opt (char **argv) { char *p = *argv; if ( Y_flags == NULL ) { Y_flags = ipa_copy_of(p); } else { char *flg; flg = concat_names(Y_flags," "); FREE (Y_flags); Y_flags = flg; flg = concat_names(Y_flags,p); FREE (Y_flags); Y_flags = flg; } return; }
/******************************************************* Function: do_compile Actually perform compilation *******************************************************/ int do_compile (string *argv) { int pid; if (toolroot) { if ((toolroot = getenv ("TOOLROOT")) == 0) toolroot = ipa_copy_of(DEFAULT_TOOLROOT); else toolroot = concat_names (toolroot, DEFAULT_TOOLROOT); } argv[0] = concat_names (toolroot, basename (argv[0])); if (ld_ipa_opt[LD_IPA_VERBOSE].flag || ld_ipa_opt[LD_IPA_SHOW].flag) dump_argv (argv); pid = fork(); pid = execve(argv[0], argv, environ_vars); if (pid < 0) { perror(argv[0]); exit(1); } active_pid = pid; FREE (argv[0]); argv[0] = NULL; if (toolroot) { FREE (toolroot); toolroot = NULL; } return pid; } /* do_compile */