tb0001.pp 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. { %CPU=i386 }
  2. { %OPT=-O2 }
  3. { Old file: tbs0002.pp }
  4. { tests for the endless bugs in the optimizer OK 0.9.2 }
  5. unit tb0001;
  6. interface
  7. implementation
  8. {$message starting hexstr}
  9. function hexstr(val : longint;cnt : byte) : string;
  10. const
  11. hexval : string[16]=('0123456789ABCDEF');
  12. var
  13. s : string;
  14. l2,i : integer;
  15. l1 : longInt;
  16. begin
  17. s[0]:=char(cnt);
  18. l1:=longint($f) shl (4*(cnt-1));
  19. for i:=1 to cnt do
  20. begin
  21. l2:=(val and l1) shr (4*(cnt-i));
  22. l1:=l1 shr 4;
  23. s[i]:=hexval[l2+1];
  24. end;
  25. hexstr:=s;
  26. end;
  27. {$message starting dump_stack}
  28. procedure dump_stack(bp : longint);
  29. {$message starting get_next_frame}
  30. function get_next_frame(bp : longint) : longint;
  31. begin
  32. asm
  33. movl bp,%eax
  34. movl (%eax),%eax
  35. movl %eax,__RESULT
  36. end ['EAX'];
  37. end;
  38. procedure dump_frame(addr : longint);
  39. begin
  40. { to be used by symify }
  41. writeln(' 0x',HexStr(addr,8));
  42. end;
  43. {$message starting get_addr}
  44. function get_addr(BP : longint) : longint;
  45. begin
  46. asm
  47. movl BP,%eax
  48. movl 4(%eax),%eax
  49. movl %eax,__RESULT
  50. end ['EAX'];
  51. end;
  52. {$message starting main}
  53. var
  54. i,prevbp : longint;
  55. begin
  56. prevbp:=bp-1;
  57. i:=0;
  58. while bp > prevbp do
  59. begin
  60. dump_frame(get_addr(bp));
  61. i:=i+1;
  62. if i>max_frame_dump then exit;
  63. prevbp:=bp;
  64. bp:=get_next_frame(bp);
  65. end;
  66. end;
  67. end.