tw11563.pp 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. { %target=linux,haiku}
  2. { %result=216 }
  3. program ExecStack;
  4. procedure DoIt;
  5. type
  6. proc = procedure;
  7. var
  8. {$if defined(cpupowerpc) or defined(cpupowerpc64)}
  9. ret: longint;
  10. {$endif}
  11. {$if defined(cpuaarch64)}
  12. ret: longint;
  13. {$endif}
  14. {$if defined(cpui386) or defined(cpux86_64)}
  15. ret: Byte;
  16. {$endif}
  17. {$ifdef cpuarm}
  18. 'add arm code to test stack execution'
  19. {$endif}
  20. {$ifdef cpumips}
  21. ret: array[0..1] of longword;
  22. {$endif}
  23. {$ifdef cpum68k}
  24. ret: word;
  25. {$endif}
  26. DoNothing: proc;
  27. begin
  28. {$if defined(cpupowerpc) or defined(cpupowerpc64)}
  29. ret := ($4e shl 24) or ($80 shl 16) or ($00 shl 8) or $20;
  30. {$if defined(cpupowerpc64)}
  31. { can't use proc(@ret) because linux/ppc64 always expects some kind of
  32. trampoline
  33. }
  34. asm
  35. la r0, ret
  36. mtctr r0
  37. bctrl
  38. end;
  39. {$else}
  40. DoNothing := proc(@ret);
  41. DoNothing;
  42. {$endif}
  43. {$endif}
  44. {$if defined(cpuaarch64)}
  45. ret := $d65f03c0;
  46. DoNothing := proc(@ret);
  47. DoNothing;
  48. {$endif}
  49. {$if defined(cpui386) or defined(cpux86_64)}
  50. ret := $C3;
  51. DoNothing := proc(@ret);
  52. DoNothing;
  53. {$endif}
  54. {$ifdef cpumips}
  55. {$ifdef ENDIAN_BIG}
  56. ret[0]:=$03e00008;
  57. {$else ENDIAN_BIG}
  58. ret[0]:=$0800e003;
  59. {$endif ENDIAN_BIG}
  60. ret[1]:=0; { delay slot }
  61. DoNothing:=proc(@ret);
  62. DoNothing;
  63. {$endif cpumips}
  64. {$ifdef cpum68k}
  65. ret:=$4E75;
  66. DoNothing:=proc(@ret);
  67. DoNothing;
  68. {$endif cpum68k}
  69. end;
  70. begin
  71. DoIt;
  72. end.