UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
syms_file_inf.c
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#ifndef SYMS_FILE_INF_C
4#define SYMS_FILE_INF_C
5
7// NOTE(allen): File Inference Functions
8
12 SYMS_ProfBegin("syms_file_inf_infer_from_file_list");
13
15 if (opts_ptr != 0){
16 syms_memmove(&opts, opts_ptr, sizeof(opts));
17 }
18
19 SYMS_FileInfState state = {0};
21
22 //- dump input file names into task queue
23 for (SYMS_String8Node *node = file_name_list.first;
24 node != 0;
25 node = node->next){
27 task->file_name = node->string;
28 }
29
30 //- while there are tasks in the task queue, analyze each task
31 for (;;){
33 if (task == 0){
34 break;
35 }
36
37 //- file load setup
38 SYMS_String8 file_name = task->file_name;
41 SYMS_String8 data = {0};
42
43 //- try the path exactly as stated
45 if (existing_node == 0){
46 syms_string_list_push(scratch.arena, &new_names, file_name);
47 SYMS_ProfBegin("syms_file_inf_infer_from_file_list.file_load_func");
48 data = ctx.file_load_func(ctx.file_load_user, arena, file_name);
50 }
51 else{
52 data = existing_node->data;
53 }
54
55 //- try the fallback path
56 if ((existing_node == 0 && data.size == 0) &&
57 !opts.disable_fallback && opts.fallback_path.size != 0){
58 // skip last slash
59 SYMS_U8 *ptr = file_name.str + file_name.size - 1;
60 for (;ptr >= file_name.str; ptr -= 1){
61 if (*ptr == '/' || *ptr == '\\'){
62 break;
63 }
64 }
65 ptr += 1;
66 SYMS_U8 *opl = file_name.str + file_name.size;
68
69 // concat strings
71 {
72 joined_path.size = opts.fallback_path.size + file_name_without_path.size + 1;
73 joined_path.str = syms_push_array(arena, SYMS_U8, joined_path.size + 1);
74 syms_memmove(joined_path.str, opts.fallback_path.str, opts.fallback_path.size);
75 syms_memmove(joined_path.str + opts.fallback_path.size, "/", 1);
76 syms_memmove(joined_path.str + opts.fallback_path.size + 1,
78 joined_path.str[joined_path.size] = 0;
79 }
80
82 if (existing_node == 0){
84 data = ctx.file_load_func(ctx.file_load_user, arena, joined_path);
85 }
86 else{
87 data = existing_node->data;
88 }
89 }
90
91 //- PE/PDB specific fallback
92 if ((existing_node == 0 && data.size == 0) &&
93 !opts.disable_fallback && task->inferred_from_node != 0 &&
94 task->inferred_from_node->bin->format == SYMS_FileFormat_PE){
95 SYMS_String8 inferred_from_file_name = task->inferred_from_node->file_name;
96 if (inferred_from_file_name.size >= 4){
101 {
103 file_name_pdb.str = syms_push_array(arena, SYMS_U8, file_name_pdb.size + 1);
105 syms_memmove(file_name_pdb.str + file_name_head.size, ".pdb", 4);
106 file_name_pdb.str[file_name_pdb.size] = 0;
107 }
108
110 if (existing_node == 0){
112 data = ctx.file_load_func(ctx.file_load_user, arena, file_name_pdb);
113 }
114 else{
115 data = existing_node->data;
116 }
117 }
118 }
119 }
120
121 //- analyze
125 if (existing_node != 0){
126 file = existing_node->file;
127 bin = existing_node->bin;
128 dbg = existing_node->dbg;
129 }
130 else if (data.size != 0){
131 file = syms_file_accel_from_data(arena, data);
132
133 //- set bin
134 // try bin from bin list
138
139 SYMS_U64 number = 1;
140 SYMS_Arch arch_hint = opts_ptr->preferred_arch;
143 for (SYMS_U64 i = 0; i < bin_info_array.count; i += 1){
144 if (bin_info_array.bin_info[i].arch == arch_hint){
145 number = i + 1;
146 break;
147 }
148 }
149 }
151
153 }
154
155 // try bin from file
156 if (bin->format == SYMS_FileFormat_Null){
157 bin = syms_bin_accel_from_file(arena, data, file);
158 }
159
160 //- set dbg
161 // try dbg from file
162 dbg = syms_dbg_accel_from_file(arena, data, file);
163
164 // try dbg from bin
165 if (bin->format != SYMS_FileFormat_Null &&
167 dbg = syms_dbg_accel_from_bin(arena, data, bin);
168 }
169 }
170
171 //- save nodes
172 SYMS_B32 inferred = (task->inferred_from_node != 0);
176 new_name_node != 0;
179 new_node->file_name = new_name_node->string;
180 new_node->data = data;
181 new_node->file = file;
182 new_node->bin = bin;
183 new_node->dbg = dbg;
184 new_node->inferred = inferred;
185
186 if (new_name_node == new_names.first){
188 }
189 if (new_name_node == new_names.last){
191 }
192 }
193
194 //- fill in fallback pointers on new nodes
196 new_node != 0;
198 new_node->fallback_to = new_node->next;
199 }
200
201 //- run file inference
202 if (existing_node == 0 && !opts.disable_inference){
204 ext[0] = syms_ext_file_list_from_bin(arena, data, bin);
205 ext[1] = syms_ext_file_list_from_dbg(arena, data, dbg);
206 for (SYMS_U64 i = 0; i < SYMS_ARRAY_SIZE(ext); i += 1){
207 for (SYMS_ExtFileNode *node = ext[i].first;
208 node != 0;
209 node = node->next){
210 SYMS_String8 ext_file_name = node->ext_file.file_name;
212 task->file_name = ext_file_name;
213 task->inferred_from_node = last_new_node;
214 }
215 }
216 }
217
219 }
220
221 //- select bin_node & dbg_node
224
225 //- is there a working bin in the list?
226 for (SYMS_FileInfNode *node = state.first_loaded;
227 node != 0;
228 node = node->next){
229 if (node->bin->format != SYMS_FileFormat_Null){
230 bin_node = node;
231 break;
232 }
233 }
234
235 //- first compatible dbg
236 if (bin_node != 0){
237 for (SYMS_FileInfNode *node = state.first_loaded;
238 node != 0;
239 node = node->next){
240
241 // TODO(allen): check for compatibility for real
243 if (node->dbg->format != SYMS_FileFormat_Null){
245 SYMS_FileFormat dbg_format = node->dbg->format;
246
248 switch (bin_format){
252 }
255 }
256 }
257
258 if (compatible){
259 dbg_node = node;
260 break;
261 }
262 }
263 }
264
265 //- first dbg
266 else{
267 for (SYMS_FileInfNode *node = state.first_loaded;
268 node != 0;
269 node = node->next){
270 if (node->dbg->format != SYMS_FileFormat_Null){
271 dbg_node = node;
272 break;
273 }
274 }
275 }
276
277 //- advance selected nodes through fallback chains
278 if (bin_node != 0){
279 for (;bin_node->fallback_to != 0; bin_node = bin_node->fallback_to);
280 }
281 if (dbg_node != 0){
282 for (;dbg_node->fallback_to != 0; dbg_node = dbg_node->fallback_to);
283 }
284
286
287 //- fill data_parsed
288 SYMS_ParseBundle data_parsed = {0};
289 data_parsed.bin = (SYMS_BinAccel*)&syms_format_nil;
290 data_parsed.dbg = (SYMS_DbgAccel*)&syms_format_nil;
291 if (bin_node != 0){
292 data_parsed.bin_data = bin_node->data;
293 data_parsed.bin = bin_node->bin;
294 }
295 if (dbg_node != 0){
296 data_parsed.dbg_data = dbg_node->data;
297 data_parsed.dbg = dbg_node->dbg;
298 }
299
300 //- mark the selected nodes
301 if (bin_node != 0){
302 bin_node->is_selected_bin = syms_true;
303 }
304 if (dbg_node != 0){
305 dbg_node->is_selected_dbg = syms_true;
306 }
307
308 //- set result
309 SYMS_FileInfResult result = {0};
310 result.first_inf_node = state.first_loaded;
311 result.last_inf_node = state.last_loaded;
312 result.selected_bin = bin_node;
313 result.selected_dbg = dbg_node;
314 result.data_parsed = data_parsed;
315
316 SYMS_ProfEnd();
317
318 return(result);
319}
320
330
333 SYMS_FileInfState result = {0};
334 return(result);
335}
336
339 SYMS_ProfBegin("syms_file_inf_node_from_name");
340 SYMS_FileInfNode *result = 0;
341 for (SYMS_FileInfNode *node = state->first_loaded;
342 node != 0;
343 node = node->next){
344 if (syms_string_match(file_name, node->file_name, 0)){
345 result = node;
346 break;
347 }
348 }
349 SYMS_ProfEnd();
350 return(result);
351}
352
356 SYMS_QueuePush(state->first_loaded, state->last_loaded, result);
357 return(result);
358}
359
362 SYMS_FileInfTask *result = state->free_task;
363 if (result != 0){
364 syms_memzero_struct(result);
365 }
366 else{
367 result = syms_push_array_zero(arena, SYMS_FileInfTask, 1);
368 }
369 SYMS_QueuePush(state->first_task, state->last_task, result);
370 return(result);
371}
372
373SYMS_API void
376 if (task != 0){
377 SYMS_QueuePop(state->first_task, state->last_task);
379 }
380}
381
382#endif //SYMS_FILE_INF_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_debug_info.h:31
Definition syms_debug_info.h:119
Definition syms_debug_info.h:114
struct SYMS_ExtFileNode * next
Definition syms_debug_info.h:115
Definition syms_file_inf.h:17
SYMS_BinAccel * bin
Definition syms_file_inf.h:23
struct SYMS_FileInfNode * next
Definition syms_file_inf.h:18
Definition syms_file_inf.h:47
Definition syms_file_inf.h:54
SYMS_ParseBundle data_parsed
Definition syms_file_inf.h:59
SYMS_FileInfNode * selected_dbg
Definition syms_file_inf.h:58
SYMS_FileInfNode * last_inf_node
Definition syms_file_inf.h:56
SYMS_FileInfNode * first_inf_node
Definition syms_file_inf.h:55
SYMS_FileInfNode * selected_bin
Definition syms_file_inf.h:57
Definition syms_file_inf.h:39
SYMS_FileInfTask * last_task
Definition syms_file_inf.h:43
SYMS_FileInfNode * last_loaded
Definition syms_file_inf.h:41
SYMS_FileInfTask * first_task
Definition syms_file_inf.h:42
SYMS_FileInfNode * first_loaded
Definition syms_file_inf.h:40
SYMS_FileInfTask * free_task
Definition syms_file_inf.h:44
Definition syms_file_inf.h:33
Definition syms_file_inf.h:12
SYMS_FileLoadFunc * file_load_func
Definition syms_file_inf.h:13
void * file_load_user
Definition syms_file_inf.h:14
Definition syms_parser.h:74
SYMS_String8 dbg_data
Definition syms_parser.h:76
SYMS_String8 bin_data
Definition syms_parser.h:75
SYMS_DbgAccel * dbg
Definition syms_parser.h:78
SYMS_BinAccel * bin
Definition syms_parser.h:77
Definition syms_base.h:306
Definition syms_base.h:301
Definition syms_base.h:296
SYMS_U8 * str
Definition syms_base.h:297
SYMS_U64 size
Definition syms_base.h:298
SYMS_API SYMS_String8 syms_str8_range(SYMS_U8 *first, SYMS_U8 *opl)
Definition syms_base.c:184
SYMS_API SYMS_ArenaTemp syms_get_scratch(SYMS_Arena **conflicts, SYMS_U64 conflict_count)
Definition syms_base.c:694
SYMS_API SYMS_B32 syms_string_match(SYMS_String8 a, SYMS_String8 b, SYMS_StringMatchFlags flags)
Definition syms_base.c:210
SYMS_API void syms_string_list_push_node(SYMS_String8Node *node, SYMS_String8List *list, SYMS_String8 string)
Definition syms_base.c:264
SYMS_API void syms_string_list_push(SYMS_Arena *arena, SYMS_String8List *list, SYMS_String8 string)
Definition syms_base.c:282
#define syms_true
Definition syms_base.h:105
#define SYMS_StackPush(f, n)
Definition syms_base.h:227
#define syms_push_array(a, T, c)
Definition syms_base.h:561
#define syms_memzero_struct(s)
Definition syms_base.h:161
#define syms_false
Definition syms_base.h:104
#define SYMS_API
Definition syms_base.h:29
#define SYMS_ARRAY_SIZE(x)
Definition syms_base.h:144
#define SYMS_QueuePop(f, l)
Definition syms_base.h:222
SYMS_S32 SYMS_B32
Definition syms_base.h:99
#define syms_push_array_zero(a, T, c)
Definition syms_base.h:564
#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
uint64_t SYMS_U64
Definition syms_crt_overrides.h:39
#define syms_memmove
Definition syms_crt_overrides.h:65
uint8_t SYMS_U8
Definition syms_crt_overrides.h:36
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 SYMS_FileInfResult syms_file_inf_infer_from_file_list(SYMS_Arena *arena, SYMS_FileLoadCtx ctx, SYMS_String8List file_name_list, SYMS_FileInfOptions *opts_ptr)
Definition syms_file_inf.c:10
SYMS_API SYMS_FileInfNode * syms_file_inf_insert_node(SYMS_Arena *arena, SYMS_FileInfState *state)
Definition syms_file_inf.c:354
SYMS_API SYMS_FileInfTask * syms_file_inf_push_task(SYMS_Arena *arena, SYMS_FileInfState *state)
Definition syms_file_inf.c:361
SYMS_API SYMS_FileInfNode * syms_file_inf_node_from_name(SYMS_FileInfState *state, SYMS_String8 file_name)
Definition syms_file_inf.c:338
SYMS_API SYMS_FileInfState syms_file_inf_begin(void)
Definition syms_file_inf.c:332
SYMS_API void syms_file_inf_pop_task(SYMS_FileInfState *state)
Definition syms_file_inf.c:374
SYMS_API SYMS_FileInfResult syms_file_inf_infer_from_file(SYMS_Arena *arena, SYMS_FileLoadCtx ctx, SYMS_String8 file_name, SYMS_FileInfOptions *opts)
Definition syms_file_inf.c:322
SYMS_FileFormat
Definition syms_meta_base.h:94
@ SYMS_FileFormat_PDB
Definition syms_meta_base.h:99
@ SYMS_FileFormat_ELF
Definition syms_meta_base.h:97
@ SYMS_FileFormat_Null
Definition syms_meta_base.h:95
@ SYMS_FileFormat_DWARF
Definition syms_meta_base.h:100
@ SYMS_FileFormat_PE
Definition syms_meta_base.h:96
@ SYMS_FileFormat_MACH
Definition syms_meta_base.h:98
SYMS_Arch
Definition syms_meta_base.h:6
@ SYMS_Arch_Null
Definition syms_meta_base.h:7
SYMS_API SYMS_DbgAccel * syms_dbg_accel_from_bin(SYMS_Arena *arena, SYMS_String8 data, SYMS_BinAccel *bin)
Definition syms_parser.c:375
SYMS_API SYMS_ExtFileList syms_ext_file_list_from_bin(SYMS_Arena *arena, SYMS_String8 data, SYMS_BinAccel *accel)
Definition syms_parser.c:112
SYMS_API SYMS_BinInfoArray syms_bin_info_array_from_bin_list(SYMS_Arena *arena, SYMS_BinListAccel *list)
Definition syms_parser.c:293
SYMS_API SYMS_BinAccel * syms_bin_accel_from_bin_list_number(SYMS_Arena *arena, SYMS_String8 data, SYMS_BinListAccel *list, SYMS_U64 n)
Definition syms_parser.c:308
SYMS_API SYMS_FileAccel * syms_file_accel_from_data(SYMS_Arena *arena, SYMS_String8 data)
Definition syms_parser.c:10
SYMS_API SYMS_BinListAccel * syms_bin_list_from_file(SYMS_Arena *arena, SYMS_String8 data, SYMS_FileAccel *file)
Definition syms_parser.c:278
SYMS_API SYMS_BinAccel * syms_bin_accel_from_file(SYMS_Arena *arena, SYMS_String8 data, SYMS_FileAccel *file)
Definition syms_parser.c:60
SYMS_API SYMS_ExtFileList syms_ext_file_list_from_dbg(SYMS_Arena *arena, SYMS_String8 data, SYMS_DbgAccel *dbg)
Definition syms_parser.c:417
SYMS_API SYMS_B32 syms_file_is_bin_list(SYMS_FileAccel *file)
Definition syms_parser.c:266
SYMS_API SYMS_DbgAccel * syms_dbg_accel_from_file(SYMS_Arena *arena, SYMS_String8 data, SYMS_FileAccel *accel)
Definition syms_parser.c:341
Definition syms_parser.h:18
SYMS_FileFormat format
Definition syms_parser.h:19
Definition syms_parser.h:25
Definition syms_parser.h:30
SYMS_FileFormat format
Definition syms_parser.h:31
Definition syms_parser.h:10