void vfs_run_callbacks() { for (int i = 0; i < vfs_global->file_count; i++) { for (int j = 0, j_size = stb_arr_len(vfs_global->file_table[i].read_callbacks); j < j_size; j++) { read_callback_t cbck = vfs_global->file_table[i].read_callbacks[j].fn; cbck(vfs_global->file_table[i].simplename, vfs_global->file_table[i].size, vfs_global->file_table[i].data, vfs_global->file_table[i].read_callbacks[j].userdata); } } }
void for_each_scev_op (tree *scev, bool (*cbck) (tree *, void *), void *data) { switch (TREE_CODE_LENGTH (TREE_CODE (*scev))) { case 3: for_each_scev_op (&TREE_OPERAND (*scev, 2), cbck, data); case 2: for_each_scev_op (&TREE_OPERAND (*scev, 1), cbck, data); case 1: for_each_scev_op (&TREE_OPERAND (*scev, 0), cbck, data); default: cbck (scev, data); break; } }
static void vfs_reload(struct vfs_file *f, int force) { time_t lastChange = stb_ftimestamp(f->name); if (f->lastChange != lastChange || force) { f->file = stb_fopen(f->name, "rb"); if (f->file == 0) { return; } fseek(f->file, 0, SEEK_SET); free(f->data); f->lastChange = lastChange; // Hacky solution to make sure the OS is finished with the fseek call // How can this be solved better? f->size = 0; while (f->size == 0) { f->size = stb_filelen(f->file); } f->data = malloc(f->size); fread(f->data, 1, f->size, f->file); stb_fclose(f->file, 0); for (int j = 0, j_size = stb_arr_len(f->read_callbacks); j < j_size; j++) { read_callback_t cbck = f->read_callbacks[j].fn; cbck(f->simplename, f->size, f->data, f->read_callbacks[j].userdata); } } }
bool for_each_index (tree *addr_p, bool (*cbck) (tree, tree *, void *), void *data) { tree *nxt, *idx; for (; ; addr_p = nxt) { switch (TREE_CODE (*addr_p)) { case SSA_NAME: return cbck (*addr_p, addr_p, data); case MISALIGNED_INDIRECT_REF: case ALIGN_INDIRECT_REF: case INDIRECT_REF: nxt = &TREE_OPERAND (*addr_p, 0); return cbck (*addr_p, nxt, data); case BIT_FIELD_REF: case VIEW_CONVERT_EXPR: case REALPART_EXPR: case IMAGPART_EXPR: nxt = &TREE_OPERAND (*addr_p, 0); break; case COMPONENT_REF: /* If the component has varying offset, it behaves like index as well. */ idx = &TREE_OPERAND (*addr_p, 2); if (*idx && !cbck (*addr_p, idx, data)) return false; nxt = &TREE_OPERAND (*addr_p, 0); break; case ARRAY_REF: case ARRAY_RANGE_REF: nxt = &TREE_OPERAND (*addr_p, 0); if (!cbck (*addr_p, &TREE_OPERAND (*addr_p, 1), data)) return false; break; case VAR_DECL: case PARM_DECL: case STRING_CST: case RESULT_DECL: case VECTOR_CST: case COMPLEX_CST: case INTEGER_CST: case REAL_CST: case FIXED_CST: case CONSTRUCTOR: return true; case TARGET_MEM_REF: idx = &TMR_BASE (*addr_p); if (*idx && !cbck (*addr_p, idx, data)) return false; idx = &TMR_INDEX (*addr_p); if (*idx && !cbck (*addr_p, idx, data)) return false; return true; default: gcc_unreachable (); } } }