+ 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 = buildargv (arg_buf);
+ if (argv == NULL)
+ error (_("Insufficient memory available to allocate simulator arg list."));
+ 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);