Artifact
4bbf6b87d7c868a962db10732f619489178c412b:
0000: 2f 2a 20 54 72 61 6d 70 6f 6c 69 6e 65 20 74 65 /* Trampoline te
0010: 73 74 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 43 6f 70 st */../*. * Cop
0020: 79 72 69 67 68 74 20 31 39 39 35 2d 31 39 39 39 yright 1995-1999
0030: 2c 20 32 30 30 31 2d 32 30 30 32 2c 20 32 30 30 , 2001-2002, 200
0040: 34 20 42 72 75 6e 6f 20 48 61 69 62 6c 65 2c 20 4 Bruno Haible,
0050: 3c 62 72 75 6e 6f 40 63 6c 69 73 70 2e 6f 72 67 <bruno@clisp.org
0060: 3e 0a 20 2a 0a 20 2a 20 54 68 69 73 20 69 73 20 >. *. * This is
0070: 66 72 65 65 20 73 6f 66 74 77 61 72 65 20 64 69 free software di
0080: 73 74 72 69 62 75 74 65 64 20 75 6e 64 65 72 20 stributed under
0090: 74 68 65 20 47 4e 55 20 47 65 6e 65 72 61 6c 20 the GNU General
00a0: 50 75 62 6c 69 63 20 4c 69 63 65 6e 63 65 0a 20 Public Licence.
00b0: 2a 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 * described in t
00c0: 68 65 20 66 69 6c 65 20 43 4f 50 59 49 4e 47 2e he file COPYING.
00d0: 20 43 6f 6e 74 61 63 74 20 74 68 65 20 61 75 74 Contact the aut
00e0: 68 6f 72 20 69 66 20 79 6f 75 20 64 6f 6e 27 74 hor if you don't
00f0: 20 68 61 76 65 20 74 68 69 73 0a 20 2a 20 6f 72 have this. * or
0100: 20 63 61 6e 27 74 20 6c 69 76 65 20 77 69 74 68 can't live with
0110: 20 69 74 2e 20 54 68 65 72 65 20 69 73 20 41 42 it. There is AB
0120: 53 4f 4c 55 54 45 4c 59 20 4e 4f 20 57 41 52 52 SOLUTELY NO WARR
0130: 41 4e 54 59 2c 20 65 78 70 6c 69 63 69 74 20 6f ANTY, explicit o
0140: 72 20 69 6d 70 6c 69 65 64 2c 0a 20 2a 20 6f 6e r implied,. * on
0150: 20 74 68 69 73 20 73 6f 66 74 77 61 72 65 2e 0a this software..
0160: 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 22 63 */..#include "c
0170: 6f 6e 66 69 67 2e 68 22 20 20 2f 2a 20 44 65 66 onfig.h" /* Def
0180: 69 6e 65 20 5f 5f 24 7b 68 6f 73 74 5f 63 70 75 ine __${host_cpu
0190: 7d 5f 5f 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 }__ */..#include
01a0: 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c <stdio.h>.#incl
01b0: 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 0a ude <stdlib.h>..
01c0: 23 69 6e 63 6c 75 64 65 20 22 74 72 61 6d 70 6f #include "trampo
01d0: 6c 69 6e 65 5f 72 2e 68 22 0a 0a 23 64 65 66 69 line_r.h"..#defi
01e0: 6e 65 20 4d 41 47 49 43 31 20 20 30 78 39 64 62 ne MAGIC1 0x9db
01f0: 39 61 66 34 32 0a 23 64 65 66 69 6e 65 20 4d 41 9af42.#define MA
0200: 47 49 43 32 20 20 30 78 36 31 34 61 31 33 63 39 GIC2 0x614a13c9
0210: 0a 23 64 65 66 69 6e 65 20 4d 41 47 49 43 33 20 .#define MAGIC3
0220: 20 30 78 37 61 66 66 33 63 62 34 0a 23 64 65 66 0x7aff3cb4.#def
0230: 69 6e 65 20 4d 41 47 49 43 34 20 20 30 78 61 32 ine MAGIC4 0xa2
0240: 66 39 64 30 34 35 0a 0a 23 69 66 64 65 66 20 5f f9d045..#ifdef _
0250: 5f 63 70 6c 75 73 70 6c 75 73 0a 74 79 70 65 64 _cplusplus.typed
0260: 65 66 20 69 6e 74 20 28 2a 66 75 6e 63 74 69 6f ef int (*functio
0270: 6e 29 28 2e 2e 2e 29 3b 0a 23 65 6c 73 65 0a 74 n)(...);.#else.t
0280: 79 70 65 64 65 66 20 69 6e 74 20 28 2a 66 75 6e ypedef int (*fun
0290: 63 74 69 6f 6e 29 28 29 3b 0a 23 65 6e 64 69 66 ction)();.#endif
02a0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f ..#if defined(__
02b0: 69 33 38 36 5f 5f 29 0a 23 69 66 20 64 65 66 69 i386__).#if defi
02c0: 6e 65 64 28 5f 5f 53 54 44 43 5f 5f 29 20 7c 7c ned(__STDC__) ||
02d0: 20 64 65 66 69 6e 65 64 28 5f 5f 47 4e 55 43 5f defined(__GNUC_
02e0: 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f _) || defined(__
02f0: 63 70 6c 75 73 70 6c 75 73 29 0a 69 6e 74 20 66 cplusplus).int f
0300: 20 28 76 6f 69 64 2a 20 65 6e 76 2c 20 69 6e 74 (void* env, int
0310: 20 78 29 0a 23 65 6c 73 65 0a 69 6e 74 20 66 20 x).#else.int f
0320: 28 65 6e 76 2c 20 78 29 0a 20 20 76 6f 69 64 2a (env, x). void*
0330: 20 65 6e 76 3b 0a 20 20 69 6e 74 20 78 3b 0a 23 env;. int x;.#
0340: 65 6e 64 69 66 0a 23 65 6c 73 65 0a 23 69 66 20 endif.#else.#if
0350: 64 65 66 69 6e 65 64 28 5f 5f 53 54 44 43 5f 5f defined(__STDC__
0360: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 47 ) || defined(__G
0370: 4e 55 43 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 NUC__) || define
0380: 64 28 5f 5f 63 70 6c 75 73 70 6c 75 73 29 0a 69 d(__cplusplus).i
0390: 6e 74 20 66 20 28 69 6e 74 20 78 29 0a 23 65 6c nt f (int x).#el
03a0: 73 65 0a 69 6e 74 20 66 20 28 78 29 0a 20 20 69 se.int f (x). i
03b0: 6e 74 20 78 3b 0a 23 65 6e 64 69 66 0a 23 65 6e nt x;.#endif.#en
03c0: 64 69 66 0a 7b 0a 23 69 66 64 65 66 20 5f 5f 47 dif.{.#ifdef __G
03d0: 4e 55 43 5f 5f 0a 23 69 66 64 65 66 20 5f 5f 6d NUC__.#ifdef __m
03e0: 36 38 6b 5f 5f 0a 72 65 67 69 73 74 65 72 20 76 68k__.register v
03f0: 6f 69 64 2a 20 65 6e 76 20 5f 5f 61 73 6d 5f 5f oid* env __asm__
0400: 28 22 61 30 22 29 3b 0a 23 65 6e 64 69 66 0a 23 ("a0");.#endif.#
0410: 69 66 64 65 66 20 5f 5f 6d 69 70 73 5f 5f 0a 72 ifdef __mips__.r
0420: 65 67 69 73 74 65 72 20 76 6f 69 64 2a 20 65 6e egister void* en
0430: 76 20 5f 5f 61 73 6d 5f 5f 28 22 24 32 22 29 3b v __asm__("$2");
0440: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f .#endif.#ifdef _
0450: 5f 6d 69 70 73 36 34 5f 5f 0a 72 65 67 69 73 74 _mips64__.regist
0460: 65 72 20 76 6f 69 64 2a 20 65 6e 76 20 5f 5f 61 er void* env __a
0470: 73 6d 5f 5f 28 22 24 32 22 29 3b 0a 23 65 6e 64 sm__("$2");.#end
0480: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f if.#if defined(_
0490: 5f 73 70 61 72 63 5f 5f 29 20 26 26 20 21 64 65 _sparc__) && !de
04a0: 66 69 6e 65 64 28 5f 5f 73 70 61 72 63 36 34 5f fined(__sparc64_
04b0: 5f 29 0a 72 65 67 69 73 74 65 72 20 76 6f 69 64 _).register void
04c0: 2a 20 65 6e 76 20 5f 5f 61 73 6d 5f 5f 28 22 25 * env __asm__("%
04d0: 67 32 22 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 g2");.#endif.#if
04e0: 64 65 66 20 5f 5f 73 70 61 72 63 36 34 5f 5f 0a def __sparc64__.
04f0: 72 65 67 69 73 74 65 72 20 76 6f 69 64 2a 20 65 register void* e
0500: 6e 76 20 5f 5f 61 73 6d 5f 5f 28 22 25 67 35 22 nv __asm__("%g5"
0510: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 );.#endif.#ifdef
0520: 20 5f 5f 61 6c 70 68 61 5f 5f 0a 72 65 67 69 73 __alpha__.regis
0530: 74 65 72 20 76 6f 69 64 2a 20 65 6e 76 20 5f 5f ter void* env __
0540: 61 73 6d 5f 5f 28 22 24 31 22 29 3b 0a 23 65 6e asm__("$1");.#en
0550: 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 68 70 70 dif.#ifdef __hpp
0560: 61 5f 5f 0a 72 65 67 69 73 74 65 72 20 76 6f 69 a__.register voi
0570: 64 2a 20 65 6e 76 20 5f 5f 61 73 6d 5f 5f 28 22 d* env __asm__("
0580: 25 72 32 39 22 29 3b 0a 23 65 6e 64 69 66 0a 23 %r29");.#endif.#
0590: 69 66 64 65 66 20 5f 5f 61 72 6d 5f 5f 0a 72 65 ifdef __arm__.re
05a0: 67 69 73 74 65 72 20 76 6f 69 64 2a 20 65 6e 76 gister void* env
05b0: 20 5f 5f 61 73 6d 5f 5f 28 22 72 31 32 22 29 3b __asm__("r12");
05c0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f .#endif.#ifdef _
05d0: 5f 72 73 36 30 30 30 5f 5f 0a 23 69 66 64 65 66 _rs6000__.#ifdef
05e0: 20 5f 5f 4e 65 74 42 53 44 5f 5f 0a 72 65 67 69 __NetBSD__.regi
05f0: 73 74 65 72 20 76 6f 69 64 2a 20 65 6e 76 20 5f ster void* env _
0600: 5f 61 73 6d 5f 5f 28 22 72 31 33 22 29 3b 0a 23 _asm__("r13");.#
0610: 65 6c 73 65 0a 72 65 67 69 73 74 65 72 20 76 6f else.register vo
0620: 69 64 2a 20 65 6e 76 20 5f 5f 61 73 6d 5f 5f 28 id* env __asm__(
0630: 22 72 31 31 22 29 3b 0a 23 65 6e 64 69 66 0a 23 "r11");.#endif.#
0640: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 6d endif.#ifdef __m
0650: 38 38 6b 5f 5f 0a 72 65 67 69 73 74 65 72 20 76 88k__.register v
0660: 6f 69 64 2a 20 65 6e 76 20 5f 5f 61 73 6d 5f 5f oid* env __asm__
0670: 28 22 72 31 31 22 29 3b 0a 23 65 6e 64 69 66 0a ("r11");.#endif.
0680: 23 69 66 64 65 66 20 5f 5f 63 6f 6e 76 65 78 5f #ifdef __convex_
0690: 5f 0a 72 65 67 69 73 74 65 72 20 76 6f 69 64 2a _.register void*
06a0: 20 65 6e 76 20 5f 5f 61 73 6d 5f 5f 28 22 73 30 env __asm__("s0
06b0: 22 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 ");.#endif.#ifde
06c0: 66 20 5f 5f 69 61 36 34 5f 5f 0a 72 65 67 69 73 f __ia64__.regis
06d0: 74 65 72 20 76 6f 69 64 2a 20 65 6e 76 20 5f 5f ter void* env __
06e0: 61 73 6d 5f 5f 28 22 72 31 35 22 29 3b 0a 23 65 asm__("r15");.#e
06f0: 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 78 38 ndif.#ifdef __x8
0700: 36 5f 36 34 5f 5f 0a 72 65 67 69 73 74 65 72 20 6_64__.register
0710: 76 6f 69 64 2a 20 65 6e 76 20 5f 5f 61 73 6d 5f void* env __asm_
0720: 5f 28 22 72 31 30 22 29 3b 0a 23 65 6e 64 69 66 _("r10");.#endif
0730: 0a 23 69 66 64 65 66 20 5f 5f 73 33 39 30 5f 5f .#ifdef __s390__
0740: 0a 72 65 67 69 73 74 65 72 20 76 6f 69 64 2a 20 .register void*
0750: 65 6e 76 20 5f 5f 61 73 6d 5f 5f 28 22 72 30 22 env __asm__("r0"
0760: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 );.#endif.. ret
0770: 75 72 6e 20 78 20 2b 20 28 69 6e 74 29 28 28 6c urn x + (int)((l
0780: 6f 6e 67 2a 29 65 6e 76 29 5b 30 5d 20 2b 20 28 ong*)env)[0] + (
0790: 69 6e 74 29 28 28 6c 6f 6e 67 2a 29 65 6e 76 29 int)((long*)env)
07a0: 5b 31 5d 20 2b 20 4d 41 47 49 43 33 3b 0a 23 65 [1] + MAGIC3;.#e
07b0: 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 78 20 2b lse. return x +
07c0: 20 4d 41 47 49 43 33 3b 0a 23 65 6e 64 69 66 0a MAGIC3;.#endif.
07d0: 7d 0a 0a 69 6e 74 20 6d 61 69 6e 20 28 29 0a 7b }..int main ().{
07e0: 0a 20 20 66 75 6e 63 74 69 6f 6e 20 63 66 20 3d . function cf =
07f0: 20 61 6c 6c 6f 63 5f 74 72 61 6d 70 6f 6c 69 6e alloc_trampolin
0800: 65 5f 72 28 28 66 75 6e 63 74 69 6f 6e 29 26 66 e_r((function)&f
0810: 2c 20 28 76 6f 69 64 2a 29 4d 41 47 49 43 31 2c , (void*)MAGIC1,
0820: 20 28 76 6f 69 64 2a 29 4d 41 47 49 43 32 29 3b (void*)MAGIC2);
0830: 0a 23 69 66 64 65 66 20 5f 5f 47 4e 55 43 5f 5f .#ifdef __GNUC__
0840: 0a 20 20 69 66 20 28 28 2a 63 66 29 28 4d 41 47 . if ((*cf)(MAG
0850: 49 43 34 29 20 3d 3d 20 4d 41 47 49 43 31 2b 4d IC4) == MAGIC1+M
0860: 41 47 49 43 32 2b 4d 41 47 49 43 33 2b 4d 41 47 AGIC2+MAGIC3+MAG
0870: 49 43 34 29 0a 23 65 6c 73 65 0a 20 20 69 66 20 IC4).#else. if
0880: 28 28 2a 63 66 29 28 4d 41 47 49 43 34 29 20 3d ((*cf)(MAGIC4) =
0890: 3d 20 4d 41 47 49 43 33 2b 4d 41 47 49 43 34 29 = MAGIC3+MAGIC4)
08a0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 20 66 72 .#endif. { fr
08b0: 65 65 5f 74 72 61 6d 70 6f 6c 69 6e 65 5f 72 28 ee_trampoline_r(
08c0: 63 66 29 3b 20 70 72 69 6e 74 66 28 22 57 6f 72 cf); printf("Wor
08d0: 6b 73 2c 20 74 65 73 74 31 20 70 61 73 73 65 64 ks, test1 passed
08e0: 2e 5c 6e 22 29 3b 20 65 78 69 74 28 30 29 3b 20 .\n"); exit(0);
08f0: 7d 0a 20 20 65 6c 73 65 0a 20 20 20 20 7b 20 70 }. else. { p
0900: 72 69 6e 74 66 28 22 44 6f 65 73 6e 27 74 20 77 rintf("Doesn't w
0910: 6f 72 6b 21 5c 6e 22 29 3b 20 65 78 69 74 28 31 ork!\n"); exit(1
0920: 29 3b 20 7d 0a 7d 0a ); }.}.