Commit | Line | Data |
---|---|---|
4a71579b PC |
1 | /* |
2 | * Simple test of using an alternate buffer for the code. | |
3 | */ | |
4 | ||
5 | #include <lightning.h> | |
6 | #include <stdio.h> | |
7 | #include <assert.h> | |
8 | #include <sys/mman.h> | |
9 | #if defined(__sgi) | |
10 | # include <fcntl.h> | |
11 | #endif | |
12 | ||
13 | #ifndef MAP_ANON | |
14 | # define MAP_ANON MAP_ANONYMOUS | |
15 | # ifndef MAP_ANONYMOUS | |
16 | # define MAP_ANONYMOUS 0 | |
17 | # endif | |
18 | #endif | |
19 | ||
20 | #if !defined(__sgi) | |
21 | #define mmap_fd -1 | |
22 | #endif | |
23 | ||
24 | jit_uint8_t *data; | |
25 | jit_state_t *_jit; | |
26 | jit_word_t data_length; | |
27 | jit_word_t note_length; | |
28 | #if defined(__sgi) | |
29 | int mmap_fd; | |
30 | #endif | |
31 | void (*function)(void); | |
32 | ||
33 | void | |
34 | gencode(jit_word_t flags) | |
35 | { | |
36 | jit_word_t offset; | |
37 | jit_word_t length; | |
38 | ||
39 | _jit = jit_new_state(); | |
40 | ||
41 | jit_name("main"); | |
42 | jit_prolog(); | |
43 | jit_prepare(); | |
44 | jit_pushargi((jit_word_t)"%f\n"); | |
45 | jit_ellipsis(); | |
46 | jit_pushargi_d(1.5); | |
47 | jit_finishi(printf); | |
48 | jit_note("nodata.c", __LINE__); | |
49 | ||
50 | /* call to jit_realize() is only required when using an alternate | |
51 | * code buffer. Note that not using mmap'ed memory may not work | |
52 | * on several ports and/or operating system versions */ | |
53 | jit_realize(); | |
54 | ||
55 | if (jit_get_data(&data_length, ¬e_length) != NULL) | |
56 | abort(); | |
57 | ||
58 | length = 0; | |
59 | if (!(flags & JIT_DISABLE_DATA)) | |
60 | length += data_length; | |
61 | if (!(flags & JIT_DISABLE_NOTE)) | |
62 | length += note_length; | |
63 | ||
64 | /* check that a too small buffer fails */ | |
65 | if (flags) | |
66 | jit_set_data(length ? data : NULL, length, flags); | |
67 | ||
68 | /* and calling again with enough space works */ | |
69 | offset = (length + 7) & -8; | |
70 | function = jit_emit(); | |
71 | if (function == NULL) | |
72 | abort(); | |
73 | ||
74 | jit_clear_state(); | |
75 | (*function)(); | |
76 | jit_destroy_state(); | |
77 | } | |
78 | ||
79 | int | |
80 | main(int argc, char *argv[]) | |
81 | { | |
82 | #if defined(__sgi) | |
83 | mmap_fd = open("/dev/zero", O_RDWR); | |
84 | #endif | |
85 | ||
86 | data = mmap(NULL, 4096, | |
87 | PROT_READ | PROT_WRITE, | |
88 | MAP_PRIVATE | MAP_ANON, mmap_fd, 0); | |
89 | assert(data != MAP_FAILED); | |
90 | #if defined(__sgi) | |
91 | close(mmap_fd); | |
92 | #endif | |
93 | ||
94 | init_jit(argv[0]); | |
95 | ||
96 | gencode(0); | |
97 | gencode(JIT_DISABLE_DATA); | |
98 | gencode(JIT_DISABLE_NOTE); | |
99 | gencode(JIT_DISABLE_DATA | JIT_DISABLE_NOTE); | |
100 | ||
101 | finish_jit(); | |
102 | ||
103 | munmap(data, 4096); | |
104 | ||
105 | return (0); | |
106 | } |