UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
syms_cv_helpers.c
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
4//~ allen: CodeView Parser Functions
5
6// cv parse helers
7
11 syms_msf_read_struct_in_range(data, msf, range, off, &sym);
12 SYMS_CvElement result = {0};
13 if (sym.size > 0){
14 SYMS_U32 end_unclamped = off + 2 + sym.size;
16 SYMS_U32 next_off = SYMS_AlignPow2(end_unclamped, align);
17 SYMS_U32 start = off + 4;
18 result.range = syms_msf_sub_range(range, start, end_clamped - start);
19 result.next_off = next_off;
20 result.kind = sym.type;
21 }
22 return(result);
23}
24
28 SYMS_U32 result = 0;
29 SYMS_U16 leaf = 0;
31 if (syms_msf_read_struct_in_range(data, msf, range, off, &leaf)){
34 syms_memmove(out->data, &leaf, 2);
35 result = sizeof(leaf);
36 }
37 else{
39 SYMS_U32 size = 0;
40 switch (leaf){
41 case SYMS_CvLeaf_FLOAT16: num.kind = SYMS_TypeKind_Float16; size = 2; break;
42 case SYMS_CvLeaf_FLOAT32: num.kind = SYMS_TypeKind_Float32; size = 4; break;
43 case SYMS_CvLeaf_FLOAT48: num.kind = SYMS_TypeKind_Float48; size = 6; break;
44 case SYMS_CvLeaf_FLOAT64: num.kind = SYMS_TypeKind_Float64; size = 8; break;
45 case SYMS_CvLeaf_FLOAT80: num.kind = SYMS_TypeKind_Float80; size = 10; break;
46 case SYMS_CvLeaf_FLOAT128: num.kind = SYMS_TypeKind_Float128; size = 16; break;
47 case SYMS_CvLeaf_CHAR: num.kind = SYMS_TypeKind_Int8; size = 1; break;
48 case SYMS_CvLeaf_SHORT: num.kind = SYMS_TypeKind_Int16; size = 2; break;
49 case SYMS_CvLeaf_USHORT: num.kind = SYMS_TypeKind_UInt16; size = 2; break;
50 case SYMS_CvLeaf_LONG: num.kind = SYMS_TypeKind_Int32; size = 4; break;
51 case SYMS_CvLeaf_ULONG: num.kind = SYMS_TypeKind_UInt32; size = 4; break;
52 case SYMS_CvLeaf_QUADWORD: num.kind = SYMS_TypeKind_Int64; size = 8; break;
53 case SYMS_CvLeaf_UQUADWORD: num.kind = SYMS_TypeKind_UInt64; size = 8; break;
54 default:break;
55 }
56 SYMS_U32 number_off = off + sizeof(leaf);
57 if (syms_msf_read_in_range(data, msf, range, number_off, size, num.data)){
58 syms_memmove(out, &num, sizeof(num));
59 result = number_off + size - off;
60 }
61 }
62 }
63 return(result);
64}
65
68 SYMS_U32 result = 0;
69 syms_memmove(&result, num.data, 4);
70 return(result);
71}
72
75 SYMS_CvStubRef *result = *free_list;
76 if (result != 0){
78 }
79 else{
80 result = syms_push_array(arena, SYMS_CvStubRef, 1);
81 }
82 return(result);
83}
84
87 SYMS_MsfRange range){
89
90 // size of section header / size of coff section
92
93 // grab coff array
95 syms_msf_read_in_range(data, msf, range, 0, count*sizeof(*coff_secs), coff_secs);
96
97 // fill array
98 SYMS_SecInfoArray result = {0};
99 result.count = count;
100 result.sec_info = syms_push_array(arena, SYMS_SecInfo, count);
101
102 SYMS_SecInfo *sec_info = result.sec_info;
104
105 for (SYMS_U64 i = 0; i < result.count; i += 1, sec_info += 1, coff_sec += 1){
106 // extract name
107 SYMS_U8 *name = coff_sec->name;
108 SYMS_U8 *name_ptr = name;
109 SYMS_U8 *name_opl = name + 8;
110 for (;name_ptr < name_opl && *name_ptr != 0; name_ptr += 1);
111
112 // fill sec info
113 sec_info->name = syms_push_string_copy(arena, syms_str8_range(name, name_ptr));
114 sec_info->vrange.min = coff_sec->virt_off;
115 sec_info->vrange.max = coff_sec->virt_off + coff_sec->virt_size;
116 sec_info->frange.min = coff_sec->file_off;
117 sec_info->frange.max = coff_sec->file_off + coff_sec->file_size;
118 }
119
121
122 return(result);
123}
124
125SYMS_API void
128 SYMS_U32 off = 0;
129 for (;;){
130 // read header
131 SYMS_CvSubSectionHeader header = {0};
132 syms_msf_read_struct_in_range(data, msf, range, off, &header);
133
134 // get sub section info
135 SYMS_U32 sub_section_off = off + sizeof(header);
138
139 // exit condition
141 break;
142 }
143
144 // emit sub section
147 list_out->count += 1;
148 sub_section->kind = header.kind;
151
152 // increment off
155 }
156}
157
158
159// cv line info
160
161SYMS_API void
163 // check if this id is new
165 for (SYMS_CvFileNode *node = loose->first_file_node;
166 node != 0;
167 node = node->next){
168 SYMS_U64 count = node->count;
169 SYMS_FileID *id_ptr = node->file_ids;
170 for (SYMS_U64 i = 0; i < count; i += 1, id_ptr += 1){
171 if (*id_ptr == id){
173 goto dblbreak;
174 }
175 }
176 }
177 dblbreak:;
178
179 // insert new id
180 if (!is_duplicate){
181 SYMS_CvFileNode *last_node = loose->last_file_node;
182 if (last_node == 0 || last_node->count == SYMS_ARRAY_SIZE(last_node->file_ids)){
184 SYMS_QueuePush(loose->first_file_node, loose->last_file_node, last_node);
185 last_node->count = 0;
186 }
187 last_node->file_ids[last_node->count] = id;
188 last_node->count += 1;
189 loose->file_count += 1;
190 }
191}
192
196 SYMS_Line *result = syms_push_array(arena, SYMS_Line, line_count);
197
198 new_seq->lines = result;
199 new_seq->line_count = line_count;
200
201 SYMS_QueuePush(loose->first_seq, loose->last_seq, new_seq);
202 loose->seq_count += 1;
203 loose->line_count += line_count;
204
205 return(result);
206}
207
210 // file table from list
211 SYMS_FileID *id_array = syms_push_array(arena, SYMS_FileID, loose->file_count);
212 {
214 for (SYMS_CvFileNode *node = loose->first_file_node;
215 node != 0;
216 node = node->next){
217 syms_memmove(file_id_ptr, node->file_ids, sizeof(*node->file_ids)*node->count);
218 file_id_ptr += node->count;
219 }
220 }
221
222 // line table from lists
223 SYMS_U64 *sequence_index_array = syms_push_array(arena, SYMS_U64, loose->seq_count + 1);
224 SYMS_Line *line_array = syms_push_array(arena, SYMS_Line, loose->line_count);
225 {
226 SYMS_U64 *index_ptr = sequence_index_array;
227 SYMS_Line *line_ptr = line_array;
228 SYMS_U64 index = 0;
229 for (SYMS_CvLineSequence *seq = loose->first_seq;
230 seq != 0;
231 seq = seq->next){
232 SYMS_U64 seq_line_count = seq->line_count;
233 // fill indices
234 *index_ptr = index;
235 index_ptr += 1;
236 // fill lines
237 syms_memmove(line_ptr, seq->lines, sizeof(*seq->lines)*seq_line_count);
239 index += seq_line_count;
240 }
241 *index_ptr = index;
242 }
243
244 // fill result
245 SYMS_LineParseOut result = {0};
246 result.file_id_array.count = loose->file_count;
247 result.file_id_array.ids = id_array;
248 result.line_table.sequence_count = loose->seq_count;
249 result.line_table.sequence_index_array = sequence_index_array;
250 result.line_table.line_count = loose->line_count;
251 result.line_table.line_array = line_array;
252
253 return(result);
254}
255
256SYMS_API void
260 SYMS_U64 *section_voffs, SYMS_U64 section_count,
262 // find the checksums section
265 node != 0;
266 node = node->next){
267 if (node->kind == SYMS_CvSubSectionKind_FILECHKSMS){
268 checksums = node;
269 break;
270 }
271 }
272
273 // extract checksums range
275 if (checksums != 0){
277 }
278
279 // iterate lines sections
281 sub_sec_node != 0;
285
286 // read header
289
290 // check for columns
292
293 // read file
294 SYMS_U32 file_off = sizeof(subsec_lines_header);
295 SYMS_CvFile file = {0};
296 syms_msf_read_struct_in_range(data, msf, subsec_range, file_off, &file);
297
298 SYMS_U32 line_array_off = file_off + sizeof(file);
300
301 // track down this file info
302 SYMS_CvChecksum chksum = {0};
303 syms_msf_read_struct_in_range(data, msf, checksums_range, file.file_off, &chksum);
304
305 // setup the section's file id
307 syms_cv_loose_push_file_id(arena, loose, file_id);
308
309 // get the section's virtual offset
310 SYMS_U64 section_voff = syms_1based_checked_lookup_u64(section_voffs, section_count,
313
314 // start the sequence
315 SYMS_Line *lines_out = syms_cv_loose_push_sequence(arena, loose, file.num_lines + 1);
316
317 // parse info
321 for (SYMS_U32 i = 0; i < file.num_lines; i += 1, line_out_ptr += 1){
322
323 // read line
324 SYMS_CvLine line = {0};
326
327 // read column
328 SYMS_CvColumn col = {0};
329 if (has_columns){
331 }
332
333 // calculate line data
334 SYMS_U64 line_off = seq_base_voff + line.off;
336 //SYMS_U32 delta_to_end = (line.flags>>SYMS_CvLineFlag_DELTA_TO_END_SHIFT)&SYMS_CvLineFlag_DELTA_TO_END_MASK;
337 //SYMS_B32 statement = ((line.flags & SYMS_CvLineFlag_STATEMENT) != 0);
338
339 // emit
340 line_out_ptr->src_coord.file_id = file_id;
341 line_out_ptr->src_coord.line = line_number;
342 line_out_ptr->src_coord.col = col.start;
343 line_out_ptr->voff = line_off;
344
345 // increment
346 line_cursor_off += sizeof(line);
347 column_cursor_off += sizeof(col);
348 }
349
350 // explicitly add an ender
351 {
352 line_out_ptr->src_coord.file_id = file_id;
353 line_out_ptr->src_coord.line = 0;
354 line_out_ptr->src_coord.col = 0;
356 }
357 }
358 }
359}
360
361SYMS_API void
364 SYMS_U64 *section_voffs, SYMS_U64 section_count,
366 // c11 layout:
367 // file_count: U16;
368 // range_count: U16;
369 // file_array: U32[file_count];
370 // range_array: U64[range_count];
371 // range_array2: U16[range_count];
372 // @align(4)
373 // ... more data ...
374 struct C11Header{
375 SYMS_U16 file_count;
376 SYMS_U16 range_count;
377 };
378 struct C11Header header = {0};
379 syms_msf_read_struct_in_range(data, msf, c11_range, 0, &header);
380 SYMS_U32 unk_file_array_off = sizeof(header);
381 SYMS_U32 unk_range_array_off = unk_file_array_off + header.file_count*4;
382 SYMS_U32 unk_range_array2_off = unk_range_array_off + header.range_count*8;
385
386 // iterate file sections
388 for (;file_section_cursor < c11_range.size;){
389 // file section layout:
390 // sec_count: U16;
391 // padding: U16;
392 // sec_array: U32[sec_count];
393 // range_array: U64[sec_count];
394 // path: length-prefixed with 1 byte;
395 // @align(4)
396 // ... more data ...
398 SYMS_U16 sec_count = 0;
403
408
410
411 // setup section file id
413 syms_cv_loose_push_file_id(arena, loose, file_id);
414
415 // iterate sections
417 for (SYMS_U16 i = 0; i < sec_count; i += 1){
418 // section layout:
419 // sec: U16;
420 // line_count: U16;
421 // offs_array: U32[line_count];
422 // nums_array: U16[line_count];
423 // @align(4)
424 // ... more data ...
426 struct C11Sec{
427 SYMS_U16 sec;
428 SYMS_U16 line_count;
429 };
430 struct C11Sec c11_sec = {0};
436
437 // get section range
440
441 // get the section's virtual offset
442 SYMS_U32 seq_base_voff = syms_1based_checked_lookup_u64(section_voffs, section_count, c11_sec.sec);
443
444 // start the sequence
446
447 // iterate line info
449 for (SYMS_U16 j = 0; j < c11_sec.line_count; j += 1, line_out_ptr += 1){
450 SYMS_U32 line_off = 0;
451 SYMS_U16 line_num = 0;
452 syms_msf_read_struct_in_range(data, msf, c11_range, offs_array_off + 4*j, &line_off);
454
455 line_out_ptr->src_coord.file_id = file_id;
456 line_out_ptr->src_coord.line = line_num;
457 line_out_ptr->src_coord.col = 0;
458 line_out_ptr->voff = seq_base_voff + line_off;
459 }
460
461 // explicitly add an ender
462 {
463 line_out_ptr->src_coord.file_id = file_id;
464 line_out_ptr->src_coord.line = 0;
465 line_out_ptr->src_coord.col = 0;
467 }
468
469 // increment
471 }
472
473 // increment
475 }
476}
477
478
479// cv parsers
480
484 SYMS_CvLeafConsParams *params){
485 // setup msf
486 SYMS_MsfRange range = {0};
487 range.sn = sn;
488 range.off = raw_range.min;
489 range.size = raw_range.max - raw_range.min;
490
491 // index stub list
494
495 // parse loop
496 SYMS_U64 ti = params->first_ti;
498 SYMS_U32 align = params->align;
499 SYMS_U32 cursor = 0;
500 for (;;){
501 // read element
502 SYMS_CvElement element = syms_cv_element(data, msf, range, cursor, align);
503
504 // exit condition
505 if (element.next_off == 0){
506 break;
507 }
508
509 // setup stub
511 stub->off = element.range.off - 4;
512 stub->index = ti;
513
514 // parse
515 switch (element.kind){
516 default:break;
517
519 {
522 SYMS_U32 num_size = syms_cv_read_numeric(data, msf, element.range, num_off, &num);
523 (void)num_size;
524 stub->num = syms_cv_u32_from_numeric(num);
525 }break;
526
527 // udt
531 {
534 SYMS_U32 num_size = syms_cv_read_numeric(data, msf, element.range, num_off, &num);
535 SYMS_U32 name_off = num_off + num_size;
536 SYMS_String8 name = syms_msf_read_zstring_in_range(arena, data, msf, element.range, name_off);
537
538 stub->num = syms_cv_u32_from_numeric(num);
539 stub->name = name;
540 }break;
541
543 {
546 SYMS_U32 num_size = syms_cv_read_numeric(data, msf, element.range, num_off, &num);
547 SYMS_U32 name_off = num_off + num_size;
548 SYMS_String8 name = syms_msf_read_zstring_in_range(arena, data, msf, element.range, name_off);
549
550 stub->num = syms_cv_u32_from_numeric(num);
551 stub->name = name;
552 }break;
553
554 case SYMS_CvLeaf_ENUM:
555 {
556 SYMS_U32 name_off = sizeof(SYMS_CvLeafEnum);
557 SYMS_String8 name = syms_msf_read_zstring_in_range(arena, data, msf, element.range, name_off);
558 stub->name = name;
559 }break;
560
563 {
566 SYMS_U32 num_size = syms_cv_read_numeric(data, msf, element.range, num_off, &num);
567 SYMS_U32 name_off = num_off + num_size;
568 SYMS_String8 name = syms_msf_read_zstring_in_range(arena, data, msf, element.range, name_off);
569
570 stub->num = syms_cv_u32_from_numeric(num);
571 stub->name = name;
572 }break;
573
575 {
576 SYMS_U32 name_off = sizeof(SYMS_CvLeafAlias);
577 SYMS_String8 name = syms_msf_read_zstring_in_range(arena, data, msf, element.range, name_off);
578
579 stub->name = name;
580 }break;
581
582 // field list
584 {
585 // parse loop
586 SYMS_CvStub *parent = stub;
588 for (;fl_cursor < element.range.size;){
589 // read kind
592
593 // insert new stub under parent
595 SYMS_QueuePush_N(parent->first, parent->last, fl_stub, sibling_next);
596 fl_stub->parent = parent;
597 fl_stub->off = element.range.off + fl_cursor;
598
599 // read internal leaf
602
603 switch (lf_kind){
604 default:break;
605
607 {
610 SYMS_U32 num_size = syms_cv_read_numeric(data, msf, element.range, num_off, &num);
611 SYMS_U32 name_off = num_off + num_size;
612 SYMS_String8 name = syms_msf_read_zstring_in_range(arena, data, msf, element.range, name_off);
613
615 fl_stub->name = name;
616 lf_end_off = name_off + name.size + 1;
617 }break;
618
620 {
621 SYMS_U32 name_off = lf_data_off + sizeof(SYMS_CvLeafStMember);
622 SYMS_String8 name = syms_msf_read_zstring_in_range(arena, data, msf, element.range, name_off);
623
624 fl_stub->name = name;
625 lf_end_off = name_off + name.size + 1;
626 }break;
627
629 {
630 SYMS_U32 name_off = lf_data_off + sizeof(SYMS_CvLeafMethod);
631 SYMS_String8 name = syms_msf_read_zstring_in_range(arena, data, msf, element.range, name_off);
632
633 fl_stub->name = name;
634 lf_end_off = name_off + name.size + 1;
635 }break;
636
638 {
642
643 SYMS_U32 name_off = lf_data_off + sizeof(onemethod);
644 SYMS_U32 virtoff = 0;
646 syms_msf_read_struct_in_range(data, msf, range, name_off, &virtoff);
647 name_off += sizeof(virtoff);
648 }
649 SYMS_String8 name = syms_msf_read_zstring_in_range(arena, data, msf, element.range, name_off);
650
651 fl_stub->name = name;
652 fl_stub->num = virtoff;
653 lf_end_off = name_off + name.size + 1;
654 }break;
655
657 {
660 SYMS_U32 num_size = syms_cv_read_numeric(data, msf, element.range, num_off, &num);
661 SYMS_U32 name_off = num_off + num_size;
662 SYMS_String8 name = syms_msf_read_zstring_in_range(arena, data, msf, element.range, name_off);
663
665 fl_stub->name = name;
666 lf_end_off = name_off + name.size + 1;
667 }break;
668
671 {
672 SYMS_U32 name_off = lf_data_off + sizeof(SYMS_CvLeafNestTypeEx);
673 SYMS_String8 name = syms_msf_read_zstring_in_range(arena, data, msf, element.range, name_off);
674
675 fl_stub->name = name;
676 lf_end_off = name_off + name.size + 1;
677 }break;
678
680 {
683 SYMS_U32 num_size = syms_cv_read_numeric(data, msf, element.range, num_off, &num);
684
687 }break;
688
691 {
694 SYMS_U32 num_size = syms_cv_read_numeric(data, msf, element.range, num_off, &num);
695
698 SYMS_U32 num2_size = syms_cv_read_numeric(data, msf, element.range, num2_off, &num2);
699
701 fl_stub->num2 = syms_cv_u32_from_numeric(num2);
703 }break;
704
706 {
708 }break;
709
711 {
713 }break;
714 }
715
716 // increment
719 off_stub_count += 1;
720 }
721
722 }break;
723
724 // method list
726 {
727 // parse loop
728 SYMS_CvStub *parent = stub;
730
731 for (;ml_cursor < element.range.size;){
732 // read method
736
737 // get virtual offset
738 SYMS_U32 virtual_offset = 0;
739 SYMS_U32 next_off = ml_cursor + sizeof(methodrec);
740 switch (mprop){
741 default:break;
744 {
745 syms_msf_read_struct_in_range(data, msf, element.range, next_off, &virtual_offset);
746 next_off += sizeof(SYMS_U32);
747 }break;
748 }
749
750 // insert new stub under parent
753 SYMS_QueuePush_N(parent->first, parent->last, ml_stub, sibling_next);
754 ml_stub->parent = parent;
755 ml_stub->off = element.range.off + ml_cursor;
756 ml_stub->num = virtual_offset;
757
758 // increment
759 ml_cursor = next_off;
760 }
761 }break;
762 }
763
764 // save stub onto list
766 ti += 1;
767
768 // increment
769 cursor = element.next_off;
770 }
771
772 // setup ti stubs array
773 SYMS_U64 index_stub_count = (ti - params->first_ti);
775 {
777 for (SYMS_CvStub *stub = first_index_stub;
778 stub != 0;
779 stub = stub->sibling_next, ti_stub_ptr += 1){
780 *ti_stub_ptr = stub;
781 }
782 }
783
784 // build bucket table
785 SYMS_U64 bucket_count = off_stub_count*5/4;
786 SYMS_CvStub **buckets = syms_push_array_zero(arena, SYMS_CvStub*, bucket_count);
787 if (bucket_count > 0){
789 for (SYMS_U64 i = 0; i < index_stub_count; i += 1, stub_ptr += 1){
790 SYMS_CvStub *stub = *stub_ptr;
791 for (SYMS_CvStub *internal_stub = stub->first;
792 internal_stub != 0;
793 internal_stub = internal_stub->sibling_next){
795 SYMS_U32 bucket_index = hash%bucket_count;
796 SYMS_StackPush_N(buckets[bucket_index], internal_stub, bucket_next);
797 }
798 }
799 }
800
801 // filter top stubs
805 {
809 for (; stub_ptr < stub_opl; stub_ptr += 1){
810 SYMS_CvStub *stub = *stub_ptr;
811 SYMS_U16 type = {0};
812 syms_msf_read_struct_in_range(data, msf, whole_range, stub->off + 2, &type);
813 switch (type){
814 // type kinds
819 case SYMS_CvLeaf_ENUM:
823 {
824 *udt_stub_ptr = stub;
825 udt_stub_ptr += 1;
826 }break;
827 }
828 }
829
832 }
833
834 // fill result
836 result->format = params->format;
837 result->leaf_set = syms_true;
838 result->sn = range.sn;
839 result->top_stubs = udt_stubs;
840 result->top_count = udt_count;
841 result->top_min_index = params->first_ti;
842 result->buckets = buckets;
843 result->bucket_count = bucket_count;
845 result->ti_indirect_stubs = ti_stubs;
846 result->ti_count = index_stub_count;
847 result->uid = params->uid;
848
849 return(result);
850}
851
855 SYMS_CvSymConsParams *params){
856 // get scratch
858
859 // root
860 SYMS_CvStub root = {0};
861 SYMS_U64 top_count = 0;
862
863 // all list
864 SYMS_CvStub *first = 0;
865 SYMS_CvStub *last = 0;
866 SYMS_U64 all_count = 0;
867
868 // proc & var
871 SYMS_U64 proc_count = 0;
872
875 SYMS_U64 var_count = 0;
876
877 // thread vars
880 SYMS_U64 tls_var_count = 0;
881
882 // thunk
885 SYMS_U64 thunk_count = 0;
886
887 // pub
890 SYMS_U64 pub_count = 0;
891
892 // free stub ref nodes
894
895 // extract alignment
896 SYMS_U32 align = params->align;
897
898 // outer parse loop
901 for (; range_ptr < range_opl; range_ptr += 1){
902 SYMS_MsfRange range = syms_msf_make_range(sn, range_ptr->min, range_ptr->max - range_ptr->min);
903
904 // per-range state
906 SYMS_CvStubRef *stack = 0;
907
908 // range parse loop
909 SYMS_U32 cursor = 0;
910 for (;;){
911 // read element
912 SYMS_CvElement element = syms_cv_element(data, msf, range, cursor, align);
913
914 // exit condition
915 if (element.next_off == 0){
916 break;
917 }
918
919 // init stub
920 SYMS_U32 symbol_off = element.range.off - 4;
922 SYMS_QueuePush_N(first, last, stub, bucket_next);
923 all_count += 1;
924 stub->off = symbol_off;
925
926 // default parent
928 if (stack != 0){
929 parent_for_this_stub = stack->stub;
930 }
931
932 // defrange collecting check
934
935 // parse
936 switch (element.kind){
937 default:break;
938
941 {
942 SYMS_U32 name_off = sizeof(SYMS_CvData32);
943 SYMS_String8 name = syms_msf_read_zstring_in_range(arena, data, msf, element.range, name_off);
944
945 stub->name = name;
946
947 // push onto var list
949 ref->stub = stub;
951 var_count += 1;
952 }break;
953
956 {
957 SYMS_U32 name_off = sizeof(SYMS_CvThread32);
958 SYMS_String8 name = syms_msf_read_zstring_in_range(arena, data, msf, element.range, name_off);
959
960 stub->name = name;
961
962 // push onto var list
964 ref->stub = stub;
966 tls_var_count += 1;
967 }break;
968
969 // general local variable
971 {
972 SYMS_U32 name_off = sizeof(SYMS_CvLocal);
973 SYMS_String8 name = syms_msf_read_zstring_in_range(arena, data, msf, element.range, name_off);
974
975 stub->name = name;
976
979 }break;
980
982 {
983 SYMS_U32 name_off = sizeof(SYMS_CvFileStatic);
984 SYMS_String8 name = syms_msf_read_zstring_in_range(arena, data, msf, element.range, name_off);
985
986 stub->name = name;
987
990 }break;
991
1001 {
1004 }break;
1005
1007 {
1008 SYMS_U32 name_off = sizeof(SYMS_CvRegrel32);
1009 SYMS_String8 name = syms_msf_read_zstring_in_range(arena, data, msf, element.range, name_off);
1010
1011 stub->name = name;
1012 }break;
1013
1015 {
1017 SYMS_String8 name = {0};
1020 SYMS_U32 name_off = numeric_off + numeric_size;
1021 name = syms_msf_read_zstring_in_range(arena, data, msf, element.range, name_off);
1022
1024 stub->name = name;
1025 }break;
1026
1030 {
1031 SYMS_U32 name_off = sizeof(SYMS_CvRef2);
1032 SYMS_String8 name = syms_msf_read_zstring_in_range(arena, data, msf, element.range, name_off);
1033
1034 stub->name = name;
1035 }break;
1036
1041 {
1042 // TODO(allen): create a *PROC32 -> FRAMEPROC accelerator
1043
1044 SYMS_U32 name_off = sizeof(SYMS_CvProc32);
1045 SYMS_String8 name = syms_msf_read_zstring_in_range(arena, data, msf, element.range, name_off);
1046
1047 stub->name = name;
1048
1049 // push stub stack
1051 SYMS_StackPush(stack, stack_node);
1052 stack_node->stub = stub;
1053
1054 // push onto proc list
1056 ref->stub = stub;
1058 proc_count += 1;
1059 }break;
1060
1062 {
1063 SYMS_U32 name_off = sizeof(SYMS_CvBlock32);
1064 SYMS_String8 name = syms_msf_read_zstring_in_range(arena, data, msf, element.range, name_off);
1065
1066 stub->name = name;
1067
1068 // push stub stack
1070 SYMS_StackPush(stack, stack_node);
1071 stack_node->stub = stub;
1072 }break;
1073
1074 case SYMS_CvSymKind_END:
1075 {
1076 if (stack != 0){
1077 SYMS_CvStubRef *bucket = stack;
1078 SYMS_StackPop(stack);
1080 }
1081 parent_for_this_stub = &root;
1082 }break;
1083
1085 {
1086 SYMS_U32 name_off = sizeof(SYMS_CvPubsym32);
1087 SYMS_String8 name = syms_msf_read_zstring_in_range(arena, data, msf, element.range, name_off);
1088 stub->name = name;
1089
1090 // push onto stripped symbol list
1092 ref->stub = stub;
1094 pub_count += 1;
1095 }break;
1096
1098 {
1099 SYMS_U32 name_off = sizeof(SYMS_CvThunk32);
1100 SYMS_String8 name = syms_msf_read_zstring_in_range(scratch.arena, data, msf, element.range, name_off);
1101 stub->name = name;
1102
1103 // push onto thunk list
1105 ref->stub = stub;
1107 thunk_count += 1;
1108 }break;
1109 }
1110
1111 // clear defrange collector
1114 }
1115
1116 // insert into tree
1118 SYMS_QueuePush_N(parent_for_this_stub->first, parent_for_this_stub->last, stub, sibling_next);
1119 if (parent_for_this_stub != &root){
1121 }
1122 else{
1123 top_count += 1;
1124 }
1125
1126 // increment
1127 cursor = element.next_off;
1128 }
1129 }
1130
1131 // build top stubs pointer table
1132 SYMS_CvStub **top_stubs = syms_push_array(arena, SYMS_CvStub*, top_count);
1133 {
1134 SYMS_CvStub **ptr = top_stubs;
1135 for (SYMS_CvStub *node = root.first;
1136 node != 0;
1137 node = node->sibling_next, ptr += 1){
1138 *ptr = node;
1139 }
1140 }
1141
1142 // build proc stubs pointer table
1143 SYMS_CvStub **proc_stubs = syms_push_array(arena, SYMS_CvStub*, proc_count);
1144 {
1145 SYMS_CvStub **ptr = proc_stubs;
1146 for (SYMS_CvStubRef *ref = proc_first;
1147 ref != 0;
1148 ref = ref->next, ptr += 1){
1149 *ptr = ref->stub;
1150 }
1151 }
1152
1153 // build var stubs pointer table
1154 SYMS_CvStub **var_stubs = syms_push_array(arena, SYMS_CvStub*, var_count);
1155 {
1156 SYMS_CvStub **ptr = var_stubs;
1157 for (SYMS_CvStubRef *ref = var_first;
1158 ref != 0;
1159 ref = ref->next, ptr += 1){
1160 *ptr = ref->stub;
1161 }
1162 }
1163
1164 // build thread stubs pointer table
1165 SYMS_CvStub **tls_var_stubs = syms_push_array(arena, SYMS_CvStub*, tls_var_count);
1166 {
1167 SYMS_CvStub **ptr = tls_var_stubs;
1168 for (SYMS_CvStubRef *ref = tls_var_first;
1169 ref != 0;
1170 ref = ref->next, ptr += 1){
1171 *ptr = ref->stub;
1172 }
1173 }
1174
1175 // build thunk stubs pointer table
1176 SYMS_CvStub **thunk_stubs = syms_push_array(arena, SYMS_CvStub*, thunk_count);
1177 {
1178 SYMS_CvStub **ptr = thunk_stubs;
1179 for (SYMS_CvStubRef *ref = thunk_first;
1180 ref != 0;
1181 ref = ref->next, ptr += 1){
1182 *ptr = ref->stub;
1183 }
1184 }
1185
1186 // build pub stubs pointer table
1187 SYMS_CvStub **pub_stubs = syms_push_array(arena, SYMS_CvStub*, pub_count);
1188 {
1189 SYMS_CvStub **ptr = pub_stubs;
1190 for (SYMS_CvStubRef *ref = pub_first;
1191 ref != 0;
1192 ref = ref->next, ptr += 1){
1193 *ptr = ref->stub;
1194 }
1195 }
1196
1197 // build bucket table
1198 SYMS_U64 bucket_count = (all_count/2)*2 + 3;
1199 SYMS_CvStub **buckets = syms_push_array(arena, SYMS_CvStub*, bucket_count);
1200 if (bucket_count > 0){
1201 syms_memset(buckets, 0, sizeof(*buckets)*bucket_count);
1202 for (SYMS_CvStub *bucket = first, *next = 0;
1203 bucket != 0;
1204 bucket = next){
1205 next = bucket->bucket_next;
1206 SYMS_U64 hash = syms_hash_u64(bucket->off);
1207 SYMS_U32 bucket_index = hash%bucket_count;
1208 SYMS_StackPush_N(buckets[bucket_index], bucket, bucket_next);
1209 }
1210 }
1211
1212 // release scratch
1214
1215 // fill result
1217 result->format = params->format;
1218 result->sn = sn;
1219 result->top_stubs = top_stubs;
1220 result->top_count = top_count;
1221 result->buckets = buckets;
1222 result->bucket_count = bucket_count;
1223 result->all_count = all_count;
1224 result->uid = params->uid;
1225 result->proc_stubs = proc_stubs;
1226 result->proc_count = proc_count;
1227 result->var_stubs = var_stubs;
1228 result->var_count = var_count;
1229 result->tls_var_stubs = tls_var_stubs;
1230 result->tls_var_count = tls_var_count;
1231 result->thunk_stubs = thunk_stubs;
1232 result->thunk_count = thunk_count;
1233 result->pub_stubs = pub_stubs;
1234 result->pub_count = pub_count;
1235
1236 return(result);
1237}
1238
1239
1240// cv extract helpers
1241
1244 SYMS_CvStub *result = 0;
1245 if (unit->bucket_count > 0){
1246 SYMS_U64 hash = syms_hash_u64(off);
1247 SYMS_U32 bucket_index = hash%unit->bucket_count;
1248 for (SYMS_CvStub *stub = unit->buckets[bucket_index];
1249 stub != 0;
1250 stub = stub->bucket_next){
1251 if (stub->off == off){
1252 result = stub;
1253 break;
1254 }
1255 }
1256 }
1257 return(result);
1258}
1259
1262 SYMS_CvStub *result = 0;
1263 if (unit->top_min_index <= index){
1264 SYMS_U32 relative_index = index - unit->top_min_index;
1265 if (relative_index < unit->ti_count){
1266 result = unit->ti_indirect_stubs[relative_index];
1267 }
1268 }
1269 return(result);
1270}
1271
1274 SYMS_CvStub *result = 0;
1275 switch (SYMS_ID_u32_0(sid)){
1277 {
1278 result = syms_cv_stub_from_unit_index(unit, SYMS_ID_u32_1(sid));
1279 }break;
1281 {
1282 result = syms_cv_stub_from_unit_off(unit, SYMS_ID_u32_1(sid));
1283 }break;
1284 }
1285 return(result);
1286}
1287
1290 SYMS_SymbolID id){
1291 // read id
1292 SYMS_MsfRange range = syms_msf_range_from_sn(msf, unit->sn);
1293
1294 SYMS_CvResolvedElement result = {0};
1295 switch (SYMS_ID_u32_0(id)){
1297 {
1299 if (result.stub != 0){
1300 SYMS_CvElement element = syms_cv_element(data, msf, range, result.stub->off, 1);
1301 result.kind = element.kind;
1302 result.range = element.range;
1303 }
1304 result.is_index = syms_true;
1305 result.is_leaf = unit->leaf_set;
1306 }break;
1307
1309 {
1310 result.stub = syms_cv_stub_from_unit_off(unit, SYMS_ID_u32_1(id));
1311 if (result.stub != 0){
1312 if (unit->leaf_set){
1313 // NOTE(allen): for "leaf" data we don't have built in sizes, so we just
1314 // return a range to the end of the stream.
1315 SYMS_U32 lf_off = result.stub->off;
1316 syms_msf_read_struct_in_range(data, msf, range, lf_off, &result.kind);
1318 result.range = syms_msf_sub_range(range, lf_data_off, range.size - lf_data_off);
1319 result.is_leaf = syms_true;
1320 }
1321
1322 else{
1323 // NOTE(allen): for "sym" data we can get the regular cv element
1324 SYMS_CvElement element = syms_cv_element(data, msf, range, result.stub->off, 1);
1325 result.kind = element.kind;
1326 result.range = element.range;
1327 }
1328 }
1329 }break;
1330 }
1331
1332 return(result);
1333}
1334
1337 SYMS_U64 result = 0;
1338 if (unit->leaf_set){
1339 result = unit->top_min_index;
1340 }
1341 return(result);
1342}
1343
1346 SYMS_U64 result = 0;
1347 if (unit->leaf_set){
1348 result = unit->ti_count;
1349 }
1350 return(result);
1351}
1352
1353// api implementors
1354
1357 return(unit->uid);
1358}
1359
1362 SYMS_SymbolID sid){
1363 //- parse symbol
1365
1366 //- resolve id
1368
1369 //- Handle SYM
1370 if (!resolve.is_leaf){
1371 if (resolve.stub != 0){
1372 //- get kind
1373 switch (resolve.kind){
1374 default:break;
1377 {
1379 }break;
1382 {
1384 }break;
1386 {
1387 result = SYMS_SymbolKind_Const;
1388 }break;
1393 {
1395 }break;
1397 {
1398 result = SYMS_SymbolKind_Scope;
1399 }break;
1402 {
1404 }break;
1405 }
1406 }
1407 }
1408
1409 //- Handle LEAF
1410 else{
1411 //- basic type info
1412 if (resolve.stub == 0 && resolve.is_index){
1414 if (ti == syms_cv_type_id_variadic){
1415 result = SYMS_SymbolKind_Type;
1416 }
1417 else if (ti < 0x1000){
1419 switch (basic_ptr_kind){
1427 {
1429 switch (itype_kind){
1471 {
1472 result = SYMS_SymbolKind_Type;
1473 }break;
1474 }
1475 }break;
1476 }
1477 }
1478 }
1479
1480 //- recorded type info
1481 if (resolve.stub != 0){
1482 switch (resolve.kind){
1483 // type kinds
1488 case SYMS_CvLeaf_ARRAY:
1490 case SYMS_CvLeaf_CLASS:
1493 case SYMS_CvLeaf_UNION:
1494 case SYMS_CvLeaf_ENUM:
1497 case SYMS_CvLeaf_ALIAS:
1498 {
1499 result = SYMS_SymbolKind_Type;
1500 }break;
1501 }
1502 }
1503
1504 }
1505
1506 return(result);
1507}
1508
1511 SYMS_SymbolIDArray result = {0};
1512 if (!unit->leaf_set){
1513
1514 //- allocate array
1515 SYMS_U64 count = unit->proc_count;
1517
1518 //- fill array
1519 SYMS_SymbolID *id_ptr = ids;
1521 SYMS_CvStub **opl = stub_ptr + count;
1522 for (; stub_ptr < opl; id_ptr += 1, stub_ptr += 1){
1523 *id_ptr = SYMS_ID_u32_u32(SYMS_CvSymbolIDKind_Off, (**stub_ptr).off);
1524 }
1525
1526 //- assemble result
1527 result.count = count;
1528 result.ids = ids;
1529 }
1530 return(result);
1531}
1532
1535 SYMS_SymbolIDArray result = {0};
1536 if (!unit->leaf_set){
1537
1538 //- allocate array
1539 SYMS_U64 count = unit->var_count;
1541
1542 //- fill array
1543 SYMS_SymbolID *id_ptr = ids;
1544 SYMS_CvStub **stub_ptr = unit->var_stubs;
1545 SYMS_CvStub **opl = stub_ptr + count;
1546 for (; stub_ptr < opl; id_ptr += 1, stub_ptr += 1){
1547 *id_ptr = SYMS_ID_u32_u32(SYMS_CvSymbolIDKind_Off, (**stub_ptr).off);
1548 }
1549
1550 //- assemble result
1551 result.count = count;
1552 result.ids = ids;
1553 }
1554 return(result);
1555}
1556
1559 SYMS_SymbolIDArray result = {0};
1560 if (unit->leaf_set){
1561
1562 //- allocate array
1563 SYMS_U64 count = unit->top_count;
1565
1566 //- fill array
1567 SYMS_SymbolID *id_ptr = ids;
1568 SYMS_CvStub **stub_ptr = unit->top_stubs;
1569 SYMS_CvStub **opl = stub_ptr + count;
1570 for (; stub_ptr < opl; id_ptr += 1, stub_ptr += 1){
1571 SYMS_CvStub *stub = *stub_ptr;
1573 }
1574
1575 //- assemble result
1576 result.count = count;
1577 result.ids = ids;
1578 }
1579 return(result);
1580}
1581
1584 //- zero result
1585 SYMS_String8 result = {0};
1586
1587 //- resolve id
1588 SYMS_CvStub *stub = syms_cv_stub_from_unit_sid(unit, sid);
1589 if (stub != 0){
1590 result = syms_push_string_copy(arena, stub->name);
1591 }
1592
1593 //- try basic type
1594 else if (unit->leaf_set && (SYMS_ID_u32_0(sid) == SYMS_CvSymbolIDKind_Index)){
1596 if (ti < 0x1000){
1601 }
1602 }
1603 }
1604
1605 return(result);
1606}
1607
1610 SYMS_SymbolID sid){
1611 // zero clear result
1613
1614 // setup uid
1615 SYMS_UnitID uid = unit->uid;
1616
1617 // resolve id
1619 if (resolve.is_leaf){
1620
1621 // basic type info
1622 if (resolve.stub == 0 && resolve.is_index){
1624 if (ti == syms_cv_type_id_variadic){
1626 }
1627 else if (ti < 0x1000){
1630
1632
1633 switch (basic_ptr_kind){
1634 default:
1635 {
1637 }break;
1638
1640 {
1641 switch (itype_kind){
1642 default:
1643 {
1645 }break;
1646
1648 {
1649 result.kind = SYMS_TypeKind_Void;
1651 }break;
1652
1654 {
1655 result.kind = SYMS_TypeKind_Void;
1656 result.reported_size = 4;
1657 }break;
1658
1661 {
1662 result.kind = SYMS_TypeKind_Int8;
1664 result.reported_size = 1;
1665 }break;
1666
1668 {
1669 result.kind = SYMS_TypeKind_UInt8;
1671 result.reported_size = 1;
1672 }break;
1673
1675 {
1676 result.kind = SYMS_TypeKind_UInt16;
1678 result.reported_size = 2;
1679 }break;
1680
1684 {
1685 result.kind = SYMS_TypeKind_Int8;
1686 result.reported_size = 1;
1687 }break;
1688
1693 {
1694 result.kind = SYMS_TypeKind_Int16;
1695 result.reported_size = 2;
1696 }break;
1697
1701 {
1702 result.kind = SYMS_TypeKind_Int32;
1703 result.reported_size = 4;
1704 }break;
1705
1709 {
1710 result.kind = SYMS_TypeKind_Int64;
1711 result.reported_size = 8;
1712 }break;
1713
1716 {
1717 result.kind = SYMS_TypeKind_Int128;
1718 result.reported_size = 16;
1719 }break;
1720
1722 {
1723 result.kind = SYMS_TypeKind_UInt8;
1724 result.reported_size = 1;
1725 }break;
1726
1729 {
1730 result.kind = SYMS_TypeKind_UInt16;
1731 result.reported_size = 2;
1732 }break;
1733
1735 {
1736 result.kind = SYMS_TypeKind_Int32;
1737 result.reported_size = 4;
1738 }break;
1739
1741 {
1742 result.kind = SYMS_TypeKind_UInt32;
1743 result.reported_size = 4;
1744 }break;
1745
1747 {
1748 result.kind = SYMS_TypeKind_UInt32;
1749 result.reported_size = 4;
1750 }break;
1751
1754 {
1755 result.kind = SYMS_TypeKind_UInt64;
1756 result.reported_size = 8;
1757 }break;
1758
1761 {
1762 result.kind = SYMS_TypeKind_UInt128;
1763 result.reported_size = 16;
1764 }break;
1765
1767 {
1768 result.kind = SYMS_TypeKind_Float16;
1769 result.reported_size = 2;
1770 }break;
1771
1773 {
1774 result.kind = SYMS_TypeKind_Float32;
1775 result.reported_size = 4;
1776 }break;
1777
1779 {
1780 result.kind = SYMS_TypeKind_Float64;
1781 result.reported_size = 8;
1782 }break;
1783
1785 {
1787 result.reported_size = 4;
1788 }break;
1789
1791 {
1792 result.kind = SYMS_TypeKind_Float80;
1793 result.reported_size = 10;
1794 }break;
1795
1797 {
1799 result.reported_size = 16;
1800 }break;
1801
1803 {
1805 result.reported_size = 8;
1806 }break;
1807
1809 {
1811 result.reported_size = 16;
1812 }break;
1813
1815 {
1817 result.reported_size = 20;
1818 }break;
1819
1821 {
1823 result.reported_size = 32;
1824 }break;
1825 }
1826 }break;
1827
1831 {
1832 result.kind = SYMS_TypeKind_Ptr;
1833 result.reported_size = 2;
1834 result.direct_type.uid = uid;
1836 }break;
1837
1840 {
1841 result.kind = SYMS_TypeKind_Ptr;
1842 result.reported_size = 4;
1843 result.direct_type.uid = uid;
1845 }break;
1846
1848 {
1849 result.kind = SYMS_TypeKind_Ptr;
1850 result.reported_size = 8;
1851 result.direct_type.uid = uid;
1853 }break;
1854 }
1855 }
1856 }
1857
1858 // recorded type info
1859 if (resolve.stub != 0){
1860 // shared fields for user data type paths
1862 SYMS_CvTypeProps props = 0;
1863
1864 switch (resolve.kind){
1865 default:break;
1866
1868 {
1869 SYMS_CvLeafModifier modifier = {0};
1870 if (syms_msf_read_struct_in_range(data, msf, resolve.range, 0, &modifier)){
1873 result.direct_type.uid = uid;
1876 result.reported_size = 1;
1877 }
1878 }break;
1879
1881 {
1882 SYMS_CvLeafPointer ptr = {0};
1883 if (syms_msf_read_struct_in_range(data, msf, resolve.range, 0, &ptr)){
1885 //SYMS_CvPointerKind ptr_kind = SYMS_CvPointerAttribs_Extract_KIND(ptr.attr);
1887
1889
1890 SYMS_CvTypeIndex containing_type = 0;
1892 syms_msf_read_struct_in_range(data, msf, resolve.range, sizeof(ptr), &containing_type);
1893 }
1894
1895 result.direct_type.uid = uid;
1897 result.kind = type_kind;
1900 result.reported_size = size;
1901 if (containing_type != 0){
1902 result.containing_type.uid = uid;
1904 }
1905 }
1906 }break;
1907
1909 {
1910 SYMS_CvLeafProcedure proc = {0};
1911 if (syms_msf_read_struct_in_range(data, msf, resolve.range, 0, &proc)){
1912 // skipped: funcattr, arg_count, arg_itype
1913 result.direct_type.uid = uid;
1915 result.kind = SYMS_TypeKind_Proc;
1917 }
1918 }break;
1919
1921 {
1923 if (syms_msf_read_struct_in_range(data, msf, resolve.range, 0, &mfunc)){
1924 // skipped: class_itype, this_itype, funcattr, arg_count, arg_itype, thisadjust
1925 result.direct_type.uid = uid;
1927 result.kind = SYMS_TypeKind_Proc;
1929 }
1930 }break;
1931
1932 case SYMS_CvLeaf_ARRAY:
1933 {
1934 SYMS_CvLeafArray array = {0};
1935 if (syms_msf_read_struct_in_range(data, msf, resolve.range, 0, &array)){
1936 result.direct_type.uid = uid;
1938 result.kind = SYMS_TypeKind_Array;
1940 result.reported_size = resolve.stub->num;
1941 }
1942 }break;
1943
1945 {
1947 if (syms_msf_read_struct_in_range(data, msf, resolve.range, 0, &bitfield)){
1948 result.direct_type.uid = uid;
1952 result.reported_size = 1;
1953 // TODO(allen): bitfield reporting
1954 }
1955 }break;
1956
1957 // udt
1958 {
1960 {
1962 goto read_struct;
1963 }
1964 case SYMS_CvLeaf_CLASS:
1966 {
1968 goto read_struct;
1969 }
1971 {
1973 syms_msf_read_struct_in_range(data, msf, resolve.range, 0, &struct_);
1974 props = struct_.props;
1975 goto fill_result;
1976 }
1977
1978 case SYMS_CvLeaf_UNION:
1979 {
1982 syms_msf_read_struct_in_range(data, msf, resolve.range, 0, &union_);
1983 props = union_.props;
1984 goto fill_result;
1985 }
1986
1987 case SYMS_CvLeaf_ENUM:
1988 {
1990 SYMS_CvLeafEnum enum_ = {0};
1991 syms_msf_read_struct_in_range(data, msf, resolve.range, 0, &enum_);
1992 props = enum_.props;
1993 result.direct_type.uid = uid;
1995 goto fill_result;
1996 }
1997
2000 {
2003 syms_msf_read_struct_in_range(data, msf, resolve.range, 0, &class_ptr);
2004 props = class_ptr.props;
2005 goto fill_result;
2006 }
2007
2009 {
2011 if (is_fwdref){
2014 result.reported_size = 0;
2015 }
2016 else{
2017 result.kind = type_kind;
2020 result.reported_size = 1;
2021 }
2022 else{
2024 result.reported_size = resolve.stub->num;
2025 }
2026 }
2027 }
2028 }break;
2029
2030 case SYMS_CvLeaf_ALIAS:
2031 {
2032 SYMS_CvLeafAlias alias = {0};
2033 if (syms_msf_read_struct_in_range(data, msf, resolve.range, 0, &alias)){
2034 result.kind = SYMS_TypeKind_Typedef;
2035 result.direct_type.uid = uid;
2038 result.reported_size = 1;
2039 }
2040 }break;
2041 }
2042 }
2043 }
2044
2045 return(result);
2046}
2047
2050 SYMS_SymbolID sid){
2051 // zero clear result
2053
2054 // read id
2056 if (resolve.is_leaf && resolve.stub != 0 &&
2059 if (syms_msf_read_struct_in_range(data, msf, resolve.range, 0, &enumerate)){
2060 // TODO(allen): attribs: SYMS_CvFieldAttribs;
2061
2064 SYMS_U32 num_size = syms_cv_read_numeric(data, msf, resolve.range, num_off, &num);
2065 (void)num_size;
2066
2067 result.kind = num.kind;
2068 syms_memmove(&result.val, num.data, sizeof(result.val));
2069 }
2070 }
2071
2072 return(result);
2073}
2074
2075
OODEFFUNC typedef const char * file
Definition oodle2.h:678
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
OODEFFUNC typedef const char int line
Definition oodle2.h:678
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
int next(int i, int n)
Definition RecastMesh.cpp:164
Definition syms_base.h:402
Definition syms_meta_coff.h:110
SYMS_U8 name[8]
Definition syms_meta_coff.h:111
Definition syms_debug_info.h:300
SYMS_U64 val
Definition syms_debug_info.h:303
SYMS_TypeKind kind
Definition syms_debug_info.h:302
Definition syms_meta_cv.h:1703
Definition syms_cv_helpers.h:49
Definition syms_cv_helpers.h:42
struct SYMS_CvC13SubSection * next
Definition syms_cv_helpers.h:43
Definition syms_cv.h:43
SYMS_U32 name_off
Definition syms_cv.h:44
Definition syms_cv.h:1064
SYMS_U16 start
Definition syms_cv.h:1065
Definition syms_meta_cv.h:1728
Definition syms_meta_cv.h:1889
Definition syms_cv_helpers.h:28
SYMS_U16 kind
Definition syms_cv_helpers.h:31
SYMS_U32 next_off
Definition syms_cv_helpers.h:30
SYMS_MsfRange range
Definition syms_cv_helpers.h:29
Definition syms_cv_helpers.h:58
Definition syms_meta_cv.h:1974
Definition syms_cv.h:1042
Definition syms_meta_cv.h:2649
Definition syms_meta_cv.h:2627
Definition syms_meta_cv.h:2687
Definition syms_meta_cv.h:2618
Definition syms_meta_cv.h:2741
Definition syms_cv_helpers.h:165
SYMS_FileFormat format
Definition syms_cv_helpers.h:166
SYMS_CvTypeIndex first_ti
Definition syms_cv_helpers.h:168
SYMS_U32 align
Definition syms_cv_helpers.h:169
SYMS_UnitID uid
Definition syms_cv_helpers.h:167
Definition syms_meta_cv.h:2643
Definition syms_meta_cv.h:2676
Definition syms_meta_cv.h:2605
Definition syms_meta_cv.h:2652
Definition syms_meta_cv.h:2668
Definition syms_meta_cv.h:2590
SYMS_CvModifierFlags flags
Definition syms_meta_cv.h:2592
SYMS_CvTypeId itype
Definition syms_meta_cv.h:2591
Definition syms_meta_cv.h:2683
Definition syms_meta_cv.h:2672
Definition syms_meta_cv.h:2594
SYMS_CvTypeId itype
Definition syms_meta_cv.h:2595
SYMS_CvPointerAttribs attr
Definition syms_meta_cv.h:2596
Definition syms_meta_cv.h:2598
SYMS_CvCallKind call_kind
Definition syms_meta_cv.h:2600
SYMS_CvTypeId ret_itype
Definition syms_meta_cv.h:2599
Definition syms_meta_cv.h:2658
Definition syms_meta_cv.h:2631
Definition syms_meta_cv.h:2638
Definition syms_meta_cv.h:2691
Definition syms_meta_cv.h:2700
Definition syms_meta_cv.h:2696
Definition syms_cv_helpers.h:64
Definition syms_cv_helpers.h:70
Definition syms_cv.h:1059
Definition syms_meta_cv.h:1822
Definition syms_cv.h:1015
Definition syms_cv_helpers.h:34
SYMS_TypeKind kind
Definition syms_cv_helpers.h:35
SYMS_U8 data[32]
Definition syms_cv_helpers.h:36
Definition syms_meta_cv.h:1911
Definition syms_meta_cv.h:1902
Definition syms_meta_cv.h:1591
Definition syms_meta_cv.h:1924
Definition syms_cv_helpers.h:130
SYMS_U16 kind
Definition syms_cv_helpers.h:132
SYMS_B8 is_index
Definition syms_cv_helpers.h:134
SYMS_B8 is_leaf
Definition syms_cv_helpers.h:133
SYMS_MsfRange range
Definition syms_cv_helpers.h:135
SYMS_CvStub * stub
Definition syms_cv_helpers.h:131
Definition syms_cv_helpers.h:99
struct SYMS_CvStubRef * next
Definition syms_cv_helpers.h:100
SYMS_CvStub * stub
Definition syms_cv_helpers.h:101
Definition syms_cv_helpers.h:84
struct SYMS_CvStub * parent
Definition syms_cv_helpers.h:86
SYMS_String8 name
Definition syms_cv_helpers.h:95
struct SYMS_CvStub * sibling_next
Definition syms_cv_helpers.h:87
struct SYMS_CvStub * last
Definition syms_cv_helpers.h:89
SYMS_U32 index
Definition syms_cv_helpers.h:91
struct SYMS_CvStub * first
Definition syms_cv_helpers.h:88
SYMS_U32 num
Definition syms_cv_helpers.h:92
SYMS_U32 off
Definition syms_cv_helpers.h:90
Definition syms_cv.h:1035
Definition syms_meta_cv.h:2768
SYMS_CvSubSectionKind kind
Definition syms_meta_cv.h:2769
SYMS_U32 size
Definition syms_meta_cv.h:2770
Definition syms_cv_helpers.h:172
SYMS_UnitID uid
Definition syms_cv_helpers.h:175
SYMS_U32 align
Definition syms_cv_helpers.h:174
SYMS_FileFormat format
Definition syms_cv_helpers.h:173
Definition syms_cv.h:1006
Definition syms_meta_cv.h:1502
Definition syms_meta_cv.h:1693
Definition syms_cv_helpers.h:104
SYMS_U64 top_min_index
Definition syms_cv_helpers.h:110
SYMS_U64 top_count
Definition syms_cv_helpers.h:109
SYMS_CvStub ** proc_stubs
Definition syms_cv_helpers.h:118
SYMS_B32 leaf_set
Definition syms_cv_helpers.h:106
SYMS_U64 ti_count
Definition syms_cv_helpers.h:115
SYMS_U64 proc_count
Definition syms_cv_helpers.h:119
SYMS_FileFormat format
Definition syms_cv_helpers.h:105
SYMS_U64 pub_count
Definition syms_cv_helpers.h:127
SYMS_MsfStreamNumber sn
Definition syms_cv_helpers.h:107
SYMS_CvStub ** ti_indirect_stubs
Definition syms_cv_helpers.h:114
SYMS_U64 all_count
Definition syms_cv_helpers.h:113
SYMS_CvStub ** tls_var_stubs
Definition syms_cv_helpers.h:122
SYMS_CvStub ** pub_stubs
Definition syms_cv_helpers.h:126
SYMS_CvStub ** thunk_stubs
Definition syms_cv_helpers.h:124
SYMS_U64 bucket_count
Definition syms_cv_helpers.h:112
SYMS_CvStub ** buckets
Definition syms_cv_helpers.h:111
SYMS_UnitID uid
Definition syms_cv_helpers.h:116
SYMS_U64 var_count
Definition syms_cv_helpers.h:121
SYMS_U64 tls_var_count
Definition syms_cv_helpers.h:123
SYMS_U64 thunk_count
Definition syms_cv_helpers.h:125
SYMS_CvStub ** var_stubs
Definition syms_cv_helpers.h:120
SYMS_CvStub ** top_stubs
Definition syms_cv_helpers.h:108
SYMS_FileID * ids
Definition syms_debug_info.h:149
SYMS_U64 count
Definition syms_debug_info.h:150
Definition syms_debug_info.h:164
SYMS_FileIDArray file_id_array
Definition syms_debug_info.h:167
SYMS_LineTable line_table
Definition syms_debug_info.h:165
SYMS_U64 line_count
Definition syms_debug_info.h:161
SYMS_Line * line_array
Definition syms_debug_info.h:160
SYMS_U64 * sequence_index_array
Definition syms_debug_info.h:157
SYMS_U64 sequence_count
Definition syms_debug_info.h:158
Definition syms_debug_info.h:136
Definition syms_msf_parser.h:38
Definition syms_msf_parser.h:24
SYMS_MsfStreamNumber sn
Definition syms_msf_parser.h:25
SYMS_U32 off
Definition syms_msf_parser.h:26
SYMS_U32 size
Definition syms_msf_parser.h:27
Definition syms_debug_info.h:21
SYMS_U64 count
Definition syms_debug_info.h:23
SYMS_SecInfo * sec_info
Definition syms_debug_info.h:22
Definition syms_debug_info.h:15
SYMS_U64Range vrange
Definition syms_debug_info.h:17
SYMS_String8 name
Definition syms_debug_info.h:16
SYMS_U64Range frange
Definition syms_debug_info.h:18
Definition syms_base.h:296
SYMS_U64 size
Definition syms_base.h:298
Definition syms_debug_info.h:228
SYMS_SymbolID * ids
Definition syms_debug_info.h:229
SYMS_U64 count
Definition syms_debug_info.h:230
Definition syms_debug_info.h:264
SYMS_U64 reported_size
Definition syms_debug_info.h:275
SYMS_USID direct_type
Definition syms_debug_info.h:290
SYMS_SizeInterpretation reported_size_interp
Definition syms_debug_info.h:274
SYMS_TypeKind kind
Definition syms_debug_info.h:265
SYMS_USID containing_type
Definition syms_debug_info.h:296
SYMS_TypeModifiers mods
Definition syms_debug_info.h:271
SYMS_CallConvention call_convention
Definition syms_debug_info.h:294
Definition syms_base.h:259
Definition syms_base.h:280
Definition syms_base.h:264
SYMS_U64 max
Definition syms_base.h:266
SYMS_U64 min
Definition syms_base.h:265
SYMS_UnitID uid
Definition syms_debug_info.h:235
SYMS_SymbolID sid
Definition syms_debug_info.h:236
SYMS_API SYMS_U64 syms_hash_u64(SYMS_U64 x)
Definition syms_base.c:57
SYMS_API SYMS_U64 syms_1based_checked_lookup_u64(SYMS_U64 *u64, SYMS_U64 count, SYMS_U64 n)
Definition syms_base.c:651
SYMS_API SYMS_String8 syms_str8_range(SYMS_U8 *first, SYMS_U8 *opl)
Definition syms_base.c:184
SYMS_API SYMS_ArenaTemp syms_get_scratch(SYMS_Arena **conflicts, SYMS_U64 conflict_count)
Definition syms_base.c:694
SYMS_API void syms_arena_put_back(SYMS_Arena *arena, SYMS_U64 amount)
Definition syms_base.c:672
SYMS_API SYMS_String8 syms_push_string_copy(SYMS_Arena *arena, SYMS_String8 string)
Definition syms_base.c:353
#define syms_true
Definition syms_base.h:105
#define SYMS_QueuePush_N(f, l, n, next)
Definition syms_base.h:210
#define SYMS_ID_u32_u32(a, b)
Definition syms_base.h:204
#define SYMS_StackPush(f, n)
Definition syms_base.h:227
#define SYMS_ID_u32_0(id)
Definition syms_base.h:197
#define syms_push_array(a, T, c)
Definition syms_base.h:561
#define syms_memzero_struct(s)
Definition syms_base.h:161
#define SYMS_AlignPow2(a, b)
Definition syms_base.h:187
#define SYMS_StackPush_N(f, n, next)
Definition syms_base.h:224
#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
#define SYMS_ASSERT(x)
Definition syms_base.h:125
#define SYMS_ID_u32_1(id)
Definition syms_base.h:198
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
#define syms_string_from_enum_value(enum_type, value)
Definition syms_base.h:461
#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
#define syms_memmove
Definition syms_crt_overrides.h:65
#define SYMS_U64
Definition syms_crt_overrides.h:54
#define SYMS_U32
Definition syms_crt_overrides.h:53
uint16_t SYMS_U16
Definition syms_crt_overrides.h:37
#define syms_memset
Definition syms_crt_overrides.h:66
uint8_t SYMS_U8
Definition syms_crt_overrides.h:36
@ SYMS_CvLineFlag_LINE_NUMBER_MASK
Definition syms_cv.h:1052
@ SYMS_CvLineFlag_LINE_NUMBER_SHIFT
Definition syms_cv.h:1053
SYMS_GLOBAL SYMS_CvTypeId syms_cv_type_id_variadic
Definition syms_cv.h:16
SYMS_U32 SYMS_CvTypeIndex
Definition syms_cv.h:10
#define SYMS_CvBasicPointerKindFromTypeId(x)
Definition syms_cv.h:35
#define SYMS_CvBasicTypeFromTypeId(x)
Definition syms_cv.h:34
@ SYMS_CvSubSecLinesFlag_HasColumns
Definition syms_cv.h:1031
SYMS_API SYMS_U64 syms_cv_type_index_count(SYMS_CvUnitAccel *unit)
Definition syms_cv_helpers.c:1345
SYMS_API SYMS_SecInfoArray syms_cv_sec_info_array_from_bin(SYMS_Arena *arena, SYMS_String8 data, SYMS_MsfAccel *msf, SYMS_MsfRange range)
Definition syms_cv_helpers.c:86
SYMS_API SYMS_UnitID syms_cv_uid_from_accel(SYMS_CvUnitAccel *unit)
Definition syms_cv_helpers.c:1356
SYMS_API void syms_cv_loose_lines_from_c11(SYMS_Arena *arena, SYMS_String8 data, SYMS_MsfAccel *msf, SYMS_MsfRange c11_range, SYMS_U64 *section_voffs, SYMS_U64 section_count, SYMS_CvLineTableLoose *loose)
Definition syms_cv_helpers.c:362
SYMS_API SYMS_CvStub * syms_cv_stub_from_unit_off(SYMS_CvUnitAccel *unit, SYMS_U32 off)
Definition syms_cv_helpers.c:1243
SYMS_API SYMS_ConstInfo syms_cv_const_info_from_sid(SYMS_String8 data, SYMS_MsfAccel *msf, SYMS_CvUnitAccel *unit, SYMS_SymbolID sid)
Definition syms_cv_helpers.c:2049
SYMS_API SYMS_CvStub * syms_cv_stub_from_unit_sid(SYMS_CvUnitAccel *unit, SYMS_SymbolID sid)
Definition syms_cv_helpers.c:1273
SYMS_API SYMS_SymbolIDArray syms_cv_type_sid_array_from_unit(SYMS_Arena *arena, SYMS_CvUnitAccel *unit)
Definition syms_cv_helpers.c:1558
SYMS_API SYMS_CvUnitAccel * syms_cv_sym_unit_from_ranges(SYMS_Arena *arena, SYMS_String8 data, SYMS_MsfAccel *msf, SYMS_MsfStreamNumber sn, SYMS_U64RangeArray symbol_ranges, SYMS_CvSymConsParams *params)
Definition syms_cv_helpers.c:853
SYMS_API SYMS_TypeInfo syms_cv_type_info_from_sid(SYMS_String8 data, SYMS_MsfAccel *msf, SYMS_CvUnitAccel *unit, SYMS_SymbolID sid)
Definition syms_cv_helpers.c:1609
SYMS_API SYMS_Line * syms_cv_loose_push_sequence(SYMS_Arena *arena, SYMS_CvLineTableLoose *loose, SYMS_U64 line_count)
Definition syms_cv_helpers.c:194
SYMS_API SYMS_CvResolvedElement syms_cv_resolve_from_id(SYMS_String8 data, SYMS_MsfAccel *msf, SYMS_CvUnitAccel *unit, SYMS_SymbolID id)
Definition syms_cv_helpers.c:1289
SYMS_API SYMS_U32 syms_cv_u32_from_numeric(SYMS_CvNumeric num)
Definition syms_cv_helpers.c:67
SYMS_API SYMS_U64 syms_cv_type_index_first(SYMS_CvUnitAccel *unit)
Definition syms_cv_helpers.c:1336
SYMS_API SYMS_CvElement syms_cv_element(SYMS_String8 data, SYMS_MsfAccel *msf, SYMS_MsfRange range, SYMS_U32 off, SYMS_U32 align)
Definition syms_cv_helpers.c:9
SYMS_API SYMS_CvUnitAccel * syms_cv_leaf_unit_from_range(SYMS_Arena *arena, SYMS_String8 data, SYMS_MsfAccel *msf, SYMS_MsfStreamNumber sn, SYMS_U64Range raw_range, SYMS_CvLeafConsParams *params)
Definition syms_cv_helpers.c:482
SYMS_API SYMS_SymbolIDArray syms_cv_proc_sid_array_from_unit(SYMS_Arena *arena, SYMS_CvUnitAccel *unit)
Definition syms_cv_helpers.c:1510
SYMS_API SYMS_CvStub * syms_cv_stub_from_unit_index(SYMS_CvUnitAccel *unit, SYMS_U32 index)
Definition syms_cv_helpers.c:1261
SYMS_API SYMS_String8 syms_cv_symbol_name_from_sid(SYMS_Arena *arena, SYMS_CvUnitAccel *unit, SYMS_SymbolID sid)
Definition syms_cv_helpers.c:1583
SYMS_API void syms_cv_loose_lines_from_c13(SYMS_Arena *arena, SYMS_String8 data, SYMS_MsfAccel *msf, SYMS_MsfRange c13_range, SYMS_CvC13SubSection *sub_sections, SYMS_U64 *section_voffs, SYMS_U64 section_count, SYMS_CvLineTableLoose *loose)
Definition syms_cv_helpers.c:257
SYMS_API void syms_cv_c13_sub_sections_from_range(SYMS_Arena *arena, SYMS_String8 data, SYMS_MsfAccel *msf, SYMS_MsfRange range, SYMS_CvC13SubSectionList *list_out)
Definition syms_cv_helpers.c:126
SYMS_API SYMS_SymbolIDArray syms_cv_var_sid_array_from_unit(SYMS_Arena *arena, SYMS_CvUnitAccel *unit)
Definition syms_cv_helpers.c:1534
SYMS_API SYMS_LineParseOut syms_cv_line_parse_from_loose(SYMS_Arena *arena, SYMS_CvLineTableLoose *loose)
Definition syms_cv_helpers.c:209
SYMS_API void syms_cv_loose_push_file_id(SYMS_Arena *arena, SYMS_CvLineTableLoose *loose, SYMS_FileID id)
Definition syms_cv_helpers.c:162
SYMS_API SYMS_U32 syms_cv_read_numeric(SYMS_String8 data, SYMS_MsfAccel *msf, SYMS_MsfRange range, SYMS_U32 off, SYMS_CvNumeric *out)
Definition syms_cv_helpers.c:26
SYMS_API SYMS_CvStubRef * syms_cv_alloc_ref(SYMS_Arena *arena, SYMS_CvStubRef **free_list)
Definition syms_cv_helpers.c:74
SYMS_API SYMS_SymbolKind syms_cv_symbol_kind_from_sid(SYMS_String8 data, SYMS_MsfAccel *msf, SYMS_CvUnitAccel *unit, SYMS_SymbolID sid)
Definition syms_cv_helpers.c:1361
@ SYMS_CvFileIDKind_StrTblOff
Definition syms_cv_helpers.h:21
@ SYMS_CvFileIDKind_C11Off
Definition syms_cv_helpers.h:22
@ SYMS_CvSymbolIDKind_Off
Definition syms_cv_helpers.h:13
@ SYMS_CvSymbolIDKind_Index
Definition syms_cv_helpers.h:14
SYMS_API SYMS_TypeKind syms_type_kind_fwd_from_main(SYMS_TypeKind kind)
Definition syms_debug_info.c:36
SYMS_U64 SYMS_UnitID
Definition syms_debug_info.h:77
SYMS_U64 SYMS_FileID
Definition syms_debug_info.h:128
@ SYMS_SizeInterpretation_ByteCount
Definition syms_debug_info.h:207
@ SYMS_SizeInterpretation_ResolveForwardReference
Definition syms_debug_info.h:209
@ SYMS_SizeInterpretation_Multiplier
Definition syms_debug_info.h:208
@ SYMS_SizeInterpretation_Null
Definition syms_debug_info.h:206
SYMS_U64 SYMS_SymbolID
Definition syms_debug_info.h:215
#define SYMS_Arena
Definition syms_default_arena.h:61
@ SYMS_CvSubSectionKind_FILECHKSMS
Definition syms_meta_cv.h:2754
@ SYMS_CvSubSectionKind_LINES
Definition syms_meta_cv.h:2752
#define SYMS_CvFieldAttribs_Extract_MPROP(f)
Definition syms_meta_cv.h:2490
@ SYMS_CvTypeProp_FWDREF
Definition syms_meta_cv.h:2345
SYMS_U8 SYMS_CvBasicPointerKind
Definition syms_meta_cv.h:71
#define SYMS_CvPointerAttribs_Extract_SIZE(f)
Definition syms_meta_cv.h:2419
@ SYMS_CvLeaf_USHORT
Definition syms_meta_cv.h:2275
@ SYMS_CvLeaf_PROCEDURE
Definition syms_meta_cv.h:2172
@ SYMS_CvLeaf_IVBCLASS
Definition syms_meta_cv.h:2199
@ SYMS_CvLeaf_ALIAS
Definition syms_meta_cv.h:2226
@ SYMS_CvLeaf_NUMERIC
Definition syms_meta_cv.h:2272
@ SYMS_CvLeaf_POINTER
Definition syms_meta_cv.h:2166
@ SYMS_CvLeaf_STMEMBER
Definition syms_meta_cv.h:2231
@ SYMS_CvLeaf_MODIFIER
Definition syms_meta_cv.h:2165
@ SYMS_CvLeaf_ENUMERATE
Definition syms_meta_cv.h:2217
@ SYMS_CvLeaf_MEMBER
Definition syms_meta_cv.h:2230
@ SYMS_CvLeaf_CHAR
Definition syms_meta_cv.h:2273
@ SYMS_CvLeaf_INTERFACE
Definition syms_meta_cv.h:2243
@ SYMS_CvLeaf_VFUNCTAB
Definition syms_meta_cv.h:2206
@ SYMS_CvLeaf_MFUNCTION
Definition syms_meta_cv.h:2173
@ SYMS_CvLeaf_FLOAT16
Definition syms_meta_cv.h:2295
@ SYMS_CvLeaf_CLASSPTR2
Definition syms_meta_cv.h:2268
@ SYMS_CvLeaf_QUADWORD
Definition syms_meta_cv.h:2282
@ SYMS_CvLeaf_CLASS
Definition syms_meta_cv.h:2219
@ SYMS_CvLeaf_SHORT
Definition syms_meta_cv.h:2274
@ SYMS_CvLeaf_ENUM
Definition syms_meta_cv.h:2222
@ SYMS_CvLeaf_STRUCTURE
Definition syms_meta_cv.h:2220
@ SYMS_CvLeaf_METHOD
Definition syms_meta_cv.h:2232
@ SYMS_CvLeaf_ONEMETHOD
Definition syms_meta_cv.h:2234
@ SYMS_CvLeaf_UNION
Definition syms_meta_cv.h:2221
@ SYMS_CvLeaf_FLOAT32
Definition syms_meta_cv.h:2278
@ SYMS_CvLeaf_FLOAT80
Definition syms_meta_cv.h:2280
@ SYMS_CvLeaf_FLOAT64
Definition syms_meta_cv.h:2279
@ SYMS_CvLeaf_ULONG
Definition syms_meta_cv.h:2277
@ SYMS_CvLeaf_BCLASS
Definition syms_meta_cv.h:2197
@ SYMS_CvLeaf_NESTTYPEEX
Definition syms_meta_cv.h:2235
@ SYMS_CvLeaf_VBCLASS
Definition syms_meta_cv.h:2198
@ SYMS_CvLeaf_ARRAY
Definition syms_meta_cv.h:2218
@ SYMS_CvLeaf_FLOAT48
Definition syms_meta_cv.h:2284
@ SYMS_CvLeaf_FIELDLIST
Definition syms_meta_cv.h:2189
@ SYMS_CvLeaf_BITFIELD
Definition syms_meta_cv.h:2191
@ SYMS_CvLeaf_METHODLIST
Definition syms_meta_cv.h:2192
@ SYMS_CvLeaf_FLOAT128
Definition syms_meta_cv.h:2281
@ SYMS_CvLeaf_UQUADWORD
Definition syms_meta_cv.h:2283
@ SYMS_CvLeaf_VFUNCOFF
Definition syms_meta_cv.h:2209
@ SYMS_CvLeaf_NESTTYPE
Definition syms_meta_cv.h:2233
@ SYMS_CvLeaf_CLASSPTR
Definition syms_meta_cv.h:2267
@ SYMS_CvLeaf_LONG
Definition syms_meta_cv.h:2276
SYMS_U8 SYMS_CvBasicType
Definition syms_meta_cv.h:14
SYMS_U16 SYMS_CvLeaf
Definition syms_meta_cv.h:2107
@ SYMS_CvBasicType_UQUAD
Definition syms_meta_cv.h:33
@ SYMS_CvBasicType_INT64
Definition syms_meta_cv.h:61
@ SYMS_CvBasicType_COMPLEX128
Definition syms_meta_cv.h:49
@ SYMS_CvBasicType_FLOAT80
Definition syms_meta_cv.h:41
@ SYMS_CvBasicType_QUAD
Definition syms_meta_cv.h:28
@ SYMS_CvBasicType_RCHAR
Definition syms_meta_cv.h:55
@ SYMS_CvBasicType_VOID
Definition syms_meta_cv.h:19
@ SYMS_CvBasicType_COMPLEX32
Definition syms_meta_cv.h:46
@ SYMS_CvBasicType_HRESULT
Definition syms_meta_cv.h:24
@ SYMS_CvBasicType_FLOAT128
Definition syms_meta_cv.h:42
@ SYMS_CvBasicType_USHORT
Definition syms_meta_cv.h:31
@ SYMS_CvBasicType_CHAR32
Definition syms_meta_cv.h:66
@ SYMS_CvBasicType_INT32
Definition syms_meta_cv.h:59
@ SYMS_CvBasicType_INT16
Definition syms_meta_cv.h:57
@ SYMS_CvBasicType_FLOAT16
Definition syms_meta_cv.h:45
@ SYMS_CvBasicType_UINT128
Definition syms_meta_cv.h:64
@ SYMS_CvBasicType_CHAR16
Definition syms_meta_cv.h:65
@ SYMS_CvBasicType_CHAR8
Definition syms_meta_cv.h:67
@ SYMS_CvBasicType_BOOL8
Definition syms_meta_cv.h:35
@ SYMS_CvBasicType_WCHAR
Definition syms_meta_cv.h:56
@ SYMS_CvBasicType_OCT
Definition syms_meta_cv.h:29
@ SYMS_CvBasicType_LONG
Definition syms_meta_cv.h:27
@ SYMS_CvBasicType_BOOL16
Definition syms_meta_cv.h:36
@ SYMS_CvBasicType_SHORT
Definition syms_meta_cv.h:26
@ SYMS_CvBasicType_UINT64
Definition syms_meta_cv.h:62
@ SYMS_CvBasicType_FLOAT32
Definition syms_meta_cv.h:39
@ SYMS_CvBasicType_ULONG
Definition syms_meta_cv.h:32
@ SYMS_CvBasicType_UCHAR
Definition syms_meta_cv.h:30
@ SYMS_CvBasicType_BOOL64
Definition syms_meta_cv.h:38
@ SYMS_CvBasicType_FLOAT32PP
Definition syms_meta_cv.h:44
@ SYMS_CvBasicType_UINT8
Definition syms_meta_cv.h:54
@ SYMS_CvBasicType_UINT16
Definition syms_meta_cv.h:58
@ SYMS_CvBasicType_UOCT
Definition syms_meta_cv.h:34
@ SYMS_CvBasicType_INT128
Definition syms_meta_cv.h:63
@ SYMS_CvBasicType_BOOL32
Definition syms_meta_cv.h:37
@ SYMS_CvBasicType_INT8
Definition syms_meta_cv.h:53
@ SYMS_CvBasicType_COMPLEX80
Definition syms_meta_cv.h:48
@ SYMS_CvBasicType_FLOAT64
Definition syms_meta_cv.h:40
@ SYMS_CvBasicType_COMPLEX64
Definition syms_meta_cv.h:47
@ SYMS_CvBasicType_CHAR
Definition syms_meta_cv.h:25
@ SYMS_CvBasicType_UINT32
Definition syms_meta_cv.h:60
@ SYMS_CvMethodProp_PUREINTRO
Definition syms_meta_cv.h:2468
@ SYMS_CvMethodProp_INTRO
Definition syms_meta_cv.h:2466
@ SYMS_CvSymKind_PUB32
Definition syms_meta_cv.h:1271
@ SYMS_CvSymKind_DEFRANGE2_2005
Definition syms_meta_cv.h:1339
@ SYMS_CvSymKind_GPROC32_ID
Definition syms_meta_cv.h:1374
@ SYMS_CvSymKind_DATAREF
Definition syms_meta_cv.h:1311
@ SYMS_CvSymKind_FILESTATIC
Definition syms_meta_cv.h:1388
@ SYMS_CvSymKind_BLOCK32
Definition syms_meta_cv.h:1249
@ SYMS_CvSymKind_THUNK32
Definition syms_meta_cv.h:1247
@ SYMS_CvSymKind_DEFRANGE_SUBFIELD_REGISTER
Definition syms_meta_cv.h:1367
@ SYMS_CvSymKind_LOCAL
Definition syms_meta_cv.h:1357
@ SYMS_CvSymKind_GTHREAD32
Definition syms_meta_cv.h:1281
@ SYMS_CvSymKind_DEFRANGE_SUBFIELD
Definition syms_meta_cv.h:1361
@ SYMS_CvSymKind_LPROC32_ID
Definition syms_meta_cv.h:1373
@ SYMS_CvSymKind_LTHREAD32
Definition syms_meta_cv.h:1279
@ SYMS_CvSymKind_END
Definition syms_meta_cv.h:1079
@ SYMS_CvSymKind_CONSTANT
Definition syms_meta_cv.h:1257
@ SYMS_CvSymKind_PROCREF
Definition syms_meta_cv.h:1309
@ SYMS_CvSymKind_DEFRANGE_FRAMEPOINTER_REL
Definition syms_meta_cv.h:1365
@ SYMS_CvSymKind_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE
Definition syms_meta_cv.h:1369
@ SYMS_CvSymKind_LDATA32
Definition syms_meta_cv.h:1267
@ SYMS_CvSymKind_LPROC32
Definition syms_meta_cv.h:1273
@ SYMS_CvSymKind_LPROCREF
Definition syms_meta_cv.h:1313
@ SYMS_CvSymKind_DEFRANGE_2005
Definition syms_meta_cv.h:1337
@ SYMS_CvSymKind_GPROC32
Definition syms_meta_cv.h:1275
@ SYMS_CvSymKind_REGREL32
Definition syms_meta_cv.h:1277
@ SYMS_CvSymKind_GDATA32
Definition syms_meta_cv.h:1269
@ SYMS_CvSymKind_DEFRANGE
Definition syms_meta_cv.h:1359
@ SYMS_CvSymKind_DEFRANGE_REGISTER_REL
Definition syms_meta_cv.h:1371
@ SYMS_CvSymKind_DEFRANGE_REGISTER
Definition syms_meta_cv.h:1363
SYMS_U16 SYMS_CvTypeProps
Definition syms_meta_cv.h:2336
SYMS_U8 SYMS_CvMethodProp
Definition syms_meta_cv.h:2460
SYMS_U8 SYMS_CvPointerMode
Definition syms_meta_cv.h:2386
#define SYMS_CvPointerAttribs_Extract_MODE(f)
Definition syms_meta_cv.h:2418
@ SYMS_CvBasicPointerKind_32BIT
Definition syms_meta_cv.h:77
@ SYMS_CvBasicPointerKind_VALUE
Definition syms_meta_cv.h:73
@ SYMS_CvBasicPointerKind_16_32BIT
Definition syms_meta_cv.h:78
@ SYMS_CvBasicPointerKind_HUGE_16BIT
Definition syms_meta_cv.h:76
@ SYMS_CvBasicPointerKind_16BIT
Definition syms_meta_cv.h:74
@ SYMS_CvBasicPointerKind_FAR_16BIT
Definition syms_meta_cv.h:75
@ SYMS_CvBasicPointerKind_64BIT
Definition syms_meta_cv.h:79
SYMS_TypeKind
Definition syms_meta_debug_info.h:27
@ SYMS_TypeKind_Int128
Definition syms_meta_debug_info.h:35
@ SYMS_TypeKind_Complex64
Definition syms_meta_debug_info.h:54
@ SYMS_TypeKind_Int32
Definition syms_meta_debug_info.h:33
@ SYMS_TypeKind_UInt128
Definition syms_meta_debug_info.h:42
@ SYMS_TypeKind_Void
Definition syms_meta_debug_info.h:57
@ SYMS_TypeKind_Int8
Definition syms_meta_debug_info.h:31
@ SYMS_TypeKind_Null
Definition syms_meta_debug_info.h:28
@ SYMS_TypeKind_Float80
Definition syms_meta_debug_info.h:51
@ SYMS_TypeKind_Float16
Definition syms_meta_debug_info.h:46
@ SYMS_TypeKind_Union
Definition syms_meta_debug_info.h:61
@ SYMS_TypeKind_Float64
Definition syms_meta_debug_info.h:50
@ SYMS_TypeKind_Int64
Definition syms_meta_debug_info.h:34
@ SYMS_TypeKind_Float32
Definition syms_meta_debug_info.h:47
@ SYMS_TypeKind_Float128
Definition syms_meta_debug_info.h:52
@ SYMS_TypeKind_Int16
Definition syms_meta_debug_info.h:32
@ SYMS_TypeKind_Complex80
Definition syms_meta_debug_info.h:55
@ SYMS_TypeKind_Float48
Definition syms_meta_debug_info.h:49
@ SYMS_TypeKind_Modifier
Definition syms_meta_debug_info.h:69
@ SYMS_TypeKind_Complex32
Definition syms_meta_debug_info.h:53
@ SYMS_TypeKind_Struct
Definition syms_meta_debug_info.h:59
@ SYMS_TypeKind_Complex128
Definition syms_meta_debug_info.h:56
@ SYMS_TypeKind_Enum
Definition syms_meta_debug_info.h:62
@ SYMS_TypeKind_Bitfield
Definition syms_meta_debug_info.h:76
@ SYMS_TypeKind_Typedef
Definition syms_meta_debug_info.h:63
@ SYMS_TypeKind_Proc
Definition syms_meta_debug_info.h:75
@ SYMS_TypeKind_MemberPtr
Definition syms_meta_debug_info.h:73
@ SYMS_TypeKind_UInt8
Definition syms_meta_debug_info.h:38
@ SYMS_TypeKind_Array
Definition syms_meta_debug_info.h:74
@ SYMS_TypeKind_UInt16
Definition syms_meta_debug_info.h:39
@ SYMS_TypeKind_Variadic
Definition syms_meta_debug_info.h:77
@ SYMS_TypeKind_UInt64
Definition syms_meta_debug_info.h:41
@ SYMS_TypeKind_Float32PP
Definition syms_meta_debug_info.h:48
@ SYMS_TypeKind_Class
Definition syms_meta_debug_info.h:60
@ SYMS_TypeKind_UInt32
Definition syms_meta_debug_info.h:40
@ SYMS_TypeKind_Ptr
Definition syms_meta_debug_info.h:70
@ SYMS_TypeModifier_Char
Definition syms_meta_debug_info.h:88
SYMS_SymbolKind
Definition syms_meta_debug_info.h:15
@ SYMS_SymbolKind_Const
Definition syms_meta_debug_info.h:22
@ SYMS_SymbolKind_TLSVariable
Definition syms_meta_debug_info.h:21
@ SYMS_SymbolKind_LocalVariable
Definition syms_meta_debug_info.h:20
@ SYMS_SymbolKind_Type
Definition syms_meta_debug_info.h:17
@ SYMS_SymbolKind_Procedure
Definition syms_meta_debug_info.h:18
@ SYMS_SymbolKind_ImageRelativeVariable
Definition syms_meta_debug_info.h:19
@ SYMS_SymbolKind_Null
Definition syms_meta_debug_info.h:16
@ SYMS_SymbolKind_Scope
Definition syms_meta_debug_info.h:23
SYMS_U16 SYMS_MsfStreamNumber
Definition syms_msf.h:11
SYMS_API SYMS_MsfRange syms_msf_range_from_sn(SYMS_MsfAccel *msf, SYMS_MsfStreamNumber sn)
Definition syms_msf_parser.c:371
SYMS_API SYMS_B32 syms_msf_bounds_check_in_range(SYMS_MsfRange range, SYMS_U32 off)
Definition syms_msf_parser.c:402
SYMS_API SYMS_B32 syms_msf_read_in_range(SYMS_String8 data, SYMS_MsfAccel *msf, SYMS_MsfRange range, SYMS_U32 off, SYMS_U32 size, void *out)
Definition syms_msf_parser.c:408
SYMS_API SYMS_MsfRange syms_msf_make_range(SYMS_MsfStreamNumber sn, SYMS_U32 off, SYMS_U32 len)
Definition syms_msf_parser.c:365
SYMS_API SYMS_MsfRange syms_msf_sub_range(SYMS_MsfRange range, SYMS_U32 off, SYMS_U32 size)
Definition syms_msf_parser.c:382
SYMS_API SYMS_String8 syms_msf_read_zstring_in_range(SYMS_Arena *arena, SYMS_String8 data, SYMS_MsfAccel *msf, SYMS_MsfRange range, SYMS_U32 r_off)
Definition syms_msf_parser.c:427
#define syms_msf_read_struct_in_range(d, a, rn, off, p)
Definition syms_msf_parser.h:87
SYMS_API SYMS_CallConvention syms_pdb_call_convention_from_cv_call_kind(SYMS_CvCallKind kind)
Definition syms_pdb_parser.c:3302
SYMS_API SYMS_TypeKind syms_pdb_type_kind_from_cv_pointer_mode(SYMS_CvPointerMode mode)
Definition syms_pdb_parser.c:3249
SYMS_API SYMS_TypeModifiers syms_pdb_modifier_from_cv_pointer_attribs(SYMS_CvPointerAttribs attribs)
Definition syms_pdb_parser.c:3263
SYMS_API SYMS_TypeModifiers syms_pdb_modifier_from_cv_modifier_flags(SYMS_CvModifierFlags flags)
Definition syms_pdb_parser.c:3287