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.
Files changed (168) hide show
  1. checksums.yaml +4 -4
  2. data/.gdbinit +41 -0
  3. data/.gitignore +1 -2
  4. data/.gitmodules +3 -0
  5. data/.rubocop.yml +8 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE.md +660 -0
  8. data/Makefile +1 -1
  9. data/README.md +17 -9
  10. data/Rakefile +39 -107
  11. data/bin/gdb +1 -1
  12. data/bin/gdb_loop +4 -0
  13. data/docs/FindingInstructions.md +17 -0
  14. data/docs/JIT.md +14 -0
  15. data/docs/SymbolicRegression.md +102 -0
  16. data/docs/Visualization.md +29 -0
  17. data/docs/examples/bit_insts.rb +44 -0
  18. data/docs/examples/jit.rb +26 -0
  19. data/docs/examples/loss.gif +0 -0
  20. data/docs/examples/program.png +0 -0
  21. data/docs/examples/sym_reg.rb +64 -0
  22. data/docs/examples/vis.rb +38 -0
  23. data/evoasm.gemspec +21 -15
  24. data/ext/evoasm_ext/Rakefile +3 -0
  25. data/ext/evoasm_ext/compile.rake +35 -0
  26. data/ext/evoasm_ext/libevoasm/src/evoasm-alloc.c +226 -0
  27. data/ext/evoasm_ext/libevoasm/src/evoasm-alloc.h +84 -0
  28. data/ext/evoasm_ext/libevoasm/src/evoasm-arch.c +52 -0
  29. data/ext/evoasm_ext/libevoasm/src/evoasm-arch.h +101 -0
  30. data/ext/evoasm_ext/libevoasm/src/evoasm-bitmap.h +158 -0
  31. data/ext/evoasm_ext/libevoasm/src/evoasm-buf.c +204 -0
  32. data/ext/evoasm_ext/libevoasm/src/evoasm-buf.h +109 -0
  33. data/ext/evoasm_ext/libevoasm/src/evoasm-domain.c +124 -0
  34. data/ext/evoasm_ext/libevoasm/src/evoasm-domain.h +279 -0
  35. data/ext/evoasm_ext/libevoasm/src/evoasm-error.c +65 -0
  36. data/ext/evoasm_ext/libevoasm/src/evoasm-error.h +108 -0
  37. data/ext/evoasm_ext/{evoasm-log.c → libevoasm/src/evoasm-log.c} +36 -18
  38. data/ext/evoasm_ext/libevoasm/src/evoasm-log.h +93 -0
  39. data/ext/evoasm_ext/libevoasm/src/evoasm-param.c +22 -0
  40. data/ext/evoasm_ext/libevoasm/src/evoasm-param.h +33 -0
  41. data/ext/evoasm_ext/libevoasm/src/evoasm-pop-params.c +192 -0
  42. data/ext/evoasm_ext/libevoasm/src/evoasm-pop-params.h +60 -0
  43. data/ext/evoasm_ext/libevoasm/src/evoasm-pop.c +1323 -0
  44. data/ext/evoasm_ext/libevoasm/src/evoasm-pop.h +107 -0
  45. data/ext/evoasm_ext/libevoasm/src/evoasm-program-io.c +116 -0
  46. data/ext/evoasm_ext/libevoasm/src/evoasm-program-io.h +60 -0
  47. data/ext/evoasm_ext/libevoasm/src/evoasm-program.c +1827 -0
  48. data/ext/evoasm_ext/libevoasm/src/evoasm-program.h +167 -0
  49. data/ext/evoasm_ext/libevoasm/src/evoasm-rand.c +65 -0
  50. data/ext/evoasm_ext/libevoasm/src/evoasm-rand.h +76 -0
  51. data/ext/evoasm_ext/libevoasm/src/evoasm-signal.c +106 -0
  52. data/ext/evoasm_ext/libevoasm/src/evoasm-signal.h +58 -0
  53. data/ext/evoasm_ext/libevoasm/src/evoasm-util.h +112 -0
  54. data/ext/evoasm_ext/libevoasm/src/evoasm-x64.c +925 -0
  55. data/ext/evoasm_ext/libevoasm/src/evoasm-x64.h +277 -0
  56. data/ext/evoasm_ext/libevoasm/src/evoasm.c +28 -0
  57. data/ext/evoasm_ext/libevoasm/src/evoasm.h +35 -0
  58. data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-enums.h +2077 -0
  59. data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-insts.c +191203 -0
  60. data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-insts.h +1713 -0
  61. data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-misc.c +348 -0
  62. data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-misc.h +93 -0
  63. data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-params.c +51 -0
  64. data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-params.h +509 -0
  65. data/lib/evoasm.rb +28 -11
  66. data/lib/evoasm/buffer.rb +105 -0
  67. data/lib/evoasm/capstone.rb +100 -0
  68. data/lib/evoasm/domain.rb +116 -0
  69. data/lib/evoasm/error.rb +37 -16
  70. data/lib/evoasm/exception_error.rb +19 -0
  71. data/lib/evoasm/ffi_ext.rb +53 -0
  72. data/lib/evoasm/libevoasm.rb +286 -0
  73. data/lib/evoasm/libevoasm/x64_enums.rb +1967 -0
  74. data/lib/evoasm/parameter.rb +20 -0
  75. data/lib/evoasm/population.rb +145 -0
  76. data/lib/evoasm/population/parameters.rb +227 -0
  77. data/lib/evoasm/population/plotter.rb +89 -0
  78. data/lib/evoasm/prng.rb +64 -0
  79. data/lib/evoasm/program.rb +195 -12
  80. data/lib/evoasm/program/io.rb +144 -0
  81. data/lib/evoasm/test.rb +8 -0
  82. data/lib/evoasm/version.rb +1 -1
  83. data/lib/evoasm/x64.rb +115 -0
  84. data/lib/evoasm/x64/cpu_state.rb +95 -0
  85. data/lib/evoasm/x64/instruction.rb +109 -0
  86. data/lib/evoasm/x64/operand.rb +156 -0
  87. data/lib/evoasm/x64/parameters.rb +211 -0
  88. data/test/helpers/population_helper.rb +128 -0
  89. data/test/helpers/test_helper.rb +1 -0
  90. data/test/helpers/x64_helper.rb +24 -0
  91. data/test/integration/bitwise_reverse_test.rb +41 -0
  92. data/test/integration/gcd_test.rb +52 -0
  93. data/test/integration/popcnt_test.rb +46 -0
  94. data/test/integration/sym_reg_test.rb +68 -0
  95. data/test/unit/evoasm/buffer_test.rb +48 -0
  96. data/test/unit/evoasm/capstone_test.rb +18 -0
  97. data/test/unit/evoasm/domain_test.rb +55 -0
  98. data/test/unit/evoasm/population/parameters_test.rb +106 -0
  99. data/test/unit/evoasm/population_test.rb +96 -0
  100. data/test/unit/evoasm/prng_test.rb +47 -0
  101. data/test/unit/evoasm/x64/cpu_state_test.rb +73 -0
  102. data/test/unit/evoasm/x64/encoding_test.rb +320 -0
  103. data/test/unit/evoasm/x64/instruction_access_test.rb +177 -0
  104. data/test/unit/evoasm/x64/instruction_encoding_test.rb +780 -0
  105. data/test/unit/evoasm/x64/instruction_test.rb +62 -0
  106. data/test/unit/evoasm/x64/parameters_test.rb +65 -0
  107. data/test/unit/evoasm/x64_test.rb +52 -0
  108. metadata +195 -89
  109. data/Gemfile.rake +0 -8
  110. data/Gemfile.rake.lock +0 -51
  111. data/LICENSE.txt +0 -373
  112. data/data/tables/README.md +0 -19
  113. data/data/tables/x64.csv +0 -1684
  114. data/data/templates/evoasm-x64.c.erb +0 -319
  115. data/data/templates/evoasm-x64.h.erb +0 -126
  116. data/examples/abs.yml +0 -20
  117. data/examples/popcnt.yml +0 -17
  118. data/examples/sym_reg.yml +0 -26
  119. data/exe/evoasm-search +0 -13
  120. data/ext/evoasm_ext/evoasm-alloc.c +0 -145
  121. data/ext/evoasm_ext/evoasm-alloc.h +0 -59
  122. data/ext/evoasm_ext/evoasm-arch.c +0 -44
  123. data/ext/evoasm_ext/evoasm-arch.h +0 -161
  124. data/ext/evoasm_ext/evoasm-bitmap.h +0 -114
  125. data/ext/evoasm_ext/evoasm-buf.c +0 -130
  126. data/ext/evoasm_ext/evoasm-buf.h +0 -47
  127. data/ext/evoasm_ext/evoasm-error.c +0 -31
  128. data/ext/evoasm_ext/evoasm-error.h +0 -75
  129. data/ext/evoasm_ext/evoasm-free-list.c.tmpl +0 -121
  130. data/ext/evoasm_ext/evoasm-free-list.h.tmpl +0 -86
  131. data/ext/evoasm_ext/evoasm-log.h +0 -69
  132. data/ext/evoasm_ext/evoasm-misc.c +0 -23
  133. data/ext/evoasm_ext/evoasm-misc.h +0 -282
  134. data/ext/evoasm_ext/evoasm-param.h +0 -37
  135. data/ext/evoasm_ext/evoasm-search.c +0 -2145
  136. data/ext/evoasm_ext/evoasm-search.h +0 -214
  137. data/ext/evoasm_ext/evoasm-util.h +0 -40
  138. data/ext/evoasm_ext/evoasm-x64.c +0 -275624
  139. data/ext/evoasm_ext/evoasm-x64.h +0 -5436
  140. data/ext/evoasm_ext/evoasm.c +0 -7
  141. data/ext/evoasm_ext/evoasm.h +0 -23
  142. data/ext/evoasm_ext/evoasm_ext.c +0 -1757
  143. data/ext/evoasm_ext/extconf.rb +0 -31
  144. data/lib/evoasm/cli.rb +0 -6
  145. data/lib/evoasm/cli/search.rb +0 -127
  146. data/lib/evoasm/core_ext.rb +0 -1
  147. data/lib/evoasm/core_ext/array.rb +0 -9
  148. data/lib/evoasm/core_ext/integer.rb +0 -10
  149. data/lib/evoasm/core_ext/kwstruct.rb +0 -13
  150. data/lib/evoasm/core_ext/range.rb +0 -5
  151. data/lib/evoasm/examples.rb +0 -27
  152. data/lib/evoasm/gen.rb +0 -8
  153. data/lib/evoasm/gen/enum.rb +0 -169
  154. data/lib/evoasm/gen/name_util.rb +0 -80
  155. data/lib/evoasm/gen/state.rb +0 -176
  156. data/lib/evoasm/gen/state_dsl.rb +0 -152
  157. data/lib/evoasm/gen/strio.rb +0 -27
  158. data/lib/evoasm/gen/translator.rb +0 -1102
  159. data/lib/evoasm/gen/version.rb +0 -5
  160. data/lib/evoasm/gen/x64.rb +0 -237
  161. data/lib/evoasm/gen/x64/funcs.rb +0 -495
  162. data/lib/evoasm/gen/x64/inst.rb +0 -781
  163. data/lib/evoasm/search.rb +0 -40
  164. data/lib/evoasm/tasks/gen_task.rb +0 -86
  165. data/lib/evoasm/tasks/template_task.rb +0 -52
  166. data/test/test_helper.rb +0 -1
  167. data/test/x64/test_helper.rb +0 -19
  168. data/test/x64/x64_test.rb +0 -87
