UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
syms_pdb_parser.c
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#ifndef SYMS_PDB_PARSER_C
4#define SYMS_PDB_PARSER_C
5
7//~ allen: PDB TPI Functions
8
11 // b.s. rule: largest 'index' so that 'tpi->hints[index].ti <= ti'
12 // or, when that's impossible, 'index = tpi->count'
13 SYMS_PdbTpiOffHint *hints = tpi->hints;
14 SYMS_U32 index = tpi->count;
15 SYMS_U32 min = 0;
16 SYMS_U32 max = tpi->count;
17 for (;;){
18 SYMS_U32 mid = (min + max)/2;
19 SYMS_PdbTpiOffHint *h = hints + mid;
20 if (h->ti > ti){
21 max = mid;
22 if (max == 0){
23 break;
24 }
25 }
26 else{
27 min = mid;
28 if (min + 1 >= max){
29 index = min;
30 break;
31 }
32 }
33 }
34
35 // return result
36 SYMS_PdbTpiOffRange result = {0};
38 result.first_off = tpi->base_off + tpi->hints[index].off;
39 result.first_ti = tpi->hints[index].ti;
40 result.opl_ti = SYMS_U32_MAX;
41 if (index + 1 < tpi->count){
42 result.opl_ti = tpi->hints[index + 1].ti;
43 }
44 }
45 return(result);
46}
47
48SYMS_API void
51 // fill params
52 SYMS_U32 first_off = fill->first_off;
53 SYMS_CvTypeIndex first_ti = SYMS_ClampBot(tpi->first_ti, fill->first_ti);
54 SYMS_CvTypeIndex opl_ti = SYMS_ClampTop(fill->opl_ti, tpi->opl_ti);
56
57 // default fill to non-zero invalid off (all bytes 0xFF)
58 // we do this because we use zero to indicate "cache not filled"
59 // so "filled by invalid" needs another value.
60 SYMS_U32 *type_off_ptr = tpi->off + first_ti - tpi->first_ti;
61 syms_memset(type_off_ptr, 0xFF, sizeof(*type_off_ptr)*(opl_ti - first_ti));
62
63 // fill
64 SYMS_U32 cursor = first_off;
65 for (SYMS_CvTypeIndex ti = first_ti;
66 ti < opl_ti;
67 ti += 1, type_off_ptr += 1){
68 // save off
69 *type_off_ptr = cursor;
70 // read size
71 SYMS_U16 size = 0;
72 syms_msf_read_struct(data, msf, sn, cursor, &size);
73 // advance
74 cursor += 2 + size;
75 if (size == 0 || !syms_msf_bounds_check(msf, sn, cursor)){
76 break;
77 }
78 }
79}
80
83 SYMS_ProfBegin("syms_pdb_tpi_accel_from_sn");
84
85 // init data structures
86 SYMS_PdbTpiAccel result = {0};
87
89 syms_msf_read_struct(data, msf, sn, 0, &hdr);
90 if (hdr.version == SYMS_PdbTpiVersion_IMPV80){ // NOTE(allen): the only version we support so far.
91
92 // parse hash table
93 SYMS_PdbChain **buckets = 0;
94 SYMS_U32 bucket_count = 0;
95
96 if (hdr.hash_bucket_count != 0){
97 // grab scratch
99
100 // setup buckets
101 bucket_count = hdr.hash_bucket_count;
102 buckets = syms_push_array(arena, SYMS_PdbChain*, bucket_count);
103 syms_memset(buckets, 0, sizeof(*buckets)*bucket_count);
104
105 // grab hash array
107 SYMS_MsfRange range = syms_msf_sub_range(hash_range, hdr.hash_vals.off, hdr.hash_vals.size);
108 SYMS_String8 hash_array = syms_msf_read_whole_range(scratch.arena, data, msf, range);
109
110 // iterate hash vals
111 SYMS_U32 stride = hdr.hash_key_size;
112 SYMS_U8 *cursor = hash_array.str;
114 SYMS_CvTypeIndex ti = hdr.ti_lo;
115 for (;;){
116 // read index
119
120 // save to typemap
121 SYMS_PdbChain *entry = 0;
122 if (bucket_index < bucket_count){
126 entry->v = ti;
127 }
128
129 // advance cursor
130 cursor += stride;
131 ti += 1;
132
133 // exit condition
134 if (cursor >= opl_cursor){
135 break;
136 }
137 }
138
139 // release scratch
141 }
142
143 // parse hint table
144 SYMS_PdbTpiOffHint *hints = 0;
146 {
148 SYMS_MsfRange range = syms_msf_sub_range(hash_range, hdr.ti_off.off, hdr.ti_off.size);
149 SYMS_String8 hint_memory = syms_msf_read_whole_range(arena, data, msf, range);
150 hints = (SYMS_PdbTpiOffHint*)hint_memory.str;
151 hint_count = (hint_memory.size)/sizeof(*hints);
152 }
153
154 // offset array
155 SYMS_CvTypeIndex first_ti = 0;
156 SYMS_CvTypeIndex opl_ti = 0;
157 SYMS_U32 *off = 0;
158 {
159 first_ti = hdr.ti_lo;
160 opl_ti = SYMS_ClampBot(first_ti, hdr.ti_hi);
161
162 SYMS_U64 count = opl_ti - first_ti;
163 off = syms_push_array_zero(arena, SYMS_U32, count);
164 }
165
166 // fill result
167 result.type_sn = sn;
168 result.buckets = buckets;
169 result.bucket_count = bucket_count;
170 result.count = hint_count;
171 result.hints = hints;
172 result.base_off = hdr.header_size;
173 result.first_ti = first_ti;
174 result.opl_ti = opl_ti;
175 result.off = off;
176 }
177
178 SYMS_ProfEnd();
179
180 return(result);
181}
182
186 SYMS_U32 result = 0;
187 if (tpi->first_ti <= ti && ti < tpi->opl_ti){
188 // read off
189 SYMS_U32 relative_index = ti - tpi->first_ti;
190 SYMS_U32 off = tpi->off[relative_index];
191
192 // if not zero this is the result
193 if (off != 0){
194 result = off;
195 }
196
197 // otherwise compute and cache this off range
198 else{
200 syms_pdb_tpi__fill_off_range(data, msf, tpi, &hint);
201 result = tpi->off[relative_index];
202 }
203
204 // collapse "error cases" down to null
205 if (result == SYMS_U32_MAX){
206 result = 0;
207 }
208 }
209 return(result);
210}
211
214 return(tpi->base_off);
215}
216
220 SYMS_MsfRange result = syms_msf_sub_range(range, map->base_off, range.size - map->base_off);
221 return(result);
222}
223
226 SYMS_CvUnitAccel *unit, SYMS_String8 name){
227 // setup accel
228 SYMS_PdbTpiAccel *tpi = &dbg->tpi;
229
230 SYMS_USIDList result = {0};
231 if (tpi->bucket_count > 0){
232
233 // get uid
234 SYMS_UnitID uid = unit->uid;
235
236 // get bucket
239
240 // iterate bucket
242 bucket != 0;
243 bucket = bucket->next){
244 SYMS_CvTypeIndex ti = bucket->v;
245 if (unit->top_min_index <= ti){
246 SYMS_U64 index = ti - unit->top_min_index;
247 if (index < unit->ti_count){
248 SYMS_CvStub *stub = unit->ti_indirect_stubs[index];
249 if (stub != 0 && syms_string_match(stub->name, name, 0)){
250 SYMS_USIDNode *usid_node = syms_push_array(arena, SYMS_USIDNode, 1);
251 SYMS_QueuePush(result.first, result.last, usid_node);
252 result.count += 1;
253 usid_node->usid.uid = uid;
255 }
256 }
257 }
258 }
259 }
260
261 return(result);
262}
263
265//~ allen: PDB GSI
266
269 SYMS_ProfBegin("syms_pdb_parse_info");
270
271 // get scratch
273 // check gsi info
275 SYMS_PdbGsiHeader header = {0};
276 if (syms_msf_read_struct_in_range(data, msf, range, 0, &header)){
277 if (header.sig == SYMS_PdbGsiSignature_Basic &&
278 header.ver == SYMS_PdbGsiVersion_V70 &&
279 header.num_buckets != 0){
281 }
282 }
283
284 // hash offset
285 SYMS_U32 hash_record_array_off = sizeof(header);
286
287 // bucket count
288 SYMS_U32 bucket_count = 4096;
289 SYMS_U32 slot_count = bucket_count + 1;
290
291 // get unpacked offsets
293 if (has_gsi){
295
297
298 // array offsets
299 SYMS_U32 bitmask_count = ((slot_count + 31)/32);
303
304 // read bitmask
308
309 // read packed offsets
313
314 // unpack offsets
322 SYMS_U32 bits = *bitmask_ptr;
327 for (SYMS_U32 k = 0; k < k_max; k += 1){
328 if ((bits & 1) == 1){
329 *dst_ptr = *src_ptr;
330 src_ptr += 1;
331 }
332 else{
334 }
335 dst_ptr += 1;
336 bits >>= 1;
337 }
338 }
339 for (; dst_ptr < dst_opl; dst_ptr += 1){
341 }
342
344 }
345
346 // construct table
347 SYMS_PdbChain **table = 0;
349 if (unpacked_offsets != 0){
350 table = syms_push_array(arena, SYMS_PdbChain*, bucket_count + 1);
351
352 // read hash records
355 SYMS_U32 entry_count = hash_records.size/sizeof(SYMS_PdbGsiHashRecord);
356
357 // build bucket chains
358 // NOTE(allen): we have to do this backwards to make the singly linked
359 // stacks end up in the right order, and because of the way groups of
360 // offsets are stored by PDB (it is specified this way on purpose)
361 SYMS_U32 last_index = entry_count - 1;
363 SYMS_U32 prev_n = entry_count;
364 for (SYMS_U32 i = bucket_count + 1; i > 0;){
365 i -= 1;
369 if (n > prev_n){
371 break;
372 }
374 for (SYMS_U32 j = 0; j < num_steps; j += 1){
376 bucket->next = 0;
377 bucket->v = in_ptr->off - 1;
379 in_ptr -= 1;
380 }
381 prev_n = n;
382 }
383 table[i] = table_ptr;
384 }
385 }
386
387 // build the result
388 SYMS_PdbGsiAccel result = {0};
390 result.buckets = table;
391 result.bucket_count = bucket_count;
392 }
393
394 // release scratch
396
397 SYMS_ProfEnd();
398
399 return(result);
400}
401
404 // NOTE(allen): We don't actually use the PSI specific information right now,
405 // so it's basically just a wrapper around GSI. We didn't collapse it down to
406 // one system because there might be reasons to start using these extra features
407 // and then this will need to be a wrapper.
408#if 0
409 // psi header
410 SYMS_PdbPsiHeader header = {0};
412#endif
413
415 psi_range.size - sizeof(SYMS_PdbPsiHeader));
416 return(result);
417}
418
422 SYMS_USIDList result = {0};
423
424 if (gsi->bucket_count > 0){
425 // get unit range
426 SYMS_MsfRange range = syms_msf_range_from_sn(msf, unit->sn);
427
428 // grab scratch
430
431 // get bucket
434
435 // iterate bucket
437 bucket != 0;
438 bucket = bucket->next){
439 SYMS_U32 off = bucket->v;
440 SYMS_CvStub *stub = syms_cv_stub_from_unit_off(unit, off);
441 if (stub != 0 && syms_string_match(stub->name, name, 0)){
442 SYMS_CvElement element = syms_cv_element(data, msf, range, stub->off, 1);
443
444 SYMS_UnitID uid = 0;
445 SYMS_SymbolID sid = 0;
446 switch (element.kind){
450 {
451 SYMS_CvRef2 ref2 = {0};
452 syms_msf_read_struct_in_range(data, msf, element.range, 0, &ref2);
453 uid = SYMS_PdbPseudoUnit_COUNT + ref2.imod;
455 }break;
456 }
457
458 if (uid != 0){
459 SYMS_USIDNode *chain = syms_push_array(arena, SYMS_USIDNode, 1);
460 SYMS_QueuePush(result.first, result.last, chain);
461 result.count += 1;
462 chain->usid.uid = uid;
463 chain->usid.sid = sid;
464 }
465 }
466 }
467
468 // release scratch
470 }
471
472 return(result);
473}
474
476//~ allen: PDB Accel Functions
477
478// pdb specific parsing
479
482 SYMS_ProfBegin("syms_pdb_dbi_from_msf");
483
484 // grab the dbi stream
485 SYMS_MsfRange range = syms_msf_range_from_sn(msf, sn);
486
487 // read dbi header
488 SYMS_PdbDbiHeader header = {0};
489 syms_msf_read_struct_in_range(data, msf, range, 0, &header);
490
491 // extract dbi info
492 SYMS_PdbDbiAccel result = {0};
493 if (header.sig == SYMS_PdbDbiHeaderSignature_V1){
494 // info directly from the header
495 result.valid = 1;
496 result.machine_type = header.machine;
497 result.gsi_sn = header.gsi_sn;
498 result.psi_sn = header.psi_sn;
499 result.sym_sn = header.sym_sn;
500
501 //- organize the sizes of the ranges in dbi
510
511 //- fill range offset array
512 {
513 SYMS_U64 cursor = sizeof(header);
514 SYMS_U64 i = 0;
515 for (; i < (SYMS_U64)(SYMS_PdbDbiRange_COUNT); i += 1){
516 result.range_off[i] = cursor;
517 cursor += range_size[i];
518 cursor = SYMS_ClampTop(cursor, range.size);
519 }
520 // allen: one last value past the end so that off[i + 1] - off[i] can get us the sizes back.
521 result.range_off[i] = cursor;
522 }
523
524 //- read debug streams
525 {
526 // allen: zero is a valid stream [ it sucks I know :( ]
527 // so we explicitly invalidate sn by clearing to 0xFF instead.
528 syms_memset(result.dbg_sn, 0xFF, sizeof(result.dbg_sn));
530 SYMS_U64 read_size = SYMS_ClampTop(sizeof(result.dbg_sn), dbg_sub_range.size);
532 }
533 }
534
535 SYMS_ProfEnd();
536
537 return(result);
538}
539
542 SYMS_MsfRange result = {0};
543 result.sn = sn;
544 result.off = dbi->range_off[n];
545 result.size = dbi->range_off[n + 1] - result.off;
546 return(result);
547}
548
551 SYMS_MsfRange result = syms_msf_range_from_sn(msf, dbi->dbg_sn[n]);
552 return(result);
553}
554
557 SYMS_ProfBegin("syms_pdb_parse_info");
558
559 // grab the info stream
561
562 // read info stream's header
563 SYMS_PdbInfoHeader header = {0};
564 syms_msf_read_struct_in_range(data, msf, range, 0, &header);
565 SYMS_U32 after_header_off = sizeof(header);
566
567 // read auth_guid (only in certain recent pdb versions)
568 SYMS_PeGuid auth_guid = {0};
570 switch (header.version){
576 {
577 syms_msf_read_struct_in_range(data, msf, range, after_header_off, &auth_guid);
578 after_auth_guid_off = after_header_off + sizeof(auth_guid);
579 }break;
580
581 default:
582 {}break;
583 }
584
585 // read table layout data
590
591 if (header.version != 0){
593
594 SYMS_U32 names_len = 0;
595 syms_msf_read_struct_in_range(data, msf, range, names_len_off, &names_len);
596
598
601
604
608
610
614
616
618 }
619
620 // read table
621 SYMS_PdbInfoTable result = {0};
624 for (SYMS_U32 i = 0;
626 i += 1, record_off += 8){
627 // read record
628 SYMS_U32 record[2];
629 syms_msf_read_in_range(data, msf, range, record_off, 8, record);
632
633 // read name
635 SYMS_String8 name = syms_msf_read_zstring_in_range(arena, data, msf, range, name_off);
636
637 // push new slot
639 SYMS_QueuePush(result.first, result.last, slot);
640 slot->string = name;
641 slot->sn = sn;
642 }
643 }
644 result.auth_guid = auth_guid;
645
646 SYMS_ProfEnd();
647
648 return(result);
649}
650
653 SYMS_ProfBegin("syms_pdb_named_stream_array");
654
655 // mapping "PdbDbiNamedStream" indexes to strings
656 struct StreamNameIndexPair{
658 SYMS_String8 name;
659 };
660 struct StreamNameIndexPair pairs[] = {
661 {SYMS_PdbNamedStream_HEADER_BLOCK, syms_str8_lit("/src/headerblock")},
664 };
665
666 // build baked array of stream indices
667 SYMS_PdbNamedStreamArray result = {0};
668 struct StreamNameIndexPair *p = pairs;
669 for (SYMS_U64 i = 0; i < SYMS_ARRAY_SIZE(pairs); i += 1, p += 1){
670 SYMS_String8 name = p->name;
671 // slot from name
673 for (SYMS_PdbInfoSlot *slot = table->first;
674 slot != 0;
675 slot = slot->next){
676 if (syms_string_match(name, slot->string, 0)){
678 break;
679 }
680 }
681 // store this slot's stream number into the array
682 if (matching_slot != 0){
683 result.sn[p->index] = matching_slot->sn;
684 }
685 }
686
687 SYMS_ProfEnd();
688
689 return(result);
690}
691
694 SYMS_ProfBegin("syms_pdb_dbi_parse_strtbl");
695
696 // grab the strtable stream
697 SYMS_MsfRange range = syms_msf_range_from_sn(msf, sn);
698
699 // read strtable's header
700 SYMS_PdbDbiStrTableHeader header = {0};
701 syms_msf_read_struct_in_range(data, msf, range, 0, &header);
702
703 // read strtable's layout
704 SYMS_PdbStrtblAccel result = {0};
705 if (header.magic == SYMS_PdbDbiStrTableHeader_MAGIC && header.version == 1){
706 SYMS_U32 strblock_size_off = sizeof(header);
710
712 SYMS_U32 bucket_count = 0;
713 syms_msf_read_struct_in_range(data, msf, range, bucket_count_off, &bucket_count);
714
716 SYMS_U32 bucket_array_size = bucket_count*sizeof(SYMS_PdbStringIndex);
717
719 result.bucket_count = bucket_count;
720 result.sn = sn;
721 result.strblock.min = range.off + strblock_off;
722 result.strblock.max = result.strblock.min + strblock_size;
723 result.buckets.min = range.off + bucket_array_off;
724 result.buckets.max = result.buckets.min + bucket_array_size;
725 }
726 }
727
728 SYMS_ProfEnd();
729
730 return(result);
731}
732
733
734// pdb specific api
735
738 // setup accel
739 SYMS_MsfAccel *msf = dbg->msf;
740 SYMS_PdbStrtblAccel *strtbl = &dbg->strtbl;
741
742 // get string range
743 SYMS_MsfRange range = syms_msf_range_from_sn(msf, strtbl->sn);
745
746 // read string
747 SYMS_String8 result = syms_msf_read_zstring_in_range(arena, data, msf, str_range, off);
748 return(result);
749}
750
754 // setup accel
755 SYMS_MsfAccel *msf = dbg->msf;
756 SYMS_PdbStrtblAccel *strtbl = &dbg->strtbl;
757
758 SYMS_String8 result = {0};
759 if (n < strtbl->bucket_count){
760 // get bucket range
761 SYMS_MsfRange range = syms_msf_range_from_sn(msf, strtbl->sn);
763
764 // get offset
765 SYMS_U32 offset_off = n*4;
766 SYMS_U32 offset = 0;
767 if (syms_msf_read_struct_in_range(data, msf, bkt_range, offset_off, &offset)){
768
769 // get string range
771
772 // read string
773 result = syms_msf_read_zstring_in_range(arena, data, msf, str_range, offset);
774 }
775 }
776
777 return(result);
778}
779
780
781// main api
782
786 SYMS_MsfAccel *msf = syms_msf_accel_from_data(arena, data);
787 if (msf != 0){
788 result = syms_push_array(arena, SYMS_PdbFileAccel, 1);
789 result->format = SYMS_FileFormat_PDB;
790 result->msf = msf;
791 }
792 return(result);
793}
794
797 // setup accel
798 SYMS_MsfAccel *msf = file->msf;
799
800 // setup result
802
803 // parse dbi header
805 if (dbi.valid){
806 // copy msf if it's not a prior on this arena.
807 // TODO(allen): re-apply deep copy optimizations using handle checks
809
810 // parse info table
813
814 // get gsi range
818
819 // get an msf range for section data
821
822 // setup voff acceleration for coff sections
824 {
825 // grab coff array
826 SYMS_U64 sec_count = section_data_range.size/sizeof(SYMS_CoffSectionHeader);
828 syms_msf_read_in_range(data, msf, section_data_range, 0, sec_count*sizeof(*sec_hdrs), sec_hdrs);
829
830 // convert to voff array
832 }
833
834 // fill accelerator
835 {
836 result = syms_push_array(arena, SYMS_PdbDbgAccel, 1);
837 result->format = SYMS_FileFormat_PDB;
838
839 // msf
840 result->msf = dbg_msf;
841
842 // pdb
843 result->dbi = dbi;
845 result->strtbl = syms_pdb_dbi_parse_strtbl(arena, data, msf, result->named.sn[SYMS_PdbNamedStream_STRTABLE]);
846 result->tpi = syms_pdb_tpi_accel_from_sn(arena, data, msf, SYMS_PdbFixedStream_TPI);
847 result->ipi = syms_pdb_tpi_accel_from_sn(arena, data, msf, SYMS_PdbFixedStream_IPI);
848 result->gsi = syms_pdb_gsi_accel_from_range(arena, data, msf, gsi_range);
849 result->psi = syms_pdb_gsi_accel_from_range(arena, data, msf, gsi_part_psi_range);
850 result->auth_guid = info_table.auth_guid;
851
852 // arch
854
855 // type uid
857
858 // section data
859 result->section_data_range = section_data_range;
860 result->section_voffs = section_voff_array.u64;
861 result->section_count = section_voff_array.count;
862 }
863
864 // release scratch
866 }
867 return(result);
868}
869
870
872//~ allen: PDB Architecture
873
876 SYMS_Arch result = dbg->arch;
877 return(result);
878}
879
880
882//~ allen: PDB Match Keys
883
886 SYMS_ExtMatchKey result = {0};
887 syms_memmove(&result, &dbg->auth_guid, sizeof(dbg->auth_guid));
888 return(result);
889}
890
891
893//~ allen: PDB Sections
894
895// pdb specific
896
899 SYMS_CoffSectionHeader result = {0};
900 if (1 <= n){
902 SYMS_U64 off = (n - 1)*sizeof(SYMS_CoffSectionHeader);
903 syms_msf_read_struct_in_range(data, dbg->msf, range, off, &result);
904 }
905 return(result);
906}
907
910 SYMS_U64 result = 0;
911 if (1 <= n && n <= dbg->section_count){
912 result = dbg->section_voffs[n - 1];
913 }
914 return(result);
915}
916
917// main api
918
921 // setup accels
922 SYMS_MsfAccel *msf = dbg->msf;
924 SYMS_SecInfoArray result = syms_cv_sec_info_array_from_bin(arena, data, msf, range);
925 return(result);
926}
927
929//~ allen: PDB Compilation Units
930
931// pdb helpers
932
935 SYMS_PdbCompUnit *result = 0;
938 if (index < accel->comp_count){
939 result = accel->comp_units[index];
940 }
941 }
942 return(result);
943}
944
947 SYMS_MsfRange result = {0};
948 result.sn = unit->sn;
949 result.off = unit->range_off[n];
950 result.size = unit->range_off[n + 1] - result.off;
951 return(result);
952}
953
954// main api
955
958 // setup accels
959 SYMS_MsfAccel *msf = dbg->msf;
960 SYMS_PdbDbiAccel *dbi = &dbg->dbi;
961
962 // parse list of modules
963 SYMS_PdbCompUnitNode *first = 0;
964 SYMS_PdbCompUnitNode *last = 0;
965 SYMS_U64 count = 0;
966
967 {
968 // grab module info range
970
971 // parse loop
972 SYMS_U64 off = 0;
973 for (;;){
974 // exit condition - past end
975 if (off >= range.size){
976 break;
977 }
978
979 // extract comp unit info
981 SYMS_PdbCompUnit comp_unit = {0};
983
984 SYMS_PdbDbiCompUnitHeader header = {0};
985 if (syms_msf_read_struct_in_range(data, msf, range, off, &header)){
987
988 // extract names from after header
989 SYMS_U32 name_off = off + sizeof(header);
990 SYMS_String8 name = syms_msf_read_zstring_in_range(arena, data, msf, range, name_off);
991
992 SYMS_U32 name2_off = name_off + name.size + 1;
994
997
998 // get the size of this mod's stream
999 SYMS_MsfStreamInfo stream_info = syms_msf_stream_info_from_sn(msf, header.sn);
1000 SYMS_U64 stream_size = stream_info.size;
1001
1002 // organize size information
1007
1008 // fill comp unit range offs
1009 {
1010 SYMS_U64 cursor = 0;
1011 SYMS_U64 i = 0;
1012 for (; i < (SYMS_U64)(SYMS_PdbCompUnitRange_COUNT); i += 1){
1013 comp_unit.range_off[i] = cursor;
1014 cursor += range_size[i];
1015 cursor = SYMS_ClampTop(cursor, stream_size);
1016 }
1017 //~ allen: one last value past the end so that off[i + 1] - off[i] can get us the sizes back.
1018 comp_unit.range_off[i] = cursor;
1019 }
1020
1021 // skip annoying signature in first range
1023 comp_unit.range_off[0] += 4;
1024 }
1025
1026 // fill comp unit direct fields
1027 comp_unit.sn = header.sn;
1028 comp_unit.src_file = header.src_file;
1029 comp_unit.pdb_file = header.pdb_file;
1030
1031 comp_unit.group_name = name;
1032 comp_unit.obj_name = name2;
1033 }
1034
1035 // exit condition - failed read
1036 if (!got_comp_unit){
1037 break;
1038 }
1039
1040 // save to list
1042 SYMS_QueuePush(first, last, node);
1043 count += 1;
1044 syms_memmove(&node->comp_unit, &comp_unit, sizeof(comp_unit));
1045
1046 // increment offset
1047 off = next_comp_unit_off;
1048 }
1049 }
1050
1051 // linearize for quick index
1052 SYMS_PdbCompUnit **comp_units = syms_push_array(arena, SYMS_PdbCompUnit*, count);
1053 {
1054 SYMS_PdbCompUnit **comp_unit_ptr = comp_units;
1055 for (SYMS_PdbCompUnitNode *node = first;
1056 node != 0;
1057 node = node->next, comp_unit_ptr += 1){
1058 *comp_unit_ptr = &node->comp_unit;
1059 }
1060 }
1061
1062 // fill result
1064 result->format = SYMS_FileFormat_PDB;
1065 result->comp_units = comp_units;
1066 result->comp_count = count;
1067
1068 return(result);
1069}
1070
1073 SYMS_U64 result = unit_set->comp_count + SYMS_PdbPseudoUnit_COUNT;
1074 return(result);
1075}
1076
1079 SYMS_UnitInfo result = {0};
1080
1081 // TODO(allen): language
1082
1083 switch (uid){
1085 {
1089 }break;
1090
1092 {
1094 }break;
1095
1096 default:
1097 {
1098 SYMS_PdbCompUnit *unit = syms_pdb_comp_unit_from_id(unit_set, uid);
1099 if (unit != 0){
1103 }
1104 }break;
1105 }
1106
1107 return(result);
1108}
1109
1112 SYMS_UnitNames result = {0};
1113 // try compilation unit
1114 SYMS_PdbCompUnit *unit = syms_pdb_comp_unit_from_id(unit_set, uid);
1115 if (unit != 0){
1116 result.object_file = syms_push_string_copy(arena, unit->group_name);
1117 result.archive_file = syms_push_string_copy(arena, unit->obj_name);
1118 }
1119 return(result);
1120}
1121
1124 SYMS_PdbUnitSetAccel *unit_set){
1126
1127 //- setup accels
1128 SYMS_MsfAccel *msf = dbg->msf;
1129 SYMS_PdbDbiAccel *dbi = &dbg->dbi;
1130
1131 //- parse contributions
1132 SYMS_U64 range_count = 0;
1133 SYMS_UnitRange *ranges = 0;
1134 {
1135 // grab module info range
1137
1138 // read version
1140 syms_msf_read_struct_in_range(data, msf, range, 0, &version);
1141
1142 // read array off/size info
1143 SYMS_U32 item_size = 0;
1144 SYMS_U32 array_off = 0;
1145 switch (version){
1146 default:
1147 {
1148 // TODO(allen): do we have a test case for this?
1149 version = 0;
1151 }break;
1153 {
1155 array_off = sizeof(version);
1156 }break;
1158 {
1160 array_off = sizeof(version);
1161 }break;
1162 }
1163
1164 // allocate ranges array
1166 ranges = syms_push_array(arena, SYMS_UnitRange, max_count);
1167
1168 // read contribution data
1171
1172 // grab section -> voff accel
1173 SYMS_U64 section_count = dbg->section_count;
1174 SYMS_U64 *section_voffs = dbg->section_voffs;
1175
1176 // fill array
1177 {
1178 SYMS_UnitRange *unit_range = ranges;
1179 SYMS_UnitRange *opl = ranges + max_count;
1180 SYMS_U8 *ptr = contrib_data.str;
1182 for (; ptr < ptr_opl; ptr += item_size){
1184 if (sc->size > 0 && 1 <= sc->sec && sc->sec <= section_count){
1185 // calculate range
1186 SYMS_U64 section_voff = section_voffs[sc->sec - 1];
1188
1189 // fill unit range
1190 unit_range->vrange.min = min;
1191 unit_range->vrange.max = min + sc->size;
1193 unit_range += 1;
1194 }
1195 }
1196
1197 range_count = (SYMS_U64)(unit_range - ranges);
1198
1199 syms_arena_put_back(arena, sizeof(SYMS_UnitRange)*(max_count - range_count));
1200 }
1201 }
1202
1204
1205 //- assemble result
1206 SYMS_UnitRangeArray result = {ranges, range_count};
1207 return(result);
1208}
1209
1211//~ allen: PDB Symbol Parsing
1212
1213// cv sym parse
1214
1217 SYMS_MsfAccel *msf = dbg->msf;
1219 SYMS_U64Range r = {range.off, range.off + range.size};
1221
1223 params.format = SYMS_FileFormat_PDB;
1224 params.uid = SYMS_PdbPseudoUnit_SYM;
1226
1227 SYMS_CvUnitAccel *result = syms_cv_sym_unit_from_ranges(arena, data, msf, range.sn, range_array,
1228 &params);
1229 return(result);
1230}
1231
1232// cv leaf parse
1233
1236 SYMS_UnitID uid){
1237 // get range from tpi
1238 SYMS_MsfAccel *msf = dbg->msf;
1239 SYMS_PdbTpiAccel *tpi = &dbg->tpi;
1241 SYMS_U64Range range = {msf_range.off, msf_range.off + msf_range.size};
1242
1243 // setup cons params
1245 params.format = dbg->format;
1246 params.uid = uid;
1247 params.first_ti = tpi->first_ti;
1248 params.align = 4;
1249
1250 // parse
1251 SYMS_CvUnitAccel *result = syms_cv_leaf_unit_from_range(arena, data, msf,
1252 msf_range.sn, range, &params);
1253
1254 return(result);
1255}
1256
1257// main api
1258
1261 SYMS_PdbUnitSetAccel *unit_set, SYMS_UnitID uid){
1262 // setup result
1264
1265 switch (uid){
1267 {
1268 result = syms_pdb_pub_sym_accel_from_dbg(arena, data, dbg);
1269 }break;
1270
1272 {
1273 result = syms_pdb_leaf_accel_from_dbg(arena, data, dbg, uid);
1274 }break;
1275
1276 default:
1277 {
1278 SYMS_PdbCompUnit *unit = syms_pdb_comp_unit_from_id(unit_set, uid);
1279 if (unit != 0){
1281 SYMS_U64Range r = {range.off, range.off + range.size};
1283
1285 params.format = SYMS_FileFormat_PDB;
1286 params.uid = SYMS_PdbPseudoUnit_SYM;
1288
1289 result = syms_cv_sym_unit_from_ranges(arena, data, dbg->msf, range.sn, range_array, &params);
1290 }
1291 }break;
1292 }
1293
1294 return(result);
1295}
1296
1299 // NOTE(nick): Thread var symbols are stored in global symbol stream
1300 // which doesn't abstract well with DWARF model where thread vars
1301 // are stored on per compilation units basis.
1302 return(SYMS_PdbPseudoUnit_SYM);
1303}
1304
1307 SYMS_SymbolIDArray result = {0};
1308 if (!thread_unit->leaf_set){
1309
1310 //- allocate array
1311 SYMS_U64 count = thread_unit->tls_var_count;
1313
1314 //- fill array
1315 SYMS_SymbolID *id_ptr = ids;
1316 SYMS_CvStub **stub_ptr = thread_unit->tls_var_stubs;
1317 SYMS_CvStub **opl = stub_ptr + count;
1318 for (; stub_ptr < opl; id_ptr += 1, stub_ptr += 1){
1319 *id_ptr = SYMS_ID_u32_u32(SYMS_CvSymbolIDKind_Off, (**stub_ptr).off);
1320 }
1321
1322 //- assemble result
1323 result.count = count;
1324 result.ids = ids;
1325 }
1326
1327 return(result);
1328}
1329
1332 SYMS_U64 result = unit->top_count;
1333 return(result);
1334}
1335
1338 SYMS_SymbolID sid){
1339 SYMS_SymbolKind result = syms_cv_symbol_kind_from_sid(data, dbg->msf, unit, sid);
1340 return(result);
1341}
1342
1345 SYMS_SymbolID sid){
1347 if (unit->leaf_set){
1348 // setup
1349 SYMS_MsfAccel *msf = dbg->msf;
1350 SYMS_UnitID uid = unit->uid;
1351
1352 // get type info
1353 result = syms_cv_type_info_from_sid(data, msf, unit, sid);
1354
1355 // ipi information lookup
1358
1359 SYMS_PdbTpiAccel *ipi = &dbg->ipi;
1361
1362 if (ipi->bucket_count > 0){
1363
1364 // get bucket
1365 SYMS_String8 id_data = {(SYMS_U8*)&ti, sizeof(ti)};
1368
1369 // iterate bucket
1371 bucket != 0;
1372 bucket = bucket->next){
1375
1377 switch (element.kind){
1378 default:break;
1379
1381 {
1382 // TODO(allen): we have never hit this case before; we're not sure how it works,
1383 // and have no way to test it.
1384 SYMS_ASSERT_PARANOID(!"not implemented");
1385#if 0
1387 if (syms_msf_read_struct_in_range(data, msf, element.range, 0, &mod_src_line)){
1388 }
1389#endif
1390 }break;
1391
1393 {
1395 if (syms_msf_read_struct_in_range(data, msf, element.range, 0, &udt_src_line)){
1396 if (udt_src_line.udt_itype == ti){
1398 result.src_coord.line = udt_src_line.ln;
1399 goto dbl_break;
1400 }
1401 }
1402 }break;
1403 }
1404 }
1405
1406 dbl_break:;
1407 }
1408 }
1409
1410 }
1411 return(result);
1412}
1413
1416 SYMS_SymbolID sid){
1417 SYMS_ConstInfo result = syms_cv_const_info_from_sid(data, dbg->msf, unit, sid);
1418 return(result);
1419}
1420
1421
1423//~ allen: PDB Variable Info
1424
1425// cv parse
1426
1429 SYMS_SymbolID id){
1430 // setup accel
1431 SYMS_MsfAccel *msf = dbg->msf;
1432
1433 // read id
1434 SYMS_MsfRange range = syms_msf_range_from_sn(msf, unit->sn);
1436
1437 // type uid
1438 SYMS_UnitID type_uid = dbg->type_uid;
1439
1440 // zero clear result
1441 SYMS_USID result = {0};
1442
1443 // parse symbol
1444 if (stub != 0){
1445 SYMS_CvElement element = syms_cv_element(data, msf, range, stub->off, 1);
1446 switch (element.kind){
1447 default:break;
1448
1451 {
1452 SYMS_CvData32 data32 = {0};
1453 syms_msf_read_struct_in_range(data, msf, element.range, 0, &data32);
1454
1455 result.uid = type_uid;
1457 }break;
1458
1460 {
1461 SYMS_CvLocal loc = {0};
1462 syms_msf_read_struct_in_range(data, msf, element.range, 0, &loc);
1463
1464 result.uid = type_uid;
1466 }break;
1467
1469 {
1471 syms_msf_read_struct_in_range(data, msf, element.range, 0, &regrel32);
1472
1473 result.uid = type_uid;
1475 }break;
1476
1479 {
1481 syms_msf_read_struct_in_range(data, msf, element.range, 0, &thread32);
1482
1483 result.uid = type_uid;
1485 }break;
1486 }
1487 }
1488
1489 return(result);
1490}
1491
1492
1495 SYMS_SymbolID sid){
1496 // setup accel
1497 SYMS_MsfAccel *msf = dbg->msf;
1498
1499 // read id
1500 SYMS_MsfRange range = syms_msf_range_from_sn(msf, unit->sn);
1502
1503 // zero clear result
1504 SYMS_U64 result = 0;
1505
1506 // parse symbol
1507 if (stub != 0){
1508 SYMS_CvElement element = syms_cv_element(data, msf, range, stub->off, 1);
1509 switch (element.kind){
1510 default:break;
1511
1514 {
1515 SYMS_CvData32 data32 = {0};
1516 syms_msf_read_struct_in_range(data, msf, element.range, 0, &data32);
1518 result = section_voff + data32.sec_off;
1519 }break;
1520 }
1521 }
1522
1523 return(result);
1524}
1525
1528 SYMS_RegSection result = {0};
1531 SYMS_RegID reg_id = slice->reg_id;
1532 if (reg_id < SYMS_RegX86Code_COUNT){
1533 SYMS_RegSection *section = syms_reg_section_X86 + reg_id;
1534 result.off = section->off + slice->byte_off;
1535 result.size = slice->byte_size;
1536 }
1537 }
1538 return(result);
1539}
1540
1543 SYMS_RegSection result = {0};
1546 SYMS_RegID reg_id = slice->reg_id;
1547 if (reg_id < SYMS_RegX64Code_COUNT){
1548 SYMS_RegSection *section = syms_reg_section_X64 + reg_id;
1549 result.off = section->off + slice->byte_off;
1550 result.size = slice->byte_size;
1551 }
1552 }
1553 return(result);
1554}
1555
1558 SYMS_RegSection result = {0};
1559 switch (arch){
1562 }
1563 return(result);
1564}
1565
1569 //- get accelerator
1570 SYMS_MsfAccel *msf = dbg->msf;
1571
1572 //- get LOCAL
1576 if (local_stub != 0){
1577 local_element = syms_cv_element(data, msf, range, local_stub->off, 1);
1580 }
1581 }
1582
1583 //- get *PROC32
1585 if (got_local){
1587 for (;root_stub->parent != 0;){
1589 }
1590 root_element = syms_cv_element(data, msf, range, root_stub->off, 1);
1591 }
1594
1595 //- get FRAMEPROC
1598 if (got_proc32){
1599 SYMS_U64 fp_off = root_element.range.off + root_element.range.size;
1600 SYMS_CvElement fp_element = syms_cv_element(data, msf, range, fp_off, 1);
1605 }
1606 }
1607
1608 //- determine the register
1609 SYMS_RegSection result = {0};
1611 if (got_fp_flags){
1612 // check if parameter
1616 SYMS_B32 is_parameter = (local_flags & SYMS_CvLocalFlag_PARAM);
1617
1618 // get frame pointer code
1620 if (is_parameter){
1622 }
1623 else{
1625 }
1626
1627 // get register section
1628 switch (arch){
1629 case SYMS_Arch_X86:
1630 {
1631 switch (frame_ptr_reg){
1633 {
1634 // TODO(allen): support SYMS_CvAllReg_VFRAME
1635 }break;
1637 {
1639 }break;
1641 {
1643 }break;
1644 }
1645 }break;
1646 case SYMS_Arch_X64:
1647 {
1648 switch (frame_ptr_reg){
1650 {
1652 }break;
1654 {
1656 }break;
1658 {
1660 }break;
1661 }
1662 }break;
1663 }
1664 }
1665
1666 //- fallback
1667 else{
1668 switch (arch){
1669 case SYMS_Arch_X86:
1670 {
1671 result = syms_reg_section_X86[SYMS_RegX86Code_ebp];
1672 }break;
1673 case SYMS_Arch_X64:
1674 {
1675 result = syms_reg_section_X64[SYMS_RegX64Code_rbp];
1676 }break;
1677 }
1678 }
1679
1680 return(result);
1681}
1682
1683// main api
1684
1687 SYMS_USID result = {0};
1688 if (!unit->leaf_set){
1689 result = syms_pdb_sym_type_from_var_id(data, dbg, unit, id);
1690 }
1691 return(result);
1692}
1693
1696 SYMS_U64 result = 0;
1697 if (!unit->leaf_set){
1698 result = syms_pdb_sym_voff_from_var_sid(data, dbg, unit, sid);
1699 }
1700 return(result);
1701}
1702
1705 SYMS_CvUnitAccel *unit, SYMS_SymbolID sid){
1706 SYMS_Location result = {0};
1707 if (!unit->leaf_set){
1708 // setup accel
1709 SYMS_MsfAccel *msf = dbg->msf;
1710
1711 // read id
1712 SYMS_MsfRange range = syms_msf_range_from_sn(msf, unit->sn);
1714
1715 // parse symbol
1716 if (stub != 0){
1717 SYMS_CvElement element = syms_cv_element(data, msf, range, stub->off, 1);
1718
1719 switch (element.kind){
1722 {
1723 SYMS_CvData32 data32 = {0};
1724 syms_msf_read_struct_in_range(data, msf, element.range, 0, &data32);
1726 SYMS_U32 voff = section_voff + data32.sec_off;
1727
1728 //- build the location info for addr:`module base + off`
1729 SYMS_EvalOpList list = {0};
1731
1732 result.op_list = list;
1733 result.mode = SYMS_EvalMode_Address;
1734 }break;
1735
1737 {
1738 //- extract frameproc's frame size
1739 SYMS_U32 frame_size = 0;
1740 {
1741 // find containing procedure
1743 for (SYMS_CvStub *node = stub->parent;
1744 node != 0;
1745 node = node->parent){
1746 SYMS_CvElement el = syms_cv_element(data, msf, range, node->off, 1);
1747 if (el.kind == SYMS_CvSymKind_LPROC32 ||
1748 el.kind == SYMS_CvSymKind_GPROC32){
1749 containing_proc = node;
1750 break;
1751 }
1752 }
1753
1754 // find frameproc symbol inside this procedure
1755 if (containing_proc != 0){
1756 for (SYMS_CvStub *node = containing_proc->first;
1757 node != 0;
1758 node = node->sibling_next){
1759 SYMS_CvElement el = syms_cv_element(data, msf, range, node->off, 1);
1760 if (el.kind == SYMS_CvSymKind_FRAMEPROC){
1761 syms_msf_read_struct_in_range(data, msf, el.range, 0, &frame_size);
1762 break;
1763 }
1764 }
1765 }
1766 }
1767
1768 //- extract regrel's info
1770 syms_msf_read_struct_in_range(data, msf, element.range, 0, &regrel32);
1771
1773 SYMS_U32 off = regrel32.reg_off;
1775 // TODO(allen): report unimplemented architecture, unimplemented register conversion
1777
1778 //- determine if this is a stack register relative
1780 (arch == SYMS_Arch_X86 && cv_reg == SYMS_CvReg_X86_ESP));
1781
1782 //- determine if this is a parameter
1783 SYMS_B32 is_param = (stack_reg && off > frame_size);
1784
1785 //- build the location info addr:`reg + off`
1786 SYMS_EvalOpList list = {0};
1788 if (off != 0){
1789 syms_eval_op_encode_u(arena, &list, off);
1791 }
1792
1793 result.op_list = list;
1794 result.mode = SYMS_EvalMode_Address;
1795 result.is_parameter = is_param;
1796 }break;
1797
1800 {
1802 syms_msf_read_struct_in_range(data, msf, element.range, 0, &thread32);
1803
1804 //- build the location info for addr:`TLS base + off`
1805 SYMS_EvalOpList list = {0};
1806 if (thread32.tls_off <= 0xFFFF){
1808 }
1809 else{
1811 syms_eval_op_encode_u(arena, &list, (thread32.tls_off - 0xFFFF));
1813 }
1814
1815 result.op_list = list;
1816 result.mode = SYMS_EvalMode_Address;
1817 }break;
1818 }
1819 }
1820 }
1821 return(result);
1822}
1823
1826 SYMS_CvUnitAccel *unit, SYMS_SymbolID sid){
1827 SYMS_LocRangeArray result = {0};
1828 if (!unit->leaf_set){
1829 //- setup accel
1830 SYMS_MsfAccel *msf = dbg->msf;
1831
1832 //- read id
1833 SYMS_MsfRange range = syms_msf_range_from_sn(msf, unit->sn);
1835
1836 //- parse symbol
1837 if (stub != 0){
1838 SYMS_CvElement element = syms_cv_element(data, msf, range, stub->off, 1);
1839 if (element.kind == SYMS_CvSymKind_LOCAL){
1841
1842 //- gather ranges
1843 SYMS_LocRangeList list = {0};
1844 for (SYMS_CvStub *child = stub->first;
1845 child != 0;
1846 child = child->sibling_next){
1847 SYMS_CvElement child_element = syms_cv_element(data, msf, range, child->off, 1);
1849
1850 //- determine handling path
1852 SYMS_U64 range_off = 0;
1853 switch (child_element.kind){
1856 {
1857 // TODO(allen): Investigate these cases further
1859 }break;
1860
1862 {
1863 range_off = SYMS_MEMBER_OFFSET(SYMS_CvDefrange, range);
1864 }break;
1865
1867 {
1868 range_off = SYMS_MEMBER_OFFSET(SYMS_CvDefrangeSubfield, range);
1869 }break;
1870
1872 {
1873 range_off = SYMS_MEMBER_OFFSET(SYMS_CvDefrangeRegister, range);
1874 }break;
1875
1877 {
1879 }break;
1880
1882 {
1884 }break;
1885
1887 {
1889
1890 //- emit a single range that covers all U64
1892 SYMS_QueuePush(list.first, list.last, node);
1893 list.count += 1;
1894 node->loc_range.vrange.min = 0;
1896 node->loc_range.loc_id = loc_id;
1897 }break;
1898
1900 {
1902 }break;
1903 }
1904
1905 //- apply range handling
1906 if (do_standard_range){
1908 if (syms_msf_read_struct_in_range(data, msf, child_element.range, range_off, &addr_range)){
1909 // setup main range
1913
1914 // setup gaps
1915 SYMS_U64 gap_off = range_off + sizeof(addr_range);
1918
1919 // emit loop
1923 gap_cursor += sizeof(SYMS_CvLvarAddrGap)){
1924 SYMS_CvLvarAddrGap gap = {0};
1926
1928
1929 // emit range
1930 {
1932 SYMS_QueuePush(list.first, list.last, node);
1933 list.count += 1;
1935 node->loc_range.vrange.max = gap_first;
1936 node->loc_range.loc_id = loc_id;
1937 }
1938
1939 // advance vaddr cursor
1940 vaddr_cursor = gap_first + gap.len;
1941 }
1942
1943 // emit range
1944 {
1946 SYMS_QueuePush(list.first, list.last, node);
1947 list.count += 1;
1950 node->loc_range.loc_id = loc_id;
1951 }
1952 }
1953 }
1954 }
1955
1956 //- flatten list
1957 SYMS_LocRange *loc_ranges = syms_push_array(arena, SYMS_LocRange, list.count);
1958 SYMS_LocRange *loc_range_ptr = loc_ranges;
1959 for (SYMS_LocRangeNode *node = list.first;
1960 node != 0;
1961 node = node->next, loc_range_ptr += 1){
1962 syms_memmove(loc_range_ptr, &node->loc_range, sizeof(node->loc_range));
1963 }
1964
1965 //- fill result
1966 result.loc_ranges = loc_ranges;
1967 result.count = list.count;
1968
1970 }
1971 }
1972 }
1973 return(result);
1974}
1975
1978 SYMS_CvUnitAccel *unit, SYMS_LocID loc_id){
1979 SYMS_Location result = {0};
1980 if (!unit->leaf_set){
1981 // setup accel
1982 SYMS_MsfAccel *msf = dbg->msf;
1983
1984 // read id
1985 SYMS_MsfRange range = syms_msf_range_from_sn(msf, unit->sn);
1987
1988 // parse symbol
1989 if (stub != 0){
1990
1991 // determine if this location is part of a parameter variable
1993 {
1994 SYMS_CvStub *parent = stub->parent;
1995 if (parent != 0){
1996 SYMS_CvElement el = syms_cv_element(data, msf, range, parent->off, 1);
1997 if (el.kind == SYMS_CvSymKind_LOCAL){
1998 SYMS_CvLocal slocal = {0};
1999 syms_msf_read_struct_in_range(data, msf, el.range, 0, &slocal);
2000 if (slocal.flags & SYMS_CvLocalFlag_PARAM){
2002 }
2003 }
2004 }
2005 }
2006 result.is_parameter = is_param;
2007
2008 // construct location from this symbol
2009 SYMS_CvElement element = syms_cv_element(data, msf, range, stub->off, 1);
2010
2011 switch (element.kind){
2014 {
2015 // TODO(allen): No known cases; Don't know how to interpret
2016 }break;
2017
2019 {
2020 // TODO(allen): No known cases; SYMS_CvDefrange 'program' - don't know how to interpret
2021 }break;
2022
2024 {
2025 // TODO(allen): No known cases; SYMS_CvDefrangeSubfield 'program' - don't know how to interpret
2026 // TODO(allen): SYMS_CvDefrangeSubfield 'off_in_parent' - not a supported concept
2027 }break;
2028
2030 {
2031 // extract info
2034
2038
2039 // location info ops
2040 SYMS_EvalOpList list = {0};
2042
2043 // fill result
2044 result.op_list = list;
2046 }break;
2047
2050 {
2051 // extract framepointer register
2052 SYMS_RegSection sec = syms_pdb_reg_section_from_framepointer(data, dbg, range, stub);
2053
2054 // extract offset
2055 SYMS_U32 offset = 0;
2056 syms_msf_read_struct_in_range(data, msf, element.range, 0, &offset);
2057
2058 // location info ops
2059 SYMS_EvalOpList list = {0};
2061 if (offset != 0){
2062 syms_eval_op_encode_u(arena, &list, offset);
2064 }
2065
2066 // fill result
2067 result.op_list = list;
2068 result.mode = SYMS_EvalMode_Address;
2069 }break;
2070
2072 {
2073 // TODO(allen): SYMS_CvDefrangeSubfieldRegister 'off_in_parent' - not a supported concept
2074 }break;
2075
2077 {
2078 // extract info
2081
2083 SYMS_U32 off = defrange_register_rel.reg_off;
2086
2087 // location info ops
2088 SYMS_EvalOpList list = {0};
2090 if (off != 0){
2091 syms_eval_op_encode_u(arena, &list, off);
2093 }
2094
2095 // fill result
2096 result.op_list = list;
2097 result.mode = SYMS_EvalMode_Address;;
2098 }break;
2099 }
2100
2101 }
2102 }
2103 return(result);
2104}
2105
2106
2108//~ allen: PDB Member Info
2109
2110// cv parse
2111
2112SYMS_API void
2115 // get field list from ti
2117
2118 // parse loop
2119 if (list_stub != 0){
2120 // leaf range
2121 SYMS_MsfRange range = syms_msf_range_from_sn(msf, unit->sn);
2122
2123 // use the stubs from initial parse
2125 field_stub != 0;
2126 field_stub = field_stub->sibling_next){
2127 // read kind
2128 SYMS_U32 lf_off = field_stub->off;
2129 SYMS_CvLeaf lf_kind = 0;
2130 syms_msf_read_struct_in_range(data, msf, range, lf_off, &lf_kind);
2131
2132 // recurse into indexes
2133 if (lf_kind == SYMS_CvLeaf_INDEX){
2134 // TODO(allen): infinite recursion breaker.
2135 SYMS_CvLeafIndex index = {0};
2136 if (syms_msf_read_struct_in_range(data, msf, range, lf_off, &index)){
2137 syms_pdb__field_list_parse(arena, data, msf, unit, index.itype, out);
2138 }
2139 }
2140
2141 // gather members
2142 else{
2143 switch (lf_kind){
2144 case SYMS_CvLeaf_MEMBER:
2149 case SYMS_CvLeaf_BCLASS:
2154 {
2156 node->name = syms_push_string_copy(arena, field_stub->name);
2157 node->num = field_stub->num;
2158 node->off = field_stub->off;
2159 node->off2 = 0;
2160 SYMS_QueuePush(out->first, out->last, node);
2161 out->mem_count += 1;
2162 }break;
2163
2164 case SYMS_CvLeaf_METHOD:
2165 {
2166 SYMS_U32 off = field_stub->off;
2167 // TODO(allen): do we get anything useful from this num?
2168 SYMS_U32 num = field_stub->num;
2169 SYMS_String8 name = syms_push_string_copy(arena, field_stub->name);
2170
2171 SYMS_U32 method_off = lf_off + sizeof(lf_kind);
2172 SYMS_CvLeafMethod method = {0};
2173 syms_msf_read_struct_in_range(data, msf, range, method_off, &method);
2174
2175 SYMS_CvStub *method_list_stub = syms_cv_stub_from_unit_index(unit, method.itype_list);
2176
2177 if (method_list_stub != 0){
2180 for (SYMS_U32 i = 0;
2181 i < method.count && method_stub != 0;
2182 i += 1, method_stub = method_stub->sibling_next){
2184 node->name = name;
2185 node->num = num;
2186 node->off = off;
2187 node->off2 = method_stub->off - method_list_off;
2188 SYMS_QueuePush(out->first, out->last, node);
2189 out->mem_count += 1;
2190 }
2191 }
2192 }break;
2193 }
2194 }
2195 }
2196 }
2197}
2198
2199// main api
2200
2204 // setup accels
2205 SYMS_MsfAccel *msf = dbg->msf;
2206
2207 // dispatch to leaf
2209 if (unit->leaf_set){
2210
2211 // read id
2212 SYMS_CvStub *stub = 0;
2215 }
2216
2217 // extract field list from stub
2218 SYMS_CvTypeIndex ti = 0;
2219 if (stub != 0){
2220 SYMS_MsfRange range = syms_msf_range_from_sn(msf, unit->sn);
2221 SYMS_CvElement element = syms_cv_element(data, msf, range, stub->off, 1);
2222 switch (element.kind){
2223 case SYMS_CvLeaf_CLASS:
2226 {
2228 if (syms_msf_read_struct_in_range(data, msf, element.range, 0, &struct_)){
2229 ti = struct_.field;
2230 }
2231 }break;
2232
2233 case SYMS_CvLeaf_UNION:
2234 {
2236 if (syms_msf_read_struct_in_range(data, msf, element.range, 0, &union_)){
2237 ti = union_.field;
2238 }
2239 }break;
2240
2243 {
2245 if (syms_msf_read_struct_in_range(data, msf, element.range, 0, &class_ptr)){
2246 ti = class_ptr.field;
2247 }
2248 }break;
2249 }
2250 }
2251
2252 if (ti != 0){
2253 // recursively gather members
2255 syms_pdb__field_list_parse(arena, data, msf, unit, ti, &list);
2256
2257 // construct result
2258 SYMS_String8 type_name = syms_push_string_copy(arena, stub->name);
2259 SYMS_CvMemStubNode **members = syms_push_array(arena, SYMS_CvMemStubNode*, list.mem_count);
2260 {
2261 SYMS_U64 i = 0;
2262 for (SYMS_CvMemStubNode *node = list.first;
2263 node != 0;
2264 node = node->next, i += 1){
2265 members[i] = node;
2266 }
2267 }
2268
2269 result = syms_push_array(arena, SYMS_CvMemsAccel, 1);
2270 syms_memzero_struct(result);
2271 result->format = SYMS_FileFormat_PDB;
2272 result->type_name = type_name;
2273 result->count = list.mem_count;
2274 result->members = members;
2275 }
2276 }
2277
2278 return(result);
2279}
2280
2283 SYMS_U64 result = mems->count;
2284 return(result);
2285}
2286
2287SYMS_API void
2289 SYMS_CvFieldAttribs attribs, SYMS_String8 type_name, SYMS_String8 name,
2290 SYMS_MemInfo *out){
2293
2294 SYMS_U32 vbaseoff = 0;
2297
2299 switch (mprop){
2302 {
2304 }//fallthrough;
2307 {
2309 }break;
2311 {
2313 }break;
2314 }
2315
2317 if (is_static){
2319 }
2320
2321 SYMS_MemFlags flags = 0;
2322 if (is_virtual){
2323 flags |= SYMS_MemFlag_Virtual;
2324 }
2325
2328 if (name.size > 0 && name.str[0] == '~'){
2330 name_destructor_skipped.size -= 1;
2332 }
2333
2336
2338 if (destructor_flag){
2339 flags |= SYMS_MemFlag_Destructor;
2340 }
2341 else{
2342 flags |= SYMS_MemFlag_Constructor;
2343 }
2344 }
2345
2346 out->kind = kind;
2347 out->visibility = visibility;
2348 out->flags = flags;
2349 out->virtual_off = vbaseoff;
2350}
2351
2355 // setup accels
2356 SYMS_MsfAccel *msf = dbg->msf;
2357
2359 if (1 <= n && n <= mems->count){
2360 SYMS_U64 index = n - 1;
2361 SYMS_CvMemStubNode *stub = mems->members[index];
2362
2363 if (stub != 0){
2364 // read kind
2365 SYMS_U32 lf_off = stub->off;
2366 SYMS_MsfRange range = syms_msf_range_from_sn(msf, unit->sn);
2367 SYMS_CvLeaf lf_kind = 0;
2368 syms_msf_read_struct_in_range(data, msf, range, lf_off, &lf_kind);
2369
2370 SYMS_U32 data_off = lf_off + sizeof(lf_kind);
2371
2372 switch (lf_kind){
2373 default:break;
2374
2375 case SYMS_CvLeaf_MEMBER:
2376 {
2378 syms_msf_read_struct_in_range(data, msf, range, data_off, &member);
2379
2382
2384 result.name = syms_push_string_copy(arena, stub->name);
2385 result.visibility = visibility;
2386 result.off = stub->num;
2387 }break;
2388
2390 {
2392 syms_msf_read_struct_in_range(data, msf, range, data_off, &stmember);
2393
2396
2398 result.name = syms_push_string_copy(arena, stub->name);
2399 result.visibility = visibility;
2400 }break;
2401
2402 case SYMS_CvLeaf_METHOD:
2403 {
2404 SYMS_CvLeafMethod method = {0};
2405 syms_msf_read_struct_in_range(data, msf, range, data_off, &method);
2406
2408
2409 if (method_list_stub != 0){
2410 SYMS_U32 rec_off = method_list_stub->off + stub->off2;
2412 syms_msf_read_struct_in_range(data, msf, range, rec_off, &methodrec);
2413 syms_pdb__fill_method_mem_info(data, msf, range, rec_off + sizeof(methodrec), methodrec.attribs,
2414 mems->type_name, stub->name, &result);
2415 result.name = syms_push_string_copy(arena, stub->name);
2416 }
2417 }break;
2418
2420 {
2423
2424 syms_pdb__fill_method_mem_info(data, msf, range, data_off + sizeof(onemethod), onemethod.attribs,
2425 mems->type_name, stub->name, &result);
2426 result.name = syms_push_string_copy(arena, stub->name);
2427 }break;
2428
2431 {
2438 }
2439
2441 result.name = syms_push_string_copy(arena, stub->name);
2442 result.visibility = visibility;
2443 }break;
2444
2445 case SYMS_CvLeaf_BCLASS:
2446 {
2448 syms_msf_read_struct_in_range(data, msf, range, data_off, &bclass);
2449
2452
2454 result.name = syms_push_string_copy(arena, stub->name);
2455 result.visibility = visibility;
2456 result.off = stub->num;
2457 }break;
2458
2461 {
2463 syms_msf_read_struct_in_range(data, msf, range, data_off, &vbclass);
2464
2467
2469 result.name = syms_push_string_copy(arena, stub->name);
2470 result.visibility = visibility;
2471 result.off = stub->num;
2472 }break;
2473
2475 {
2477 syms_msf_read_struct_in_range(data, msf, range, data_off, &vfunctab);
2478
2480 result.off = 0;
2481 }break;
2482
2484 {
2486 syms_msf_read_struct_in_range(data, msf, range, data_off, &vfuncoff);
2487
2489 result.off = vfuncoff.off;
2490 }break;
2491 }
2492 }
2493 }
2494
2495 return(result);
2496}
2497
2500 SYMS_CvMemsAccel *mems, SYMS_U64 n){
2501 // setup accels
2502 SYMS_MsfAccel *msf = dbg->msf;
2503
2504 SYMS_USID result = {0};
2505 if (1 <= n && n <= mems->count){
2506 SYMS_U64 index = n - 1;
2507 SYMS_CvMemStubNode *stub = mems->members[index];
2508
2509 if (stub != 0){
2510 SYMS_U32 lf_off = stub->off;
2511 SYMS_MsfRange range = syms_msf_range_from_sn(msf, unit->sn);
2512 SYMS_CvLeaf lf_kind = 0;
2513 syms_msf_read_struct_in_range(data, msf, range, lf_off, &lf_kind);
2514
2515 SYMS_U32 data_off = lf_off + sizeof(lf_kind);
2516
2517 result.uid = unit->uid;
2518
2519 switch (lf_kind){
2520 default:
2521 {
2522 result.uid = 0;
2523 }break;
2524
2525 case SYMS_CvLeaf_MEMBER:
2526 {
2528 syms_msf_read_struct_in_range(data, msf, range, data_off, &member);
2529
2531 }break;
2532
2534 {
2536 syms_msf_read_struct_in_range(data, msf, range, data_off, &stmember);
2538 }break;
2539
2542 {
2545
2547 }break;
2548
2549 case SYMS_CvLeaf_BCLASS:
2550 {
2552 syms_msf_read_struct_in_range(data, msf, range, data_off, &bclass);
2553
2555 }break;
2556
2559 {
2561 syms_msf_read_struct_in_range(data, msf, range, data_off, &vbclass);
2562
2564 }break;
2565 }
2566 }
2567 }
2568
2569 return(result);
2570}
2571
2575 // setup accels
2576 SYMS_MsfAccel *msf = dbg->msf;
2577
2578 SYMS_SigInfo result = {0};
2579 if (1 <= n && n <= mems->count){
2580 SYMS_U64 index = n - 1;
2581 SYMS_CvMemStubNode *stub = mems->members[index];
2582
2583 if (stub != 0){
2584 // read kind
2585 SYMS_U32 lf_off = stub->off;
2586 SYMS_MsfRange range = syms_msf_range_from_sn(msf, unit->sn);
2587 SYMS_CvLeaf lf_kind = 0;
2588 syms_msf_read_struct_in_range(data, msf, range, lf_off, &lf_kind);
2589
2590 SYMS_U32 data_off = lf_off + sizeof(lf_kind);
2591
2592 switch (lf_kind){
2593 default:
2594 {}break;
2595
2596 case SYMS_CvLeaf_METHOD:
2597 {
2598 SYMS_CvLeafMethod method = {0};
2599 syms_msf_read_struct_in_range(data, msf, range, data_off, &method);
2600
2602 if (method_list_stub != 0){
2603 SYMS_U32 rec_off = method_list_stub->off + stub->off2;
2605 syms_msf_read_struct_in_range(data, msf, range, rec_off, &methodrec);
2606 result = syms_pdb_sig_info_from_sig_index(arena, data, dbg, unit, methodrec.itype);
2607 }
2608 }break;
2609
2611 {
2614 result = syms_pdb_sig_info_from_sig_index(arena, data, dbg, unit, onemethod.itype);
2615 }break;
2616 }
2617 }
2618 }
2619
2620 return(result);
2621}
2622
2625 SYMS_CvUnitAccel *unit, SYMS_SymbolID sid){
2626 // setup accels
2627 SYMS_MsfAccel *msf = dbg->msf;
2628
2629 // dispatch to leaf
2630 SYMS_EnumMemberArray result = {0};
2631 if (unit->leaf_set){
2632 SYMS_MsfRange range = syms_msf_range_from_sn(msf, unit->sn);
2633
2634 // read id
2635 SYMS_CvStub *stub = 0;
2638 }
2639
2640 // extract field list from stub
2641 SYMS_CvTypeIndex ti = 0;
2642 if (stub != 0){
2643 SYMS_CvElement element = syms_cv_element(data, msf, range, stub->off, 1);
2644 if (element.kind == SYMS_CvLeaf_ENUM){
2645 SYMS_CvLeafEnum enum_ = {0};
2646 if (syms_msf_read_struct_in_range(data, msf, element.range, 0, &enum_)){
2647 ti = enum_.field;
2648 }
2649 }
2650 }
2651
2652 // get field list from ti
2654
2655 // parse loop
2656 if (list_stub != 0){
2657 // count the enumerates
2658 SYMS_U64 count = 0;
2660 field_stub != 0;
2661 field_stub = field_stub->sibling_next){
2662 SYMS_U32 lf_off = field_stub->off;
2663 SYMS_CvLeaf lf_kind = 0;
2664 syms_msf_read_struct_in_range(data, msf, range, lf_off, &lf_kind);
2666 count += 1;
2667 }
2668 }
2669
2670 // fill the enumerates array
2671 result.count = count;
2673
2676 field_stub != 0;
2677 field_stub = field_stub->sibling_next){
2678 SYMS_U32 lf_off = field_stub->off;
2679 SYMS_CvLeaf lf_kind = 0;
2680 syms_msf_read_struct_in_range(data, msf, range, lf_off, &lf_kind);
2682 enum_mem_ptr->name = syms_push_string_copy(arena, field_stub->name);
2683 enum_mem_ptr->val = field_stub->num;
2684 enum_mem_ptr += 1;
2685 }
2686 }
2687 }
2688 }
2689
2690 return(result);
2691}
2692
2693
2695//~ allen: PDB Procedure Info
2696
2697// main api
2698
2701 SYMS_SymbolID id){
2702 SYMS_UnitIDAndSig result = {0};
2703
2704 if (!unit->leaf_set){
2705 // setup accels
2706 SYMS_MsfAccel *msf = dbg->msf;
2707
2708 // read id
2709 SYMS_MsfRange range = syms_msf_range_from_sn(msf, unit->sn);
2711
2712 // read proc
2713 if (stub != 0){
2714 SYMS_CvElement element = syms_cv_element(data, msf, range, stub->off, 1);
2715 switch (element.kind){
2716 default:break;
2717
2722 {
2723 SYMS_CvProc32 proc32 = {0};
2724 if (syms_msf_read_struct_in_range(data, msf, element.range, 0, &proc32)){
2725 result.uid = dbg->type_uid;
2726 result.sig.v = proc32.itype;
2727 }
2728 }break;
2729 }
2730 }
2731 }
2732
2733 return(result);
2734}
2735
2739 SYMS_SigInfo result = {0};
2740 if (unit->leaf_set){
2741 result = syms_pdb_sig_info_from_sig_index(arena, data, dbg, unit, handle.v);
2742 }
2743 return(result);
2744}
2745
2748 SYMS_CvUnitAccel *unit, SYMS_SymbolID sid){
2749 SYMS_U64RangeArray result = {0};
2750 if (!unit->leaf_set){
2751 // setup accels
2752 SYMS_MsfAccel *msf = dbg->msf;
2753
2754 // read id
2755 SYMS_MsfRange range = syms_msf_range_from_sn(msf, unit->sn);
2757
2758 // read proc
2759 if (stub != 0){
2760 SYMS_CvElement element = syms_cv_element(data, msf, range, stub->off, 1);
2761 switch (element.kind){
2762 default:break;
2763
2768 {
2769 SYMS_CvProc32 proc32 = {0};
2770 if (syms_msf_read_struct_in_range(data, msf, element.range, 0, &proc32)){
2772
2773 SYMS_U64Range range = {0};
2774 range.min = section_voff + proc32.off;
2775 range.max = range.min + proc32.len;
2776
2777 result.count = 1;
2778 result.ranges = syms_push_array(arena, SYMS_U64Range, 1);
2779 result.ranges[0] = range;
2780 }
2781 }break;
2782
2784 {
2785 SYMS_CvBlock32 block32 = {0};
2786 if (syms_msf_read_struct_in_range(data, msf, element.range, 0, &block32)){
2788
2789 SYMS_U64Range range = {0};
2790 range.min = section_voff + block32.off;
2791 range.max = range.min + block32.len;
2792
2793 result.count = 1;
2794 result.ranges = syms_push_array(arena, SYMS_U64Range, 1);
2795 result.ranges[0] = range;
2796 }
2797 }break;
2798 }
2799 }
2800 }
2801
2802 return(result);
2803}
2804
2808 // dispatch to sym or leaf
2810 SYMS_SymbolIDList list = {0};
2811 if (!unit->leaf_set){
2812 // setup accels
2813 SYMS_MsfAccel *msf = dbg->msf;
2814
2815 // read id
2816 SYMS_MsfRange range = syms_msf_range_from_sn(msf, unit->sn);
2818
2819 // build list
2820 if (stub != 0){
2821 SYMS_CvElement element = syms_cv_element(data, msf, range, stub->off, 1);
2822 switch (element.kind){
2823 default:break;
2824
2830 {
2831 for (SYMS_CvStub *child = stub->first;
2832 child != 0;
2833 child = child->sibling_next){
2835 SYMS_QueuePush(list.first, list.last, node);
2837 list.count += 1;
2838 }
2839 }break;
2840 }
2841 }
2842 }
2843
2844 // convert list to array
2846
2848
2849 return(result);
2850}
2851
2853//~ allen: PDB Signature Info
2854
2855// pdb specific helper
2858 SYMS_CvUnitAccel *unit, SYMS_CvTypeIndex index){
2859 SYMS_SigInfo result = {0};
2860
2861 if (unit->leaf_set){
2862 // setup accels
2863 SYMS_MsfAccel *msf = dbg->msf;
2864
2865 // get unit range
2866 SYMS_MsfRange range = syms_msf_range_from_sn(msf, unit->sn);
2867
2868 // get member function data
2869 SYMS_CvTypeIndex arg_itype = 0;
2870 SYMS_CvTypeIndex ret_itype = 0;
2871 SYMS_CvTypeIndex this_itype = 0;
2872
2873 {
2875 if (sig_stub != 0){
2876 SYMS_CvElement sig_element = syms_cv_element(data, msf, range, sig_stub->off, 1);
2877 switch (sig_element.kind){
2879 {
2880 SYMS_CvLeafProcedure proc = {0};
2881 syms_msf_read_struct_in_range(data, msf, sig_element.range, 0, &proc);
2882 arg_itype = proc.arg_itype;
2883 ret_itype = proc.ret_itype;
2884 }break;
2885
2887 {
2889 syms_msf_read_struct_in_range(data, msf, sig_element.range, 0, &mfunc);
2890 arg_itype = mfunc.arg_itype;
2891 ret_itype = mfunc.ret_itype;
2892 this_itype = mfunc.this_itype;
2893 }break;
2894 }
2895 }
2896 }
2897
2898 // get args list
2901 if (arg_itype != 0){
2903 if (args_stub != 0){
2904 SYMS_CvElement args_element = syms_cv_element(data, msf, range, args_stub->off, 1);
2905 if (args_element.kind == SYMS_CvLeaf_ARGLIST){
2908 args_element.range.size - sizeof(args_list));
2909 }
2910 }
2911 }
2912
2913 // build params list
2914
2916 if (args_list.count > 0){
2919
2923
2925 SYMS_SymbolID *id_ptr = ids;
2927 for (SYMS_U32 i = 0; i < count; i += 1, ti += 1, id_ptr += 1){
2929 }
2930
2931 param_array.ids = ids;
2932 param_array.count = count;
2934 }
2935
2936 result.uid = unit->uid;
2937 result.param_type_ids = param_array;
2940
2941 }
2942
2943 return(result);
2944}
2945
2946// main api
2950 SYMS_SigInfo result = {0};
2951
2952 if (unit->leaf_set){
2953 // setup accels
2954 SYMS_MsfAccel *msf = dbg->msf;
2955 SYMS_MsfRange range = syms_msf_range_from_sn(msf, unit->sn);
2956
2957 // method stub symbol -> sig info
2960 if (stub != 0){
2961 SYMS_U32 lf_off = stub->off;
2962 SYMS_CvLeaf lf_kind = 0;
2963 syms_msf_read_struct_in_range(data, msf, range, lf_off, &lf_kind);
2964
2965 SYMS_U32 data_off = lf_off + sizeof(lf_kind);
2966
2967 switch (lf_kind){
2968 case SYMS_CvLeaf_METHOD:
2969 {
2970 SYMS_CvLeafMethod method = {0};
2971 syms_msf_read_struct_in_range(data, msf, range, data_off, &method);
2972
2974
2975 if (method_list_stub != 0){
2978 syms_msf_read_struct_in_range(data, msf, range, rec_off, &methodrec);
2979 result = syms_pdb_sig_info_from_sig_index(arena, data, dbg, unit, methodrec.itype);
2980 }
2981 }break;
2982
2984 {
2987 result = syms_pdb_sig_info_from_sig_index(arena, data, dbg, unit, onemethod.itype);
2988 }break;
2989 }
2990 }
2991 }
2992
2993 // type symbol -> sig info
2994 else{
2995 result = syms_pdb_sig_info_from_sig_index(arena, data, dbg, unit, SYMS_ID_u32_1(id));
2996 }
2997 }
2998
2999 return(result);
3000}
3001
3003//~ allen: PDB Line Info
3004
3005// main api
3008 SYMS_PdbUnitSetAccel *unit_set, SYMS_UnitID uid, SYMS_FileID id){
3009 // setup accel
3010 SYMS_MsfAccel *msf = dbg->msf;
3011
3012 // read string
3013 SYMS_String8 result = {0};
3014 switch (SYMS_ID_u32_0(id)){
3016 {
3017 SYMS_PdbTpiAccel *ipi = &dbg->ipi;
3019 result = syms_msf_read_zstring_in_range(arena, data, msf, ipi_range, SYMS_ID_u32_1(id));
3020 }break;
3021
3023 {
3024 SYMS_PdbTpiAccel *ipi = &dbg->ipi;
3030 if (syms_msf_read_struct_in_range(data, msf, src_element.range, 0, &string_id)){
3031 result = syms_msf_read_zstring_in_range(arena, data, msf, src_element.range, sizeof(string_id));
3032 }
3033 }
3034 }break;
3035
3037 {
3038 result = syms_pdb_strtbl_string_from_off(arena, data, dbg, SYMS_ID_u32_1(id));
3039 }break;
3040
3042 {
3043 SYMS_PdbCompUnit *comp_unit = syms_pdb_comp_unit_from_id(unit_set, uid);
3045 SYMS_U32 off = SYMS_ID_u32_1(id);
3046 syms_msf_read_in_range(data, msf, c11_range, off, 1, &result.size);
3047 result.str = syms_push_array(arena, SYMS_U8, result.size);
3048 syms_msf_read_in_range(data, msf, c11_range, off + 1, result.size, result.str);
3049 }break;
3050 }
3051 return(result);
3052}
3053
3056 SYMS_PdbUnitSetAccel *unit_set, SYMS_UnitID uid){
3057 SYMS_LineParseOut result = {0};
3058
3059 //- get comp unit
3060 SYMS_PdbCompUnit *comp_unit = syms_pdb_comp_unit_from_id(unit_set, uid);
3061 if (comp_unit != 0){
3063
3064 // build table
3066
3067 SYMS_MsfAccel *msf = dbg->msf;
3068
3069 // try C13
3071 if (c13_range.size > 0){
3074 syms_cv_loose_lines_from_c13(scratch.arena, data, msf, c13_range, list.first,
3075 dbg->section_voffs, dbg->section_count, &loose);
3076 }
3077
3078 // try C11
3080 if (c11_range.size > 0){
3082 dbg->section_voffs, dbg->section_count, &loose);
3083 }
3084
3085 // bake line data
3086 result = syms_cv_line_parse_from_loose(arena, &loose);
3087
3089 }
3090
3091 return(result);
3092}
3093
3094
3096//~ allen: PDB Name Maps
3097
3101 result->format = SYMS_FileFormat_PDB;
3102 result->uid = SYMS_PdbPseudoUnit_TPI;
3103 return(result);
3104}
3105
3113
3118
3121 SYMS_CvUnitAccel *unit, SYMS_PdbMapAccel *map, SYMS_String8 string){
3122 SYMS_USIDList result = {0};
3123 if (unit->format == SYMS_FileFormat_PDB){
3124 switch (map->uid){
3126 {
3127 result = syms_pdb_symbols_from_name(arena, data, dbg->msf, &dbg->gsi, unit, string);
3128 }break;
3129
3131 {
3132 result = syms_pdb_types_from_name(arena, data, dbg, unit, string);
3133 }break;
3134 }
3135 }
3136 return(result);
3137}
3138
3139
3141//~ allen: PDB Mangled Names
3142
3147
3151 result->format = SYMS_FileFormat_PDB;
3152 return(result);
3153}
3154
3158 SYMS_U64 result = 0;
3159
3160 // get accelerators
3161 SYMS_MsfAccel *msf = dbg->msf;
3162 SYMS_PdbGsiAccel *psi = &dbg->psi;
3163
3164 if (psi->bucket_count > 0){
3165 // get unit range
3167
3168 // grab scratch
3170
3171 // get bucket
3174
3175 // iterate bucket
3177 bucket != 0;
3178 bucket = bucket->next){
3179 SYMS_U32 off = bucket->v;
3181 if (stub != 0 && syms_string_match(stub->name, name, 0)){
3182 SYMS_CvElement element = syms_cv_element(data, msf, range, stub->off, 1);
3183 if (element.kind == SYMS_CvSymKind_PUB32){
3184 SYMS_CvPubsym32 pub = {0};
3185 syms_msf_read_struct_in_range(data, msf, element.range, 0, &pub);
3187 result = section_voff + pub.off;
3188 break;
3189 }
3190 }
3191 }
3192
3193 // release scratch
3195 }
3196
3197 return(result);
3198}
3199
3203 SYMS_LinkNameRecArray result = {0};
3204
3205 if (unit->pub_count != 0){
3206 // setup accels
3207 SYMS_MsfAccel *msf = dbg->msf;
3208
3209 // allocate output memory
3210 SYMS_U64 count = unit->pub_count;
3212
3213 // fill output array
3215 SYMS_CvStub **stub_opl = unit->pub_stubs + count;
3216 for (SYMS_CvStub **stub_ptr = unit->pub_stubs; stub_ptr < stub_opl; stub_ptr += 1, rec_ptr += 1){
3217 SYMS_CvStub *stub = *stub_ptr;
3218
3219 // extract rec from stub
3220 SYMS_String8 name = stub->name;
3221 SYMS_U64 voff = 0;
3222 {
3223 SYMS_MsfRange range = syms_msf_range_from_sn(msf, unit->sn);
3224 SYMS_CvElement sig_element = syms_cv_element(data, msf, range, stub->off, 1);
3226 if (syms_msf_read_struct_in_range(data, msf, sig_element.range, 0, &pubsym32)){
3228 voff = section_voff + pubsym32.off;
3229 }
3230 }
3231
3232 // fill stripped rec
3233 rec_ptr->name = syms_push_string_copy(arena, name);
3234 rec_ptr->voff = voff;
3235 }
3236
3237 // fill result struct
3238 result.recs = rec;
3239 result.count = count;
3240 }
3241
3242 return(result);
3243}
3244
3246//~ allen: PDB CV -> Syms Enums and Flags
3247
3251 switch (mode){
3252 default:break;
3253 case SYMS_CvPointerMode_PTR: result = SYMS_TypeKind_Ptr; break;
3258 }
3259 return(result);
3260}
3261
3264 SYMS_TypeModifiers result = 0;
3265 if (attribs & SYMS_CvPointerAttrib_IS_VOLATILE){
3267 }
3268 if (attribs & SYMS_CvPointerAttrib_IS_CONST){
3269 result |= SYMS_TypeModifier_Const;
3270 }
3271 if (attribs & SYMS_CvPointerAttrib_IS_UNALIGNED){
3272 result |= SYMS_TypeModifier_Packed;
3273 }
3276 }
3277 if (attribs & SYMS_CvPointerAttrib_IS_LREF){
3279 }
3280 if (attribs & SYMS_CvPointerAttrib_IS_RREF){
3282 }
3283 return(result);
3284}
3285
3288 SYMS_TypeModifiers result = 0;
3289 if (flags & SYMS_CvModifierFlag_VOLATILE){
3291 }
3292 if (flags & SYMS_CvModifierFlag_CONST){
3293 result |= SYMS_TypeModifier_Const;
3294 }
3295 if (flags & SYMS_CvModifierFlag_UNALIGNED){
3296 result |= SYMS_TypeModifier_Packed;
3297 }
3298 return(result);
3299}
3300
3304 switch (kind){
3329 }
3330 return(result);
3331}
3332
3333#if 0
3336 SYMS_ProcedureFlags result = 0;
3337 if (pdb_flags){
3338
3339 }
3340 return(result);
3341}
3342
3345 SYMS_VarFlags result = 0;
3346 // TODO(allen): canonical flag conversion
3348 result |= SYMS_VarFlag_Parameter;
3349 }
3351 result |= SYMS_VarFlag_CompilerGen;
3352 }
3354 result |= SYMS_VarFlag_Aliased;
3355 }
3357 result |= SYMS_VarFlag_ReturnValue;
3358 }
3360 result |= SYMS_VarFlag_OptOut;
3361 }
3363 result |= SYMS_VarFlag_Static;
3364 }
3366 result |= SYMS_VarFlag_Global;
3367 }
3368 return(result);
3369}
3370#endif
3371
3372#endif //SYMS_PDB_PARSER_C
OODEFFUNC typedef const char * file
Definition oodle2.h:678
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
Definition syms_base.h:402
Definition syms_meta_coff.h:110
Definition syms_debug_info.h:300
Definition syms_meta_cv.h:1703
Definition syms_cv_helpers.h:49
Definition syms_meta_cv.h:1889
Definition syms_meta_cv.h:1858
Definition syms_meta_cv.h:1882
Definition syms_meta_cv.h:1852
Definition syms_meta_cv.h:1863
Definition syms_meta_cv.h:1846
Definition syms_meta_cv.h:1841
Definition syms_cv_helpers.h:28
Definition syms_meta_cv.h:1668
Definition syms_meta_cv.h:2615
Definition syms_meta_cv.h:2687
Definition syms_meta_cv.h:2741
SYMS_CvTypeId field
Definition syms_meta_cv.h:2744
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
SYMS_CvTypeId field
Definition syms_meta_cv.h:2647
Definition syms_meta_cv.h:2623
SYMS_CvTypeId itype
Definition syms_meta_cv.h:2625
Definition syms_meta_cv.h:2605
Definition syms_meta_cv.h:2652
Definition syms_meta_cv.h:2668
SYMS_CvTypeId itype_list
Definition syms_meta_cv.h:2670
Definition syms_meta_cv.h:2735
Definition syms_meta_cv.h:2683
Definition syms_meta_cv.h:2672
Definition syms_meta_cv.h:2598
SYMS_CvTypeId arg_itype
Definition syms_meta_cv.h:2603
SYMS_CvTypeId ret_itype
Definition syms_meta_cv.h:2599
Definition syms_meta_cv.h:2658
Definition syms_meta_cv.h:2723
Definition syms_meta_cv.h:2631
SYMS_CvTypeId field
Definition syms_meta_cv.h:2634
Definition syms_meta_cv.h:2728
Definition syms_meta_cv.h:2638
SYMS_CvTypeId field
Definition syms_meta_cv.h:2641
Definition syms_meta_cv.h:2691
Definition syms_meta_cv.h:2700
Definition syms_meta_cv.h:2696
Definition syms_cv_helpers.h:70
Definition syms_meta_cv.h:1822
SYMS_CvTypeId itype
Definition syms_meta_cv.h:1823
Definition syms_meta_cv.h:1833
Definition syms_meta_cv.h:1828
Definition syms_cv_helpers.h:141
SYMS_U32 off2
Definition syms_cv_helpers.h:146
SYMS_U32 off
Definition syms_cv_helpers.h:145
SYMS_U32 num
Definition syms_cv_helpers.h:144
SYMS_String8 name
Definition syms_cv_helpers.h:143
Definition syms_cv_helpers.h:155
SYMS_CvMemStubNode ** members
Definition syms_cv_helpers.h:159
SYMS_FileFormat format
Definition syms_cv_helpers.h:156
SYMS_U64 count
Definition syms_cv_helpers.h:158
SYMS_String8 type_name
Definition syms_cv_helpers.h:157
Definition syms_cv.h:1015
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:84
struct SYMS_CvStub * parent
Definition syms_cv_helpers.h:86
SYMS_String8 name
Definition syms_cv_helpers.h:95
struct SYMS_CvStub * first
Definition syms_cv_helpers.h:88
SYMS_U32 off
Definition syms_cv_helpers.h:90
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_meta_cv.h:1502
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_B32 leaf_set
Definition syms_cv_helpers.h:106
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_CvStub ** pub_stubs
Definition syms_cv_helpers.h:126
SYMS_UnitID uid
Definition syms_cv_helpers.h:116
Definition syms_debug_info.h:346
SYMS_EnumMember * enum_members
Definition syms_debug_info.h:347
SYMS_U64 count
Definition syms_debug_info.h:348
Definition syms_debug_info.h:341
Definition syms_eval.h:56
Definition syms_debug_info.h:105
Definition syms_debug_info.h:164
Definition syms_debug_info.h:390
SYMS_LinkNameRec * recs
Definition syms_debug_info.h:391
SYMS_U64 count
Definition syms_debug_info.h:392
Definition syms_debug_info.h:385
Definition syms_debug_info.h:361
SYMS_LocRange * loc_ranges
Definition syms_debug_info.h:362
SYMS_U64 count
Definition syms_debug_info.h:363
Definition syms_debug_info.h:371
Definition syms_debug_info.h:366
SYMS_LocRange loc_range
Definition syms_debug_info.h:368
Definition syms_debug_info.h:356
SYMS_LocID loc_id
Definition syms_debug_info.h:358
SYMS_U64Range vrange
Definition syms_debug_info.h:357
Definition syms_eval.h:62
SYMS_EvalOpList op_list
Definition syms_eval.h:63
SYMS_EvalMode mode
Definition syms_eval.h:64
SYMS_B32 is_parameter
Definition syms_eval.h:65
Definition syms_debug_info.h:325
SYMS_U32 off
Definition syms_debug_info.h:330
SYMS_String8 name
Definition syms_debug_info.h:329
SYMS_MemVisibility visibility
Definition syms_debug_info.h:327
SYMS_MemKind kind
Definition syms_debug_info.h:326
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_msf_parser.h:18
SYMS_U32 size
Definition syms_msf_parser.h:21
Definition syms_pdb_parser.h:11
Definition syms_pdb_parser.h:75
struct SYMS_PdbCompUnitNode * next
Definition syms_pdb_parser.h:76
SYMS_PdbCompUnit comp_unit
Definition syms_pdb_parser.h:77
Definition syms_pdb_parser.h:64
SYMS_String8 obj_name
Definition syms_pdb_parser.h:71
SYMS_MsfStreamNumber sn
Definition syms_pdb_parser.h:65
SYMS_PdbStringIndex src_file
Definition syms_pdb_parser.h:68
SYMS_String8 group_name
Definition syms_pdb_parser.h:72
SYMS_U64 range_off[(SYMS_U64)(SYMS_PdbCompUnitRange_COUNT)+1]
Definition syms_pdb_parser.h:66
SYMS_PdbStringIndex pdb_file
Definition syms_pdb_parser.h:69
Definition syms_pdb_parser.h:124
SYMS_FileFormat format
Definition syms_pdb_parser.h:125
SYMS_U64 section_count
Definition syms_pdb_parser.h:151
SYMS_PdbTpiAccel tpi
Definition syms_pdb_parser.h:134
SYMS_U64 * section_voffs
Definition syms_pdb_parser.h:150
SYMS_PdbGsiAccel gsi
Definition syms_pdb_parser.h:136
SYMS_PdbNamedStreamArray named
Definition syms_pdb_parser.h:132
SYMS_MsfRange section_data_range
Definition syms_pdb_parser.h:149
SYMS_PeGuid auth_guid
Definition syms_pdb_parser.h:138
SYMS_PdbGsiAccel psi
Definition syms_pdb_parser.h:137
SYMS_PdbTpiAccel ipi
Definition syms_pdb_parser.h:135
SYMS_UnitID type_uid
Definition syms_pdb_parser.h:146
SYMS_MsfAccel * msf
Definition syms_pdb_parser.h:128
SYMS_PdbDbiAccel dbi
Definition syms_pdb_parser.h:131
SYMS_PdbStrtblAccel strtbl
Definition syms_pdb_parser.h:133
SYMS_Arch arch
Definition syms_pdb_parser.h:143
Definition syms_pdb_parser.h:27
SYMS_MsfStreamNumber dbg_sn[SYMS_PdbDbiStream_COUNT]
Definition syms_pdb_parser.h:35
SYMS_MsfStreamNumber sym_sn
Definition syms_pdb_parser.h:32
SYMS_MsfStreamNumber psi_sn
Definition syms_pdb_parser.h:31
SYMS_B16 valid
Definition syms_pdb_parser.h:28
SYMS_CoffMachineType machine_type
Definition syms_pdb_parser.h:29
SYMS_U64 range_off[(SYMS_U64)(SYMS_PdbDbiRange_COUNT)+1]
Definition syms_pdb_parser.h:34
SYMS_MsfStreamNumber gsi_sn
Definition syms_pdb_parser.h:30
Definition syms_pdb.h:201
SYMS_MsfStreamNumber sn
Definition syms_pdb.h:207
SYMS_U32 c13_lines_size
Definition syms_pdb.h:210
SYMS_PdbStringIndex src_file
Definition syms_pdb.h:216
SYMS_U32 symbol_bytes
Definition syms_pdb.h:208
SYMS_PdbStringIndex pdb_file
Definition syms_pdb.h:217
SYMS_U32 c11_lines_size
Definition syms_pdb.h:209
Definition syms_pdb.h:127
SYMS_U32 sec_con_size
Definition syms_pdb.h:141
SYMS_U32 dbg_header_size
Definition syms_pdb.h:147
SYMS_U32 ec_info_size
Definition syms_pdb.h:148
SYMS_MsfStreamNumber sym_sn
Definition syms_pdb.h:137
SYMS_MsfStreamNumber psi_sn
Definition syms_pdb.h:134
SYMS_U16 machine
Definition syms_pdb.h:151
SYMS_U32 module_info_size
Definition syms_pdb.h:140
SYMS_U32 sec_map_size
Definition syms_pdb.h:142
SYMS_MsfStreamNumber gsi_sn
Definition syms_pdb.h:131
SYMS_U32 tsm_size
Definition syms_pdb.h:145
SYMS_PdbDbiHeaderSig sig
Definition syms_pdb.h:128
SYMS_U32 file_info_size
Definition syms_pdb.h:143
Definition syms_pdb.h:192
Definition syms_pdb.h:176
SYMS_U32 sec_off
Definition syms_pdb.h:178
Definition syms_pdb.h:185
Definition syms_pdb.h:75
SYMS_U32 magic
Definition syms_pdb.h:76
SYMS_U32 version
Definition syms_pdb.h:77
Definition syms_pdb_parser.h:119
SYMS_FileFormat format
Definition syms_pdb_parser.h:120
SYMS_MsfAccel * msf
Definition syms_pdb_parser.h:121
Definition syms_pdb_parser.h:111
SYMS_U32 bucket_count
Definition syms_pdb_parser.h:113
SYMS_PdbChain ** buckets
Definition syms_pdb_parser.h:112
Definition syms_pdb.h:292
Definition syms_pdb.h:285
SYMS_PdbGsiSignature sig
Definition syms_pdb.h:286
SYMS_U32 hr_len
Definition syms_pdb.h:288
SYMS_U32 num_buckets
Definition syms_pdb.h:289
SYMS_PdbGsiVersion ver
Definition syms_pdb.h:287
Definition syms_pdb.h:299
Definition syms_pdb.h:60
SYMS_PdbVersion version
Definition syms_pdb.h:61
Definition syms_pdb_parser.h:38
Definition syms_pdb_parser.h:44
SYMS_PeGuid auth_guid
Definition syms_pdb_parser.h:47
SYMS_PdbInfoSlot * first
Definition syms_pdb_parser.h:45
SYMS_PdbInfoSlot * last
Definition syms_pdb_parser.h:46
Definition syms_pdb_parser.h:162
SYMS_FileFormat format
Definition syms_pdb_parser.h:163
Definition syms_pdb_parser.h:157
SYMS_FileFormat format
Definition syms_pdb_parser.h:158
SYMS_UnitID uid
Definition syms_pdb_parser.h:159
Definition syms_cv_helpers.h:149
Definition syms_pdb_parser.h:50
SYMS_MsfStreamNumber sn[SYMS_PdbNamedStream_COUNT]
Definition syms_pdb_parser.h:51
Definition syms_pdb.h:305
Definition syms_pdb_parser.h:54
SYMS_U32 bucket_count
Definition syms_pdb_parser.h:55
SYMS_MsfStreamNumber sn
Definition syms_pdb_parser.h:56
SYMS_U32Range strblock
Definition syms_pdb_parser.h:57
SYMS_U32Range buckets
Definition syms_pdb_parser.h:58
Definition syms_pdb_parser.h:95
SYMS_MsfStreamNumber type_sn
Definition syms_pdb_parser.h:96
SYMS_U64 count
Definition syms_pdb_parser.h:101
SYMS_U32 base_off
Definition syms_pdb_parser.h:102
SYMS_PdbTpiOffHint * hints
Definition syms_pdb_parser.h:98
SYMS_CvTypeIndex first_ti
Definition syms_pdb_parser.h:103
SYMS_CvTypeIndex opl_ti
Definition syms_pdb_parser.h:104
SYMS_U32 bucket_count
Definition syms_pdb_parser.h:100
SYMS_U32 * off
Definition syms_pdb_parser.h:105
SYMS_PdbChain ** buckets
Definition syms_pdb_parser.h:99
Definition syms_pdb.h:247
Definition syms_pdb.h:265
SYMS_CvTypeIndex ti
Definition syms_pdb.h:266
SYMS_U32 off
Definition syms_pdb.h:267
Definition syms_pdb_parser.h:89
SYMS_U32 first_off
Definition syms_pdb_parser.h:90
SYMS_CvTypeIndex first_ti
Definition syms_pdb_parser.h:91
SYMS_CvTypeIndex opl_ti
Definition syms_pdb_parser.h:92
Definition syms_pdb_parser.h:80
SYMS_PdbCompUnit ** comp_units
Definition syms_pdb_parser.h:82
SYMS_FileFormat format
Definition syms_pdb_parser.h:81
SYMS_U64 comp_count
Definition syms_pdb_parser.h:83
Definition syms_pe.h:71
Definition syms_regs.h:49
SYMS_U16 size
Definition syms_regs.h:52
SYMS_U16 off
Definition syms_regs.h:51
Definition syms_regs.h:55
SYMS_U16 reg_id
Definition syms_regs.h:56
Definition syms_debug_info.h:21
Definition syms_debug_info.h:255
SYMS_U64 v
Definition syms_debug_info.h:256
Definition syms_debug_info.h:334
SYMS_SymbolIDArray param_type_ids
Definition syms_debug_info.h:336
SYMS_SymbolID this_type_id
Definition syms_debug_info.h:338
SYMS_SymbolID return_type_id
Definition syms_debug_info.h:337
SYMS_UnitID uid
Definition syms_debug_info.h:335
SYMS_FileID file_id
Definition syms_debug_info.h:131
SYMS_U32 line
Definition syms_debug_info.h:132
Definition syms_base.h:296
SYMS_U8 * str
Definition syms_base.h:297
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:222
Definition syms_debug_info.h:217
SYMS_SymbolID id
Definition syms_debug_info.h:219
Definition syms_debug_info.h:264
SYMS_SrcCoord src_coord
Definition syms_debug_info.h:278
SYMS_U32 max
Definition syms_base.h:261
SYMS_U32 min
Definition syms_base.h:260
Definition syms_base.h:233
Definition syms_base.h:280
SYMS_U64Range * ranges
Definition syms_base.h:281
SYMS_U64 count
Definition syms_base.h:282
Definition syms_base.h:264
SYMS_U64 max
Definition syms_base.h:266
SYMS_U64 min
Definition syms_base.h:265
Definition syms_debug_info.h:244
SYMS_U64 count
Definition syms_debug_info.h:247
SYMS_USIDNode * last
Definition syms_debug_info.h:246
SYMS_USIDNode * first
Definition syms_debug_info.h:245
Definition syms_debug_info.h:239
SYMS_USID usid
Definition syms_debug_info.h:241
Definition syms_debug_info.h:234
SYMS_UnitID uid
Definition syms_debug_info.h:235
SYMS_SymbolID sid
Definition syms_debug_info.h:236
Definition syms_debug_info.h:259
SYMS_UnitID uid
Definition syms_debug_info.h:260
SYMS_SigHandle sig
Definition syms_debug_info.h:261
Definition syms_debug_info.h:79
SYMS_UnitFeatures features
Definition syms_debug_info.h:80
Definition syms_debug_info.h:84
SYMS_String8 archive_file
Definition syms_debug_info.h:87
SYMS_String8 object_file
Definition syms_debug_info.h:86
Definition syms_debug_info.h:97
Definition syms_debug_info.h:92
SYMS_API SYMS_ArenaTemp syms_get_scratch(SYMS_Arena **conflicts, SYMS_U64 conflict_count)
Definition syms_base.c:694
SYMS_API SYMS_B32 syms_string_match(SYMS_String8 a, SYMS_String8 b, SYMS_StringMatchFlags flags)
Definition syms_base.c:210
SYMS_API SYMS_String8 syms_string_trunc_symbol_heuristic(SYMS_String8 string)
Definition syms_base.c:361
SYMS_API void syms_arena_put_back(SYMS_Arena *arena, SYMS_U64 amount)
Definition syms_base.c:672
SYMS_API void syms_arena_temp_end(SYMS_ArenaTemp temp)
Definition syms_base.c:689
SYMS_API SYMS_String8 syms_push_string_copy(SYMS_Arena *arena, SYMS_String8 string)
Definition syms_base.c:353
SYMS_API SYMS_ArenaTemp syms_arena_temp_begin(SYMS_Arena *arena)
Definition syms_base.c:682
#define syms_true
Definition syms_base.h:105
#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_U32_MAX
Definition syms_base.h:175
#define syms_push_array(a, T, c)
Definition syms_base.h:561
#define syms_memzero_struct(s)
Definition syms_base.h:161
#define SYMS_ClampTop(a, b)
Definition syms_base.h:182
#define SYMS_MEMBER_OFFSET(type, member)
Definition syms_base.h:149
#define SYMS_ClampBot(a, b)
Definition syms_base.h:183
#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_U32 SYMS_RegID
Definition syms_base.h:107
#define SYMS_ID_u16_1(id)
Definition syms_base.h:200
#define SYMS_ID_u32_1(id)
Definition syms_base.h:198
SYMS_S32 SYMS_B32
Definition syms_base.h:99
#define syms_push_array_zero(a, T, c)
Definition syms_base.h:564
#define SYMS_ASSERT_PARANOID(x)
Definition syms_base.h:132
#define SYMS_U64_MAX
Definition syms_base.h:176
#define syms_str8_lit(s)
Definition syms_base.h:483
#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_U32 SYMS_CvTypeIndex
Definition syms_cv.h:10
@ SYMS_CvReg_X86_ESP
Definition syms_cv.h:78
@ SYMS_CvReg_X64_RSP
Definition syms_cv.h:613
SYMS_U32 SYMS_CvItemId
Definition syms_cv.h:14
SYMS_U16 SYMS_CvReg
Definition syms_cv.h:24
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 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_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_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_CvStub * syms_cv_stub_from_unit_index(SYMS_CvUnitAccel *unit, SYMS_U32 index)
Definition syms_cv_helpers.c:1261
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_LineParseOut syms_cv_line_parse_from_loose(SYMS_Arena *arena, SYMS_CvLineTableLoose *loose)
Definition syms_cv_helpers.c:209
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_IPIOff
Definition syms_cv_helpers.h:19
@ SYMS_CvFileIDKind_StrTblOff
Definition syms_cv_helpers.h:21
@ SYMS_CvFileIDKind_C11Off
Definition syms_cv_helpers.h:22
@ SYMS_CvFileIDKind_IPIStringID
Definition syms_cv_helpers.h:20
@ SYMS_CvSymbolIDKind_Off
Definition syms_cv_helpers.h:13
@ SYMS_CvSymbolIDKind_Index
Definition syms_cv_helpers.h:14
SYMS_API SYMS_SymbolIDArray syms_sid_array_from_list(SYMS_Arena *arena, SYMS_SymbolIDList *list)
Definition syms_debug_info.c:115
SYMS_U32 SYMS_MemFlags
Definition syms_debug_info.h:318
SYMS_U64 SYMS_UnitID
Definition syms_debug_info.h:77
SYMS_U64 SYMS_FileID
Definition syms_debug_info.h:128
SYMS_U64 SYMS_SymbolID
Definition syms_debug_info.h:215
SYMS_U64 SYMS_LocID
Definition syms_debug_info.h:354
SYMS_CallConvention
Definition syms_debug_info.h:176
@ SYMS_CallConvention_ALPHACALL
Definition syms_debug_info.h:191
@ SYMS_CallConvention_FAR_C
Definition syms_debug_info.h:179
@ SYMS_CallConvention_INLINE
Definition syms_debug_info.h:200
@ SYMS_CallConvention_ARMCALL
Definition syms_debug_info.h:194
@ SYMS_CallConvention_NEAR_STD
Definition syms_debug_info.h:184
@ SYMS_CallConvention_FAR_FAST
Definition syms_debug_info.h:183
@ SYMS_CallConvention_SHCALL
Definition syms_debug_info.h:193
@ SYMS_CallConvention_FAR_SYS
Definition syms_debug_info.h:187
@ SYMS_CallConvention_NEAR_SYS
Definition syms_debug_info.h:186
@ SYMS_CallConvention_M32RCALL
Definition syms_debug_info.h:198
@ SYMS_CallConvention_THISCALL
Definition syms_debug_info.h:188
@ SYMS_CallConvention_NULL
Definition syms_debug_info.h:177
@ SYMS_CallConvention_FAR_PASCAL
Definition syms_debug_info.h:181
@ SYMS_CallConvention_MIPSCALL
Definition syms_debug_info.h:189
@ SYMS_CallConvention_NEAR_VECTOR
Definition syms_debug_info.h:201
@ SYMS_CallConvention_FAR_STD
Definition syms_debug_info.h:185
@ SYMS_CallConvention_PPCCALL
Definition syms_debug_info.h:192
@ SYMS_CallConvention_NEAR_C
Definition syms_debug_info.h:178
@ SYMS_CallConvention_SH5CALL
Definition syms_debug_info.h:197
@ SYMS_CallConvention_TRICALL
Definition syms_debug_info.h:196
@ SYMS_CallConvention_CLRCALL
Definition syms_debug_info.h:199
@ SYMS_CallConvention_GENERIC
Definition syms_debug_info.h:190
@ SYMS_CallConvention_NEAR_FAST
Definition syms_debug_info.h:182
@ SYMS_CallConvention_AM33CALL
Definition syms_debug_info.h:195
@ SYMS_CallConvention_NEAR_PASCAL
Definition syms_debug_info.h:180
@ SYMS_MemFlag_Destructor
Definition syms_debug_info.h:322
@ SYMS_MemFlag_Constructor
Definition syms_debug_info.h:321
@ SYMS_MemFlag_Virtual
Definition syms_debug_info.h:320
SYMS_MemKind
Definition syms_debug_info.h:306
@ SYMS_MemKind_VTablePtr
Definition syms_debug_info.h:312
@ SYMS_MemKind_StaticMethod
Definition syms_debug_info.h:311
@ SYMS_MemKind_Null
Definition syms_debug_info.h:307
@ SYMS_MemKind_VBaseClassPtr
Definition syms_debug_info.h:314
@ SYMS_MemKind_StaticData
Definition syms_debug_info.h:309
@ SYMS_MemKind_NestedType
Definition syms_debug_info.h:315
@ SYMS_MemKind_Method
Definition syms_debug_info.h:310
@ SYMS_MemKind_DataField
Definition syms_debug_info.h:308
@ SYMS_MemKind_BaseClass
Definition syms_debug_info.h:313
SYMS_READ_ONLY SYMS_GLOBAL SYMS_FileFormat syms_format_nil
Definition syms_debug_info.h:398
#define SYMS_Arena
Definition syms_default_arena.h:61
#define SYMS_ProfEnd()
Definition syms_dev.h:212
#define SYMS_ProfBegin(str)
Definition syms_dev.h:209
SYMS_API void syms_eval_op_encode_reg_section(SYMS_Arena *arena, SYMS_EvalOpList *list, SYMS_RegSection sec)
Definition syms_eval.c:126
SYMS_API void syms_eval_op_push(SYMS_Arena *arena, SYMS_EvalOpList *list, SYMS_EvalOp op, SYMS_EvalOpParams params)
Definition syms_eval.c:41
SYMS_API SYMS_EvalOpParams syms_eval_op_params(SYMS_U64 p)
Definition syms_eval.c:18
SYMS_API void syms_eval_op_encode_u(SYMS_Arena *arena, SYMS_EvalOpList *list, SYMS_U64 u)
Definition syms_eval.c:89
SYMS_API SYMS_EvalOpParams syms_eval_op_params_2u16(SYMS_U16 p1, SYMS_U16 p2)
Definition syms_eval.c:33
@ SYMS_EvalMode_Register
Definition syms_eval.h:19
@ SYMS_EvalMode_Address
Definition syms_eval.h:18
@ SYMS_FileFormat_PDB
Definition syms_meta_base.h:99
@ SYMS_FileFormat_Null
Definition syms_meta_base.h:95
SYMS_Arch
Definition syms_meta_base.h:6
@ SYMS_Arch_X64
Definition syms_meta_base.h:8
@ SYMS_Arch_X86
Definition syms_meta_base.h:9
SYMS_API SYMS_Arch syms_arch_from_coff_machine_type(SYMS_CoffMachineType v)
Definition syms_meta_coff.c:7
SYMS_API SYMS_MemVisibility syms_mem_visibility_from_member_access(SYMS_CvMemberAccess v)
Definition syms_meta_cv.c:32
#define SYMS_CvFrameprocFlags_Extract_ParamBasePointer(f)
Definition syms_meta_cv.h:1667
SYMS_U8 SYMS_CvMemberAccess
Definition syms_meta_cv.h:2471
#define SYMS_CvFieldAttribs_Extract_MPROP(f)
Definition syms_meta_cv.h:2490
@ SYMS_CvEncodedFramePtrReg_BasePtr
Definition syms_meta_cv.h:1639
@ SYMS_CvEncodedFramePtrReg_FramePtr
Definition syms_meta_cv.h:1638
@ SYMS_CvEncodedFramePtrReg_StackPtr
Definition syms_meta_cv.h:1637
@ SYMS_CvRegx86_EBX
Definition syms_meta_cv.h:191
@ SYMS_CvRegx86_EBP
Definition syms_meta_cv.h:193
@ SYMS_CvPointerAttrib_IS_RESTRICTED
Definition syms_meta_cv.h:2411
@ SYMS_CvPointerAttrib_IS_VOLATILE
Definition syms_meta_cv.h:2408
@ SYMS_CvPointerAttrib_IS_UNALIGNED
Definition syms_meta_cv.h:2410
@ SYMS_CvPointerAttrib_IS_CONST
Definition syms_meta_cv.h:2409
@ SYMS_CvPointerAttrib_IS_RREF
Definition syms_meta_cv.h:2415
@ SYMS_CvPointerAttrib_IS_LREF
Definition syms_meta_cv.h:2414
@ SYMS_CvLeaf_PROCEDURE
Definition syms_meta_cv.h:2172
@ SYMS_CvLeaf_IVBCLASS
Definition syms_meta_cv.h:2199
@ SYMS_CvLeaf_STMEMBER
Definition syms_meta_cv.h:2231
@ SYMS_CvLeaf_UDT_SRC_LINE
Definition syms_meta_cv.h:2263
@ SYMS_CvLeaf_ENUMERATE
Definition syms_meta_cv.h:2217
@ SYMS_CvLeaf_MEMBER
Definition syms_meta_cv.h:2230
@ 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_CLASSPTR2
Definition syms_meta_cv.h:2268
@ SYMS_CvLeaf_ARGLIST
Definition syms_meta_cv.h:2187
@ SYMS_CvLeaf_CLASS
Definition syms_meta_cv.h:2219
@ 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_STRING_ID
Definition syms_meta_cv.h:2261
@ SYMS_CvLeaf_UNION
Definition syms_meta_cv.h:2221
@ 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_INDEX
Definition syms_meta_cv.h:2201
@ 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_UDT_MOD_SRC_LINE
Definition syms_meta_cv.h:2265
SYMS_U32 SYMS_CvFrameprocFlags
Definition syms_meta_cv.h:1642
#define SYMS_CvFieldAttribs_Extract_ACCESS(f)
Definition syms_meta_cv.h:2489
@ SYMS_CvRegx64_R13
Definition syms_meta_cv.h:700
@ SYMS_CvRegx64_RSP
Definition syms_meta_cv.h:693
@ SYMS_CvRegx64_RBP
Definition syms_meta_cv.h:692
SYMS_U16 SYMS_CvLocalFlags
Definition syms_meta_cv.h:1808
@ SYMS_CvPointerMode_PMFUNC
Definition syms_meta_cv.h:2396
@ SYMS_CvPointerMode_RVREF
Definition syms_meta_cv.h:2398
@ SYMS_CvPointerMode_LVREF
Definition syms_meta_cv.h:2392
@ SYMS_CvPointerMode_PTR
Definition syms_meta_cv.h:2388
@ SYMS_CvPointerMode_PMEM
Definition syms_meta_cv.h:2394
SYMS_U8 SYMS_CvProcFlags
Definition syms_meta_cv.h:1711
SYMS_U16 SYMS_CvLeaf
Definition syms_meta_cv.h:2107
SYMS_U16 SYMS_CvModifierFlags
Definition syms_meta_cv.h:2314
@ SYMS_CvMethodProp_STATIC
Definition syms_meta_cv.h:2464
@ SYMS_CvMethodProp_PUREINTRO
Definition syms_meta_cv.h:2468
@ SYMS_CvMethodProp_INTRO
Definition syms_meta_cv.h:2466
@ SYMS_CvMethodProp_PUREVIRT
Definition syms_meta_cv.h:2467
@ SYMS_CvMethodProp_VIRTUAL
Definition syms_meta_cv.h:2463
SYMS_GLOBAL SYMS_RegSlice syms_reg_slices_X64[688]
Definition syms_meta_cv.h:3211
@ SYMS_CvLocalFlag_STATIC
Definition syms_meta_cv.h:1820
@ SYMS_CvLocalFlag_ALIASED
Definition syms_meta_cv.h:1815
@ SYMS_CvLocalFlag_GLOBAL
Definition syms_meta_cv.h:1819
@ SYMS_CvLocalFlag_OPTOUT
Definition syms_meta_cv.h:1818
@ SYMS_CvLocalFlag_PARAM
Definition syms_meta_cv.h:1810
@ SYMS_CvLocalFlag_RETVAL
Definition syms_meta_cv.h:1817
@ SYMS_CvLocalFlag_COMPGEN
Definition syms_meta_cv.h:1812
@ 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_FRAMEPROC
Definition syms_meta_cv.h:1203
@ SYMS_CvSymKind_DATAREF
Definition syms_meta_cv.h:1311
@ SYMS_CvSymKind_BLOCK32
Definition syms_meta_cv.h:1249
@ 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_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_U32 SYMS_CvPointerAttribs
Definition syms_meta_cv.h:2403
SYMS_C_LINKAGE_END SYMS_C_LINKAGE_BEGIN SYMS_C_LINKAGE_END SYMS_GLOBAL SYMS_RegSlice syms_reg_slices_X86[396]
Definition syms_meta_cv.h:2813
SYMS_U8 SYMS_CvMethodProp
Definition syms_meta_cv.h:2460
@ SYMS_CvModifierFlag_UNALIGNED
Definition syms_meta_cv.h:2318
@ SYMS_CvModifierFlag_CONST
Definition syms_meta_cv.h:2316
@ SYMS_CvModifierFlag_VOLATILE
Definition syms_meta_cv.h:2317
SYMS_U8 SYMS_CvCallKind
Definition syms_meta_cv.h:2503
@ SYMS_CvCallKind_SHCALL
Definition syms_meta_cv.h:2537
@ SYMS_CvCallKind_M32RCALL
Definition syms_meta_cv.h:2547
@ SYMS_CvCallKind_THISCALL
Definition syms_meta_cv.h:2527
@ SYMS_CvCallKind_NEAR_VECTOR
Definition syms_meta_cv.h:2553
@ SYMS_CvCallKind_NEAR_FAST
Definition syms_meta_cv.h:2513
@ SYMS_CvCallKind_FAR_SYS
Definition syms_meta_cv.h:2525
@ SYMS_CvCallKind_MIPSCALL
Definition syms_meta_cv.h:2529
@ SYMS_CvCallKind_NEAR_C
Definition syms_meta_cv.h:2505
@ SYMS_CvCallKind_CLRCALL
Definition syms_meta_cv.h:2549
@ SYMS_CvCallKind_SH5CALL
Definition syms_meta_cv.h:2545
@ SYMS_CvCallKind_NEAR_SYS
Definition syms_meta_cv.h:2523
@ SYMS_CvCallKind_PPCCALL
Definition syms_meta_cv.h:2535
@ SYMS_CvCallKind_NEAR_PASCAL
Definition syms_meta_cv.h:2509
@ SYMS_CvCallKind_FAR_PASCAL
Definition syms_meta_cv.h:2511
@ SYMS_CvCallKind_ARMCALL
Definition syms_meta_cv.h:2539
@ SYMS_CvCallKind_ALPHACALL
Definition syms_meta_cv.h:2533
@ SYMS_CvCallKind_FAR_FAST
Definition syms_meta_cv.h:2515
@ SYMS_CvCallKind_FAR_STD
Definition syms_meta_cv.h:2521
@ SYMS_CvCallKind_GENERIC
Definition syms_meta_cv.h:2531
@ SYMS_CvCallKind_NEAR_STD
Definition syms_meta_cv.h:2519
@ SYMS_CvCallKind_INLINE
Definition syms_meta_cv.h:2551
@ SYMS_CvCallKind_TRICALL
Definition syms_meta_cv.h:2543
@ SYMS_CvCallKind_FAR_C
Definition syms_meta_cv.h:2507
@ SYMS_CvCallKind_AM33CALL
Definition syms_meta_cv.h:2541
SYMS_U8 SYMS_CvPointerMode
Definition syms_meta_cv.h:2386
SYMS_U16 SYMS_CvFieldAttribs
Definition syms_meta_cv.h:2479
SYMS_U8 SYMS_CvEncodedFramePtrReg
Definition syms_meta_cv.h:1634
#define SYMS_CvFrameprocFlags_Extract_LocalBasePointer(f)
Definition syms_meta_cv.h:1666
SYMS_MemVisibility
Definition syms_meta_debug_info.h:92
@ SYMS_MemVisibility_Public
Definition syms_meta_debug_info.h:95
SYMS_U32 SYMS_TypeModifiers
Definition syms_meta_debug_info.h:81
SYMS_TypeKind
Definition syms_meta_debug_info.h:27
@ SYMS_TypeKind_Null
Definition syms_meta_debug_info.h:28
@ SYMS_TypeKind_LValueReference
Definition syms_meta_debug_info.h:71
@ SYMS_TypeKind_MemberPtr
Definition syms_meta_debug_info.h:73
@ SYMS_TypeKind_RValueReference
Definition syms_meta_debug_info.h:72
@ SYMS_TypeKind_Ptr
Definition syms_meta_debug_info.h:70
@ SYMS_TypeModifier_Volatile
Definition syms_meta_debug_info.h:87
@ SYMS_TypeModifier_Restrict
Definition syms_meta_debug_info.h:85
@ SYMS_TypeModifier_RValueReference
Definition syms_meta_debug_info.h:90
@ SYMS_TypeModifier_Const
Definition syms_meta_debug_info.h:83
@ SYMS_TypeModifier_Packed
Definition syms_meta_debug_info.h:84
@ SYMS_TypeModifier_Reference
Definition syms_meta_debug_info.h:89
SYMS_SymbolKind
Definition syms_meta_debug_info.h:15
@ SYMS_UnitFeature_CompilationUnit
Definition syms_meta_debug_info.h:8
@ SYMS_UnitFeature_ExternVariables
Definition syms_meta_debug_info.h:11
@ SYMS_UnitFeature_FunctionStubs
Definition syms_meta_debug_info.h:13
@ SYMS_UnitFeature_Types
Definition syms_meta_debug_info.h:9
@ SYMS_UnitFeature_Functions
Definition syms_meta_debug_info.h:12
@ SYMS_UnitFeature_StaticVariables
Definition syms_meta_debug_info.h:10
@ SYMS_EvalOp_TLSOff
Definition syms_meta_eval.h:15
@ SYMS_EvalOp_RegRead
Definition syms_meta_eval.h:11
@ SYMS_EvalOp_ModuleOff
Definition syms_meta_eval.h:14
@ SYMS_EvalOp_Add
Definition syms_meta_eval.h:24
@ SYMS_EvalTypeGroup_U
Definition syms_meta_eval.h:64
@ SYMS_RegX64Code_COUNT
Definition syms_meta_regs_x64.h:244
@ SYMS_RegX64Code_rbp
Definition syms_meta_regs_x64.h:93
@ SYMS_RegX86Code_ebp
Definition syms_meta_regs_x86.h:77
@ SYMS_RegX86Code_COUNT
Definition syms_meta_regs_x86.h:168
SYMS_U16 SYMS_MsfStreamNumber
Definition syms_msf.h:11
SYMS_API SYMS_String8 syms_msf_read_whole_range(SYMS_Arena *arena, SYMS_String8 data, SYMS_MsfAccel *msf, SYMS_MsfRange range)
Definition syms_msf_parser.c:418
SYMS_API SYMS_MsfAccel * syms_msf_deep_copy(SYMS_Arena *arena, SYMS_MsfAccel *msf)
Definition syms_msf_parser.c:241
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_sub_range_from_off_range(SYMS_MsfRange range, SYMS_U32Range off_range)
Definition syms_msf_parser.c:393
SYMS_API SYMS_B32 syms_msf_bounds_check(SYMS_MsfAccel *msf, SYMS_MsfStreamNumber sn, SYMS_U32 off)
Definition syms_msf_parser.c:303
SYMS_API SYMS_MsfStreamInfo syms_msf_stream_info_from_sn(SYMS_MsfAccel *msf, SYMS_MsfStreamNumber sn)
Definition syms_msf_parser.c:290
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_MsfAccel * syms_msf_accel_from_data(SYMS_Arena *arena, SYMS_String8 data)
Definition syms_msf_parser.c:56
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
#define syms_msf_read_struct(d, a, sn, off, p)
Definition syms_msf_parser.h:70
SYMS_API SYMS_U32 syms_pdb_hashV1(SYMS_String8 string)
Definition syms_pdb.c:12
@ SYMS_PdbDbiStrTableHeader_MAGIC
Definition syms_pdb.h:72
@ SYMS_PdbFixedStream_DBI
Definition syms_pdb.h:47
@ SYMS_PdbFixedStream_TPI
Definition syms_pdb.h:46
@ SYMS_PdbFixedStream_PDB
Definition syms_pdb.h:45
@ SYMS_PdbFixedStream_IPI
Definition syms_pdb.h:48
@ SYMS_PdbGsiVersion_V70
Definition syms_pdb.h:282
@ SYMS_PdbDbiHeaderSignature_V1
Definition syms_pdb.h:100
SYMS_PdbCompUnitRange
Definition syms_pdb.h:224
@ SYMS_PdbCompUnitRange_COUNT
Definition syms_pdb.h:228
@ SYMS_PdbCompUnitRange_Symbols
Definition syms_pdb.h:225
@ SYMS_PdbCompUnitRange_C11
Definition syms_pdb.h:226
@ SYMS_PdbCompUnitRange_C13
Definition syms_pdb.h:227
SYMS_PdbDbiRange
Definition syms_pdb.h:157
@ SYMS_PdbDbiRange_COUNT
Definition syms_pdb.h:165
@ SYMS_PdbDbiRange_SecMap
Definition syms_pdb.h:160
@ SYMS_PdbDbiRange_DbgHeader
Definition syms_pdb.h:164
@ SYMS_PdbDbiRange_FileInfo
Definition syms_pdb.h:161
@ SYMS_PdbDbiRange_TSM
Definition syms_pdb.h:162
@ SYMS_PdbDbiRange_EcInfo
Definition syms_pdb.h:163
@ SYMS_PdbDbiRange_SecCon
Definition syms_pdb.h:159
@ SYMS_PdbDbiRange_ModuleInfo
Definition syms_pdb.h:158
SYMS_U32 SYMS_PdbDbiStream
Definition syms_pdb.h:82
SYMS_U32 SYMS_PdbStringIndex
Definition syms_pdb.h:37
@ SYMS_PdbDbiStream_SECTION_HEADER
Definition syms_pdb.h:89
SYMS_PdbNamedStream
Definition syms_pdb.h:53
@ SYMS_PdbNamedStream_LINK_INFO
Definition syms_pdb.h:56
@ SYMS_PdbNamedStream_STRTABLE
Definition syms_pdb.h:55
@ SYMS_PdbNamedStream_HEADER_BLOCK
Definition syms_pdb.h:54
@ SYMS_PdbGsiSignature_Basic
Definition syms_pdb.h:277
@ SYMS_PdbTpiVersion_IMPV80
Definition syms_pdb.h:244
#define SYMS_PdbDbiSectionContribVersion_2
Definition syms_pdb.h:173
@ SYMS_PdbVersion_VC80
Definition syms_pdb.h:31
@ SYMS_PdbVersion_VC70
Definition syms_pdb.h:30
@ SYMS_PdbVersion_VC70_DEP
Definition syms_pdb.h:29
@ SYMS_PdbVersion_VC140
Definition syms_pdb.h:33
@ SYMS_PdbVersion_VC110
Definition syms_pdb.h:32
SYMS_U32 SYMS_PdbDbiSectionContribVersion
Definition syms_pdb.h:170
#define SYMS_PdbDbiSectionContribVersion_1
Definition syms_pdb.h:172
SYMS_API SYMS_PdbFileAccel * syms_pdb_file_accel_from_data(SYMS_Arena *arena, SYMS_String8 data)
Definition syms_pdb_parser.c:784
SYMS_API SYMS_Location syms_pdb_location_from_var_sid(SYMS_Arena *arena, SYMS_String8 data, SYMS_PdbDbgAccel *dbg, SYMS_CvUnitAccel *unit, SYMS_SymbolID sid)
Definition syms_pdb_parser.c:1704
SYMS_API SYMS_LocRangeArray syms_pdb_location_ranges_from_var_sid(SYMS_Arena *arena, SYMS_String8 data, SYMS_PdbDbgAccel *dbg, SYMS_CvUnitAccel *unit, SYMS_SymbolID sid)
Definition syms_pdb_parser.c:1825
SYMS_API void syms_pdb_tpi__fill_off_range(SYMS_String8 data, SYMS_MsfAccel *msf, SYMS_PdbTpiAccel *tpi, SYMS_PdbTpiOffRange *fill)
Definition syms_pdb_parser.c:49
SYMS_API SYMS_TypeInfo syms_pdb_type_info_from_sid(SYMS_String8 data, SYMS_PdbDbgAccel *dbg, SYMS_CvUnitAccel *unit, SYMS_SymbolID sid)
Definition syms_pdb_parser.c:1344
SYMS_API SYMS_MsfRange syms_pdb_dbi_sub_range(SYMS_PdbDbiAccel *dbi, SYMS_MsfStreamNumber sn, SYMS_PdbDbiRange n)
Definition syms_pdb_parser.c:541
SYMS_API SYMS_LineParseOut syms_pdb_line_parse_from_uid(SYMS_Arena *arena, SYMS_String8 data, SYMS_PdbDbgAccel *dbg, SYMS_PdbUnitSetAccel *unit_set, SYMS_UnitID uid)
Definition syms_pdb_parser.c:3055
SYMS_API SYMS_CoffSectionHeader syms_pdb_coff_section(SYMS_String8 data, SYMS_PdbDbgAccel *dbg, SYMS_U64 n)
Definition syms_pdb_parser.c:898
SYMS_API SYMS_USID syms_pdb_sym_type_from_var_id(SYMS_String8 data, SYMS_PdbDbgAccel *dbg, SYMS_CvUnitAccel *unit, SYMS_SymbolID id)
Definition syms_pdb_parser.c:1428
SYMS_API SYMS_USIDList syms_pdb_usid_list_from_string(SYMS_Arena *arena, SYMS_String8 data, SYMS_PdbDbgAccel *dbg, SYMS_CvUnitAccel *unit, SYMS_PdbMapAccel *map, SYMS_String8 string)
Definition syms_pdb_parser.c:3120
SYMS_API SYMS_U64 syms_pdb_voff_from_var_sid(SYMS_String8 data, SYMS_PdbDbgAccel *dbg, SYMS_CvUnitAccel *unit, SYMS_SymbolID sid)
Definition syms_pdb_parser.c:1695
SYMS_API SYMS_SigInfo syms_pdb_sig_info_from_handle(SYMS_Arena *arena, SYMS_String8 data, SYMS_PdbDbgAccel *dbg, SYMS_CvUnitAccel *unit, SYMS_SigHandle handle)
Definition syms_pdb_parser.c:2737
SYMS_API void syms_pdb__fill_method_mem_info(SYMS_String8 data, SYMS_MsfAccel *msf, SYMS_MsfRange range, SYMS_U32 vbaseoff_off, SYMS_CvFieldAttribs attribs, SYMS_String8 type_name, SYMS_String8 name, SYMS_MemInfo *out)
Definition syms_pdb_parser.c:2288
SYMS_API SYMS_MsfRange syms_pdb_tpi_range(SYMS_MsfAccel *msf, SYMS_PdbTpiAccel *map)
Definition syms_pdb_parser.c:218
SYMS_API SYMS_PdbStrtblAccel syms_pdb_dbi_parse_strtbl(SYMS_Arena *arena, SYMS_String8 data, SYMS_MsfAccel *msf, SYMS_MsfStreamNumber sn)
Definition syms_pdb_parser.c:693
SYMS_API SYMS_U64RangeArray syms_pdb_scope_vranges_from_sid(SYMS_Arena *arena, SYMS_String8 data, SYMS_PdbDbgAccel *dbg, SYMS_CvUnitAccel *unit, SYMS_SymbolID sid)
Definition syms_pdb_parser.c:2747
SYMS_API SYMS_EnumMemberArray syms_pdb_enum_member_array_from_sid(SYMS_Arena *arena, SYMS_String8 data, SYMS_PdbDbgAccel *dbg, SYMS_CvUnitAccel *unit, SYMS_SymbolID sid)
Definition syms_pdb_parser.c:2624
SYMS_API SYMS_U64 syms_pdb_voff_from_section_n(SYMS_PdbDbgAccel *dbg, SYMS_U64 n)
Definition syms_pdb_parser.c:909
SYMS_API SYMS_SymbolIDArray syms_pdb_scope_children_from_sid(SYMS_Arena *arena, SYMS_String8 data, SYMS_PdbDbgAccel *dbg, SYMS_CvUnitAccel *unit, SYMS_SymbolID id)
Definition syms_pdb_parser.c:2806
SYMS_API SYMS_RegSection syms_pdb_reg_section_from_x86_reg(SYMS_CvReg cv_reg)
Definition syms_pdb_parser.c:1527
SYMS_API SYMS_UnitIDAndSig syms_pdb_proc_sig_handle_from_id(SYMS_String8 data, SYMS_PdbDbgAccel *dbg, SYMS_CvUnitAccel *unit, SYMS_SymbolID id)
Definition syms_pdb_parser.c:2700
SYMS_API SYMS_U32 syms_pdb_tpi_base_off(SYMS_PdbTpiAccel *tpi)
Definition syms_pdb_parser.c:213
SYMS_API SYMS_SigInfo syms_pdb_sig_info_from_id(SYMS_Arena *arena, SYMS_String8 data, SYMS_PdbDbgAccel *dbg, SYMS_CvUnitAccel *unit, SYMS_SymbolID id)
Definition syms_pdb_parser.c:2948
SYMS_API SYMS_SigInfo syms_pdb_sig_info_from_mem_number(SYMS_Arena *arena, SYMS_String8 data, SYMS_PdbDbgAccel *dbg, SYMS_CvUnitAccel *unit, SYMS_CvMemsAccel *mems, SYMS_U64 n)
Definition syms_pdb_parser.c:2573
SYMS_API SYMS_String8 syms_pdb_strtbl_string_from_off(SYMS_Arena *arena, SYMS_String8 data, SYMS_PdbDbgAccel *dbg, SYMS_U32 off)
Definition syms_pdb_parser.c:737
SYMS_API SYMS_PdbTpiOffRange syms_pdb_tpi__hint_from_index(SYMS_PdbTpiAccel *tpi, SYMS_CvTypeIndex ti)
Definition syms_pdb_parser.c:10
SYMS_API SYMS_USID syms_pdb_type_from_var_id(SYMS_String8 data, SYMS_PdbDbgAccel *dbg, SYMS_CvUnitAccel *unit, SYMS_SymbolID id)
Definition syms_pdb_parser.c:1686
SYMS_API SYMS_PdbLinkMapAccel * syms_pdb_link_map_from_dbg(SYMS_Arena *arena, SYMS_String8 data, SYMS_PdbDbgAccel *dbg)
Definition syms_pdb_parser.c:3149
SYMS_API SYMS_U64 syms_pdb_voff_from_link_name(SYMS_String8 data, SYMS_PdbDbgAccel *dbg, SYMS_PdbLinkMapAccel *map, SYMS_CvUnitAccel *link_unit, SYMS_String8 name)
Definition syms_pdb_parser.c:3156
SYMS_API SYMS_CvMemsAccel * syms_pdb_mems_accel_from_sid(SYMS_Arena *arena, SYMS_String8 data, SYMS_PdbDbgAccel *dbg, SYMS_CvUnitAccel *unit, SYMS_SymbolID id)
Definition syms_pdb_parser.c:2202
SYMS_API void syms_pdb__field_list_parse(SYMS_Arena *arena, SYMS_String8 data, SYMS_MsfAccel *msf, SYMS_CvUnitAccel *unit, SYMS_U32 index, SYMS_PdbMemStubList *out)
Definition syms_pdb_parser.c:2113
SYMS_API SYMS_String8 syms_pdb_file_name_from_id(SYMS_Arena *arena, SYMS_String8 data, SYMS_PdbDbgAccel *dbg, SYMS_PdbUnitSetAccel *unit_set, SYMS_UnitID uid, SYMS_FileID id)
Definition syms_pdb_parser.c:3007
SYMS_API SYMS_MsfRange syms_pdb_dbi_stream(SYMS_MsfAccel *msf, SYMS_PdbDbiAccel *dbi, SYMS_PdbDbiStream n)
Definition syms_pdb_parser.c:550
SYMS_API SYMS_UnitID syms_pdb_tls_var_uid_from_dbg(SYMS_PdbDbgAccel *dbg)
Definition syms_pdb_parser.c:1298
SYMS_API SYMS_UnitRangeArray syms_pdb_unit_ranges_from_set(SYMS_Arena *arena, SYMS_String8 data, SYMS_PdbDbgAccel *dbg, SYMS_PdbUnitSetAccel *unit_set)
Definition syms_pdb_parser.c:1123
SYMS_API SYMS_PdbMapAccel * syms_pdb_type_map_from_dbg(SYMS_Arena *arena, SYMS_String8 data, SYMS_PdbDbgAccel *dbg)
Definition syms_pdb_parser.c:3099
SYMS_API SYMS_RegSection syms_pdb_reg_section_from_arch_reg(SYMS_Arch arch, SYMS_CvReg cv_reg)
Definition syms_pdb_parser.c:1557
SYMS_API SYMS_ConstInfo syms_pdb_const_info_from_id(SYMS_String8 data, SYMS_PdbDbgAccel *dbg, SYMS_CvUnitAccel *unit, SYMS_SymbolID sid)
Definition syms_pdb_parser.c:1415
SYMS_API SYMS_UnitID syms_pdb_partner_uid_from_map(SYMS_PdbMapAccel *map)
Definition syms_pdb_parser.c:3115
SYMS_API SYMS_U64 syms_pdb_symbol_count_from_unit(SYMS_CvUnitAccel *unit)
Definition syms_pdb_parser.c:1331
SYMS_API SYMS_USIDList syms_pdb_types_from_name(SYMS_Arena *arena, SYMS_String8 data, SYMS_PdbDbgAccel *dbg, SYMS_CvUnitAccel *unit, SYMS_String8 name)
Definition syms_pdb_parser.c:225
SYMS_API SYMS_USID syms_pdb_type_from_mem_number(SYMS_String8 data, SYMS_PdbDbgAccel *dbg, SYMS_CvUnitAccel *unit, SYMS_CvMemsAccel *mems, SYMS_U64 n)
Definition syms_pdb_parser.c:2499
SYMS_API SYMS_ExtMatchKey syms_pdb_ext_match_key_from_dbg(SYMS_String8 data, SYMS_PdbDbgAccel *dbg)
Definition syms_pdb_parser.c:885
SYMS_API SYMS_SymbolIDArray syms_pdb_tls_var_sid_array_from_unit(SYMS_Arena *arena, SYMS_CvUnitAccel *thread_unit)
Definition syms_pdb_parser.c:1306
SYMS_API SYMS_U64 syms_pdb_mem_count_from_mems(SYMS_CvMemsAccel *mems)
Definition syms_pdb_parser.c:2282
SYMS_API SYMS_U64 syms_pdb_sym_voff_from_var_sid(SYMS_String8 data, SYMS_PdbDbgAccel *dbg, SYMS_CvUnitAccel *unit, SYMS_SymbolID sid)
Definition syms_pdb_parser.c:1494
SYMS_API SYMS_U64 syms_pdb_unit_count_from_set(SYMS_PdbUnitSetAccel *unit_set)
Definition syms_pdb_parser.c:1072
SYMS_API SYMS_MsfRange syms_pdb_gsi_part_from_psi_range(SYMS_MsfRange psi_range)
Definition syms_pdb_parser.c:403
SYMS_API SYMS_PdbNamedStreamArray syms_pdb_named_stream_array(SYMS_PdbInfoTable *table)
Definition syms_pdb_parser.c:652
SYMS_API SYMS_MsfRange syms_pdb_msf_range_from_comp_unit(SYMS_PdbCompUnit *unit, SYMS_PdbCompUnitRange n)
Definition syms_pdb_parser.c:946
SYMS_API SYMS_PdbUnitSetAccel * syms_pdb_unit_set_accel_from_dbg(SYMS_Arena *arena, SYMS_String8 data, SYMS_PdbDbgAccel *dbg)
Definition syms_pdb_parser.c:957
SYMS_API SYMS_PdbCompUnit * syms_pdb_comp_unit_from_id(SYMS_PdbUnitSetAccel *accel, SYMS_UnitID id)
Definition syms_pdb_parser.c:934
SYMS_API SYMS_CvUnitAccel * syms_pdb_pub_sym_accel_from_dbg(SYMS_Arena *arena, SYMS_String8 data, SYMS_PdbDbgAccel *dbg)
Definition syms_pdb_parser.c:1216
SYMS_API SYMS_Location syms_pdb_location_from_id(SYMS_Arena *arena, SYMS_String8 data, SYMS_PdbDbgAccel *dbg, SYMS_CvUnitAccel *unit, SYMS_LocID loc_id)
Definition syms_pdb_parser.c:1977
SYMS_API SYMS_PdbInfoTable syms_pdb_parse_info(SYMS_Arena *arena, SYMS_String8 data, SYMS_MsfAccel *msf)
Definition syms_pdb_parser.c:556
SYMS_API SYMS_SymbolKind syms_pdb_symbol_kind_from_sid(SYMS_String8 data, SYMS_PdbDbgAccel *dbg, SYMS_CvUnitAccel *unit, SYMS_SymbolID sid)
Definition syms_pdb_parser.c:1337
SYMS_API SYMS_UnitNames syms_pdb_unit_names_from_uid(SYMS_Arena *arena, SYMS_PdbUnitSetAccel *unit_set, SYMS_UnitID uid)
Definition syms_pdb_parser.c:1111
SYMS_API SYMS_CvUnitAccel * syms_pdb_leaf_accel_from_dbg(SYMS_Arena *arena, SYMS_String8 data, SYMS_PdbDbgAccel *dbg, SYMS_UnitID uid)
Definition syms_pdb_parser.c:1235
SYMS_API SYMS_RegSection syms_pdb_reg_section_from_framepointer(SYMS_String8 data, SYMS_PdbDbgAccel *dbg, SYMS_MsfRange range, SYMS_CvStub *framepointer_stub)
Definition syms_pdb_parser.c:1567
SYMS_API SYMS_PdbTpiAccel syms_pdb_tpi_accel_from_sn(SYMS_Arena *arena, SYMS_String8 data, SYMS_MsfAccel *msf, SYMS_MsfStreamNumber sn)
Definition syms_pdb_parser.c:82
SYMS_API SYMS_CallConvention syms_pdb_call_convention_from_cv_call_kind(SYMS_CvCallKind kind)
Definition syms_pdb_parser.c:3302
SYMS_API SYMS_CvUnitAccel * syms_pdb_unit_accel_from_uid(SYMS_Arena *arena, SYMS_String8 data, SYMS_PdbDbgAccel *dbg, SYMS_PdbUnitSetAccel *unit_set, SYMS_UnitID uid)
Definition syms_pdb_parser.c:1260
SYMS_API SYMS_PdbMapAccel * syms_pdb_unmangled_symbol_map_from_dbg(SYMS_Arena *arena, SYMS_String8 data, SYMS_PdbDbgAccel *dbg)
Definition syms_pdb_parser.c:3107
SYMS_API SYMS_String8 syms_pdb_strtbl_string_from_index(SYMS_Arena *arena, SYMS_String8 data, SYMS_PdbDbgAccel *dbg, SYMS_PdbStringIndex n)
Definition syms_pdb_parser.c:752
SYMS_API SYMS_UnitID syms_pdb_link_names_uid(void)
Definition syms_pdb_parser.c:3144
SYMS_API SYMS_UnitInfo syms_pdb_unit_info_from_uid(SYMS_PdbUnitSetAccel *unit_set, SYMS_UnitID uid)
Definition syms_pdb_parser.c:1078
SYMS_API SYMS_USIDList syms_pdb_symbols_from_name(SYMS_Arena *arena, SYMS_String8 data, SYMS_MsfAccel *msf, SYMS_PdbGsiAccel *gsi, SYMS_CvUnitAccel *unit, SYMS_String8 name)
Definition syms_pdb_parser.c:420
SYMS_API SYMS_MemInfo syms_pdb_mem_info_from_number(SYMS_Arena *arena, SYMS_String8 data, SYMS_PdbDbgAccel *dbg, SYMS_CvUnitAccel *unit, SYMS_CvMemsAccel *mems, SYMS_U64 n)
Definition syms_pdb_parser.c:2353
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_RegSection syms_pdb_reg_section_from_x64_reg(SYMS_CvReg cv_reg)
Definition syms_pdb_parser.c:1542
SYMS_API SYMS_TypeModifiers syms_pdb_modifier_from_cv_modifier_flags(SYMS_CvModifierFlags flags)
Definition syms_pdb_parser.c:3287
SYMS_API SYMS_PdbDbiAccel syms_pdb_dbi_from_msf(SYMS_String8 data, SYMS_MsfAccel *msf, SYMS_MsfStreamNumber sn)
Definition syms_pdb_parser.c:481
SYMS_API SYMS_U32 syms_pdb_tpi_off_from_ti(SYMS_String8 data, SYMS_MsfAccel *msf, SYMS_PdbTpiAccel *tpi, SYMS_CvTypeIndex ti)
Definition syms_pdb_parser.c:184
SYMS_API SYMS_LinkNameRecArray syms_pdb_link_name_array_from_unit(SYMS_Arena *arena, SYMS_String8 data, SYMS_PdbDbgAccel *dbg, SYMS_CvUnitAccel *unit)
Definition syms_pdb_parser.c:3201
SYMS_API SYMS_Arch syms_pdb_arch_from_dbg(SYMS_PdbDbgAccel *dbg)
Definition syms_pdb_parser.c:875
SYMS_API SYMS_SigInfo syms_pdb_sig_info_from_sig_index(SYMS_Arena *arena, SYMS_String8 data, SYMS_PdbDbgAccel *dbg, SYMS_CvUnitAccel *unit, SYMS_CvTypeIndex index)
Definition syms_pdb_parser.c:2857
SYMS_API SYMS_PdbDbgAccel * syms_pdb_dbg_accel_from_file(SYMS_Arena *arena, SYMS_String8 data, SYMS_PdbFileAccel *file)
Definition syms_pdb_parser.c:796
SYMS_API SYMS_SecInfoArray syms_pdb_sec_info_array_from_dbg(SYMS_Arena *arena, SYMS_String8 data, SYMS_PdbDbgAccel *dbg)
Definition syms_pdb_parser.c:920
SYMS_API SYMS_PdbGsiAccel syms_pdb_gsi_accel_from_range(SYMS_Arena *arena, SYMS_String8 data, SYMS_MsfAccel *msf, SYMS_MsfRange range)
Definition syms_pdb_parser.c:268
#define SYMS_CV_SYMBOL_ALIGN_IN_PDB
Definition syms_pdb_parser.h:169
@ SYMS_PdbPseudoUnit_SYM
Definition syms_pdb_parser.h:18
@ SYMS_PdbPseudoUnit_COUNT
Definition syms_pdb_parser.h:20
@ SYMS_PdbPseudoUnit_FIRST_COMP_UNIT
Definition syms_pdb_parser.h:21
@ SYMS_PdbPseudoUnit_TPI
Definition syms_pdb_parser.h:19
SYMS_API SYMS_U64Array syms_pecoff_voff_array_from_coff_hdr_array(SYMS_Arena *arena, SYMS_CoffSectionHeader *sec_hdrs, SYMS_U64 sec_count)
Definition syms_pecoff_helpers.c:67