information.c 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <assert.h>
  4. #include <string.h>
  5. #include "objects.h"
  6. #include "vm.h"
  7. #include "interpreter.h"
  8. #define MAXINFO (1<<15)
  9. scm *information_addr[MAXINFO];
  10. char *information_info[MAXINFO];
  11. int information_len = 0;
  12. void information_store(scm *addr, char *info)
  13. {
  14. information_addr[information_len] = addr;
  15. information_info[information_len] = strdup(info);
  16. information_len++;
  17. }
  18. char *information_lookup(scm *addr)
  19. {
  20. for (scm i = 0; i < information_len; i++) {
  21. if (information_addr[i] == addr)
  22. return information_info[i];
  23. }
  24. return "***";
  25. }
  26. void stack_trace()
  27. {
  28. scm tmp;
  29. scm gc_stack_ptr;
  30. scm gc_stack_base_ptr;
  31. scm *ret_addr;
  32. fprintf(stderr, "=======================\n");
  33. fprintf(stderr, "STACK TRACE\n");
  34. gc_stack_ptr = reg_rsp;
  35. gc_stack_base_ptr = reg_rbp;
  36. gc_stack_ptr = gc_stack_base_ptr;
  37. while(gc_stack_ptr > 0) {
  38. tmp = stack[gc_stack_ptr--];
  39. assert(tmp == 0xDEADBEEFDEADBEEF);
  40. // rbp
  41. gc_stack_base_ptr = stack[gc_stack_ptr--];
  42. // reg env
  43. gc_stack_ptr--;
  44. // ret addr
  45. ret_addr = PTR_SCM(stack[gc_stack_ptr--]);
  46. fprintf(stderr, "%s\n", information_lookup(ret_addr));
  47. tmp = stack[gc_stack_ptr--];
  48. assert(tmp == 0xC0FFEEEEEEEEEEEE);
  49. gc_stack_ptr = gc_stack_base_ptr;
  50. }
  51. fprintf(stderr, "=======================\n\n");
  52. }