UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
syms_dwarf_expr.c
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#if !defined(SYMS_DWARF_EXPR_C)
4#define SYMS_DWARF_EXPR_C
5
7//~ NOTE(allen): Include Generated Functions/Tables
8
10
12//~ NOTE(allen): Dwarf Expression Analysis & Eval Functions
13
14//- analyzers
15
17syms_dw_expr__analyze_fast(void *base, SYMS_U64Range range, SYMS_U64 text_section_base){
19
20 SYMS_U8 op = 0;
21 if (syms_based_range_read(base, range, 0, 1, &op)){
22
23 // step params
26
27 // step
29 switch (op){
30
32
44 {
47 result.addr = x;
48 }break;
49
58 const_n:
59 {
60 SYMS_U64 x = 0;
62 // sign extend
63 if (is_signed){
64 SYMS_U64 bit_shift = (size_param << 3) - 1;
65 if ((x >> bit_shift) != 0){
66 x |= ~((1 << bit_shift) - 1);
67 }
68 }
70 result.addr = x;
71 }break;
72
73 case SYMS_DwOp_ADDR:
74 {
75 SYMS_U64 offset = 0;
76 step_cursor += syms_based_range_read(base, range, step_cursor, 8, &offset);
77 SYMS_U64 x = text_section_base + offset;
79 result.addr = x;
80 }break;
81
83 {
84 SYMS_U64 x = 0;
87 result.addr = x;
88 }break;
89
91 {
92 SYMS_U64 x = 0;
95 result.addr = x;
96 }break;
97
98
100
112 {
113 SYMS_U64 reg_idx = op - SYMS_DwOp_REG0;
115 result.reg_idx = reg_idx;
116 }break;
117
118 case SYMS_DwOp_REGX:
119 {
120 SYMS_U64 reg_idx = 0;
121 step_cursor += syms_based_range_read_uleb128(base, range, step_cursor, &reg_idx);
123 result.reg_idx = reg_idx;
124 }break;
125
126
128
130 {
131 SYMS_U64 size = 0;
133 if (step_cursor + size <= range.max){
134 void *data = (SYMS_U8*)base + range.min + step_cursor;
136 result.val_long.str = (SYMS_U8*)data;
137 result.val_long.size = size;
138 }
139 step_cursor += size;
140 }break;
141
143 {
144 // NOTE(allen): This op pops from the value stack, so if it comes
145 // first the dwarf expression is bad.
148 }break;
149
150
152
153 // NOTE(allen): if the first and only op is a piece, the expression is empty
154
155 case SYMS_DwOp_PIECE:
156 {
157 SYMS_U64 size = 0;
160 }break;
161
163 {
164 SYMS_U64 bit_size = 0;
165 step_cursor += syms_based_range_read_uleb128(base, range, step_cursor, &bit_size);
166 SYMS_U64 bit_off = 0;
167 step_cursor += syms_based_range_read_uleb128(base, range, step_cursor, &bit_off);
169 }break;
170
171
173
174 default:
175 {
178 }break;
179 }
180
181 // check this was the whole expression
182 if (range.min + step_cursor < range.max){
185 }
186 }
187
188 return(result);
189}
190
193 SYMS_DwExprAnalysis result = {0};
194
195 // are we resolving calls?
196 SYMS_B32 has_call_func = (call_config != 0 && call_config->func != 0);
197
198 // tasks
202
203 // convert range input to string
204 SYMS_String8 in_data = syms_str8((SYMS_U8*)in_base + in_range.min, in_range.max - in_range.min);
205
206 // put input task onto the list
207 {
210 new_task->data = in_data;
212 }
213
214 // state for checking implicit locations
216
217 // task loop
218 for (;;){
219 // get next task to handle
221 if (task == 0){
222 break;
223 }
224
228
229 // move the task to finished now
232
233 // analysis loop
234 SYMS_U64 cursor = 0;
235 for (;;){
236
237 // decode op
238 SYMS_U64 op_offset = cursor;
239 SYMS_U8 op = 0;
241 SYMS_U64 after_op_off = cursor + 1;
242
243 // require piece op after 'implicit' location descriptions
247 goto finish;
248 }
249 }
250
251 // step params
253 SYMS_B8 is_signed = 0;
254
255 // step
257 switch (op){
258
260
272 break;
273
274 case SYMS_DwOp_CONST1U:size_param = 1; goto const_n;
275 case SYMS_DwOp_CONST2U:size_param = 2; goto const_n;
276 case SYMS_DwOp_CONST4U:size_param = 4; goto const_n;
277 case SYMS_DwOp_CONST8U:size_param = 8; goto const_n;
278 case SYMS_DwOp_CONST1S:size_param = 1; is_signed = 1; goto const_n;
279 case SYMS_DwOp_CONST2S:size_param = 2; is_signed = 1; goto const_n;
280 case SYMS_DwOp_CONST4S:size_param = 4; is_signed = 1; goto const_n;
281 case SYMS_DwOp_CONST8S:size_param = 8; is_signed = 1; goto const_n;
282 const_n:
283 {
284 SYMS_U64 x = 0;
286 }break;
287
288 case SYMS_DwOp_ADDR:
289 {
290 SYMS_U64 offset = 0;
293 }break;
294
295 case SYMS_DwOp_CONSTU:
296 {
297 SYMS_U64 x = 0;
299 }break;
300
301 case SYMS_DwOp_CONSTS:
302 {
303 SYMS_U64 x = 0;
305 }break;
306
307
309
310 case SYMS_DwOp_FBREG:
311 {
312 SYMS_S64 offset = 0;
315 }break;
316
328 {
329 SYMS_S64 offset = 0;
332 }break;
333
334 case SYMS_DwOp_BREGX:
335 {
336 SYMS_U64 reg_idx = 0;
338 SYMS_S64 offset = 0;
341 }break;
342
343
345
346 case SYMS_DwOp_DUP:
347 case SYMS_DwOp_DROP:
348 break;
349
350 case SYMS_DwOp_PICK:
351 {
352 SYMS_U64 idx = 0;
354 }break;
355
356 case SYMS_DwOp_OVER:
357 case SYMS_DwOp_SWAP:
358 case SYMS_DwOp_ROT:
359 break;
360
361 case SYMS_DwOp_DEREF:
362 {
364 }break;
365
367 {
368 SYMS_U64 size = 0;
371 }break;
372
373 case SYMS_DwOp_XDEREF:
375 {
377 goto finish;
378 }break;
379
381 {
383 }break;
384
387 {
389 }break;
390
392 {
394 }break;
395
396
398
399 case SYMS_DwOp_ABS:
400 case SYMS_DwOp_AND:
401 case SYMS_DwOp_DIV:
402 case SYMS_DwOp_MINUS:
403 case SYMS_DwOp_MOD:
404 case SYMS_DwOp_MUL:
405 case SYMS_DwOp_NEG:
406 case SYMS_DwOp_NOT:
407 case SYMS_DwOp_OR:
408 case SYMS_DwOp_PLUS:
409 break;
410
412 {
413 SYMS_U64 y = 0;
415 }break;
416
417 case SYMS_DwOp_SHL:
418 case SYMS_DwOp_SHR:
419 case SYMS_DwOp_SHRA:
420 case SYMS_DwOp_XOR:
421 break;
422
423
425
426 case SYMS_DwOp_LE:
427 case SYMS_DwOp_GE:
428 case SYMS_DwOp_EQ:
429 case SYMS_DwOp_LT:
430 case SYMS_DwOp_GT:
431 case SYMS_DwOp_NE:
432 break;
433
434 case SYMS_DwOp_SKIP:
435 case SYMS_DwOp_BRA:
436 {
437 SYMS_S16 d = 0;
440 }break;
441
442 case SYMS_DwOp_CALL2:size_param = 2; goto callN;
443 case SYMS_DwOp_CALL4:size_param = 4; goto callN;
444 callN:
445 {
446 SYMS_U64 p = 0;
449
450 // add to task list
451 if (has_call_func){
453 if (existing == 0){
455 }
456 if (existing == 0){
458 new_task->p = p;
459 new_task->data = call_config->func(call_config->user_ptr, p);
461 }
462 }
463 }break;
464
466 {
468 goto finish;
469 }break;
470
471
473
474 case SYMS_DwOp_NOP:break;
475
476
478
490 {
492 }break;
493
494 case SYMS_DwOp_REGX:
495 {
496 SYMS_U64 reg_idx = 0;
499 }break;
500
501
503
505 {
506 SYMS_U64 size = 0;
508 if (step_cursor + size > task_range.max){
510 goto finish;
511 }
512 step_cursor += size;
514 }break;
515
517 {
519 }break;
520
521
523
524 case SYMS_DwOp_PIECE:
525 {
526 SYMS_U64 size = 0;
529
531 }break;
532
534 {
535 SYMS_U64 bit_size = 0;
537 SYMS_U64 bit_off = 0;
540
542 }break;
543
544
546
547 default:
548 {
550 goto finish;
551 }break;
552 }
553
554 // increment cursor
555 cursor = step_cursor;
556 }
557
558 // check for end of task
559 if (cursor < task_data.size){
560 goto finish_task;
561 }
562 }
563
565 }
566
567 finish:;
568
570
571 return(result);
572}
573
574
575//- full eval
576
580 SYMS_DwLocation result = {0};
581
582 // setup stack
585
586 // adjust expr range
587 void *expr_ptr = (SYMS_U8*)expr_base + expr_range.min;
589
590 // setup call stack
593
594 // state variables
596
597
598 // run loop
599 SYMS_U64 max_step_count = config->max_step_count;
601 for (;;){
602 // check top of stack
604 if (call == 0){
605 goto finish;
606 }
607
608 // grab top of stack details
609 void *base = call->ptr;
610 SYMS_U64Range range = {0, call->size};
611 SYMS_U64 cursor = call->cursor;
612
613 // decode op
614 SYMS_U64 op_offset = cursor;
615 SYMS_U8 op = 0;
616 if (syms_based_range_read(base, range, op_offset, 1, &op)){
617 SYMS_U64 after_op_off = cursor + 1;
618
619 // require piece op after 'implicit' location descriptions
624 goto finish;
625 }
626 }
627
628 // step params
630 SYMS_B8 is_signed = 0;
631
632 // step
634 switch (op){
635
637
649 {
651 syms_dw_expr__stack_push(scratch.arena, &stack, x);
652 }break;
653
654 case SYMS_DwOp_CONST1U:size_param = 1; goto const_n;
655 case SYMS_DwOp_CONST2U:size_param = 2; goto const_n;
656 case SYMS_DwOp_CONST4U:size_param = 4; goto const_n;
657 case SYMS_DwOp_CONST8U:size_param = 8; goto const_n;
658 case SYMS_DwOp_CONST1S:size_param = 1; is_signed = 1; goto const_n;
659 case SYMS_DwOp_CONST2S:size_param = 2; is_signed = 1; goto const_n;
660 case SYMS_DwOp_CONST4S:size_param = 4; is_signed = 1; goto const_n;
661 case SYMS_DwOp_CONST8S:size_param = 8; is_signed = 1; goto const_n;
662 const_n:
663 {
664 SYMS_U64 x = 0;
666 // sign extend
667 if (is_signed){
668 SYMS_U64 bit_shift = (size_param << 3) - 1;
669 if ((x >> bit_shift) != 0){
670 x |= ~((1 << bit_shift) - 1);
671 }
672 }
673 syms_dw_expr__stack_push(scratch.arena, &stack, x);
674 }break;
675
676 case SYMS_DwOp_ADDR:
677 {
678 SYMS_U64 offset = 0;
679 step_cursor += syms_based_range_read(base, range, step_cursor, 8, &offset);
680
681 // NOTE(nick): Earlier versions of GCC emit TLS offset with SYMS_DwOp_ADDR.
683 {
684 SYMS_U8 next_op = 0;
687 }
688
689 SYMS_U64 addr = offset;
690
691 if (is_text_relative){
692 if (config->text_section_base != 0){
693 addr += *config->text_section_base;
694 }
695 else{
698 goto finish;
699 }
700 }
701
702 syms_dw_expr__stack_push(scratch.arena, &stack, addr);
703 }break;
704
705 case SYMS_DwOp_CONSTU:
706 {
707 SYMS_U64 x = 0;
709 syms_dw_expr__stack_push(scratch.arena, &stack, x);
710 }break;
711
712 case SYMS_DwOp_CONSTS:
713 {
714 SYMS_U64 x = 0;
716 syms_dw_expr__stack_push(scratch.arena, &stack, x);
717 }break;
718
719
721
722 case SYMS_DwOp_FBREG:
723 {
724 SYMS_S64 offset = 0;
725 step_cursor += syms_based_range_read_sleb128(base, range, step_cursor, &offset);
726 if (config->frame_base != 0){
727 SYMS_U64 x = *config->frame_base + offset;
728 syms_dw_expr__stack_push(scratch.arena, &stack, x);
729 }
730 else{
733 goto finish;
734 }
735 }break;
736
748 {
749 SYMS_S64 offset = 0;
750 step_cursor += syms_based_range_read_sleb128(base, range, step_cursor, &offset);
751 SYMS_U64 reg_idx = op - SYMS_DwOp_BREG0;
752 SYMS_DwRegsX64 *regs = config->regs;
753 if (regs != 0){
754 if (reg_idx < SYMS_ARRAY_SIZE(regs->r)){
755 SYMS_U64 x = regs->r[reg_idx] + offset;
756 syms_dw_expr__stack_push(scratch.arena, &stack, x);
757 }
758 else{
761 stashed_loc.fail_data = op_offset;
762 goto finish;
763 }
764 }
765 else{
768 goto finish;
769 }
770 }break;
771
772 case SYMS_DwOp_BREGX:
773 {
774 SYMS_U64 reg_idx = 0;
775 step_cursor += syms_based_range_read_uleb128(base, range, step_cursor, &reg_idx);
776 SYMS_S64 offset = 0;
777 step_cursor += syms_based_range_read_sleb128(base, range, step_cursor, &offset);
778 SYMS_DwRegsX64 *regs = config->regs;
779 if (regs != 0){
780 if (reg_idx < SYMS_ARRAY_SIZE(regs->r)){
781 SYMS_U64 x = regs->r[reg_idx] + offset;
782 syms_dw_expr__stack_push(scratch.arena, &stack, x);
783 }
784 else{
787 stashed_loc.fail_data = op_offset;
788 goto finish;
789 }
790 }
791 else{
794 goto finish;
795 }
796 }break;
797
798
800
801 case SYMS_DwOp_DUP:
802 {
803 SYMS_U64 x = syms_dw_expr__stack_pick(&stack, 0);
804 syms_dw_expr__stack_push(scratch.arena, &stack, x);
805 }break;
806
807 case SYMS_DwOp_DROP:
808 {
810 }break;
811
812 case SYMS_DwOp_PICK:
813 {
814 SYMS_U64 idx = 0;
815 step_cursor += syms_based_range_read(base, range, step_cursor, 1, &idx);
816 SYMS_U64 x = syms_dw_expr__stack_pick(&stack, idx);
817 syms_dw_expr__stack_push(scratch.arena, &stack, x);
818 }break;
819
820 case SYMS_DwOp_OVER:
821 {
822 SYMS_U64 x = syms_dw_expr__stack_pick(&stack, 1);
823 syms_dw_expr__stack_push(scratch.arena, &stack, x);
824 }break;
825
826 case SYMS_DwOp_SWAP:
827 {
830 syms_dw_expr__stack_push(scratch.arena, &stack, b);
831 syms_dw_expr__stack_push(scratch.arena, &stack, a);
832 }break;
833
834 case SYMS_DwOp_ROT:
835 {
839 syms_dw_expr__stack_push(scratch.arena, &stack, a);
840 syms_dw_expr__stack_push(scratch.arena, &stack, c);
841 syms_dw_expr__stack_push(scratch.arena, &stack, b);
842 }break;
843
844 case SYMS_DwOp_DEREF:
845 {
846 SYMS_U64 addr = syms_dw_expr__stack_pop(&stack);
848 SYMS_MemoryView *memview = config->memview;
849 if (memview != 0){
850 SYMS_U64 x = 0;
851 if (syms_memory_view_read_struct(memview, addr, &x)){
852 syms_dw_expr__stack_push(scratch.arena, &stack, x);
854 }
855 }
856 if (!read_success){
859 stashed_loc.fail_data = addr;
860 goto finish;
861 }
862 }break;
863
865 {
866 SYMS_U64 raw_size = 0;
869 SYMS_U64 addr = syms_dw_expr__stack_pop(&stack);
871 SYMS_MemoryView *memview = config->memview;
872 if (memview != 0){
873 SYMS_U64 x = 0;
874 if (syms_memory_view_read(memview, addr, size, &x)){
875 syms_dw_expr__stack_push(scratch.arena, &stack, x);
877 }
878 }
879 if (!read_success){
882 stashed_loc.fail_data = addr;
883 goto finish;
884 }
885 }break;
886
887 case SYMS_DwOp_XDEREF:
889 {
892 goto finish;
893 }break;
894
896 {
897 if (config->object_address != 0){
898 SYMS_U64 x = *config->object_address;
899 syms_dw_expr__stack_push(scratch.arena, &stack, x);
900 }
901 else{
904 goto finish;
905 }
906 }break;
907
908 // NOTE: pop offset from stack, convert it to TLS address, then push it back.
911 {
913
914 if (config->tls_address != 0){
915 SYMS_U64 x = *config->tls_address + s;
916 syms_dw_expr__stack_push(scratch.arena, &stack, x);
917 }
918 else{
921 goto finish;
922 }
923 }break;
924
926 {
927 if (config->cfa != 0){
928 SYMS_U64 x = *config->cfa;
929 syms_dw_expr__stack_push(scratch.arena, &stack, x);
930 }
931 else{
934 goto finish;
935 }
936 }break;
937
938
940
941 case SYMS_DwOp_ABS:
942 {
944 SYMS_S64 x = (s < 0)?-s:s;
945 syms_dw_expr__stack_push(scratch.arena, &stack, x);
946 }break;
947
948 case SYMS_DwOp_AND:
949 {
952 syms_dw_expr__stack_push(scratch.arena, &stack, x&y);
953 }break;
954
955 case SYMS_DwOp_DIV:
956 {
959 SYMS_S64 x = (d == 0)?0:n/d;
960 syms_dw_expr__stack_push(scratch.arena, &stack, x);
961 }break;
962
963 case SYMS_DwOp_MINUS:
964 {
967 SYMS_U64 x = a - b;
968 syms_dw_expr__stack_push(scratch.arena, &stack, x);
969 }break;
970
971 case SYMS_DwOp_MOD:
972 {
975 SYMS_S64 x = (d == 0)?0:n%d;
976 syms_dw_expr__stack_push(scratch.arena, &stack, x);
977 }break;
978
979 case SYMS_DwOp_MUL:
980 {
983 SYMS_U64 x = a*b;
984 syms_dw_expr__stack_push(scratch.arena, &stack, x);
985 }break;
986
987 case SYMS_DwOp_NEG:
988 {
990 SYMS_S64 x = -s;
991 syms_dw_expr__stack_push(scratch.arena, &stack, x);
992 }break;
993
994 case SYMS_DwOp_NOT:
995 {
997 SYMS_U64 x = ~y;
998 syms_dw_expr__stack_push(scratch.arena, &stack, x);
999 }break;
1000
1001 case SYMS_DwOp_OR:
1002 {
1005 SYMS_U64 x = y | z;
1006 syms_dw_expr__stack_push(scratch.arena, &stack, x);
1007 }break;
1008
1009 case SYMS_DwOp_PLUS:
1010 {
1013 SYMS_U64 x = y + z;
1014 syms_dw_expr__stack_push(scratch.arena, &stack, x);
1015 }break;
1016
1018 {
1019 SYMS_U64 y = 0;
1022 SYMS_U64 x = y + z;
1023 syms_dw_expr__stack_push(scratch.arena, &stack, x);
1024 }break;
1025
1026 case SYMS_DwOp_SHL:
1027 {
1030 SYMS_U64 x = 0;
1031 if (y < 64){
1032 x = z << y;
1033 }
1034 syms_dw_expr__stack_push(scratch.arena, &stack, x);
1035 }break;
1036
1037 case SYMS_DwOp_SHR:
1038 {
1041 SYMS_U64 x = 0;
1042 if (y < 64){
1043 x = z >> y;
1044 }
1045 syms_dw_expr__stack_push(scratch.arena, &stack, x);
1046 }break;
1047
1048 case SYMS_DwOp_SHRA:
1049 {
1052 SYMS_U64 x = 0;
1053 if (y < 64){
1054 x = z >> y;
1055 // sign extensions
1056 if (y > 0 && (z & (1ull << 63))){
1057 x |= ~((1 << (64 - y)) - 1);
1058 }
1059 }
1060 syms_dw_expr__stack_push(scratch.arena, &stack, x);
1061 }break;
1062
1063 case SYMS_DwOp_XOR:
1064 {
1067 SYMS_U64 x = y ^ z;
1068 syms_dw_expr__stack_push(scratch.arena, &stack, x);
1069 }break;
1070
1071
1073
1074 case SYMS_DwOp_LE:
1075 {
1078 SYMS_U64 x = (a <= b);
1079 syms_dw_expr__stack_push(scratch.arena, &stack, x);
1080 }break;
1081
1082 case SYMS_DwOp_GE:
1083 {
1086 SYMS_U64 x = (a >= b);
1087 syms_dw_expr__stack_push(scratch.arena, &stack, x);
1088 }break;
1089
1090 case SYMS_DwOp_EQ:
1091 {
1094 SYMS_U64 x = (a == b);
1095 syms_dw_expr__stack_push(scratch.arena, &stack, x);
1096 }break;
1097
1098 case SYMS_DwOp_LT:
1099 {
1102 SYMS_U64 x = (a < b);
1103 syms_dw_expr__stack_push(scratch.arena, &stack, x);
1104 }break;
1105
1106 case SYMS_DwOp_GT:
1107 {
1110 SYMS_U64 x = (a > b);
1111 syms_dw_expr__stack_push(scratch.arena, &stack, x);
1112 }break;
1113
1114 case SYMS_DwOp_NE:
1115 {
1118 SYMS_U64 x = (a != b);
1119 syms_dw_expr__stack_push(scratch.arena, &stack, x);
1120 }break;
1121
1122 case SYMS_DwOp_SKIP:
1123 {
1124 SYMS_S16 d = 0;
1125 step_cursor += syms_based_range_read(base, range, step_cursor, 2, &d);
1127 }break;
1128
1129 case SYMS_DwOp_BRA:
1130 {
1131 SYMS_S16 d = 0;
1132 step_cursor += syms_based_range_read(base, range, step_cursor, 2, &d);
1134 if (b != 0){
1136 }
1137 }break;
1138
1139 case SYMS_DwOp_CALL2:
1140 {
1141 SYMS_U16 p = 0;
1142 step_cursor += syms_based_range_read(base, range, step_cursor, 2, &p);
1143 if (config->call.func != 0){
1144 SYMS_String8 sub_data = config->call.func(config->call.user_ptr, p);
1146 }
1147 else{
1150 goto finish;
1151 }
1152 }break;
1153
1154 case SYMS_DwOp_CALL4:
1155 {
1156 SYMS_U32 p = 0;
1157 step_cursor += syms_based_range_read(base, range, step_cursor, 4, &p);
1158 if (config->call.func != 0){
1159 SYMS_String8 sub_data = config->call.func(config->call.user_ptr, p);
1161 }
1162 else{
1165 goto finish;
1166 }
1167 }break;
1168
1169 case SYMS_DwOp_CALL_REF:
1170 {
1173 goto finish;
1174 }break;
1175
1176
1178
1179 case SYMS_DwOp_NOP:break;
1180
1181
1183
1195 {
1196 SYMS_U64 reg_idx = op - SYMS_DwOp_REG0;
1198 stashed_loc.reg_idx = reg_idx;
1199 }break;
1200
1201 case SYMS_DwOp_REGX:
1202 {
1203 SYMS_U64 reg_idx = 0;
1204 step_cursor += syms_based_range_read(base, range, step_cursor, size_param, &reg_idx);
1206 stashed_loc.reg_idx = reg_idx;
1207 }break;
1208
1209
1211
1213 {
1214 SYMS_U64 size = 0;
1216 if (step_cursor + size <= range.max){
1217 void *data = (SYMS_U8*)base + range.min + step_cursor;
1219 stashed_loc.val_long.str = (SYMS_U8*)data;
1220 stashed_loc.val_long.size = size;
1221 }
1222 else{
1225 goto finish;
1226 }
1227 step_cursor += size;
1228 }break;
1229
1231 {
1234 stashed_loc.val = x;
1235 }break;
1236
1237
1239
1240 case SYMS_DwOp_PIECE:
1242 {
1243 if (arena_optional == 0){
1246 goto finish;
1247 }
1248 else{
1249
1250 // determine this piece's size & offset
1251 SYMS_U64 bit_size = 0;
1252 SYMS_U64 bit_off = 0;
1253 SYMS_B32 is_bit_loc = syms_false;
1254 switch (op){
1255 case SYMS_DwOp_PIECE:
1256 {
1257 SYMS_U64 size = 0;
1259 bit_size = size*8;
1260 }break;
1262 {
1263 step_cursor += syms_based_range_read_uleb128(base, range, step_cursor, &bit_size);
1264 step_cursor += syms_based_range_read_uleb128(base, range, step_cursor, &bit_off);
1265 is_bit_loc = syms_true;
1266 }break;
1267 }
1268
1269 // determine this piece's location information
1272 if (syms_dw_expr__stack_is_empty(&stack)){
1274 }
1275 else{
1277 piece_loc.addr = x;
1278 }
1279 }
1280
1281 // push the piece
1283 SYMS_QueuePush(result.first_piece, result.last_piece, piece);
1284 piece->loc = piece_loc;
1285 piece->bit_size = bit_size;
1286 piece->bit_off = bit_off;
1287 piece->is_bit_loc = is_bit_loc;
1288
1289 // zero the stached loc
1291 }
1292 }break;
1293
1294
1296
1297 default:
1298 {
1301 goto finish;
1302 }break;
1303 }
1304
1305 // increment cursor
1306 cursor = step_cursor;
1307 }
1308
1309 // advance cursor or finish call
1310 if (cursor < call->size){
1311 call->cursor = cursor;
1312 }
1313 else{
1315 }
1316
1317 // advance step counter
1318 step_counter += 1;
1319 if (step_counter == max_step_count){
1322 goto finish;
1323 }
1324 }
1325
1326 finish:;
1327
1328 // non-piece location
1329 {
1331 if (result.first_piece == 0){
1332
1333 // normal location resolution
1334 loc = stashed_loc;
1336 if (syms_dw_expr__stack_is_empty(&stack)){
1338 }
1339 else{
1341 loc.addr = x;
1342 }
1343 }
1344 }
1345
1346 // non-piece location resolution after composite
1347 else{
1348
1349 // change the default kind to empty
1352 }
1353
1354 // the non-piece should either be empty or fail
1355 if (loc.kind != SYMS_DwSimpleLocKind_Empty &&
1359 }
1360 }
1361
1362 result.non_piece_loc = loc;
1363 }
1364
1365 // clear stack
1367
1368 return(result);
1369}
1370
1371
1372//- dw expr val stack
1373
1376 SYMS_DwExprStack result = {0};
1377 return(result);
1378}
1379
1380SYMS_API void
1382 SYMS_DwExprStackNode *node = stack->free_nodes;
1383 if (node == 0){
1384 SYMS_StackPop(stack->free_nodes);
1385 }
1386 else{
1387 node = syms_push_array(arena, SYMS_DwExprStackNode, 1);
1388 }
1389 SYMS_StackPush(stack->stack, node);
1390 node->val = x;
1391 stack->count += 1;
1392}
1393
1396 SYMS_U64 result = 0;
1397 SYMS_DwExprStackNode *node = stack->stack;
1398 if (node != 0){
1399 SYMS_StackPop(stack->stack);
1400 stack->count -= 1;
1401 result = node->val;
1402 }
1403 return(result);
1404}
1405
1408 SYMS_U64 result = 0;
1409 if (idx < stack->count){
1410 SYMS_U64 counter = idx;
1411 SYMS_DwExprStackNode *node = stack->stack;
1412 for (;node != 0 && counter > 0;
1413 node = node->next, counter -= 1);
1414 if (counter == 0 && node != 0){
1415 result = node->val;
1416 }
1417 }
1418 return(result);
1419}
1420
1423 SYMS_B32 result = (stack->count == 0);
1424 return(result);
1425}
1426
1427//- dw expr call stack
1428
1431 SYMS_DwExprCall *call = stack->stack;
1432 return(call);
1433}
1434
1435SYMS_API void
1437 SYMS_DwExprCall *call = 0;
1438 if (call != 0){
1439 SYMS_StackPop(stack->free_calls);
1440 }
1441 else{
1442 call = syms_push_array(arena, SYMS_DwExprCall, 1);
1443 }
1444 syms_memzero_struct(call);
1445 SYMS_StackPush(stack->stack, call);
1446 stack->depth += 1;
1447}
1448
1449SYMS_API void
1451 SYMS_DwExprCall *top = stack->stack;
1452 if (top != 0){
1453 SYMS_StackPop(stack->stack);
1454 SYMS_StackPush(stack->free_calls, top);
1455 }
1456}
1457
1458//- analysis tasks
1459
1462 SYMS_DwExprAnalysisTask *result = 0;
1463 for (SYMS_DwExprAnalysisTask *task = first;
1464 task != 0;
1465 task = task->next){
1466 if (task->p == p){
1467 result = task;
1468 break;
1469 }
1470 }
1471 return(result);
1472}
1473
1474#endif //SYMS_DWARF_EXPR_C
1475
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define op
Definition syms_base.h:402
Definition syms_dwarf_expr.h:119
struct SYMS_DwExprAnalysisTask * next
Definition syms_dwarf_expr.h:120
Definition syms_dwarf_expr.h:115
SYMS_DwExprFlags flags
Definition syms_dwarf_expr.h:116
Definition syms_dwarf_expr.h:237
SYMS_DwExprCall * stack
Definition syms_dwarf_expr.h:238
SYMS_DwExprCall * free_calls
Definition syms_dwarf_expr.h:239
SYMS_U64 depth
Definition syms_dwarf_expr.h:240
Definition syms_dwarf_expr.h:230
SYMS_U64 size
Definition syms_dwarf_expr.h:233
void * ptr
Definition syms_dwarf_expr.h:232
SYMS_U64 cursor
Definition syms_dwarf_expr.h:234
Definition syms_dwarf_expr.h:78
Definition syms_dwarf_expr.h:83
Definition syms_dwarf_expr.h:219
struct SYMS_DwExprStackNode * next
Definition syms_dwarf_expr.h:220
SYMS_U64 val
Definition syms_dwarf_expr.h:221
Definition syms_dwarf_expr.h:224
SYMS_U64 count
Definition syms_dwarf_expr.h:227
SYMS_DwExprStackNode * free_nodes
Definition syms_dwarf_expr.h:226
SYMS_DwExprStackNode * stack
Definition syms_dwarf_expr.h:225
Definition syms_dwarf_expr.h:186
SYMS_DwPiece * last_piece
Definition syms_dwarf_expr.h:211
SYMS_DwSimpleLoc non_piece_loc
Definition syms_dwarf_expr.h:214
SYMS_DwPiece * first_piece
Definition syms_dwarf_expr.h:210
Definition syms_dwarf_expr.h:173
Definition syms_dwarf_expr.h:15
SYMS_U64 r[17]
Definition syms_dwarf_expr.h:36
Definition syms_dwarf_expr.h:159
SYMS_DwSimpleLocKind kind
Definition syms_dwarf_expr.h:160
SYMS_U64 reg_idx
Definition syms_dwarf_expr.h:163
SYMS_U64 addr
Definition syms_dwarf_expr.h:162
SYMS_DwLocFailKind fail_kind
Definition syms_dwarf_expr.h:167
SYMS_String8 val_long
Definition syms_dwarf_expr.h:165
Definition syms_base.h:410
Definition syms_base.h:296
SYMS_U8 * str
Definition syms_base.h:297
SYMS_U64 size
Definition syms_base.h:298
Definition syms_base.h:264
SYMS_U64 max
Definition syms_base.h:266
SYMS_U64 min
Definition syms_base.h:265
SYMS_API SYMS_U64 syms_based_range_read(void *base, SYMS_U64Range range, SYMS_U64 offset, SYMS_U64 out_size, void *out)
Definition syms_base.c:753
SYMS_API SYMS_B32 syms_memory_view_read(SYMS_MemoryView *memview, SYMS_U64 addr, SYMS_U64 size, void *ptr)
Definition syms_base.c:849
SYMS_API SYMS_ArenaTemp syms_get_scratch(SYMS_Arena **conflicts, SYMS_U64 conflict_count)
Definition syms_base.c:694
SYMS_API SYMS_U64 syms_based_range_read_sleb128(void *base, SYMS_U64Range range, SYMS_U64 offset, SYMS_S64 *out_value)
Definition syms_base.c:792
SYMS_API SYMS_String8 syms_str8(SYMS_U8 *str, SYMS_U64 size)
Definition syms_base.c:169
SYMS_API SYMS_U64 syms_based_range_read_uleb128(void *base, SYMS_U64Range range, SYMS_U64 offset, SYMS_U64 *out_value)
Definition syms_base.c:765
#define syms_true
Definition syms_base.h:105
#define SYMS_StackPush(f, n)
Definition syms_base.h:227
#define syms_based_range_read_struct(b, r, o, p)
Definition syms_base.h:593
#define syms_push_array(a, T, c)
Definition syms_base.h:561
#define syms_memory_view_read_struct(s, a, p)
Definition syms_base.h:602
#define syms_memzero_struct(s)
Definition syms_base.h:161
#define SYMS_ClampTop(a, b)
Definition syms_base.h:182
#define syms_false
Definition syms_base.h:104
#define SYMS_API
Definition syms_base.h:29
#define SYMS_ARRAY_SIZE(x)
Definition syms_base.h:144
SYMS_S32 SYMS_B32
Definition syms_base.h:99
#define SYMS_StackPop(f)
Definition syms_base.h:228
#define syms_push_array_zero(a, T, c)
Definition syms_base.h:564
SYMS_S8 SYMS_B8
Definition syms_base.h:97
#define SYMS_U64_MAX
Definition syms_base.h:176
#define SYMS_QueuePush(f, l, n)
Definition syms_base.h:220
#define syms_release_scratch
Definition syms_base.h:567
uint32_t SYMS_U32
Definition syms_crt_overrides.h:38
uint64_t SYMS_U64
Definition syms_crt_overrides.h:39
uint16_t SYMS_U16
Definition syms_crt_overrides.h:37
int64_t SYMS_S64
Definition syms_crt_overrides.h:35
#define SYMS_S64
Definition syms_crt_overrides.h:50
int16_t SYMS_S16
Definition syms_crt_overrides.h:33
uint8_t SYMS_U8
Definition syms_crt_overrides.h:36
#define SYMS_Arena
Definition syms_default_arena.h:61
SYMS_API void syms_dw_expr__call_pop(SYMS_DwExprCallStack *stack)
Definition syms_dwarf_expr.c:1450
SYMS_API SYMS_U64 syms_dw_expr__stack_pick(SYMS_DwExprStack *stack, SYMS_U64 idx)
Definition syms_dwarf_expr.c:1407
SYMS_API SYMS_B32 syms_dw_expr__stack_is_empty(SYMS_DwExprStack *stack)
Definition syms_dwarf_expr.c:1422
SYMS_API SYMS_DwExprAnalysis syms_dw_expr__analyze_details(void *in_base, SYMS_U64Range in_range, SYMS_DwExprMachineCallConfig *call_config)
Definition syms_dwarf_expr.c:192
SYMS_API SYMS_U64 syms_dw_expr__stack_pop(SYMS_DwExprStack *stack)
Definition syms_dwarf_expr.c:1395
SYMS_API SYMS_DwExprCall * syms_dw_expr__call_top(SYMS_DwExprCallStack *stack)
Definition syms_dwarf_expr.c:1430
SYMS_API SYMS_DwLocation syms_dw_expr__eval(SYMS_Arena *arena_optional, void *expr_base, SYMS_U64Range expr_range, SYMS_DwExprMachineConfig *config)
Definition syms_dwarf_expr.c:578
SYMS_API SYMS_DwSimpleLoc syms_dw_expr__analyze_fast(void *base, SYMS_U64Range range, SYMS_U64 text_section_base)
Definition syms_dwarf_expr.c:17
SYMS_API void syms_dw_expr__stack_push(SYMS_Arena *arena, SYMS_DwExprStack *stack, SYMS_U64 x)
Definition syms_dwarf_expr.c:1381
SYMS_API void syms_dw_expr__call_push(SYMS_Arena *arena, SYMS_DwExprCallStack *stack, void *ptr, SYMS_U64 size)
Definition syms_dwarf_expr.c:1436
SYMS_API SYMS_DwExprStack syms_dw_expr__stack_make(SYMS_Arena *arena)
Definition syms_dwarf_expr.c:1375
SYMS_API SYMS_DwExprAnalysisTask * syms_dw_expr__analysis_task_from_p(SYMS_DwExprAnalysisTask *first, SYMS_U64 p)
Definition syms_dwarf_expr.c:1461
@ SYMS_DwSimpleLocKind_Empty
Definition syms_dwarf_expr.h:132
@ SYMS_DwSimpleLocKind_Register
Definition syms_dwarf_expr.h:129
@ SYMS_DwSimpleLocKind_Address
Definition syms_dwarf_expr.h:128
@ SYMS_DwSimpleLocKind_ValueLong
Definition syms_dwarf_expr.h:131
@ SYMS_DwSimpleLocKind_Value
Definition syms_dwarf_expr.h:130
@ SYMS_DwSimpleLocKind_Fail
Definition syms_dwarf_expr.h:133
@ SYMS_DwExprFlag_NonLinearFlow
Definition syms_dwarf_expr.h:112
@ SYMS_DwExprFlag_NotSupported
Definition syms_dwarf_expr.h:110
@ SYMS_DwExprFlag_UsesTLSAddress
Definition syms_dwarf_expr.h:105
@ SYMS_DwExprFlag_UsesMemory
Definition syms_dwarf_expr.h:101
@ SYMS_DwExprFlag_UsesCallResolution
Definition syms_dwarf_expr.h:107
@ SYMS_DwExprFlag_UsesComposite
Definition syms_dwarf_expr.h:108
@ SYMS_DwExprFlag_UsesRegisters
Definition syms_dwarf_expr.h:102
@ SYMS_DwExprFlag_UsesCFA
Definition syms_dwarf_expr.h:106
@ SYMS_DwExprFlag_UsesObjectAddress
Definition syms_dwarf_expr.h:104
@ SYMS_DwExprFlag_BadData
Definition syms_dwarf_expr.h:111
@ SYMS_DwExprFlag_UsesTextBase
Definition syms_dwarf_expr.h:100
@ SYMS_DwExprFlag_UsesFrameBase
Definition syms_dwarf_expr.h:103
@ SYMS_DwLocFailKind_TimeOut
Definition syms_dwarf_expr.h:146
@ SYMS_DwLocFailKind_MissingObjectAddress
Definition syms_dwarf_expr.h:152
@ SYMS_DwLocFailKind_NotSupported
Definition syms_dwarf_expr.h:145
@ SYMS_DwLocFailKind_MissingMemory
Definition syms_dwarf_expr.h:149
@ SYMS_DwLocFailKind_MissingFrameBase
Definition syms_dwarf_expr.h:151
@ SYMS_DwLocFailKind_MissingCFA
Definition syms_dwarf_expr.h:154
@ SYMS_DwLocFailKind_MissingArenaForComposite
Definition syms_dwarf_expr.h:156
@ SYMS_DwLocFailKind_MissingTextBase
Definition syms_dwarf_expr.h:148
@ SYMS_DwLocFailKind_MissingRegisters
Definition syms_dwarf_expr.h:150
@ SYMS_DwLocFailKind_MissingCallResolution
Definition syms_dwarf_expr.h:155
@ SYMS_DwLocFailKind_BadData
Definition syms_dwarf_expr.h:144
@ SYMS_DwLocFailKind_TooComplicated
Definition syms_dwarf_expr.h:147
@ SYMS_DwLocFailKind_MissingTLSAddress
Definition syms_dwarf_expr.h:153
@ SYMS_DwOp_REG11
Definition syms_meta_dwarf_expr.h:206
@ SYMS_DwOp_REG22
Definition syms_meta_dwarf_expr.h:217
@ SYMS_DwOp_REG26
Definition syms_meta_dwarf_expr.h:221
@ SYMS_DwOp_REG23
Definition syms_meta_dwarf_expr.h:218
@ SYMS_DwOp_LIT21
Definition syms_meta_dwarf_expr.h:184
@ SYMS_DwOp_LT
Definition syms_meta_dwarf_expr.h:161
@ SYMS_DwOp_ABS
Definition syms_meta_dwarf_expr.h:140
@ SYMS_DwOp_CALL2
Definition syms_meta_dwarf_expr.h:267
@ SYMS_DwOp_XDEREF
Definition syms_meta_dwarf_expr.h:139
@ SYMS_DwOp_REG27
Definition syms_meta_dwarf_expr.h:222
@ SYMS_DwOp_ROT
Definition syms_meta_dwarf_expr.h:138
@ SYMS_DwOp_LIT16
Definition syms_meta_dwarf_expr.h:179
@ SYMS_DwOp_BREGX
Definition syms_meta_dwarf_expr.h:261
@ SYMS_DwOp_GNU_PUSH_TLS_ADDRESS
Definition syms_meta_dwarf_expr.h:285
@ SYMS_DwOp_MUL
Definition syms_meta_dwarf_expr.h:145
@ SYMS_DwOp_BREG16
Definition syms_meta_dwarf_expr.h:243
@ SYMS_DwOp_ADDR
Definition syms_meta_dwarf_expr.h:121
@ SYMS_DwOp_BREG25
Definition syms_meta_dwarf_expr.h:252
@ SYMS_DwOp_CALL_FRAME_CFA
Definition syms_meta_dwarf_expr.h:271
@ SYMS_DwOp_REG5
Definition syms_meta_dwarf_expr.h:200
@ SYMS_DwOp_OVER
Definition syms_meta_dwarf_expr.h:135
@ SYMS_DwOp_SHRA
Definition syms_meta_dwarf_expr.h:153
@ SYMS_DwOp_LIT24
Definition syms_meta_dwarf_expr.h:187
@ SYMS_DwOp_LIT14
Definition syms_meta_dwarf_expr.h:177
@ SYMS_DwOp_LIT15
Definition syms_meta_dwarf_expr.h:178
@ SYMS_DwOp_REG0
Definition syms_meta_dwarf_expr.h:195
@ SYMS_DwOp_XDEREF_SIZE
Definition syms_meta_dwarf_expr.h:264
@ SYMS_DwOp_CONST4S
Definition syms_meta_dwarf_expr.h:128
@ SYMS_DwOp_BREG19
Definition syms_meta_dwarf_expr.h:246
@ SYMS_DwOp_FORM_TLS_ADDRESS
Definition syms_meta_dwarf_expr.h:270
@ SYMS_DwOp_BREG2
Definition syms_meta_dwarf_expr.h:229
@ SYMS_DwOp_BREG15
Definition syms_meta_dwarf_expr.h:242
@ SYMS_DwOp_BREG13
Definition syms_meta_dwarf_expr.h:240
@ SYMS_DwOp_LIT7
Definition syms_meta_dwarf_expr.h:170
@ SYMS_DwOp_LIT30
Definition syms_meta_dwarf_expr.h:193
@ SYMS_DwOp_LIT26
Definition syms_meta_dwarf_expr.h:189
@ SYMS_DwOp_GT
Definition syms_meta_dwarf_expr.h:159
@ SYMS_DwOp_NOP
Definition syms_meta_dwarf_expr.h:265
@ SYMS_DwOp_NEG
Definition syms_meta_dwarf_expr.h:146
@ SYMS_DwOp_DUP
Definition syms_meta_dwarf_expr.h:133
@ SYMS_DwOp_BREG31
Definition syms_meta_dwarf_expr.h:258
@ SYMS_DwOp_BREG21
Definition syms_meta_dwarf_expr.h:248
@ SYMS_DwOp_BREG3
Definition syms_meta_dwarf_expr.h:230
@ SYMS_DwOp_BRA
Definition syms_meta_dwarf_expr.h:156
@ SYMS_DwOp_MOD
Definition syms_meta_dwarf_expr.h:144
@ SYMS_DwOp_NE
Definition syms_meta_dwarf_expr.h:162
@ SYMS_DwOp_CONSTU
Definition syms_meta_dwarf_expr.h:131
@ SYMS_DwOp_BREG29
Definition syms_meta_dwarf_expr.h:256
@ SYMS_DwOp_REG24
Definition syms_meta_dwarf_expr.h:219
@ SYMS_DwOp_BREG22
Definition syms_meta_dwarf_expr.h:249
@ SYMS_DwOp_REG9
Definition syms_meta_dwarf_expr.h:204
@ SYMS_DwOp_SWAP
Definition syms_meta_dwarf_expr.h:137
@ SYMS_DwOp_BREG11
Definition syms_meta_dwarf_expr.h:238
@ SYMS_DwOp_LIT8
Definition syms_meta_dwarf_expr.h:171
@ SYMS_DwOp_BREG12
Definition syms_meta_dwarf_expr.h:239
@ SYMS_DwOp_CONST8S
Definition syms_meta_dwarf_expr.h:130
@ SYMS_DwOp_REG18
Definition syms_meta_dwarf_expr.h:213
@ SYMS_DwOp_REG16
Definition syms_meta_dwarf_expr.h:211
@ SYMS_DwOp_REG2
Definition syms_meta_dwarf_expr.h:197
@ SYMS_DwOp_LIT31
Definition syms_meta_dwarf_expr.h:194
@ SYMS_DwOp_EQ
Definition syms_meta_dwarf_expr.h:157
@ SYMS_DwOp_REG7
Definition syms_meta_dwarf_expr.h:202
@ SYMS_DwOp_CONST1U
Definition syms_meta_dwarf_expr.h:123
@ SYMS_DwOp_REG29
Definition syms_meta_dwarf_expr.h:224
@ SYMS_DwOp_REG21
Definition syms_meta_dwarf_expr.h:216
@ SYMS_DwOp_IMPLICIT_VALUE
Definition syms_meta_dwarf_expr.h:273
@ SYMS_DwOp_AND
Definition syms_meta_dwarf_expr.h:141
@ SYMS_DwOp_CONST8U
Definition syms_meta_dwarf_expr.h:129
@ SYMS_DwOp_LIT9
Definition syms_meta_dwarf_expr.h:172
@ SYMS_DwOp_PIECE
Definition syms_meta_dwarf_expr.h:262
@ SYMS_DwOp_BREG20
Definition syms_meta_dwarf_expr.h:247
@ SYMS_DwOp_BREG6
Definition syms_meta_dwarf_expr.h:233
@ SYMS_DwOp_LIT22
Definition syms_meta_dwarf_expr.h:185
@ SYMS_DwOp_DEREF
Definition syms_meta_dwarf_expr.h:122
@ SYMS_DwOp_BREG23
Definition syms_meta_dwarf_expr.h:250
@ SYMS_DwOp_LIT27
Definition syms_meta_dwarf_expr.h:190
@ SYMS_DwOp_LIT20
Definition syms_meta_dwarf_expr.h:183
@ SYMS_DwOp_BREG8
Definition syms_meta_dwarf_expr.h:235
@ SYMS_DwOp_REG30
Definition syms_meta_dwarf_expr.h:225
@ SYMS_DwOp_REG13
Definition syms_meta_dwarf_expr.h:208
@ SYMS_DwOp_REG8
Definition syms_meta_dwarf_expr.h:203
@ SYMS_DwOp_SHR
Definition syms_meta_dwarf_expr.h:152
@ SYMS_DwOp_PICK
Definition syms_meta_dwarf_expr.h:136
@ SYMS_DwOp_LIT17
Definition syms_meta_dwarf_expr.h:180
@ SYMS_DwOp_LIT12
Definition syms_meta_dwarf_expr.h:175
@ SYMS_DwOp_PLUS_UCONST
Definition syms_meta_dwarf_expr.h:150
@ SYMS_DwOp_SHL
Definition syms_meta_dwarf_expr.h:151
@ SYMS_DwOp_LIT11
Definition syms_meta_dwarf_expr.h:174
@ SYMS_DwOp_REG19
Definition syms_meta_dwarf_expr.h:214
@ SYMS_DwOp_BREG30
Definition syms_meta_dwarf_expr.h:257
@ SYMS_DwOp_REG25
Definition syms_meta_dwarf_expr.h:220
@ SYMS_DwOp_LIT23
Definition syms_meta_dwarf_expr.h:186
@ SYMS_DwOp_BREG26
Definition syms_meta_dwarf_expr.h:253
@ SYMS_DwOp_DROP
Definition syms_meta_dwarf_expr.h:134
@ SYMS_DwOp_CONST2U
Definition syms_meta_dwarf_expr.h:125
@ SYMS_DwOp_LIT28
Definition syms_meta_dwarf_expr.h:191
@ SYMS_DwOp_LIT4
Definition syms_meta_dwarf_expr.h:167
@ SYMS_DwOp_REG28
Definition syms_meta_dwarf_expr.h:223
@ SYMS_DwOp_REG12
Definition syms_meta_dwarf_expr.h:207
@ SYMS_DwOp_REG15
Definition syms_meta_dwarf_expr.h:210
@ SYMS_DwOp_NOT
Definition syms_meta_dwarf_expr.h:147
@ SYMS_DwOp_SKIP
Definition syms_meta_dwarf_expr.h:155
@ SYMS_DwOp_OR
Definition syms_meta_dwarf_expr.h:148
@ SYMS_DwOp_BREG27
Definition syms_meta_dwarf_expr.h:254
@ SYMS_DwOp_PUSH_OBJECT_ADDRESS
Definition syms_meta_dwarf_expr.h:266
@ SYMS_DwOp_BREG7
Definition syms_meta_dwarf_expr.h:234
@ SYMS_DwOp_BREG5
Definition syms_meta_dwarf_expr.h:232
@ SYMS_DwOp_REG20
Definition syms_meta_dwarf_expr.h:215
@ SYMS_DwOp_BREG4
Definition syms_meta_dwarf_expr.h:231
@ SYMS_DwOp_FBREG
Definition syms_meta_dwarf_expr.h:260
@ SYMS_DwOp_DEREF_SIZE
Definition syms_meta_dwarf_expr.h:263
@ SYMS_DwOp_REG14
Definition syms_meta_dwarf_expr.h:209
@ SYMS_DwOp_BREG24
Definition syms_meta_dwarf_expr.h:251
@ SYMS_DwOp_LIT2
Definition syms_meta_dwarf_expr.h:165
@ SYMS_DwOp_CONSTS
Definition syms_meta_dwarf_expr.h:132
@ SYMS_DwOp_LIT6
Definition syms_meta_dwarf_expr.h:169
@ SYMS_DwOp_CALL_REF
Definition syms_meta_dwarf_expr.h:269
@ SYMS_DwOp_BREG17
Definition syms_meta_dwarf_expr.h:244
@ SYMS_DwOp_GE
Definition syms_meta_dwarf_expr.h:158
@ SYMS_DwOp_LE
Definition syms_meta_dwarf_expr.h:160
@ SYMS_DwOp_LIT1
Definition syms_meta_dwarf_expr.h:164
@ SYMS_DwOp_CONST4U
Definition syms_meta_dwarf_expr.h:127
@ SYMS_DwOp_LIT13
Definition syms_meta_dwarf_expr.h:176
@ SYMS_DwOp_REG10
Definition syms_meta_dwarf_expr.h:205
@ SYMS_DwOp_LIT0
Definition syms_meta_dwarf_expr.h:163
@ SYMS_DwOp_LIT29
Definition syms_meta_dwarf_expr.h:192
@ SYMS_DwOp_BREG1
Definition syms_meta_dwarf_expr.h:228
@ SYMS_DwOp_REG17
Definition syms_meta_dwarf_expr.h:212
@ SYMS_DwOp_CONST1S
Definition syms_meta_dwarf_expr.h:124
@ SYMS_DwOp_REG4
Definition syms_meta_dwarf_expr.h:199
@ SYMS_DwOp_BIT_PIECE
Definition syms_meta_dwarf_expr.h:272
@ SYMS_DwOp_BREG18
Definition syms_meta_dwarf_expr.h:245
@ SYMS_DwOp_BREG9
Definition syms_meta_dwarf_expr.h:236
@ SYMS_DwOp_DIV
Definition syms_meta_dwarf_expr.h:142
@ SYMS_DwOp_BREG14
Definition syms_meta_dwarf_expr.h:241
@ SYMS_DwOp_LIT5
Definition syms_meta_dwarf_expr.h:168
@ SYMS_DwOp_REG1
Definition syms_meta_dwarf_expr.h:196
@ SYMS_DwOp_BREG10
Definition syms_meta_dwarf_expr.h:237
@ SYMS_DwOp_XOR
Definition syms_meta_dwarf_expr.h:154
@ SYMS_DwOp_REGX
Definition syms_meta_dwarf_expr.h:259
@ SYMS_DwOp_REG3
Definition syms_meta_dwarf_expr.h:198
@ SYMS_DwOp_STACK_VALUE
Definition syms_meta_dwarf_expr.h:274
@ SYMS_DwOp_CONST2S
Definition syms_meta_dwarf_expr.h:126
@ SYMS_DwOp_BREG0
Definition syms_meta_dwarf_expr.h:227
@ SYMS_DwOp_MINUS
Definition syms_meta_dwarf_expr.h:143
@ SYMS_DwOp_REG31
Definition syms_meta_dwarf_expr.h:226
@ SYMS_DwOp_LIT25
Definition syms_meta_dwarf_expr.h:188
@ SYMS_DwOp_PLUS
Definition syms_meta_dwarf_expr.h:149
@ SYMS_DwOp_BREG28
Definition syms_meta_dwarf_expr.h:255
@ SYMS_DwOp_REG6
Definition syms_meta_dwarf_expr.h:201
@ SYMS_DwOp_LIT18
Definition syms_meta_dwarf_expr.h:181
@ SYMS_DwOp_CALL4
Definition syms_meta_dwarf_expr.h:268
@ SYMS_DwOp_LIT19
Definition syms_meta_dwarf_expr.h:182
@ SYMS_DwOp_LIT3
Definition syms_meta_dwarf_expr.h:166
@ SYMS_DwOp_LIT10
Definition syms_meta_dwarf_expr.h:173