evoasm 0.0.2.pre7 → 0.1.0.pre2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gdbinit +41 -0
- data/.gitignore +1 -2
- data/.gitmodules +3 -0
- data/.rubocop.yml +8 -0
- data/Gemfile +4 -0
- data/LICENSE.md +660 -0
- data/Makefile +1 -1
- data/README.md +17 -9
- data/Rakefile +39 -107
- data/bin/gdb +1 -1
- data/bin/gdb_loop +4 -0
- data/docs/FindingInstructions.md +17 -0
- data/docs/JIT.md +14 -0
- data/docs/SymbolicRegression.md +102 -0
- data/docs/Visualization.md +29 -0
- data/docs/examples/bit_insts.rb +44 -0
- data/docs/examples/jit.rb +26 -0
- data/docs/examples/loss.gif +0 -0
- data/docs/examples/program.png +0 -0
- data/docs/examples/sym_reg.rb +64 -0
- data/docs/examples/vis.rb +38 -0
- data/evoasm.gemspec +21 -15
- data/ext/evoasm_ext/Rakefile +3 -0
- data/ext/evoasm_ext/compile.rake +35 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-alloc.c +226 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-alloc.h +84 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-arch.c +52 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-arch.h +101 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-bitmap.h +158 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-buf.c +204 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-buf.h +109 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-domain.c +124 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-domain.h +279 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-error.c +65 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-error.h +108 -0
- data/ext/evoasm_ext/{evoasm-log.c → libevoasm/src/evoasm-log.c} +36 -18
- data/ext/evoasm_ext/libevoasm/src/evoasm-log.h +93 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-param.c +22 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-param.h +33 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-pop-params.c +192 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-pop-params.h +60 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-pop.c +1323 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-pop.h +107 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-program-io.c +116 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-program-io.h +60 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-program.c +1827 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-program.h +167 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-rand.c +65 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-rand.h +76 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-signal.c +106 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-signal.h +58 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-util.h +112 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-x64.c +925 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-x64.h +277 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm.c +28 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm.h +35 -0
- data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-enums.h +2077 -0
- data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-insts.c +191203 -0
- data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-insts.h +1713 -0
- data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-misc.c +348 -0
- data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-misc.h +93 -0
- data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-params.c +51 -0
- data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-params.h +509 -0
- data/lib/evoasm.rb +28 -11
- data/lib/evoasm/buffer.rb +105 -0
- data/lib/evoasm/capstone.rb +100 -0
- data/lib/evoasm/domain.rb +116 -0
- data/lib/evoasm/error.rb +37 -16
- data/lib/evoasm/exception_error.rb +19 -0
- data/lib/evoasm/ffi_ext.rb +53 -0
- data/lib/evoasm/libevoasm.rb +286 -0
- data/lib/evoasm/libevoasm/x64_enums.rb +1967 -0
- data/lib/evoasm/parameter.rb +20 -0
- data/lib/evoasm/population.rb +145 -0
- data/lib/evoasm/population/parameters.rb +227 -0
- data/lib/evoasm/population/plotter.rb +89 -0
- data/lib/evoasm/prng.rb +64 -0
- data/lib/evoasm/program.rb +195 -12
- data/lib/evoasm/program/io.rb +144 -0
- data/lib/evoasm/test.rb +8 -0
- data/lib/evoasm/version.rb +1 -1
- data/lib/evoasm/x64.rb +115 -0
- data/lib/evoasm/x64/cpu_state.rb +95 -0
- data/lib/evoasm/x64/instruction.rb +109 -0
- data/lib/evoasm/x64/operand.rb +156 -0
- data/lib/evoasm/x64/parameters.rb +211 -0
- data/test/helpers/population_helper.rb +128 -0
- data/test/helpers/test_helper.rb +1 -0
- data/test/helpers/x64_helper.rb +24 -0
- data/test/integration/bitwise_reverse_test.rb +41 -0
- data/test/integration/gcd_test.rb +52 -0
- data/test/integration/popcnt_test.rb +46 -0
- data/test/integration/sym_reg_test.rb +68 -0
- data/test/unit/evoasm/buffer_test.rb +48 -0
- data/test/unit/evoasm/capstone_test.rb +18 -0
- data/test/unit/evoasm/domain_test.rb +55 -0
- data/test/unit/evoasm/population/parameters_test.rb +106 -0
- data/test/unit/evoasm/population_test.rb +96 -0
- data/test/unit/evoasm/prng_test.rb +47 -0
- data/test/unit/evoasm/x64/cpu_state_test.rb +73 -0
- data/test/unit/evoasm/x64/encoding_test.rb +320 -0
- data/test/unit/evoasm/x64/instruction_access_test.rb +177 -0
- data/test/unit/evoasm/x64/instruction_encoding_test.rb +780 -0
- data/test/unit/evoasm/x64/instruction_test.rb +62 -0
- data/test/unit/evoasm/x64/parameters_test.rb +65 -0
- data/test/unit/evoasm/x64_test.rb +52 -0
- metadata +195 -89
- data/Gemfile.rake +0 -8
- data/Gemfile.rake.lock +0 -51
- data/LICENSE.txt +0 -373
- data/data/tables/README.md +0 -19
- data/data/tables/x64.csv +0 -1684
- data/data/templates/evoasm-x64.c.erb +0 -319
- data/data/templates/evoasm-x64.h.erb +0 -126
- data/examples/abs.yml +0 -20
- data/examples/popcnt.yml +0 -17
- data/examples/sym_reg.yml +0 -26
- data/exe/evoasm-search +0 -13
- data/ext/evoasm_ext/evoasm-alloc.c +0 -145
- data/ext/evoasm_ext/evoasm-alloc.h +0 -59
- data/ext/evoasm_ext/evoasm-arch.c +0 -44
- data/ext/evoasm_ext/evoasm-arch.h +0 -161
- data/ext/evoasm_ext/evoasm-bitmap.h +0 -114
- data/ext/evoasm_ext/evoasm-buf.c +0 -130
- data/ext/evoasm_ext/evoasm-buf.h +0 -47
- data/ext/evoasm_ext/evoasm-error.c +0 -31
- data/ext/evoasm_ext/evoasm-error.h +0 -75
- data/ext/evoasm_ext/evoasm-free-list.c.tmpl +0 -121
- data/ext/evoasm_ext/evoasm-free-list.h.tmpl +0 -86
- data/ext/evoasm_ext/evoasm-log.h +0 -69
- data/ext/evoasm_ext/evoasm-misc.c +0 -23
- data/ext/evoasm_ext/evoasm-misc.h +0 -282
- data/ext/evoasm_ext/evoasm-param.h +0 -37
- data/ext/evoasm_ext/evoasm-search.c +0 -2145
- data/ext/evoasm_ext/evoasm-search.h +0 -214
- data/ext/evoasm_ext/evoasm-util.h +0 -40
- data/ext/evoasm_ext/evoasm-x64.c +0 -275624
- data/ext/evoasm_ext/evoasm-x64.h +0 -5436
- data/ext/evoasm_ext/evoasm.c +0 -7
- data/ext/evoasm_ext/evoasm.h +0 -23
- data/ext/evoasm_ext/evoasm_ext.c +0 -1757
- data/ext/evoasm_ext/extconf.rb +0 -31
- data/lib/evoasm/cli.rb +0 -6
- data/lib/evoasm/cli/search.rb +0 -127
- data/lib/evoasm/core_ext.rb +0 -1
- data/lib/evoasm/core_ext/array.rb +0 -9
- data/lib/evoasm/core_ext/integer.rb +0 -10
- data/lib/evoasm/core_ext/kwstruct.rb +0 -13
- data/lib/evoasm/core_ext/range.rb +0 -5
- data/lib/evoasm/examples.rb +0 -27
- data/lib/evoasm/gen.rb +0 -8
- data/lib/evoasm/gen/enum.rb +0 -169
- data/lib/evoasm/gen/name_util.rb +0 -80
- data/lib/evoasm/gen/state.rb +0 -176
- data/lib/evoasm/gen/state_dsl.rb +0 -152
- data/lib/evoasm/gen/strio.rb +0 -27
- data/lib/evoasm/gen/translator.rb +0 -1102
- data/lib/evoasm/gen/version.rb +0 -5
- data/lib/evoasm/gen/x64.rb +0 -237
- data/lib/evoasm/gen/x64/funcs.rb +0 -495
- data/lib/evoasm/gen/x64/inst.rb +0 -781
- data/lib/evoasm/search.rb +0 -40
- data/lib/evoasm/tasks/gen_task.rb +0 -86
- data/lib/evoasm/tasks/template_task.rb +0 -52
- data/test/test_helper.rb +0 -1
- data/test/x64/test_helper.rb +0 -19
- data/test/x64/x64_test.rb +0 -87
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
#pragma once
|
|
2
|
-
|
|
3
|
-
#include <stdint.h>
|
|
4
|
-
#include <stdbool.h>
|
|
5
|
-
|
|
6
|
-
#define _EVOASM_BITMAP_INDEX_DECLS(key) \
|
|
7
|
-
unsigned size = sizeof(uint64_t) * 8;\
|
|
8
|
-
unsigned ary_idx = ((unsigned) key) / size;\
|
|
9
|
-
unsigned bit_idx = ((unsigned) key) % size;
|
|
10
|
-
|
|
11
|
-
typedef struct {
|
|
12
|
-
uint64_t data[1];
|
|
13
|
-
} evoasm_bitmap64;
|
|
14
|
-
|
|
15
|
-
typedef struct {
|
|
16
|
-
uint64_t data[2];
|
|
17
|
-
} evoasm_bitmap128;
|
|
18
|
-
|
|
19
|
-
typedef struct {
|
|
20
|
-
uint64_t data[4];
|
|
21
|
-
} evoasm_bitmap256;
|
|
22
|
-
|
|
23
|
-
typedef struct {
|
|
24
|
-
uint64_t data[8];
|
|
25
|
-
} evoasm_bitmap512;
|
|
26
|
-
|
|
27
|
-
typedef struct {
|
|
28
|
-
uint64_t data[16];
|
|
29
|
-
} evoasm_bitmap1024;
|
|
30
|
-
|
|
31
|
-
typedef uint64_t evoasm_bitmap;
|
|
32
|
-
|
|
33
|
-
static inline void
|
|
34
|
-
evoasm_bitmap_set(evoasm_bitmap *bitmap, unsigned idx) {
|
|
35
|
-
_EVOASM_BITMAP_INDEX_DECLS(idx);
|
|
36
|
-
bitmap[ary_idx] |= (1ull << bit_idx);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
static inline void
|
|
40
|
-
evoasm_bitmap_unset(evoasm_bitmap *bitmap, unsigned idx) {
|
|
41
|
-
_EVOASM_BITMAP_INDEX_DECLS(idx);
|
|
42
|
-
/* unset values must be 0*/
|
|
43
|
-
bitmap[ary_idx] &= ~(1ull << bit_idx);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
static inline bool
|
|
47
|
-
evoasm_bitmap_get(evoasm_bitmap *bitmap, unsigned idx) {
|
|
48
|
-
_EVOASM_BITMAP_INDEX_DECLS(idx);
|
|
49
|
-
return !!(bitmap[ary_idx] & (1ull << bit_idx));
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
#define _EVOASM_BITMAP_DECL_UNOP(name, width, op) \
|
|
54
|
-
static inline void evoasm_bitmap ## width ## _ ## name (evoasm_bitmap##width *bitmap, evoasm_bitmap##width *result) { \
|
|
55
|
-
unsigned i;\
|
|
56
|
-
for(i = 0; i < width / 64; i++) {\
|
|
57
|
-
result->data[i] = op bitmap->data[i];\
|
|
58
|
-
}\
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
#define _EVOASM_BITMAP_DECL_BINOP(name, width, op) \
|
|
62
|
-
static inline void evoasm_bitmap ## width ## _ ## name (evoasm_bitmap##width *bitmap1, evoasm_bitmap##width *bitmap2, evoasm_bitmap##width *result) { \
|
|
63
|
-
unsigned i;\
|
|
64
|
-
for(i = 0; i < width / 64; i++) {\
|
|
65
|
-
result->data[i] = bitmap1->data[i] op bitmap2->data[i];\
|
|
66
|
-
}\
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
#define _EVOASM_BITMAP_DECL_EQL(width) \
|
|
70
|
-
static inline bool evoasm_bitmap ## width ## _ ## eql (evoasm_bitmap##width *bitmap1, evoasm_bitmap##width *bitmap2) { \
|
|
71
|
-
unsigned i;\
|
|
72
|
-
for(i = 0; i < width / 64; i++) {\
|
|
73
|
-
if(bitmap1->data[i] != bitmap2->data[i]) return false;\
|
|
74
|
-
} \
|
|
75
|
-
return true;\
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
#ifdef __GNUC__
|
|
80
|
-
# define _EVOASM_BITMAP_DECL_POPCOUNT(width) \
|
|
81
|
-
static inline unsigned evoasm_bitmap ## width ## _ ## popcount (evoasm_bitmap##width *bitmap) { \
|
|
82
|
-
unsigned c = 0, i;\
|
|
83
|
-
for(i = 0; i < width / 64; i++) {\
|
|
84
|
-
c += (unsigned) __builtin_popcountll(bitmap->data[i]);\
|
|
85
|
-
} \
|
|
86
|
-
return c;\
|
|
87
|
-
}
|
|
88
|
-
#else
|
|
89
|
-
# define _EVOASM_BITMAP_DECL_POPCOUNT(width) \
|
|
90
|
-
static inline unsigned evoasm_bitmap ## width ## _ ## popcount (evoasm_bitmap##width *bitmap) { \
|
|
91
|
-
unsigned c = 0, i;\
|
|
92
|
-
for(i = 0; i < width / 64; i++) {\
|
|
93
|
-
uint64_t x = bitmap->data[i]; \
|
|
94
|
-
for(; x > 0; x &= x - 1) c++;\
|
|
95
|
-
} \
|
|
96
|
-
return c;\
|
|
97
|
-
}
|
|
98
|
-
#endif
|
|
99
|
-
|
|
100
|
-
_EVOASM_BITMAP_DECL_UNOP(not, 128, ~)
|
|
101
|
-
_EVOASM_BITMAP_DECL_BINOP(and, 128, &)
|
|
102
|
-
_EVOASM_BITMAP_DECL_BINOP(or, 128, |)
|
|
103
|
-
_EVOASM_BITMAP_DECL_BINOP(andn, 128, &~)
|
|
104
|
-
_EVOASM_BITMAP_DECL_POPCOUNT(128)
|
|
105
|
-
_EVOASM_BITMAP_DECL_EQL(128)
|
|
106
|
-
|
|
107
|
-
_EVOASM_BITMAP_DECL_UNOP(not, 64, ~)
|
|
108
|
-
_EVOASM_BITMAP_DECL_BINOP(and, 64, &)
|
|
109
|
-
_EVOASM_BITMAP_DECL_BINOP(or, 64, |)
|
|
110
|
-
_EVOASM_BITMAP_DECL_POPCOUNT(64)
|
|
111
|
-
_EVOASM_BITMAP_DECL_EQL(64)
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
_EVOASM_BITMAP_DECL_EQL(1024)
|
data/ext/evoasm_ext/evoasm-buf.c
DELETED
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
#include <string.h>
|
|
2
|
-
|
|
3
|
-
#include "evoasm-buf.h"
|
|
4
|
-
#include "evoasm-util.h"
|
|
5
|
-
#include "evoasm-error.h"
|
|
6
|
-
#include "evoasm-alloc.h"
|
|
7
|
-
#include "evoasm-log.h"
|
|
8
|
-
|
|
9
|
-
EVOASM_DECL_LOG_TAG("buf")
|
|
10
|
-
|
|
11
|
-
static evoasm_success
|
|
12
|
-
evoasm_buf_init_mmap(evoasm_buf *buf, size_t size) {
|
|
13
|
-
uint8_t *mem;
|
|
14
|
-
|
|
15
|
-
//size = EVOASM_ALIGN_UP(size, evoasm_page_size());
|
|
16
|
-
mem = evoasm_mmap(size, NULL);
|
|
17
|
-
|
|
18
|
-
if(mem) {
|
|
19
|
-
buf->capa = size;
|
|
20
|
-
buf->data = mem;
|
|
21
|
-
buf->pos = 0;
|
|
22
|
-
return true;
|
|
23
|
-
}
|
|
24
|
-
else {
|
|
25
|
-
return false;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
static evoasm_success
|
|
30
|
-
evoasm_buf_init_malloc(evoasm_buf *buf, size_t size) {
|
|
31
|
-
uint8_t *mem;
|
|
32
|
-
|
|
33
|
-
mem = malloc(size);
|
|
34
|
-
|
|
35
|
-
if(mem) {
|
|
36
|
-
buf->capa = size;
|
|
37
|
-
buf->data = mem;
|
|
38
|
-
buf->pos = 0;
|
|
39
|
-
return true;
|
|
40
|
-
}
|
|
41
|
-
else {
|
|
42
|
-
return false;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
evoasm_success
|
|
47
|
-
evoasm_buf_init(evoasm_buf *buf, evoasm_buf_type buf_type, size_t size)
|
|
48
|
-
{
|
|
49
|
-
buf->type = buf_type;
|
|
50
|
-
switch(buf_type) {
|
|
51
|
-
case EVOASM_BUF_TYPE_MMAP: return evoasm_buf_init_mmap(buf, size);
|
|
52
|
-
case EVOASM_BUF_TYPE_MALLOC: return evoasm_buf_init_malloc(buf, size);
|
|
53
|
-
default: evoasm_assert_not_reached();
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
static evoasm_success
|
|
58
|
-
evoasm_buf_destroy_mmap(evoasm_buf *buf) {
|
|
59
|
-
return evoasm_munmap(buf->data, buf->capa);
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
static evoasm_success
|
|
63
|
-
evoasm_buf_destroy_malloc(evoasm_buf *buf) {
|
|
64
|
-
evoasm_free(buf->data);
|
|
65
|
-
return true;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
evoasm_success
|
|
69
|
-
evoasm_buf_destroy(evoasm_buf *buf)
|
|
70
|
-
{
|
|
71
|
-
switch(buf->type) {
|
|
72
|
-
case EVOASM_BUF_TYPE_MMAP: return evoasm_buf_destroy_mmap(buf);
|
|
73
|
-
case EVOASM_BUF_TYPE_MALLOC: return evoasm_buf_destroy_malloc(buf);
|
|
74
|
-
default: evoasm_assert_not_reached();
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
void
|
|
79
|
-
evoasm_buf_reset(evoasm_buf *buf) {
|
|
80
|
-
memset(buf->data, 0, buf->pos);
|
|
81
|
-
buf->pos = 0;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
evoasm_success
|
|
85
|
-
evoasm_buf_protect(evoasm_buf *buf, int mode) {
|
|
86
|
-
return evoasm_mprot(buf->data, buf->capa, mode);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
intptr_t
|
|
90
|
-
evoasm_buf_exec(evoasm_buf *buf) {
|
|
91
|
-
intptr_t (*func)(void);
|
|
92
|
-
intptr_t result = 0;
|
|
93
|
-
*(void **) (&func) = buf->data;
|
|
94
|
-
result = func();
|
|
95
|
-
return result;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
void
|
|
99
|
-
evoasm_buf_log(evoasm_buf *buf, evoasm_log_level log_level) {
|
|
100
|
-
unsigned i;
|
|
101
|
-
|
|
102
|
-
evoasm_log(log_level, EVOASM_LOG_TAG, "Evoasm::Buffer: capa: %zu, pos: %zu, addr: %p\n", buf->capa, buf->pos, (void *) buf->data);
|
|
103
|
-
for(i = 0; i < buf->pos; i++)
|
|
104
|
-
{
|
|
105
|
-
if (i > 0) evoasm_log(log_level, EVOASM_LOG_TAG, " ");
|
|
106
|
-
evoasm_log(log_level, EVOASM_LOG_TAG, " %02X ", buf->data[i]);
|
|
107
|
-
}
|
|
108
|
-
evoasm_log(log_level, EVOASM_LOG_TAG, " \n ");
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
size_t
|
|
112
|
-
evoasm_buf_append(evoasm_buf * restrict dst, evoasm_buf * restrict src) {
|
|
113
|
-
size_t free = dst->capa - dst->pos;
|
|
114
|
-
if(src->pos > free) {
|
|
115
|
-
evoasm_set_error(EVOASM_ERROR_TYPE_ARGUMENT, EVOASM_ERROR_CODE_NONE,
|
|
116
|
-
NULL, "buffer does not fit (need %zu bytes but only %zu free)", src->pos, free);
|
|
117
|
-
return src->pos - (dst->capa - dst->pos);
|
|
118
|
-
}
|
|
119
|
-
memcpy(dst->data + dst->pos, src->data, src->pos);
|
|
120
|
-
dst->pos += src->pos;
|
|
121
|
-
return 0;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
evoasm_success
|
|
125
|
-
evoasm_buf_clone(evoasm_buf * restrict buf, evoasm_buf * restrict cloned_buf) {
|
|
126
|
-
if(!evoasm_buf_init(cloned_buf, buf->type, buf->capa)) {
|
|
127
|
-
return false;
|
|
128
|
-
}
|
|
129
|
-
return evoasm_buf_append(cloned_buf, buf) == 0;
|
|
130
|
-
}
|
data/ext/evoasm_ext/evoasm-buf.h
DELETED
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
#pragma once
|
|
2
|
-
|
|
3
|
-
#include <stdbool.h>
|
|
4
|
-
#include <stdint.h>
|
|
5
|
-
#include <stdlib.h>
|
|
6
|
-
#include <stdio.h>
|
|
7
|
-
|
|
8
|
-
#include "evoasm-error.h"
|
|
9
|
-
#include "evoasm-log.h"
|
|
10
|
-
|
|
11
|
-
typedef enum {
|
|
12
|
-
EVOASM_BUF_TYPE_MMAP,
|
|
13
|
-
EVOASM_BUF_TYPE_MALLOC,
|
|
14
|
-
EVOASM_N_BUF_TYPES
|
|
15
|
-
} evoasm_buf_type;
|
|
16
|
-
|
|
17
|
-
typedef struct {
|
|
18
|
-
size_t capa;
|
|
19
|
-
size_t pos;
|
|
20
|
-
evoasm_buf_type type : 2;
|
|
21
|
-
uint8_t *data;
|
|
22
|
-
} evoasm_buf;
|
|
23
|
-
|
|
24
|
-
evoasm_success
|
|
25
|
-
evoasm_buf_init(evoasm_buf *buf, evoasm_buf_type buf_type, size_t size);
|
|
26
|
-
|
|
27
|
-
evoasm_success
|
|
28
|
-
evoasm_buf_destroy(evoasm_buf *buf);
|
|
29
|
-
|
|
30
|
-
void
|
|
31
|
-
evoasm_buf_reset(evoasm_buf *buf);
|
|
32
|
-
|
|
33
|
-
size_t
|
|
34
|
-
evoasm_buf_append(evoasm_buf * restrict dst, evoasm_buf * restrict src);
|
|
35
|
-
|
|
36
|
-
evoasm_success
|
|
37
|
-
evoasm_buf_protect(evoasm_buf *buf, int mode);
|
|
38
|
-
|
|
39
|
-
intptr_t
|
|
40
|
-
evoasm_buf_exec(evoasm_buf *buf);
|
|
41
|
-
|
|
42
|
-
void
|
|
43
|
-
evoasm_buf_log(evoasm_buf *buf, evoasm_log_level log_level);
|
|
44
|
-
|
|
45
|
-
evoasm_success
|
|
46
|
-
evoasm_buf_clone(evoasm_buf * restrict buf, evoasm_buf * restrict cloned_buf);
|
|
47
|
-
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
#include "evoasm-error.h"
|
|
2
|
-
|
|
3
|
-
_Thread_local evoasm_error evoasm_last_error;
|
|
4
|
-
|
|
5
|
-
void
|
|
6
|
-
evoasm_error_setv(evoasm_error *error, unsigned error_type, unsigned error_code,
|
|
7
|
-
void *error_data, const char *file,
|
|
8
|
-
unsigned line, const char *format, va_list args) {
|
|
9
|
-
|
|
10
|
-
error->type = (uint16_t) error_type;
|
|
11
|
-
error->code = (uint16_t) error_code;
|
|
12
|
-
error->line = line;
|
|
13
|
-
strncpy(error->filename, file, EVOASM_ERROR_MAX_FILENAME_LEN);
|
|
14
|
-
vsnprintf(error->msg, EVOASM_ERROR_MAX_MSG_LEN, format, args);
|
|
15
|
-
|
|
16
|
-
if(error_data != NULL) {
|
|
17
|
-
memcpy(&error->data, error_data, sizeof(evoasm_error_data));
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
void
|
|
22
|
-
evoasm_error_set(evoasm_error *error, unsigned error_type, unsigned error_code,
|
|
23
|
-
void *error_data, const char *file,
|
|
24
|
-
unsigned line, const char *format, ...) {
|
|
25
|
-
va_list args;
|
|
26
|
-
va_start(args, format);
|
|
27
|
-
evoasm_error_setv(error, error_type, error_code,
|
|
28
|
-
error_data, file, line,
|
|
29
|
-
format, args);
|
|
30
|
-
va_end(args);
|
|
31
|
-
}
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
#pragma once
|
|
2
|
-
|
|
3
|
-
#include <assert.h>
|
|
4
|
-
#include <stdio.h>
|
|
5
|
-
#include <stdlib.h>
|
|
6
|
-
#include <stdint.h>
|
|
7
|
-
#include <stdbool.h>
|
|
8
|
-
#include <string.h>
|
|
9
|
-
#include <stdarg.h>
|
|
10
|
-
#include <setjmp.h>
|
|
11
|
-
|
|
12
|
-
#include "evoasm-util.h"
|
|
13
|
-
|
|
14
|
-
#define EVOASM_ERROR_MAX_FILENAME_LEN 128
|
|
15
|
-
#define EVOASM_ERROR_MAX_MSG_LEN 128
|
|
16
|
-
|
|
17
|
-
#define EVOASM_ERROR_HEADER \
|
|
18
|
-
uint16_t type; \
|
|
19
|
-
uint16_t code; \
|
|
20
|
-
uint32_t line; \
|
|
21
|
-
char filename[EVOASM_ERROR_MAX_FILENAME_LEN]; \
|
|
22
|
-
char msg[EVOASM_ERROR_MAX_MSG_LEN];
|
|
23
|
-
|
|
24
|
-
typedef enum {
|
|
25
|
-
EVOASM_ERROR_CODE_NONE,
|
|
26
|
-
EVOASM_N_ERROR_CODES
|
|
27
|
-
} evoasm_error_code;
|
|
28
|
-
|
|
29
|
-
typedef enum {
|
|
30
|
-
EVOASM_ERROR_TYPE_INVALID,
|
|
31
|
-
EVOASM_ERROR_TYPE_ARGUMENT,
|
|
32
|
-
EVOASM_ERROR_TYPE_MEMORY,
|
|
33
|
-
EVOASM_ERROR_TYPE_ARCH,
|
|
34
|
-
EVOASM_ERROR_TYPE_GRAPH,
|
|
35
|
-
} evoasm_error_type;
|
|
36
|
-
|
|
37
|
-
typedef struct {
|
|
38
|
-
uint8_t data[64];
|
|
39
|
-
} evoasm_error_data;
|
|
40
|
-
|
|
41
|
-
typedef struct {
|
|
42
|
-
EVOASM_ERROR_HEADER
|
|
43
|
-
evoasm_error_data data;
|
|
44
|
-
} evoasm_error;
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
void
|
|
48
|
-
evoasm_error_setv(evoasm_error *error, unsigned error_type, unsigned error_code,
|
|
49
|
-
void *error_data, const char *file,
|
|
50
|
-
unsigned line, const char *format, va_list args);
|
|
51
|
-
|
|
52
|
-
void
|
|
53
|
-
evoasm_error_set(evoasm_error *error, unsigned error_type, unsigned error_code,
|
|
54
|
-
void *error_data, const char *file,
|
|
55
|
-
unsigned line, const char *format, ...);
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
extern _Thread_local evoasm_error evoasm_last_error;
|
|
59
|
-
|
|
60
|
-
#define EVOASM_TRY(label, func, ...) \
|
|
61
|
-
do { if(!func(__VA_ARGS__)) {goto label;} } while(0)
|
|
62
|
-
|
|
63
|
-
#define evoasm_success evoasm_check_return bool
|
|
64
|
-
|
|
65
|
-
#define evoasm_set_error(type, code, data, ...) \
|
|
66
|
-
evoasm_error_set(&evoasm_last_error, (type), (code), (data),\
|
|
67
|
-
__FILE__, __LINE__, __VA_ARGS__)
|
|
68
|
-
|
|
69
|
-
#define evoasm_assert_not_reached() \
|
|
70
|
-
evoasm_assert_not_reached_full(__FILE__, __LINE__)
|
|
71
|
-
|
|
72
|
-
static inline _Noreturn void evoasm_assert_not_reached_full(const char *file, unsigned line) {
|
|
73
|
-
fprintf(stderr, "FATAL: %s:%d should not be reached\n", file, line);
|
|
74
|
-
abort();
|
|
75
|
-
}
|
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
#include <assert.h>
|
|
2
|
-
#include <errno.h>
|
|
3
|
-
|
|
4
|
-
#include "$-s.h"
|
|
5
|
-
#include "evoasm-alloc.h"
|
|
6
|
-
|
|
7
|
-
$includes
|
|
8
|
-
|
|
9
|
-
void
|
|
10
|
-
$s_clear($s *free_list, $s_index start, $s_index end) {
|
|
11
|
-
for($s_index i = start; i < end - 1; i++) {
|
|
12
|
-
$S_DATA(free_list)[i].free = true;
|
|
13
|
-
$S_DATA(free_list)[i].next_free = i + 1;
|
|
14
|
-
}
|
|
15
|
-
$S_DATA(free_list)[end - 1].next_free = $S_NULL_IDX;
|
|
16
|
-
$S_DATA(free_list)[end - 1].free = true;
|
|
17
|
-
|
|
18
|
-
free_list->last_free = end - 1;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
$e *
|
|
23
|
-
$s_data($s *free_list) {
|
|
24
|
-
return $S_DATA(free_list);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
evoasm_success
|
|
28
|
-
$s_init($s *free_list, $s_index capa) {
|
|
29
|
-
|
|
30
|
-
#if $embed > 0
|
|
31
|
-
free_list->data = NULL;
|
|
32
|
-
free_list->capa = EVOASM_SEQ_EMBED_N;
|
|
33
|
-
#else
|
|
34
|
-
size_t size = sizeof($e) * capa;
|
|
35
|
-
free_list->data = evoasm_malloc(size);
|
|
36
|
-
if(free_list->data == NULL) {
|
|
37
|
-
evoasm_set_error(EVOASM_ERROR_TYPE_MEMORY, EVOASM_ERROR_CODE_NONE,
|
|
38
|
-
NULL, "Allocationg buffer of size %zu failed: %s", size, strerror(errno));
|
|
39
|
-
return false;
|
|
40
|
-
}
|
|
41
|
-
free_list->capa = capa;
|
|
42
|
-
#endif
|
|
43
|
-
|
|
44
|
-
free_list->first_free = 0;
|
|
45
|
-
free_list->len = 0;
|
|
46
|
-
|
|
47
|
-
$s_clear(free_list, 0, free_list->capa);
|
|
48
|
-
return true;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
evoasm_success
|
|
52
|
-
_$s_grow($s *free_list) {
|
|
53
|
-
$s_index new_capa = free_list->capa + free_list->capa / 2;
|
|
54
|
-
|
|
55
|
-
#if $embed > 0
|
|
56
|
-
if(free_list->data == NULL) {
|
|
57
|
-
free_list->data = malloc(sizeof($e) * new_capa);
|
|
58
|
-
memcpy(free_list->data, free_list->_data, sizeof($e) * free_list->capa);
|
|
59
|
-
goto update;
|
|
60
|
-
}
|
|
61
|
-
#endif
|
|
62
|
-
|
|
63
|
-
{
|
|
64
|
-
size_t size = sizeof($e) * new_capa;
|
|
65
|
-
$e *new_data = evoasm_realloc(free_list->data, size);
|
|
66
|
-
|
|
67
|
-
if(EVOASM_UNLIKELY(new_data == NULL)) {
|
|
68
|
-
evoasm_set_error(EVOASM_ERROR_TYPE_MEMORY, EVOASM_ERROR_CODE_NONE,
|
|
69
|
-
NULL, "Reallocationg buffer of size %zu failed: %s", size, strerror(errno));
|
|
70
|
-
return false;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
update:
|
|
74
|
-
free_list->first_free = free_list->capa;
|
|
75
|
-
$s_clear(free_list, free_list->capa, new_capa);
|
|
76
|
-
free_list->capa = new_capa;
|
|
77
|
-
return true;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
$e *
|
|
81
|
-
$s_delete($s *free_list, $e *e) {
|
|
82
|
-
$s_index idx = $s_index(free_list, e);
|
|
83
|
-
|
|
84
|
-
e->next_free = free_list->first_free;
|
|
85
|
-
e->free = true;
|
|
86
|
-
|
|
87
|
-
// only free slot
|
|
88
|
-
if(free_list->last_free == $S_NULL_IDX) {
|
|
89
|
-
free_list->last_free = idx;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
free_list->first_free = idx;
|
|
93
|
-
free_list->len--;
|
|
94
|
-
return e;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
bool
|
|
98
|
-
$s_eql($s *a, $s *b) {
|
|
99
|
-
$eql
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
bool
|
|
103
|
-
$s_find($s *free_list, $e *value, $s_index *index) {
|
|
104
|
-
|
|
105
|
-
if(free_list->len == 0) return false;
|
|
106
|
-
|
|
107
|
-
for($s_index i = 0; i < free_list->capa; i++) {
|
|
108
|
-
if(!$S_DATA(free_list)[i].free) {
|
|
109
|
-
if($s_cmp(value, &$S_DATA(free_list)[i])) {
|
|
110
|
-
if(index != NULL) *index = i;
|
|
111
|
-
return true;
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
return false;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
void
|
|
119
|
-
$s_destroy($s *free_list) {
|
|
120
|
-
evoasm_free(free_list->data);
|
|
121
|
-
}
|