@@ -0,0 +1,65 @@
1
+ /*
2
+ * Copyright (C) 2016 Julian Aron Prenner <jap@polyadic.com>
3
+ *
4
+ * This program is free software: you can redistribute it and/or modify
5
+ * it under the terms of the GNU Affero General Public License as published by
6
+ * the Free Software Foundation, either version 3 of the License, or
7
+ * (at your option) any later version.
8
+ *
9
+ * This program is distributed in the hope that it will be useful,
10
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ * GNU Affero General Public License for more details.
13
+ *
14
+ * You should have received a copy of the GNU Affero General Public License
15
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
16
+ */
17
+
18
+ #include "evoasm-error.h"
19
+
20
+ _Thread_local evoasm_error_t evoasm_last_error;
21
+
22
+ void
23
+ evoasm_error_setv(evoasm_error_t *error, unsigned error_type, unsigned error_code,
24
+ void *error_data, const char *file,
25
+ unsigned line, const char *format, va_list args) {
26
+
27
+ error->type = (uint16_t) error_type;
28
+ error->code = (uint16_t) error_code;
29
+ error->line = line;
30
+ strncpy(error->filename, file, EVOASM_ERROR_MAX_FILENAME_LEN);
31
+ vsnprintf(error->msg, EVOASM_ERROR_MAX_MSG_LEN, format, args);
32
+
33
+ if(error_data != NULL) {
34
+ memcpy(&error->data, error_data, sizeof(evoasm_error_data_t));
35
+ }
36
+ }
37
+
38
+ evoasm_error_t *
39
+ evoasm_get_last_error() {
40
+ return &evoasm_last_error;
41
+ }
42
+
43
+ void
44
+ evoasm_set_last_error(evoasm_error_t *error) {
45
+ evoasm_last_error = *error;
46
+ }
47
+
48
+ void
49
+ evoasm_error_set(evoasm_error_t *error, unsigned error_type, unsigned error_code,
50
+ void *error_data, const char *file,
51
+ unsigned line, const char *format, ...) {
52
+ va_list args;
53
+ va_start(args, format);
54
+ evoasm_error_setv(error, error_type, error_code,
55
+ error_data, file, line,
56
+ format, args);
57
+ va_end(args);
58
+ }
59
+
60
+ EVOASM_DEF_GETTER(error, type, evoasm_error_type_t)
61
+ EVOASM_DEF_GETTER(error, code, evoasm_error_code_t)
62
+ EVOASM_DEF_GETTER(error, line, unsigned)
63
+ EVOASM_DEF_GETTER(error, filename, char *)
64
+ EVOASM_DEF_GETTER(error, msg, char *)
65
+
@@ -0,0 +1,108 @@
1
+ /*
2
+ * Copyright (C) 2016 Julian Aron Prenner <jap@polyadic.com>
3
+ *
4
+ * This program is free software: you can redistribute it and/or modify
5
+ * it under the terms of the GNU Affero General Public License as published by
6
+ * the Free Software Foundation, either version 3 of the License, or
7
+ * (at your option) any later version.
8
+ *
9
+ * This program is distributed in the hope that it will be useful,
10
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ * GNU Affero General Public License for more details.
13
+ *
14
+ * You should have received a copy of the GNU Affero General Public License
15
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
16
+ */
17
+
18
+ #pragma once
19
+
20
+ #include <assert.h>
21
+ #include <stdio.h>
22
+ #include <stdlib.h>
23
+ #include <stdint.h>
24
+ #include <stdbool.h>
25
+ #include <string.h>
26
+ #include <stdarg.h>
27
+
28
+ #include "evoasm-util.h"
29
+ #include "evoasm-log.h"
30
+
31
+ #define EVOASM_ERROR_MAX_FILENAME_LEN 128
32
+ #define EVOASM_ERROR_MAX_MSG_LEN 128
33
+
34
+ #define EVOASM_ERROR_HEADER \
35
+ uint16_t type; \
36
+ uint16_t code; \
37
+ uint32_t line; \
38
+ char filename[EVOASM_ERROR_MAX_FILENAME_LEN]; \
39
+ char msg[EVOASM_ERROR_MAX_MSG_LEN];
40
+
41
+ typedef enum {
42
+ EVOASM_ERROR_CODE_NONE
43
+ } evoasm_error_code_t;
44
+
45
+ typedef enum {
46
+ EVOASM_ERROR_TYPE_BUF,
47
+ EVOASM_ERROR_TYPE_ALLOC,
48
+ EVOASM_ERROR_TYPE_ARCH,
49
+ EVOASM_ERROR_TYPE_PROGRAM,
50
+ EVOASM_ERROR_TYPE_POP_PARAMS,
51
+ EVOASM_ERROR_TYPE_POP,
52
+ EVOASM_ERROR_TYPE_NONE,
53
+ } evoasm_error_type_t;
54
+
55
+ typedef struct {
56
+ uint8_t data[64];
57
+ } evoasm_error_data_t;
58
+
59
+ typedef struct {
60
+ EVOASM_ERROR_HEADER
61
+ evoasm_error_data_t data;
62
+ } evoasm_error_t;
63
+
64
+
65
+ void
66
+ evoasm_error_setv(evoasm_error_t *error, unsigned error_type, unsigned error_code,
67
+ void *error_data, const char *file,
68
+ unsigned line, const char *format, va_list args);
69
+
70
+ void
71
+ evoasm_error_set(evoasm_error_t *error, unsigned error_type, unsigned error_code,
72
+ void *error_data, const char *file,
73
+ unsigned line, const char *format, ...) evoasm_printf(7, 8);
74
+
75
+
76
+ evoasm_error_t *
77
+ evoasm_get_last_error();
78
+
79
+ void
80
+ evoasm_set_last_error(evoasm_error_t *error);
81
+
82
+ extern _Thread_local evoasm_error_t evoasm_last_error;
83
+
84
+ #define EVOASM_TRY(label, func, ...) \
85
+ do { if(!func(__VA_ARGS__)) {goto label;} } while(0)
86
+
87
+
88
+ #define EVOASM_TRY_WARN(func, ...) \
89
+ do { \
90
+ if(!func(__VA_ARGS__)) { \
91
+ evoasm_log(EVOASM_LOG_LEVEL_WARN, EVOASM_LOG_TAG, #func "failed"); \
92
+ } \
93
+ } while(0)
94
+
95
+ #define evoasm_success_t evoasm_check_return bool
96
+
97
+ #define evoasm_error(type, code, ...) evoasm_error2(type, code, NULL, __VA_ARGS__)
98
+
99
+ #define evoasm_error2(type, code, data, ...) \
100
+ evoasm_error_set(&evoasm_last_error, (type), (code), (data),\
101
+ __FILE__, __LINE__, __VA_ARGS__)
102
+
103
+ #define evoasm_assert_not_reached() \
104
+ do { \
105
+ evoasm_log(EVOASM_LOG_LEVEL_FATAL, "error", "%s:%d should not be reached", __FILE__, __LINE__); \
106
+ abort(); \
107
+ } while(0)
108
+
@@ -1,12 +1,25 @@
1
- #define _DEFAULT_SOURCE
1
+ /*
2
+ * Copyright (C) 2016 Julian Aron Prenner <jap@polyadic.com>
3
+ *
4
+ * This program is free software: you can redistribute it and/or modify
5
+ * it under the terms of the GNU Affero General Public License as published by
6
+ * the Free Software Foundation, either version 3 of the License, or
7
+ * (at your option) any later version.
8
+ *
9
+ * This program is distributed in the hope that it will be useful,
10
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ * GNU Affero General Public License for more details.
13
+ *
14
+ * You should have received a copy of the GNU Affero General Public License
15
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
16
+ */
2
17
 
3
18
  #include <stdarg.h>
4
19
  #include <stdio.h>
5
20
  #include <string.h>
6
- #include <stdint.h>
7
21
  #include <stdlib.h>
8
22
  #include <stdbool.h>
9
- #include <alloca.h>
10
23
 
11
24
  #ifdef _WIN32
12
25
  #include <io.h>
@@ -18,10 +31,15 @@
18
31
  #include "evoasm-log.h"
19
32
  #include "evoasm-alloc.h"
20
33
 
21
- evoasm_log_level evoasm_min_log_level = EVOASM_LOG_LEVEL_WARN;
22
- FILE * evoasm_log_file;
34
+ evoasm_log_level_t _evoasm_log_level = EVOASM_LOG_LEVEL_WARN;
35
+ FILE * _evoasm_log_file;
23
36
 
24
- static const char *const log_levels[EVOASM_N_LOG_LEVELS] = {
37
+ void
38
+ evoasm_set_log_level(evoasm_log_level_t log_level) {
39
+ _evoasm_log_level = log_level;
40
+ }
41
+
42
+ static const char *const log_levels[EVOASM_LOG_LEVEL_NONE] = {
25
43
  "TRACE",
26
44
  "DEBUG",
27
45
  "INFO",
@@ -30,28 +48,28 @@ static const char *const log_levels[EVOASM_N_LOG_LEVELS] = {
30
48
  "FATAL"
31
49
  };
32
50
 
33
- static const char *const log_colors[EVOASM_N_LOG_LEVELS] = {
34
- "\x1b[30;1m",
35
- "\x1b[30;1m",
36
- "\x1b[32;1m",
37
- "\x1b[33;1m",
38
- "\x1b[31;1m",
39
- "\x1b[31;1m",
51
+ static const char *const log_colors[EVOASM_LOG_LEVEL_NONE] = {
52
+ EVOASM_ANSI_CODE_BLACK,
53
+ EVOASM_ANSI_CODE_BLACK,
54
+ EVOASM_ANSI_CODE_GREEN,
55
+ EVOASM_ANSI_CODE_YELLOW,
56
+ EVOASM_ANSI_CODE_RED,
57
+ EVOASM_ANSI_CODE_RED,
40
58
  };
41
59
 
42
60
 
43
61
  void
44
- evoasm_log(evoasm_log_level level, const char *tag, const char *format, ...)
62
+ evoasm_log(evoasm_log_level_t level, const char *tag, const char *format, ...)
45
63
  {
46
- if(level < evoasm_min_log_level) return;
64
+ if(level < _evoasm_log_level) return;
47
65
 
48
66
  va_list args;
49
67
 
50
68
  static const char *prefix = "evoasm:";
51
69
  static const char *sep1 = ":";
52
70
  static const char *sep2 = ": ";
53
- static const char *color_reset = "\x1b[0m";
54
- bool is_tty = isatty(fileno(evoasm_log_file));
71
+ static const char *color_reset = EVOASM_ANSI_CODE_RESET;
72
+ bool is_tty = isatty(fileno(_evoasm_log_file)) != 0;
55
73
 
56
74
  size_t prefix_len = strlen(prefix);
57
75
  size_t color_len = is_tty ? strlen(log_colors[level]) : 0;
@@ -101,7 +119,7 @@ evoasm_log(evoasm_log_level level, const char *tag, const char *format, ...)
101
119
 
102
120
  //fprintf(stderr, "printing '%s'\n", full_format);
103
121
  va_start(args, format);
104
- vfprintf(evoasm_log_file, full_format, args);
122
+ vfprintf(_evoasm_log_file, full_format, args);
105
123
  va_end(args);
106
124
  }
107
125
 
@@ -0,0 +1,93 @@
1
+ /*
2
+ * Copyright (C) 2016 Julian Aron Prenner <jap@polyadic.com>
3
+ *
4
+ * This program is free software: you can redistribute it and/or modify
5
+ * it under the terms of the GNU Affero General Public License as published by
6
+ * the Free Software Foundation, either version 3 of the License, or
7
+ * (at your option) any later version.
8
+ *
9
+ * This program is distributed in the hope that it will be useful,
10
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ * GNU Affero General Public License for more details.
13
+ *
14
+ * You should have received a copy of the GNU Affero General Public License
15
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
16
+ */
17
+
18
+ #pragma once
19
+
20
+ #include <stdlib.h>
21
+ #include <stdio.h>
22
+ #include <stdint.h>
23
+
24
+ #include "evoasm-util.h"
25
+
26
+ typedef int evoasm_log_level_t;
27
+ #define EVOASM_LOG_LEVEL_TRACE 0
28
+ #define EVOASM_LOG_LEVEL_DEBUG 1
29
+ #define EVOASM_LOG_LEVEL_INFO 2
30
+ #define EVOASM_LOG_LEVEL_WARN 3
31
+ #define EVOASM_LOG_LEVEL_ERROR 4
32
+ #define EVOASM_LOG_LEVEL_FATAL 5
33
+ #define EVOASM_LOG_LEVEL_NONE 6
34
+
35
+
36
+ #define EVOASM_ANSI_CODE_BLACK "\x1b[30;1m"
37
+ #define EVOASM_ANSI_CODE_RED "\x1b[31;1m"
38
+ #define EVOASM_ANSI_CODE_GREEN "\x1b[32;1m"
39
+ #define EVOASM_ANSI_CODE_YELLOW "\x1b[33;1m"
40
+ #define EVOASM_ANSI_CODE_BLUE "\x1b[34;1m"
41
+ #define EVOASM_ANSI_CODE_MAGENTA "\x1b[35;1m"
42
+ #define EVOASM_ANSI_CODE_CYAN "\x1b[36;1m"
43
+ #define EVOASM_ANSI_CODE_WHITE "\x1b[37;1m"
44
+ #define EVOASM_ANSI_CODE_RESET "\x1b[0m"
45
+
46
+ #ifndef EVOASM_LOG_LEVEL
47
+ # define EVOASM_LOG_LEVEL EVOASM_LOG_LEVEL_INFO
48
+ #endif
49
+
50
+ extern evoasm_log_level_t _evoasm_log_level;
51
+ extern FILE * _evoasm_log_file;
52
+
53
+ #define EVOASM_DEF_LOG_TAG(tag) evoasm_used static const char *_evoasm_log_tag = tag;
54
+ #define EVOASM_LOG_TAG _evoasm_log_tag
55
+
56
+ void
57
+ evoasm_log(evoasm_log_level_t level, const char *tag, const char *format, ...) evoasm_printf(3, 4);
58
+
59
+ #if EVOASM_LOG_LEVEL <= EVOASM_LOG_LEVEL_TRACE
60
+ # define evoasm_log_trace(...) evoasm_log(EVOASM_LOG_LEVEL_TRACE, EVOASM_LOG_TAG, __VA_ARGS__)
61
+ #else
62
+ # define evoasm_log_trace(...)
63
+ #endif
64
+
65
+ #if EVOASM_LOG_LEVEL <= EVOASM_LOG_LEVEL_DEBUG
66
+ # define evoasm_log_debug(...) evoasm_log(EVOASM_LOG_LEVEL_DEBUG, EVOASM_LOG_TAG, __VA_ARGS__)
67
+ #else
68
+ # define evoasm_log_debug(...)
69
+ #endif
70
+
71
+ #if EVOASM_LOG_LEVEL <= EVOASM_LOG_LEVEL_INFO
72
+ # define evoasm_log_info(...) evoasm_log(EVOASM_LOG_LEVEL_INFO, EVOASM_LOG_TAG, __VA_ARGS__)
73
+ #else
74
+ # define evoasm_log_info(...)
75
+ #endif
76
+
77
+ #if EVOASM_LOG_LEVEL <= EVOASM_LOG_LEVEL_WARN
78
+ # define evoasm_log_warn(...) evoasm_log(EVOASM_LOG_LEVEL_WARN, EVOASM_LOG_TAG, __VA_ARGS__)
79
+ #else
80
+ # define evoasm_log_warn(...)
81
+ #endif
82
+
83
+ #if EVOASM_LOG_LEVEL <= EVOASM_LOG_LEVEL_ERROR
84
+ # define evoasm_log_error(...) evoasm_log(EVOASM_LOG_LEVEL_ERROR, EVOASM_LOG_TAG, __VA_ARGS__)
85
+ #else
86
+ # define evoasm_log_error(...)
87
+ #endif
88
+
89
+ #if EVOASM_LOG_LEVEL <= EVOASM_LOG_LEVEL_FATAL
90
+ # define evoasm_log_fatal(...) evoasm_log(EVOASM_LOG_LEVEL_FATAL, EVOASM_LOG_TAG, __VA_ARGS__)
91
+ #else
92
+ # define evoasm_log_fatal(...)
93
+ #endif
@@ -0,0 +1,22 @@
1
+ /*
2
+ * Copyright (C) 2016 Julian Aron Prenner <jap@polyadic.com>
3
+ *
4
+ * This program is free software: you can redistribute it and/or modify
5
+ * it under the terms of the GNU Affero General Public License as published by
6
+ * the Free Software Foundation, either version 3 of the License, or
7
+ * (at your option) any later version.
8
+ *
9
+ * This program is distributed in the hope that it will be useful,
10
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ * GNU Affero General Public License for more details.
13
+ *
14
+ * You should have received a copy of the GNU Affero General Public License
15
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
16
+ */
17
+
18
+ #include "evoasm-param.h"
19
+
20
+ EVOASM_DEF_GETTER(param, domain, evoasm_domain_t *)
21
+ EVOASM_DEF_GETTER(param, id, evoasm_param_id_t)
22
+
@@ -0,0 +1,33 @@
1
+ /*
2
+ * Copyright (C) 2016 Julian Aron Prenner <jap@polyadic.com>
3
+ *
4
+ * This program is free software: you can redistribute it and/or modify
5
+ * it under the terms of the GNU Affero General Public License as published by
6
+ * the Free Software Foundation, either version 3 of the License, or
7
+ * (at your option) any later version.
8
+ *
9
+ * This program is distributed in the hope that it will be useful,
10
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ * GNU Affero General Public License for more details.
13
+ *
14
+ * You should have received a copy of the GNU Affero General Public License
15
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
16
+ */
17
+
18
+ #pragma once
19
+
20
+ #include <stdint.h>
21
+ #include "evoasm-bitmap.h"
22
+ #include "evoasm-domain.h"
23
+
24
+ #define EVOASM_PARAM_VAL_FORMAT PRId64
25
+ #define EVOASM_PARAM_FORMAT PRIu32
26
+
27
+ typedef int64_t evoasm_param_val_t;
28
+ typedef uint8_t evoasm_param_id_t;
29
+
30
+ typedef struct {
31
+ evoasm_param_id_t id;
32
+ evoasm_domain_t *domain;
33
+ } evoasm_param_t;
@@ -0,0 +1,192 @@
1
+ /*
2
+ * Copyright (C) 2016 Julian Aron Prenner <jap@polyadic.com>
3
+ *
4
+ * This program is free software: you can redistribute it and/or modify
5
+ * it under the terms of the GNU Affero General Public License as published by
6
+ * the Free Software Foundation, either version 3 of the License, or
7
+ * (at your option) any later version.
8
+ *
9
+ * This program is distributed in the hope that it will be useful,
10
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ * GNU Affero General Public License for more details.
13
+ *
14
+ * You should have received a copy of the GNU Affero General Public License
15
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
16
+ */
17
+
18
+ #include "evoasm-pop-params.h"
19
+ #include "evoasm-util.h"
20
+
21
+ EVOASM_DEF_ALLOC_FREE_FUNCS(pop_params)
22
+
23
+ EVOASM_DEF_ZERO_INIT_FUNC(pop_params)
24
+
25
+ #define EVOASM_POP_PARAMS_DEF_GETTER_SETTER(field, value_type, field_type) \
26
+ EVOASM_DEF_GETTER(pop_params, field, value_type) \
27
+ EVOASM_DEF_SETTER(pop_params, field, value_type, field_type)
28
+
29
+ EVOASM_POP_PARAMS_DEF_GETTER_SETTER(program_size, size_t, uint16_t)
30
+
31
+ EVOASM_POP_PARAMS_DEF_GETTER_SETTER(kernel_size, size_t, uint16_t)
32
+
33
+ EVOASM_POP_PARAMS_DEF_GETTER_SETTER(deme_size, size_t, uint16_t)
34
+
35
+ EVOASM_POP_PARAMS_DEF_GETTER_SETTER(n_params, size_t, uint8_t)
36
+
37
+ EVOASM_POP_PARAMS_DEF_GETTER_SETTER(n_demes, size_t, uint16_t)
38
+
39
+ EVOASM_POP_PARAMS_DEF_GETTER_SETTER(mut_rate, float, float)
40
+
41
+ EVOASM_POP_PARAMS_DEF_GETTER_SETTER(recur_limit, size_t, uint32_t)
42
+
43
+ EVOASM_POP_PARAMS_DEF_GETTER_SETTER(n_insts, size_t, uint16_t)
44
+
45
+ EVOASM_POP_PARAMS_DEF_GETTER_SETTER(program_input, evoasm_program_io_t *, evoasm_program_io_t *)
46
+
47
+ EVOASM_POP_PARAMS_DEF_GETTER_SETTER(program_output, evoasm_program_io_t *, evoasm_program_io_t *)
48
+
49
+ static evoasm_domain_t **
50
+ evoasm_pop_params_find_domain(evoasm_pop_params_t *pop_params, evoasm_param_id_t param_id) {
51
+ for(size_t i = 0; i < pop_params->n_params; i++) {
52
+ if(pop_params->param_ids[i] == param_id) {
53
+ return &pop_params->domains[i];
54
+ }
55
+ }
56
+ return NULL;
57
+ }
58
+
59
+ bool
60
+ evoasm_pop_params_set_domain(evoasm_pop_params_t *pop_params, evoasm_param_id_t param_id, evoasm_domain_t *domain) {
61
+ evoasm_domain_t **domain_ptr = evoasm_pop_params_find_domain(pop_params, param_id);
62
+ if(domain_ptr) {
63
+ *domain_ptr = domain;
64
+ return true;
65
+ } else {
66
+ return false;
67
+ }
68
+ }
69
+
70
+ evoasm_domain_t *
71
+ evoasm_pop_params_get_domain(evoasm_pop_params_t *pop_params, evoasm_param_id_t param_id) {
72
+ evoasm_domain_t **domain_ptr = evoasm_pop_params_find_domain(pop_params, param_id);
73
+ if(domain_ptr) {
74
+ return *domain_ptr;
75
+ } else {
76
+ return NULL;
77
+ }
78
+ }
79
+
80
+ evoasm_param_id_t
81
+ evoasm_pop_params_get_param(evoasm_pop_params_t *pop_params, size_t idx) {
82
+ return pop_params->param_ids[idx];
83
+ }
84
+
85
+ void
86
+ evoasm_pop_params_set_param(evoasm_pop_params_t *pop_params, size_t idx, evoasm_param_id_t param) {
87
+ pop_params->param_ids[idx] = param;
88
+ }
89
+
90
+ uint64_t
91
+ evoasm_pop_params_get_seed(evoasm_pop_params_t *pop_params, size_t idx) {
92
+ return pop_params->seed.data[idx];
93
+ }
94
+
95
+ void
96
+ evoasm_pop_params_set_seed(evoasm_pop_params_t *pop_params, size_t idx, uint64_t seed) {
97
+ pop_params->seed.data[idx] = seed;
98
+ }
99
+
100
+ void
101
+ evoasm_pop_params_destroy(evoasm_pop_params_t *pop_params) {
102
+ }
103
+
104
+ void
105
+ evoasm_pop_params_set_inst(evoasm_pop_params_t *pop_params, size_t index, evoasm_inst_id_t inst_id) {
106
+ pop_params->inst_ids[index] = inst_id;
107
+ }
108
+
109
+ evoasm_inst_id_t
110
+ evoasm_pop_params_get_inst(evoasm_pop_params_t *pop_params, size_t idx) {
111
+ return pop_params->inst_ids[idx];
112
+ }
113
+
114
+ bool
115
+ evoasm_pop_params_validate(evoasm_pop_params_t *pop_params) {
116
+ if(pop_params->n_params == 0) {
117
+ evoasm_error(EVOASM_ERROR_TYPE_POP_PARAMS, EVOASM_POP_PARAMS_ERROR_CODE_INVALID,
118
+ "No parameters given");
119
+ goto fail;
120
+ }
121
+
122
+ if(pop_params->deme_size == 0) {
123
+ evoasm_error(EVOASM_ERROR_TYPE_POP_PARAMS, EVOASM_POP_PARAMS_ERROR_CODE_INVALID,
124
+ "Deme size cannot be zero");
125
+ goto fail;
126
+ }
127
+
128
+ if(pop_params->n_demes == 0) {
129
+ evoasm_error(EVOASM_ERROR_TYPE_POP_PARAMS, EVOASM_POP_PARAMS_ERROR_CODE_INVALID,
130
+ "Number of demes cannot be zero");
131
+ goto fail;
132
+ }
133
+
134
+ if(pop_params->mut_rate < 0.0 || pop_params->mut_rate > 1.0) {
135
+ evoasm_error(EVOASM_ERROR_TYPE_POP_PARAMS, EVOASM_POP_PARAMS_ERROR_CODE_INVALID,
136
+ "Mutatin rate must be in the range [0..1]");
137
+ goto fail;
138
+ }
139
+
140
+ if(pop_params->kernel_size > EVOASM_KERNEL_MAX_SIZE) {
141
+ evoasm_error(EVOASM_ERROR_TYPE_POP_PARAMS, EVOASM_POP_PARAMS_ERROR_CODE_INVALID,
142
+ "Program size cannot exceed %d", EVOASM_PROGRAM_MAX_SIZE);
143
+ goto fail;
144
+ }
145
+
146
+ if(pop_params->kernel_size == 0) {
147
+ evoasm_error(EVOASM_ERROR_TYPE_POP_PARAMS, EVOASM_POP_PARAMS_ERROR_CODE_INVALID,
148
+ "Kernel size cannot be zero");
149
+ goto fail;
150
+ }
151
+
152
+ if(pop_params->program_size > EVOASM_PROGRAM_MAX_SIZE) {
153
+ evoasm_error(EVOASM_ERROR_TYPE_POP_PARAMS, EVOASM_POP_PARAMS_ERROR_CODE_INVALID,
154
+ "Program size cannot exceed %d", EVOASM_PROGRAM_MAX_SIZE);
155
+ goto fail;
156
+ }
157
+
158
+ if(pop_params->program_size == 0) {
159
+ evoasm_error(EVOASM_ERROR_TYPE_POP_PARAMS, EVOASM_POP_PARAMS_ERROR_CODE_INVALID,
160
+ "Program size cannot be zero");
161
+ goto fail;
162
+ }
163
+
164
+ if(pop_params->n_insts == 0) {
165
+ evoasm_error(EVOASM_ERROR_TYPE_POP_PARAMS, EVOASM_POP_PARAMS_ERROR_CODE_INVALID,
166
+ "No instructions given");
167
+ goto fail;
168
+ }
169
+
170
+ if(pop_params->program_input == NULL || pop_params->program_input->len == 0) {
171
+ evoasm_error(EVOASM_ERROR_TYPE_POP_PARAMS, EVOASM_POP_PARAMS_ERROR_CODE_INVALID,
172
+ "No input values given");
173
+ goto fail;
174
+ }
175
+
176
+ if(pop_params->program_output == NULL || pop_params->program_output->len == 0) {
177
+ evoasm_error(EVOASM_ERROR_TYPE_POP_PARAMS, EVOASM_POP_PARAMS_ERROR_CODE_INVALID,
178
+ "No output values given");
179
+ goto fail;
180
+ }
181
+
182
+ // if(pop_params->n_demes == 0) {
183
+ // evoasm_error(EVOASM_ERROR_TYPE_ARG, EVOASM_ERROR_CODE_NONE,
184
+ // NULL, "Invalid number of demes");
185
+ // goto fail;
186
+ // }
187
+
188
+ return true;
189
+
190
+ fail:
191
+ return false;
192
+ }