dump.c 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. /* $Header$ */
  2. #include <assert.h>
  3. #include <alloc.h>
  4. #include "operator.h"
  5. #include "position.h"
  6. #include "tree.h"
  7. #include "message.h"
  8. #include "type.h"
  9. #include "expr.h"
  10. extern long pointer_size;
  11. extern p_tree get_from_item_list();
  12. struct dump {
  13. char *globals, *stack;
  14. struct message_hdr mglobal, mstack;
  15. };
  16. /* dumping and restoring of child process.
  17. */
  18. do_dump(p)
  19. p_tree p;
  20. {
  21. struct dump *d = (struct dump *) Malloc(sizeof(struct dump));
  22. if (! get_dump(&d->mglobal, &d->globals, &d->mstack, &d->stack)) {
  23. error("no debuggee");
  24. free((char *) d);
  25. return;
  26. }
  27. p->t_args[0] = (struct tree *) d;
  28. p->t_address = (t_addr) get_int(d->mglobal.m_buf+PC_OFF*pointer_size, pointer_size, T_UNSIGNED);
  29. add_to_item_list(p);
  30. }
  31. /* dumping and restoring of child process.
  32. */
  33. do_restore(p)
  34. p_tree p;
  35. {
  36. struct dump *d;
  37. p = get_from_item_list((int) p->t_ival);
  38. if (!p || p->t_oper != OP_DUMP) {
  39. error("no such dump");
  40. return;
  41. }
  42. d = (struct dump *) p->t_args[0];
  43. if (! put_dump(&d->mglobal, d->globals, &d->mstack, d->stack)) {
  44. error("no debuggee");
  45. }
  46. do_items();
  47. }
  48. free_dump(p)
  49. p_tree p;
  50. {
  51. struct dump *d = (struct dump *) p->t_args[0];
  52. free(d->globals);
  53. free(d->stack);
  54. free((char *) d);
  55. }