summaryrefslogtreecommitdiff
path: root/minix/llvm/include/magic_common.h
blob: d3e653a6d7b216d3b27208c4188d75582d2799db (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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
#ifndef _MAGIC_COMMON_H
#define _MAGIC_COMMON_H

/* Magic constants. */
#define MAGIC_PREFIX                        magic_
#define MAGIC_PREFIX_STR                    "magic_"
#define MAGIC_ASR_PREFIX                    magic_asr_
#define MAGIC_ASR_PREFIX_STR                "magic_asr_"
#define MAGIC_NESTED_PREFIX_STR             "nested_"
#define MAGIC_EVAL_FUNC_PREFIX              "me_"
#define MAGIC_ANON_MEMBER_PREFIX            "magic.anon"
#define MAGIC_STRINGREF_HAS_MAGIC_HIDDEN_PREFIX(S)                             \
    ((S).startswith(MAGIC_HIDDEN_ARRAY_PREFIX)                                 \
    || (S).startswith(MAGIC_HIDDEN_STR_PREFIX))

#define MAGIC_VOID_PTR                      _____magic_instr_void_ptr
#define MAGIC_VOID_PTR_NAME                 "_____magic_instr_void_ptr"
#define MAGIC_VOID_ARRAY                    _____magic_instr_void_arr
#define MAGIC_VOID_ARRAY_NAME               "_____magic_instr_void_arr"

#define MAGIC_VOID_PTR_TYPE                 _magic_void_ptr_type_ptr
#define MAGIC_VOID_PTR_TYPE_ID              1
#define MAGIC_VOID_PTR_INT_CAST_TYPE        _magic_void_ptr_int_cast_type_ptr
#define MAGIC_VOID_PTR_INT_CAST_TYPE_ID     2
#define MAGIC_VOID_ARRAY_TYPE               _magic_void_array_type_ptr
#define MAGIC_VOID_ARRAY_TYPE_ID            3
#define MAGIC_PTRINT_TYPE                   _magic_ptrint_type_ptr
#define MAGIC_PTRINT_TYPE_ID                4
#define MAGIC_PTRINT_ARRAY_TYPE             _magic_ptrint_array_type_ptr
#define MAGIC_PTRINT_ARRAY_TYPE_ID          5
#define MAGIC_VOID_TYPE                     (MAGIC_VOID_PTR_TYPE->contained_types[0])

#ifdef __MINIX
#define GLOBAL_VARS_IN_SECTION              1
#else
#define GLOBAL_VARS_IN_SECTION              0
#endif
#define GLOBAL_VARS_SECTION_PREFIX          ".gvars"
#define GLOBAL_VARS_SECTION_DATA            GLOBAL_VARS_SECTION_PREFIX
#define GLOBAL_VARS_SECTION_RO              (GLOBAL_VARS_SECTION_PREFIX "_ro")

#define MAGIC_LLVM_METADATA_SECTION         "llvm.metadata"
#define MAGIC_DEFAULT_EXT_LIB_SECTION_REGEX "^.lib.*"
#define MAGIC_STATIC_FUNCTIONS_SECTION      "magic_functions"

#define MAGIC_STATIC_VARS_SECTION_PREFIX    "magic_data"
#define MAGIC_STATIC_VARS_SECTION_DATA      MAGIC_STATIC_VARS_SECTION_PREFIX
#define MAGIC_STATIC_VARS_SECTION_RO        (MAGIC_STATIC_VARS_SECTION_PREFIX "_ro")

#define MAGIC_SHADOW_VARS_SECTION_PREFIX    "magic_shadow_data"
#define MAGIC_SHADOW_VARS_SECTION_DATA      MAGIC_SHADOW_VARS_SECTION_PREFIX
#define MAGIC_SHADOW_VARS_SECTION_RO        (MAGIC_SHADOW_VARS_SECTION_PREFIX "_ro")

#define UNBL_SECTION_PREFIX                 "unblockify"
#define MAGIC_SHADOW_VAR_PREFIX             ".magic_shadow_"
#define MAGIC_HIDDEN_ARRAY_PREFIX           ".arr.magic"
#define MAGIC_HIDDEN_STR_PREFIX             ".str.magic"

#define MAGIC_MALLOC_VARS_SECTION_PREFIX    "magic_malloc_data"

/* Magic configuration. */
#ifndef MAGIC_OUTPUT_CTL
#define MAGIC_OUTPUT_CTL                    0
#endif
/* 0=disabled, 1=force no debug output, 2=force no output (for perf. testing).*/
#define MAGIC_CHECK_LEVEL                   1
/* 2=extra checks, 1=standard checks, 0=no checks (for perf. testing). */
#define MAGIC_FLATTEN_FUNCTION_ARGS         0 /* XXX was 1 but header was not included, seems to break on variadic functions */
#define MAGIC_CHECK_INVARIANTS              1
#define MAGIC_SHRINK_TYPE_STR               1
#define MAGIC_MAX_NAME_LEN                  64
#define MAGIC_MAX_TYPE_STR_LEN              256
#define MAGIC_MAX_RECURSIVE_TYPES           1024
#define MAGIC_TYPE_STR_PRINT_MAX            5000
#define MAGIC_TYPE_STR_PRINT_MAX_LEVEL      10
#define MAGIC_MAX_DEAD_DSENTRIES            10
#define MAGIC_MAX_DEAD_DSENTRIES_SIZE       (1024 * 4 * 10)
#define MAGIC_NAMED_ALLOC_USE_DBG_INFO      0
/* 1=for more verbose dsentry naming. */
#define MAGIC_FORCE_ALLOC_EXT_NAMES         0
/* 1=to force external names for allocations made inside library functions. */
#define MAGIC_ABORT_ON_UNSUPPORTED_LOCAL_EXTERNAL_TYPE 0
/* 0=to resort to void* type when a local external type is not supported. */
#ifndef MAGIC_MEM_USAGE_OUTPUT_CTL
#define MAGIC_MEM_USAGE_OUTPUT_CTL          0
#endif
/* 0=disabled, 1=use call site info 2=use stacktrace */

#define MAGIC_INSTRUMENT_MEM_FUNCS_ASR_ONLY 0
#define MAGIC_INSTRUMENT_MEM_CUSTOM_WRAPPERS 1
#define MAGIC_INSTRUMENT_MEM_FUNCS          1
#define MAGIC_INSTRUMENT_STACK              1
#define MAGIC_FORCE_RAW_UNIONS              0
#define MAGIC_FORCE_RAW_BITFIELDS           0
#define MAGIC_FORCE_DYN_MEM_ZERO_INIT       0
/* 1=for accurate dsentry analysis. */
#define MAGIC_INDEX_DYN_LIBS                1
#define MAGIC_USE_DYN_MEM_WRAPPERS          1
#define MAGIC_USE_DYN_DL_WRAPPERS           1
#define MAGIC_ALLOW_DYN_MEM_WRAPPER_NESTING 1

/* qprof-related settings */
#ifdef __MINIX
#define MAGIC_USE_QPROF_INSTRUMENTATION     0
#else
#define MAGIC_USE_QPROF_INSTRUMENTATION     1
#endif
#define MAGIC_DEEPEST_LL_LOOP_HOOK          magic_deepest_ll_loop
#define MAGIC_DEEPEST_LL_LIB_HOOK           magic_deepest_ll_lib
#define MAGIC_DEEPEST_LL_LOOP_HOOK_NAME     "magic_deepest_ll_loop"
#define MAGIC_DEEPEST_LL_LIB_HOOK_NAME      "magic_deepest_ll_lib"
#define MAGIC_NUM_LL_TASK_CLASSES           magic_num_ll_task_classes
#define MAGIC_NUM_LL_BLOCK_EXT_TASK_CLASSES magic_num_ll_block_ext_task_classes
#define MAGIC_NUM_LL_BLOCK_INT_TASK_CLASSES magic_num_ll_block_int_task_classes
#define MAGIC_NUM_LL_BLOCK_EXT_LIBS         magic_num_ll_block_ext_libs
#define MAGIC_NUM_LL_BLOCK_INT_LIBS         magic_num_ll_block_int_libs
#define MAGIC_NUM_LL_TASK_CLASSES_NAME           "magic_num_ll_task_classes"
#define MAGIC_NUM_LL_BLOCK_EXT_TASK_CLASSES_NAME "magic_num_ll_block_ext_task_classes"
#define MAGIC_NUM_LL_BLOCK_INT_TASK_CLASSES_NAME "magic_num_ll_block_int_task_classes"
#define MAGIC_NUM_LL_BLOCK_EXT_LIBS_NAME    "magic_num_ll_block_ext_libs"
#define MAGIC_NUM_LL_BLOCK_INT_LIBS_NAME    "magic_num_ll_block_int_libs"

#define MAGIC_THREAD_SAFE                   1
#define MAGIC_FORCE_LOCKS                   0
#define MAGIC_LOOKUP_SENTRY                 1
#define MAGIC_LOOKUP_DSENTRY                1
#define MAGIC_LOOKUP_FUNCTION               1
#define MAGIC_LOOKUP_DFUNCTION              1
#define MAGIC_LOOKUP_TYPE                   1
#define MAGIC_LOOKUP_SENTRY_ALLOW_RANGE_INDEX 1
#define MAGIC_LOOKUP_SENTRY_ALLOW_NAME_HASH 1
#define MAGIC_LOOKUP_FUNCTION_ALLOW_ADDR_HASH 1

#define MAGIC_INDEX_INT_CAST                1
#define MAGIC_INDEX_FUN_PTR_INT_CAST        1
#define MAGIC_INDEX_STR_PTR_INT_CAST        1
#define MAGIC_INDEX_VOID_PTR_INT_CAST       1
#define MAGIC_INDEX_OTH_PTR_INT_CAST        1

#define MAGIC_INDEX_BIT_CAST                1
#define MAGIC_INDEX_TRANSITIVE_BIT_CASTS    0
#define MAGIC_INDEX_FUN_PTR_BIT_CAST        1
#define MAGIC_INDEX_STR_PTR_BIT_CAST        1
#define MAGIC_INDEX_VOID_PTR_BIT_CAST       0
#define MAGIC_INDEX_OTH_PTR_BIT_CAST        1

#ifdef __MINIX
#define MAGIC_SKIP_TOVOID_PTR_BIT_CAST      0
#else
#define MAGIC_SKIP_TOVOID_PTR_BIT_CAST      1
#endif

#define MAGIC_COMPACT_COMP_TYPES            0

#define MAGIC_OFF_BY_N_PROTECTION_N         0

#define MAGIC_VARSIZED_STRUCTS_SUPPORT      1

#define MAGIC_ALLOW_DEAD_DSENTRIES_DEFAULT  0

#define MAGIC_WALK_UNIONS_AS_VOID_ARRAYS_DEFAULT 1

#define MAGIC_DEBUG_SELECT(D,ND)            (MAGIC_OUTPUT_CTL>=1 ? (ND) : (D))
#define MAGIC_OUTPUT_SELECT(D,ND,NO)                                           \
    (MAGIC_OUTPUT_CTL>=2 ? (NO) : MAGIC_DEBUG_SELECT(D,ND))
#define MAGIC_DEBUG_SET(D)                  MAGIC_DEBUG_SELECT(D,0)

#define MAGIC_ENABLED                       "_magic_enabled"

#define MAGIC_ARRAY_NAME                    "_magic_sentries_array"
#define MAGIC_TYPE_ARRAY_NAME               "_magic_types_array"
#define MAGIC_FUNC_ARRAY_NAME               "_magic_functions_array"
#define MAGIC_DSINDEX_ARRAY_NAME            "_magic_dsindexes_array"

#define MAGIC_ROOT_VAR_NAME                 "_magic_vars_buff"
#define MAGIC_RSTRUCT_FIELD_ASR_SEED                  "asr_seed"
#define MAGIC_RSTRUCT_FIELD_ASR_HEAP_MAP_DO_PERMUTATE "asr_heap_map_do_permutate"
#define MAGIC_RSTRUCT_FIELD_ASR_HEAP_MAX_OFFSET       "asr_heap_max_offset"
#define MAGIC_RSTRUCT_FIELD_ASR_HEAP_MAX_PADDING      "asr_heap_max_padding"
#define MAGIC_RSTRUCT_FIELD_ASR_MAP_MAX_OFFSET_PAGES  "asr_map_max_offset_pages"
#define MAGIC_RSTRUCT_FIELD_ASR_MAP_MAX_PADDING_PAGES "asr_map_max_padding_pages"
#define MAGIC_RSTRUCT_FIELD_NO_MEM_INST         "no_mem_inst"
#define MAGIC_RSTRUCT_FIELD_TYPES               "types"
#define MAGIC_RSTRUCT_FIELD_TYPES_NUM           "types_num"
#define MAGIC_RSTRUCT_FIELD_TYPES_NEXT_ID       "types_next_id"
#define MAGIC_RSTRUCT_FIELD_FUNCTIONS           "functions"
#define MAGIC_RSTRUCT_FIELD_FUNCTIONS_NUM       "functions_num"
#define MAGIC_RSTRUCT_FIELD_FUNCTIONS_NEXT_ID   "functions_next_id"
#define MAGIC_RSTRUCT_FIELD_SENTRIES            "sentries"
#define MAGIC_RSTRUCT_FIELD_SENTRIES_NUM        "sentries_num"
#define MAGIC_RSTRUCT_FIELD_SENTRIES_STR_NUM    "sentries_str_num"
#define MAGIC_RSTRUCT_FIELD_SENTRIES_NEXT_ID    "sentries_next_id"
#define MAGIC_RSTRUCT_FIELD_DSINDEXES           "dsindexes"
#define MAGIC_RSTRUCT_FIELD_DSINDEXES_NUM       "dsindexes_num"
#define MAGIC_RSTRUCT_FIELD_FIRST_DSENTRY   "first_dsentry"
#define MAGIC_RSTRUCT_FIELDS                                                   \
        MAGIC_RSTRUCT_FIELD_ASR_SEED,                                          \
        MAGIC_RSTRUCT_FIELD_ASR_HEAP_MAP_DO_PERMUTATE,                         \
        MAGIC_RSTRUCT_FIELD_ASR_HEAP_MAX_OFFSET,                               \
        MAGIC_RSTRUCT_FIELD_ASR_HEAP_MAX_PADDING,                              \
        MAGIC_RSTRUCT_FIELD_ASR_MAP_MAX_OFFSET_PAGES,                          \
        MAGIC_RSTRUCT_FIELD_ASR_MAP_MAX_PADDING_PAGES,                         \
        MAGIC_RSTRUCT_FIELD_NO_MEM_INST,                                       \
        MAGIC_RSTRUCT_FIELD_TYPES,                                             \
        MAGIC_RSTRUCT_FIELD_TYPES_NUM,                                         \
        MAGIC_RSTRUCT_FIELD_TYPES_NEXT_ID,                                     \
        MAGIC_RSTRUCT_FIELD_FUNCTIONS,                                         \
        MAGIC_RSTRUCT_FIELD_FUNCTIONS_NUM,                                     \
        MAGIC_RSTRUCT_FIELD_FUNCTIONS_NEXT_ID,                                 \
        MAGIC_RSTRUCT_FIELD_SENTRIES,                                          \
        MAGIC_RSTRUCT_FIELD_SENTRIES_NUM,                                      \
        MAGIC_RSTRUCT_FIELD_SENTRIES_STR_NUM,                                  \
        MAGIC_RSTRUCT_FIELD_SENTRIES_NEXT_ID,                                  \
        MAGIC_RSTRUCT_FIELD_DSINDEXES,                                         \
        MAGIC_RSTRUCT_FIELD_DSINDEXES_NUM,                                     \
        MAGIC_RSTRUCT_FIELD_FIRST_DSENTRY

#define MAGIC_ENTRY_POINT                       "main"
#define MAGIC_INIT_FUNC_NAME                    "magic_init"
#define MAGIC_DATA_INIT_FUNC_NAME               "magic_data_init"

#define MAGIC_STACK_DSENTRIES_CREATE_FUNC_NAME  "magic_stack_dsentries_create"
#define MAGIC_STACK_DSENTRIES_DESTROY_FUNC_NAME "magic_stack_dsentries_destroy"

#define MAGIC_GET_PAGE_SIZE_FUNC_NAME           "magic_get_sys_pagesize"

#define MAGIC_VOID_PTR_TYPE_PTR_NAME            "_magic_void_ptr_type_ptr"

#define MAGIC_ALLOC_NAME_SUFFIX                 "#"
#define MAGIC_ALLOC_NAME_SEP                    "%"
#define MAGIC_ALLOC_NONAME                      "%UNKNOWN"
#define MAGIC_ALLOC_EXT_NAME                    "%EXT"
#define MAGIC_ALLOC_EXT_PARENT_NAME             "%EXT_PARENT"
#define MAGIC_ALLOC_RET_ADDR_NAME               "%RET_ADDR"
#define MAGIC_ALLOC_INITIAL_STACK_NAME          "%INITIAL_STACK_AREA"
#define MAGIC_OBDSENTRY_DEFAULT_PARENT_NAME     "%OUT_OF_BAND_PARENT"
#define MAGIC_DSENTRY_DATA_SEGMENT_NAME         "%LIB_DATA_SEGMENT"
#define MAGIC_DSENTRY_ABS_NAME_SEP              "~"
#define MAGIC_SELEMENT_SEP                      "/"
#define MAGIC_NAME_INVALID                      "%INVALID"

#define MAGIC_SSTRUCT_FIELD_ID                  "id"
#define MAGIC_SSTRUCT_FIELD_NAME                "name"
#define MAGIC_SSTRUCT_FIELD_TYPE                "type"
#define MAGIC_SSTRUCT_FIELD_FLAGS               "flags"
#define MAGIC_SSTRUCT_FIELD_ADDRESS             "address"
#define MAGIC_SSTRUCT_FIELD_SHADOW_ADDRESS      "shadow_address"
#define MAGIC_SSTRUCT_FIELDS                                                   \
        MAGIC_SSTRUCT_FIELD_ID,                                                \
        MAGIC_SSTRUCT_FIELD_NAME,                                              \
        MAGIC_SSTRUCT_FIELD_TYPE,                                              \
        MAGIC_SSTRUCT_FIELD_FLAGS,                                             \
        MAGIC_SSTRUCT_FIELD_ADDRESS,                                           \
        MAGIC_SSTRUCT_FIELD_SHADOW_ADDRESS

#define MAGIC_TSTRUCT_FIELD_ID                  "id"
#define MAGIC_TSTRUCT_FIELD_NAME                "name"
#define MAGIC_TSTRUCT_FIELD_NAMES               "names"
#define MAGIC_TSTRUCT_FIELD_NUM_NAMES           "num_names"
#define MAGIC_TSTRUCT_FIELD_TYPE_STR            "type_str"
#define MAGIC_TSTRUCT_FIELD_SIZE                "size"
#define MAGIC_TSTRUCT_FIELD_NUM_CHILD_TYPES     "num_child_types"
#define MAGIC_TSTRUCT_FIELD_CONTAINED_TYPES     "contained_types"
#define MAGIC_TSTRUCT_FIELD_COMPATIBLE_TYPES    "compatible_types"
#define MAGIC_TSTRUCT_FIELD_MEMBER_NAMES        "member_names"
#define MAGIC_TSTRUCT_FIELD_MEMBER_OFFSETS      "member_offsets"
#define MAGIC_TSTRUCT_FIELD_VALUE_SET           "value_set"
#define MAGIC_TSTRUCT_FIELD_TYPE_ID             "type_id"
#define MAGIC_TSTRUCT_FIELD_FLAGS               "flags"
#define MAGIC_TSTRUCT_FIELD_BIT_WIDTH           "bit_width"
#define MAGIC_TSTRUCT_FIELDS                                                   \
        MAGIC_TSTRUCT_FIELD_ID,                                                \
        MAGIC_TSTRUCT_FIELD_NAME,                                              \
        MAGIC_TSTRUCT_FIELD_NAMES,                                             \
        MAGIC_TSTRUCT_FIELD_NUM_NAMES,                                         \
        MAGIC_TSTRUCT_FIELD_TYPE_STR,                                          \
        MAGIC_TSTRUCT_FIELD_SIZE,                                              \
        MAGIC_TSTRUCT_FIELD_NUM_CHILD_TYPES,                                   \
        MAGIC_TSTRUCT_FIELD_CONTAINED_TYPES,                                   \
        MAGIC_TSTRUCT_FIELD_COMPATIBLE_TYPES,                                  \
        MAGIC_TSTRUCT_FIELD_MEMBER_NAMES,                                      \
        MAGIC_TSTRUCT_FIELD_MEMBER_OFFSETS,                                    \
        MAGIC_TSTRUCT_FIELD_VALUE_SET,                                         \
        MAGIC_TSTRUCT_FIELD_TYPE_ID,                                           \
        MAGIC_TSTRUCT_FIELD_FLAGS,                                             \
        MAGIC_TSTRUCT_FIELD_BIT_WIDTH

#define MAGIC_FSTRUCT_FIELD_ID                   "id"
#define MAGIC_FSTRUCT_FIELD_NAME                 "name"
#define MAGIC_FSTRUCT_FIELD_TYPE                 "type"
#define MAGIC_FSTRUCT_FIELD_FLAGS                "flags"
#define MAGIC_FSTRUCT_FIELD_ADDRESS              "address"
#define MAGIC_FSTRUCT_FIELDS                                                   \
        MAGIC_FSTRUCT_FIELD_ID,                                                \
        MAGIC_FSTRUCT_FIELD_NAME,                                              \
        MAGIC_FSTRUCT_FIELD_TYPE,                                              \
        MAGIC_FSTRUCT_FIELD_FLAGS,                                             \
        MAGIC_FSTRUCT_FIELD_ADDRESS

#define MAGIC_DSTRUCT_FIELD_TYPE                 "type"
#define MAGIC_DSTRUCT_FIELD_NAME                 "name"
#define MAGIC_DSTRUCT_FIELD_PARENT_NAME          "parent_name"
#define MAGIC_DSTRUCT_FIELD_FLAGS                "flags"
#define MAGIC_DSTRUCT_FIELDS                                                   \
        MAGIC_DSTRUCT_FIELD_TYPE,                                              \
        MAGIC_DSTRUCT_FIELD_NAME,                                              \
        MAGIC_DSTRUCT_FIELD_PARENT_NAME,                                       \
        MAGIC_DSTRUCT_FIELD_FLAGS

#define MAGIC_TYPE_ISUNION                  0x01
#define MAGIC_TYPE_ISPADDED                 0x02

/* Type IDs. */
#define MAGIC_TYPE_VOID                     1
#define MAGIC_TYPE_FLOAT                    2
#define MAGIC_TYPE_INTEGER                  3
#define MAGIC_TYPE_FUNCTION                 4
#define MAGIC_TYPE_ARRAY                    5
#define MAGIC_TYPE_ENUM                     6
#define MAGIC_TYPE_VECTOR                   7
#define MAGIC_TYPE_UNION                    8
#define MAGIC_TYPE_STRUCT                   9
#define MAGIC_TYPE_POINTER                  10
#define MAGIC_TYPE_OPAQUE                   11

/* Type flags. */
#define MAGIC_TYPE_EXTERNAL                 0x001
#define MAGIC_TYPE_IS_ROOT                  0x002
#define MAGIC_TYPE_DYNAMIC                  0x004
#define MAGIC_TYPE_INT_CAST                 0x008
#define MAGIC_TYPE_STRICT_VALUE_SET         0x010
#define MAGIC_TYPE_VARSIZE                  0x020
#define MAGIC_TYPE_UNSIGNED                 0x040
#define MAGIC_TYPE_NO_INNER_PTRS            0x080

/* State flags for sentries and functions. */
#define MAGIC_STATE_DIRTY                   0x00000001
#define MAGIC_STATE_CONSTANT                0x00000002
#define MAGIC_STATE_DYNAMIC                 0x00000004
#define MAGIC_STATE_DETACHED                0x00000008
#define MAGIC_STATE_DATA                    0x00000010
#define MAGIC_STATE_HEAP                    0x00000020
#define MAGIC_STATE_MAP                     0x00000040
#define MAGIC_STATE_SHM                     0x00000080
#define MAGIC_STATE_STACK                   0x00000100
#define MAGIC_STATE_TEXT                    0x00000200
/* All libraries. */
#define MAGIC_STATE_LIB                     0x00000400
/* Dynamically linked libraries. */
#define MAGIC_STATE_LIB_SO                  0x00000800
/* Dynamically loaded libraries. */
#define MAGIC_STATE_LIB_DSO                 0x00001000
#define MAGIC_STATE_ADDR_NOT_TAKEN          0x00002000
#define MAGIC_STATE_EXT                     0x00004000
#define MAGIC_STATE_OUT_OF_BAND             0x00008000
#define MAGIC_STATE_STRING                  0x00010000
#define MAGIC_STATE_NAMED_STRING            0x00020000
#define MAGIC_STATE_MODE_R                  0x00040000
#define MAGIC_STATE_MODE_W                  0x00080000
#define MAGIC_STATE_MODE_X                  0x00100000
#define MAGIC_STATE_THREAD_LOCAL            0x00200000
#define MAGIC_STATE_MEMPOOL                 0x00400000
#define MAGIC_STATE_MEMBLOCK                0x00800000
#define MAGIC_STATE_EXTERNAL                0x01000000
#define MAGIC_STATE_TYPE_SIZE_MISMATCH      0x02000000
#define MAGIC_STATE_IMMUTABLE               0x04000000
#define MAGIC_STATE_INIT                    0x08000000
#define MAGIC_STATE_DIRTY_PAGE              0x10000000
/* Skip char* and void* entries in arrays */
#define MAGIC_STATE_SKIP_BYTE_INDICES       0x20000000

#define MAGIC_STATE_ANNOTATION_MASK                                            \
    (MAGIC_STATE_MODE_R | MAGIC_STATE_MODE_W | MAGIC_STATE_MODE_X)

#define MAGIC_ASR_FLAG_INIT                 0x40000

#define MAGIC_STATE_EXTF_MASK               0xFF000000
#define MAGIC_STATE_EXTF_SHIFT              24

#define MAGIC_STATE_FLAG(E,F) (((E)->flags & (F)) != 0)
#define MAGIC_STATE_FLAGS(E,F) (((E)->flags & (F)) == (F))
#define MAGIC_STATE_FLAGS_REGION(F)                                            \
    ((F) & (MAGIC_STATE_DATA | MAGIC_STATE_HEAP | MAGIC_STATE_MAP              \
    | MAGIC_STATE_SHM | MAGIC_STATE_STACK | MAGIC_STATE_TEXT))
#define MAGIC_STATE_FLAGS_LIBSPEC(F)                                           \
    ((F) & (MAGIC_STATE_LIB | MAGIC_STATE_LIB_SO | MAGIC_STATE_LIB_DSO))
#define MAGIC_STATE_REGION(E)  MAGIC_STATE_FLAGS_REGION((E)->flags)
#define MAGIC_STATE_LIBSPEC(E) MAGIC_STATE_FLAGS_LIBSPEC((E)->flags)
#define MAGIC_STATE_FLAGS_REGION_C(F)                                          \
    (((F) & MAGIC_STATE_DATA) ? 'D' : ((F) & MAGIC_STATE_HEAP) ? 'H'           \
    : ((F) & MAGIC_STATE_SHM) ? 'X' : ((F) & MAGIC_STATE_MAP) ? 'M'            \
    : ((F) & MAGIC_STATE_STACK) ? 'S' : ((F) & MAGIC_STATE_TEXT) ? 'T' : '?')
#define MAGIC_STATE_FLAGS_LIBSPEC_C(F)                                         \
    (((F) & MAGIC_STATE_LIB) ? (((F) & MAGIC_STATE_LIB_SO) ? 'l'               \
    : ((F) & MAGIC_STATE_LIB_DSO) ? 'o' : 'L') : '0')
#define MAGIC_STATE_REGION_C(E)  MAGIC_STATE_FLAGS_REGION_C((E)->flags)
#define MAGIC_STATE_LIBSPEC_C(E) MAGIC_STATE_FLAGS_LIBSPEC_C((E)->flags)

#define MAGIC_STATE_IS_EXTF(F)       (((F) & MAGIC_STATE_EXTF_MASK) == (F))
#define MAGIC_STATE_FLAGS_TO_EXTF(F)                                           \
    (((F) & MAGIC_STATE_EXTF_MASK) >> MAGIC_STATE_EXTF_SHIFT)
#define MAGIC_STATE_FLAGS_TO_NONEXTF(F) ((F) & (~MAGIC_STATE_EXTF_MASK))
#define MAGIC_STATE_EXTF_TO_FLAGS(F)                                           \
    (((F) << MAGIC_STATE_EXTF_SHIFT) & MAGIC_STATE_EXTF_MASK)
#define MAGIC_STATE_EXTF_FLAG(E,F)   (MAGIC_STATE_EXTF_GET(E,F) != 0)
#define MAGIC_STATE_EXTF_GET(E,F)                                              \
    ((MAGIC_STATE_FLAGS_TO_EXTF((E)->flags) & (F)))
#define MAGIC_STATE_EXTF_ADD(E,F)                                              \
    ((E)->flags |= MAGIC_STATE_EXTF_TO_FLAGS(F))
#define MAGIC_STATE_EXTF_DEL(E,F)                                              \
    ((E)->flags &= ~MAGIC_STATE_EXTF_TO_FLAGS(F))
#define MAGIC_STATE_EXTF_SET(E,F)                                              \
    do {                                                                       \
        MAGIC_STATE_EXTF_CLEAR(E);                                             \
        (E)->flags |= MAGIC_STATE_EXTF_TO_FLAGS(F);                            \
    } while(0)
#define MAGIC_STATE_EXTF_CLEAR(E)    ((E)->flags &= ~MAGIC_STATE_EXTF_MASK)

/* Annotations. */
#define MAGIC_CALL_ANNOTATION_VAR               _magic_call_annotation_var
#define MAGIC_CALL_ANNOTATION_VAR_NAME          "_magic_call_annotation_var"
#define MAGIC_CALL_ANNOTATE(C, VALUE)                                          \
    do { C; MAGIC_CALL_ANNOTATION_VAR = VALUE; } while(0)
#define MAGIC_CALL_MEM_SKIP_INSTRUMENTATION     0x01

#define MAGIC_VAR_ANNOTATION_PREFIX_NAME        "_magic_var_annotation_"

#define MAGIC_VAR_ANNOTATE(T,V,A)                                              \
T V;                                                                           \
volatile int _magic_var_annotation_ ## V = A
#define MAGIC_VAR_INIT_ANNOTATE(T,V,I,A)                                       \
T V = I;                                                                       \
volatile int _magic_var_annotation_ ## V = A

#define MAGIC_MEMCPY_FUNC_NAME        "memcpy"
#define MAGIC_MALLOC_FUNC_NAME        "malloc"

/* Magic memory pool management functions. */
#define MAGIC_MEMPOOL_BLOCK_ALLOC_TEMPLATE_FUNC_NAME                           \
    "mempool_block_alloc_template"

/* Wrapper functions. */
#define MAGIC_MEMPOOL_CREATE_FUNCS                                             \
    __X(magic_mempool_create_begin), __X(magic_mempool_create_end)
#define MAGIC_MEMPOOL_DESTROY_FUNCS                                            \
    __X(magic_mempool_destroy_begin), __X(magic_mempool_destroy_end)
#define MAGIC_MEMPOOL_MGMT_FUNCS                                               \
    __X(magic_mempool_mgmt_begin), __X(magic_mempool_mgmt_end)
#define MAGIC_MEMPOOL_RESET_FUNCS                                              \
    __X(magic_mempool_reset_begin), __X(magic_mempool_mgmt_end)
#define MAGIC_MEMPOOL_FUNCS                                                    \
    MAGIC_MEMPOOL_CREATE_FUNCS,                                                \
    MAGIC_MEMPOOL_DESTROY_FUNCS,                                               \
    MAGIC_MEMPOOL_MGMT_FUNCS,                                                  \
    MAGIC_MEMPOOL_RESET_FUNCS

#define MAGIC_MEMPOOL_CREATE_FUNC_NAMES     MAGIC_MEMPOOL_CREATE_FUNCS, ""
#define MAGIC_MEMPOOL_DESTROY_FUNC_NAMES    MAGIC_MEMPOOL_DESTROY_FUNCS, ""
#define MAGIC_MEMPOOL_MGMT_FUNC_NAMES       MAGIC_MEMPOOL_MGMT_FUNCS, ""
#define MAGIC_MEMPOOL_RESET_FUNC_NAMES      MAGIC_MEMPOOL_RESET_FUNCS, ""
#define MAGIC_MEMPOOL_FUNC_NAMES            MAGIC_MEMPOOL_FUNCS, ""

/* Flags for inlining wrapper calls. */
#define MAGIC_PRE_HOOK_SIMPLE_CALL          0x0001
#define MAGIC_PRE_HOOK_FORWARDING_CALL      0x0002
#define MAGIC_POST_HOOK_SIMPLE_CALL         0x0004
#define MAGIC_POST_HOOK_FORWARDING_CALL     0x0008
#define MAGIC_PRE_HOOK_DEBUG                0x0010
#define MAGIC_POST_HOOK_DEBUG               0x0020
#define MAGIC_PRE_HOOK_FLAGS_MASK                                              \
    (MAGIC_PRE_HOOK_SIMPLE_CALL | MAGIC_PRE_HOOK_FORWARDING_CALL)
#define MAGIC_POST_HOOK_FLAGS_MASK                                             \
    (MAGIC_POST_HOOK_SIMPLE_CALL | MAGIC_POST_HOOK_FORWARDING_CALL)
#define MAGIC_HOOK_DEBUG_MASK                                                  \
    (MAGIC_PRE_HOOK_DEBUG | MAGIC_POST_HOOK_DEBUG)

#if (MAGIC_MEM_USAGE_OUTPUT_CTL == 1)
#define MAGIC_MEMPOOL_CREATE_FUNC_FLAGS  MAGIC_PRE_HOOK_SIMPLE_CALL | MAGIC_POST_HOOK_FORWARDING_CALL | MAGIC_PRE_HOOK_DEBUG
#else
#define MAGIC_MEMPOOL_CREATE_FUNC_FLAGS  MAGIC_PRE_HOOK_SIMPLE_CALL | MAGIC_POST_HOOK_FORWARDING_CALL
#endif
#define MAGIC_MEMPOOL_DESTROY_FUNC_FLAGS                                       \
    MAGIC_PRE_HOOK_FORWARDING_CALL | MAGIC_POST_HOOK_SIMPLE_CALL
#define MAGIC_MEMPOOL_MGMT_FUNC_FLAGS                                          \
    MAGIC_PRE_HOOK_FORWARDING_CALL | MAGIC_POST_HOOK_SIMPLE_CALL
#define MAGIC_MEMPOOL_RESET_FUNC_FLAGS                                         \
    MAGIC_PRE_HOOK_FORWARDING_CALL | MAGIC_POST_HOOK_SIMPLE_CALL
#define MAGIC_MEMPOOL_FUNC_FLAGS                                               \
    MAGIC_MEMPOOL_CREATE_FUNC_FLAGS,                                           \
    MAGIC_MEMPOOL_DESTROY_FUNC_FLAGS,                                          \
    MAGIC_MEMPOOL_MGMT_FUNC_FLAGS,                                             \
    MAGIC_MEMPOOL_RESET_FUNC_FLAGS

#define MAGIC_CHECKPOINT_ENABLED            "_magic_checkpoint_enabled"
#define MAGIC_CHECKPOINT_FUNC_NAME          "sef_receive_status"

#define MAGIC_SHADOW_FUNC_PREFIX            "llvm_shadow"

#define MAGIC_LAZY_CHECKPOINT_ENABLED       "_magic_lazy_checkpoint_enabled"
#define MAGIC_LAZY_CHECKPOINT_CLEARDF_FUNC_NAME "sef_receive_status"

#define MAGIC_LAZY_CHECKPOINT_SHADOW_TAG    "llvm_shadow"

/* Magic memory functions. */
#define MAGIC_MEMA_FUNCS                                                       \
    __X(malloc), __X(calloc), __X(realloc),                                    \
    __X(posix_memalign), __X(valloc), __X(memalign),                           \
    __X(mmap),                                                                 \
    __X(brk), __X(sbrk),                                                       \
    __X(shmat),                                                                \
    __X(mmap64)
#define MAGIC_MEMA_FUNC_ALLOC_FLAGS                                            \
    MAGIC_STATE_HEAP, MAGIC_STATE_HEAP, MAGIC_STATE_HEAP,                      \
    MAGIC_STATE_HEAP, MAGIC_STATE_HEAP, MAGIC_STATE_HEAP,                      \
    MAGIC_STATE_MAP,                                                           \
    MAGIC_STATE_HEAP, MAGIC_STATE_HEAP,                                        \
    MAGIC_STATE_SHM,                                                           \
    MAGIC_STATE_MAP

#ifdef __MINIX
#define MAGIC_MEMA_EXTRA_FUNCS , __X(vm_map_cacheblock)
#define MAGIC_MEMA_EXTRA_FUNC_ALLOC_FLAGS , MAGIC_STATE_MAP
#else
#define MAGIC_MEMA_EXTRA_FUNCS
#define MAGIC_MEMA_EXTRA_FUNC_ALLOC_FLAGS
#endif

#define MAGIC_MEMD_FUNCS                                                       \
    __X(free), __X(munmap), __X(shmdt)
#define MAGIC_MEMD_FUNC_ALLOC_FLAGS                                            \
    0, 0, 0

#define MAGIC_MEM_FUNCS                     MAGIC_MEMA_FUNCS MAGIC_MEMA_EXTRA_FUNCS, MAGIC_MEMD_FUNCS
#define MAGIC_MEM_UNS_FUNCS                                                    \
    __X(mmap2), __X(remap_file_pages), __X(mremap)
#define MAGIC_MEM_FUNC_ALLOC_FLAGS                                             \
    MAGIC_MEMA_FUNC_ALLOC_FLAGS MAGIC_MEMA_EXTRA_FUNC_ALLOC_FLAGS, MAGIC_MEMD_FUNC_ALLOC_FLAGS

#ifdef __MINIX
/* Nested allocation functions to hook. That is, functions that are being
 * called as part of allocation functions - in particular, malloc - and need to
 * be intercepted for tracking purposes - in particular, so that mmap'ed malloc
 * page directories can be unmapped in order to avoid memory leaks. MINIX3 only.
 */
#define MAGIC_MEMN_FUNCS                                                       \
    __X(mmap), __X(munmap)
#else
#define MAGIC_MEMN_FUNCS ""
#endif

#define MAGIC_DL_FUNCS                                                         \
   __X(dlopen), __X(dlclose)

#define MAGIC_MEMA_FUNC_NAMES               MAGIC_MEMA_FUNCS MAGIC_MEMA_EXTRA_FUNCS, ""
#define MAGIC_MEMD_FUNC_NAMES               MAGIC_MEMD_FUNCS, ""
#define MAGIC_MEMN_FUNC_NAMES               MAGIC_MEMN_FUNCS, ""
#define MAGIC_MEM_FUNC_NAMES                MAGIC_MEM_FUNCS, ""
#define MAGIC_DL_FUNC_NAMES                 MAGIC_DL_FUNCS, ""

#if MAGIC_INSTRUMENT_MEM_FUNCS_ASR_ONLY
#define MAGIC_MEM_PREFIX_STRS    MAGIC_ASR_PREFIX_STR, MAGIC_PREFIX_STR, ""
#else
#define MAGIC_MEM_PREFIX_STRS               MAGIC_PREFIX_STR, ""
#endif

#endif /* _MAGIC_COMMON_H */