static SCM gdbscm_string_to_argv (SCM string_scm) { char *string; char **c_argv; int i; SCM result = SCM_EOL; gdbscm_parse_function_args (FUNC_NAME, SCM_ARG1, NULL, "s", string_scm, &string); if (string == NULL || *string == '\0') { xfree (string); return SCM_EOL; } c_argv = gdb_buildargv (string); for (i = 0; c_argv[i] != NULL; ++i) result = scm_cons (gdbscm_scm_from_c_string (c_argv[i]), result); freeargv (c_argv); xfree (string); return scm_reverse_x (result, SCM_EOL); }
static void gdbsim_load (char *args, int fromtty) { char **argv; char *prog; if (args == NULL) error_no_arg (_("program to load")); argv = gdb_buildargv (args); make_cleanup_freeargv (argv); prog = tilde_expand (argv[0]); if (argv[1] != NULL) error (_("GDB sim does not yet support a load offset.")); if (remote_debug) printf_filtered ("gdbsim_load: prog \"%s\"\n", prog); /* FIXME: We will print two messages on error. Need error to either not print anything if passed NULL or need another routine that doesn't take any arguments. */ if (sim_load (gdbsim_desc, prog, NULL, fromtty) == SIM_RC_FAIL) error (_("unable to load program")); /* FIXME: If a load command should reset the targets registers then a call to sim_create_inferior() should go here. */ program_loaded = 1; }
static void trace_save_command (char *args, int from_tty) { int target_does_save = 0; char **argv; char *filename = NULL; struct cleanup *back_to; int generate_ctf = 0; struct trace_file_writer *writer = NULL; if (args == NULL) error_no_arg (_("file in which to save trace data")); argv = gdb_buildargv (args); back_to = make_cleanup_freeargv (argv); for (; *argv; ++argv) { if (strcmp (*argv, "-r") == 0) target_does_save = 1; if (strcmp (*argv, "-ctf") == 0) generate_ctf = 1; else if (**argv == '-') error (_("unknown option `%s'"), *argv); else filename = *argv; } if (!filename) error_no_arg (_("file in which to save trace data")); if (generate_ctf) writer = ctf_trace_file_writer_new (); else writer = tfile_trace_file_writer_new (); make_cleanup (trace_file_writer_xfree, writer); trace_save (filename, writer, target_does_save); if (from_tty) printf_filtered (_("Trace data saved to %s '%s'.\n"), generate_ctf ? "directory" : "file", filename); do_cleanups (back_to); }
static void gdbsim_create_inferior (struct target_ops *target, char *exec_file, char *args, char **env, int from_tty) { int len; char *arg_buf, **argv; if (exec_file == 0 || exec_bfd == 0) warning (_("No executable file specified.")); if (!program_loaded) warning (_("No program loaded.")); if (remote_debug) printf_filtered ("gdbsim_create_inferior: exec_file \"%s\", args \"%s\"\n", (exec_file ? exec_file : "(NULL)"), args); if (ptid_equal (inferior_ptid, remote_sim_ptid)) gdbsim_kill (target); remove_breakpoints (); init_wait_for_inferior (); if (exec_file != NULL) { len = strlen (exec_file) + 1 + strlen (args) + 1 + /*slop */ 10; arg_buf = (char *) alloca (len); arg_buf[0] = '\0'; strcat (arg_buf, exec_file); strcat (arg_buf, " "); strcat (arg_buf, args); argv = gdb_buildargv (arg_buf); make_cleanup_freeargv (argv); } else argv = NULL; sim_create_inferior (gdbsim_desc, exec_bfd, argv, env); inferior_ptid = remote_sim_ptid; add_inferior_silent (ptid_get_pid (inferior_ptid)); add_thread_silent (inferior_ptid); target_mark_running (&gdbsim_ops); insert_breakpoints (); /* Needed to get correct instruction in cache */ clear_proceed_status (); }
static void exec_file_command (char *args, int from_tty) { char **argv; char *filename; if (from_tty && target_has_execution && !query (_("A program is being debugged already.\n" "Are you sure you want to change the file? "))) error (_("File not changed.")); if (args) { struct cleanup *cleanups; /* Scan through the args and pick up the first non option arg as the filename. */ argv = gdb_buildargv (args); cleanups = make_cleanup_freeargv (argv); for (; (*argv != NULL) && (**argv == '-'); argv++) {; } if (*argv == NULL) error (_("No executable file name was specified")); filename = tilde_expand (*argv); make_cleanup (xfree, filename); exec_file_attach (filename, from_tty); do_cleanups (cleanups); } else exec_file_attach (NULL, from_tty); }
static void gdbsim_open (char *args, int from_tty) { int len; char *arg_buf; char **argv; if (remote_debug) printf_filtered ("gdbsim_open: args \"%s\"\n", args ? args : "(null)"); /* Remove current simulator if one exists. Only do this if the simulator has been opened because sim_close requires it. This is important because the call to push_target below will cause sim_close to be called if the simulator is already open, but push_target is called after sim_open! We can't move the call to push_target before the call to sim_open because sim_open may invoke `error'. */ if (gdbsim_desc != NULL) unpush_target (&gdbsim_ops); len = (7 + 1 /* gdbsim */ + strlen (" -E little") + strlen (" --architecture=xxxxxxxxxx") + (args ? strlen (args) : 0) + 50) /* slack */ ; arg_buf = (char *) alloca (len); strcpy (arg_buf, "gdbsim"); /* 7 */ /* Specify the byte order for the target when it is explicitly specified by the user (not auto detected). */ switch (selected_byte_order ()) { case BFD_ENDIAN_BIG: strcat (arg_buf, " -E big"); break; case BFD_ENDIAN_LITTLE: strcat (arg_buf, " -E little"); break; case BFD_ENDIAN_UNKNOWN: break; } /* Specify the architecture of the target when it has been explicitly specified */ if (selected_architecture_name () != NULL) { strcat (arg_buf, " --architecture="); strcat (arg_buf, selected_architecture_name ()); } /* finally, any explicit args */ if (args) { strcat (arg_buf, " "); /* 1 */ strcat (arg_buf, args); } argv = gdb_buildargv (arg_buf); make_cleanup_freeargv (argv); init_callbacks (); gdbsim_desc = sim_open (SIM_OPEN_DEBUG, &gdb_callback, exec_bfd, argv); if (gdbsim_desc == 0) error (_("unable to create simulator instance")); push_target (&gdbsim_ops); printf_filtered ("Connected to the simulator.\n"); /* There's nothing running after "target sim" or "load"; not until "run". */ inferior_ptid = null_ptid; target_mark_exited (&gdbsim_ops); }