tb0001.pp 1.7 KB

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