/src/core/sys/posix/setjmp.d

http://github.com/AlexeyProkhin/druntime · D · 209 lines · 136 code · 17 blank · 56 comment · 13 complexity · e139296c3abcb34abfd5c8d083b3a03b MD5 · raw file

  1. /**
  2. * D header file for POSIX.
  3. *
  4. * Copyright: Copyright Sean Kelly 2005 - 2009.
  5. * License: <a href="http://www.boost.org/LICENSE_1_0.txt">Boost License 1.0</a>.
  6. * Authors: Sean Kelly
  7. * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition
  8. */
  9. /* Copyright Sean Kelly 2005 - 2009.
  10. * Distributed under the Boost Software License, Version 1.0.
  11. * (See accompanying file LICENSE or copy at
  12. * http://www.boost.org/LICENSE_1_0.txt)
  13. */
  14. module core.sys.posix.setjmp;
  15. private import core.sys.posix.config;
  16. private import core.sys.posix.signal; // for sigset_t
  17. version (Posix):
  18. extern (C):
  19. //
  20. // Required
  21. //
  22. /*
  23. jmp_buf
  24. int setjmp(ref jmp_buf);
  25. void longjmp(ref jmp_buf, int);
  26. */
  27. version( linux )
  28. {
  29. version( X86_64 )
  30. {
  31. //enum JB_BX = 0;
  32. //enum JB_BP = 1;
  33. //enum JB_12 = 2;
  34. //enum JB_13 = 3;
  35. //enum JB_14 = 4;
  36. //enum JB_15 = 5;
  37. //enum JB_SP = 6;
  38. //enum JB_PC = 7;
  39. //enum JB_SIZE = 64;
  40. alias long[8] __jmp_buf;
  41. }
  42. else version( X86 )
  43. {
  44. //enum JB_BX = 0;
  45. //enum JB_SI = 1;
  46. //enum JB_DI = 2;
  47. //enum JB_BP = 3;
  48. //enum JB_SP = 4;
  49. //enum JB_PC = 5;
  50. //enum JB_SIZE = 24;
  51. alias int[6] __jmp_buf;
  52. }
  53. else version ( SPARC )
  54. {
  55. alias int[3] __jmp_buf;
  56. }
  57. else version (ARM)
  58. {
  59. alias int[64] __jmp_buf;
  60. }
  61. else version (PPC)
  62. {
  63. alias int[64 + (12*4)] __jmp_buf;
  64. }
  65. else version (PPC64)
  66. {
  67. alias long[64] __jmp_buf;
  68. }
  69. else version (MIPS)
  70. {
  71. struct __jmp_buf
  72. {
  73. version (MIPS_O32)
  74. {
  75. void * __pc;
  76. void * __sp;
  77. int __regs[8];
  78. void * __fp;
  79. void * __gp;
  80. }
  81. else
  82. {
  83. long __pc;
  84. long __sp;
  85. long __regs[8];
  86. long __fp;
  87. long __gp;
  88. }
  89. int __fpc_csr;
  90. version (MIPS_N64)
  91. double __fpregs[8];
  92. else
  93. double __fpregs[6];
  94. }
  95. }
  96. else
  97. static assert(0, "unimplemented");
  98. struct __jmp_buf_tag
  99. {
  100. __jmp_buf __jmpbuf;
  101. int __mask_was_saved;
  102. sigset_t __saved_mask;
  103. }
  104. alias __jmp_buf_tag[1] jmp_buf;
  105. alias _setjmp setjmp; // see XOpen block
  106. void longjmp(ref jmp_buf, int);
  107. }
  108. else version( FreeBSD )
  109. {
  110. // <machine/setjmp.h>
  111. version( X86 )
  112. {
  113. enum _JBLEN = 11;
  114. struct _jmp_buf { int[_JBLEN + 1] _jb; }
  115. }
  116. else version( X86_64)
  117. {
  118. enum _JBLEN = 12;
  119. struct _jmp_buf { c_long[_JBLEN] _jb; }
  120. }
  121. else version( SPARC )
  122. {
  123. enum _JBLEN = 5;
  124. struct _jmp_buf { c_long[_JBLEN + 1] _jb; }
  125. }
  126. else
  127. static assert(0);
  128. alias _jmp_buf[1] jmp_buf;
  129. int setjmp(ref jmp_buf);
  130. void longjmp(ref jmp_buf, int);
  131. }
  132. //
  133. // C Extension (CX)
  134. //
  135. /*
  136. sigjmp_buf
  137. int sigsetjmp(sigjmp_buf, int);
  138. void siglongjmp(sigjmp_buf, int);
  139. */
  140. version( linux )
  141. {
  142. alias jmp_buf sigjmp_buf;
  143. int __sigsetjmp(sigjmp_buf, int);
  144. alias __sigsetjmp sigsetjmp;
  145. void siglongjmp(sigjmp_buf, int);
  146. }
  147. else version( FreeBSD )
  148. {
  149. // <machine/setjmp.h>
  150. version( X86 )
  151. {
  152. struct _sigjmp_buf { int[_JBLEN + 1] _ssjb; }
  153. }
  154. else version( X86_64)
  155. {
  156. struct _sigjmp_buf { c_long[_JBLEN] _sjb; }
  157. }
  158. else version( SPARC )
  159. {
  160. enum _JBLEN = 5;
  161. enum _JB_FP = 0;
  162. enum _JB_PC = 1;
  163. enum _JB_SP = 2;
  164. enum _JB_SIGMASK = 3;
  165. enum _JB_SIGFLAG = 5;
  166. struct _sigjmp_buf { c_long[_JBLEN + 1] _sjb; }
  167. }
  168. else
  169. static assert(0);
  170. alias _sigjmp_buf[1] sigjmp_buf;
  171. int sigsetjmp(ref sigjmp_buf);
  172. void siglongjmp(ref sigjmp_buf, int);
  173. }
  174. //
  175. // XOpen (XSI)
  176. //
  177. /*
  178. int _setjmp(jmp_buf);
  179. void _longjmp(jmp_buf, int);
  180. */
  181. version( linux )
  182. {
  183. int _setjmp(ref jmp_buf);
  184. void _longjmp(ref jmp_buf, int);
  185. }
  186. else version( FreeBSD )
  187. {
  188. int _setjmp(ref jmp_buf);
  189. void _longjmp(ref jmp_buf, int);
  190. }