aboutsummaryrefslogtreecommitdiff
path: root/deps/lightning/check/setcode.c
blob: 0047f34880fac62ea56d627ff717011c45ec90ef (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
/*
 * Simple test of using an alternate buffer for the code.
 */

#include <lightning.h>
#include <stdio.h>
#include <assert.h>
#include <sys/mman.h>
#if defined(__sgi)
#  include <fcntl.h>
#endif

#ifndef MAP_ANON
#  define MAP_ANON			MAP_ANONYMOUS
#  ifndef MAP_ANONYMOUS
#    define MAP_ANONYMOUS		0
#  endif
#endif

#if !defined(__sgi)
#define  mmap_fd			-1
#endif

int
main(int argc, char *argv[])
{
    jit_uint8_t		 *ptr;
    jit_state_t		 *_jit;
    jit_word_t		  length;
#if defined(__sgi)
    int			  mmap_fd;
#endif
    void		(*function)(void);

#if defined(__sgi)
    mmap_fd = open("/dev/zero", O_RDWR);
#endif

    ptr = mmap(NULL, 1024 * 1024,
	       PROT_EXEC | PROT_READ | PROT_WRITE,
	       MAP_PRIVATE | MAP_ANON, mmap_fd, 0);
    assert(ptr != MAP_FAILED);
#if defined(__sgi)
    close(mmap_fd);
#endif

    init_jit(argv[0]);
    _jit = jit_new_state();

    jit_prolog();
    jit_prepare();
    jit_pushargi((jit_word_t)"%s\n");
    jit_ellipsis();
    jit_pushargi((jit_word_t)"ok");
    jit_finishi(printf);

    /* call to jit_realize() is only required when using an alternate
     * code buffer. Note that not using mmap'ed memory may not work
     * on several ports and/or operating system versions */
    jit_realize();

    length = 0;
    if (jit_get_code(&length) != NULL)
	abort();

    if (length <= 4)
	abort();

    /* check that a too small buffer fails */
    jit_set_code(ptr, 4);
    function = jit_emit();
    if (function != NULL)
	abort();

    /* and calling again with enough space works */
    jit_set_code(ptr, 1024 * 1024);
    function = jit_emit();
    if (function == NULL)
	abort();

    jit_clear_state();
    (*function)();
    jit_destroy_state();
    finish_jit();

    munmap(ptr, 1024 * 1024);

    return (0);
}