Lines Matching refs:cfi

241 static void init_cfi_state(struct cfi_state *cfi)  in init_cfi_state()  argument
246 cfi->regs[i].base = CFI_UNDEFINED; in init_cfi_state()
247 cfi->vals[i].base = CFI_UNDEFINED; in init_cfi_state()
249 cfi->cfa.base = CFI_UNDEFINED; in init_cfi_state()
250 cfi->drap_reg = CFI_UNDEFINED; in init_cfi_state()
251 cfi->drap_offset = -1; in init_cfi_state()
257 init_cfi_state(&state->cfi); in init_insn_state()
304 init_cfi_state(&insn->cfi); in decode_instructions()
1096 orig_alt_group->cfi = calloc(special_alt->orig_len, in handle_group_alt()
1098 if (!orig_alt_group->cfi) { in handle_group_alt()
1139 init_cfi_state(&nop->cfi); in handle_group_alt()
1214 new_alt_group->cfi = orig_alt_group->cfi; in handle_group_alt()
1589 set_func_state(&insn->cfi); in read_unwind_hints()
1599 insn->cfi.cfa.offset = bswap_if_needed(hint->sp_offset); in read_unwind_hints()
1600 insn->cfi.type = hint->type; in read_unwind_hints()
1601 insn->cfi.end = hint->end; in read_unwind_hints()
1880 struct cfi_state *cfi = &state->cfi; in has_modified_stack_frame() local
1883 if (cfi->cfa.base != initial_func_cfi.cfa.base || cfi->drap) in has_modified_stack_frame()
1886 if (cfi->cfa.offset != initial_func_cfi.cfa.offset) in has_modified_stack_frame()
1889 if (cfi->stack_size != initial_func_cfi.cfa.offset) in has_modified_stack_frame()
1893 if (cfi->regs[i].base != initial_func_cfi.regs[i].base || in has_modified_stack_frame()
1894 cfi->regs[i].offset != initial_func_cfi.regs[i].offset) in has_modified_stack_frame()
1910 struct cfi_state *cfi = &state->cfi; in has_valid_stack_frame() local
1912 if (cfi->cfa.base == CFI_BP && in has_valid_stack_frame()
1913 check_reg_frame_pos(&cfi->regs[CFI_BP], -cfi->cfa.offset) && in has_valid_stack_frame()
1914 check_reg_frame_pos(&cfi->regs[CFI_RA], -cfi->cfa.offset + 8)) in has_valid_stack_frame()
1917 if (cfi->drap && cfi->regs[CFI_BP].base == CFI_BP) in has_valid_stack_frame()
1924 struct cfi_state *cfi, in update_cfi_state_regs() argument
1927 struct cfi_reg *cfa = &cfi->cfa; in update_cfi_state_regs()
1948 static void save_reg(struct cfi_state *cfi, unsigned char reg, int base, int offset) in save_reg() argument
1951 cfi->regs[reg].base == CFI_UNDEFINED) { in save_reg()
1952 cfi->regs[reg].base = base; in save_reg()
1953 cfi->regs[reg].offset = offset; in save_reg()
1957 static void restore_reg(struct cfi_state *cfi, unsigned char reg) in restore_reg() argument
1959 cfi->regs[reg].base = initial_func_cfi.regs[reg].base; in restore_reg()
1960 cfi->regs[reg].offset = initial_func_cfi.regs[reg].offset; in restore_reg()
2018 struct cfi_state *cfi, struct stack_op *op) in update_cfi_state() argument
2020 struct cfi_reg *cfa = &cfi->cfa; in update_cfi_state()
2021 struct cfi_reg *regs = cfi->regs; in update_cfi_state()
2032 if (cfi->type == UNWIND_HINT_TYPE_REGS || in update_cfi_state()
2033 cfi->type == UNWIND_HINT_TYPE_REGS_PARTIAL) in update_cfi_state()
2034 return update_cfi_state_regs(insn, cfi, op); in update_cfi_state()
2048 cfi->bp_scratch = false; in update_cfi_state()
2052 op->dest.reg == CFI_BP && cfi->drap) { in update_cfi_state()
2056 regs[CFI_BP].offset = -cfi->stack_size; in update_cfi_state()
2057 cfi->bp_scratch = false; in update_cfi_state()
2072 cfi->vals[op->dest.reg].base = CFI_CFA; in update_cfi_state()
2073 cfi->vals[op->dest.reg].offset = -cfi->stack_size; in update_cfi_state()
2077 (cfa->base == CFI_BP || cfa->base == cfi->drap_reg)) { in update_cfi_state()
2084 cfi->stack_size = -cfi->regs[CFI_BP].offset; in update_cfi_state()
2091 cfi->vals[op->src.reg].base == CFI_CFA) { in update_cfi_state()
2101 cfa->offset = -cfi->vals[op->src.reg].offset; in update_cfi_state()
2102 cfi->stack_size = cfa->offset; in update_cfi_state()
2105 cfi->vals[op->src.reg].base == CFI_SP_INDIRECT && in update_cfi_state()
2106 cfi->vals[op->src.reg].offset == cfa->offset) { in update_cfi_state()
2143 cfi->vals[op->src.reg].base == CFI_SP_INDIRECT && in update_cfi_state()
2144 cfi->vals[op->src.reg].offset == cfa->offset) { in update_cfi_state()
2152 cfi->stack_size += 8; in update_cfi_state()
2162 cfi->stack_size -= op->src.offset; in update_cfi_state()
2171 cfi->stack_size = -(op->src.offset + regs[CFI_BP].offset); in update_cfi_state()
2175 if (!cfi->drap && op->src.reg == CFI_SP && in update_cfi_state()
2182 cfi->bp_scratch = false; in update_cfi_state()
2189 cfi->drap_reg = op->dest.reg; in update_cfi_state()
2201 cfi->vals[op->dest.reg].base = CFI_CFA; in update_cfi_state()
2202 cfi->vals[op->dest.reg].offset = \ in update_cfi_state()
2203 -cfi->stack_size + op->src.offset; in update_cfi_state()
2208 if (cfi->drap && op->dest.reg == CFI_SP && in update_cfi_state()
2209 op->src.reg == cfi->drap_reg) { in update_cfi_state()
2213 cfa->offset = cfi->stack_size = -op->src.offset; in update_cfi_state()
2214 cfi->drap_reg = CFI_UNDEFINED; in update_cfi_state()
2215 cfi->drap = false; in update_cfi_state()
2219 if (op->dest.reg == cfi->cfa.base && !(next_insn && next_insn->hint)) { in update_cfi_state()
2229 (cfi->drap_reg != CFI_UNDEFINED && cfa->base != CFI_SP) || in update_cfi_state()
2230 (cfi->drap_reg == CFI_UNDEFINED && cfa->base != CFI_BP)) { in update_cfi_state()
2236 if (cfi->drap_reg != CFI_UNDEFINED) { in update_cfi_state()
2238 cfa->base = cfi->drap_reg; in update_cfi_state()
2239 cfa->offset = cfi->stack_size = 0; in update_cfi_state()
2240 cfi->drap = true; in update_cfi_state()
2259 if (!cfi->drap && op->dest.reg == cfa->base) { in update_cfi_state()
2265 if (cfi->drap && cfa->base == CFI_BP_INDIRECT && in update_cfi_state()
2266 op->dest.reg == cfi->drap_reg && in update_cfi_state()
2267 cfi->drap_offset == -cfi->stack_size) { in update_cfi_state()
2270 cfa->base = cfi->drap_reg; in update_cfi_state()
2272 cfi->drap_offset = -1; in update_cfi_state()
2274 } else if (cfi->stack_size == -regs[op->dest.reg].offset) { in update_cfi_state()
2277 restore_reg(cfi, op->dest.reg); in update_cfi_state()
2280 cfi->stack_size -= 8; in update_cfi_state()
2287 if (!cfi->drap && op->dest.reg == cfa->base && in update_cfi_state()
2292 cfa->offset = cfi->stack_size; in update_cfi_state()
2295 if (cfi->drap && op->src.reg == CFI_BP && in update_cfi_state()
2296 op->src.offset == cfi->drap_offset) { in update_cfi_state()
2299 cfa->base = cfi->drap_reg; in update_cfi_state()
2301 cfi->drap_offset = -1; in update_cfi_state()
2304 if (cfi->drap && op->src.reg == CFI_BP && in update_cfi_state()
2308 restore_reg(cfi, op->dest.reg); in update_cfi_state()
2315 restore_reg(cfi, op->dest.reg); in update_cfi_state()
2318 op->src.offset == regs[op->dest.reg].offset + cfi->stack_size) { in update_cfi_state()
2321 restore_reg(cfi, op->dest.reg); in update_cfi_state()
2336 cfi->stack_size += 8; in update_cfi_state()
2343 if (cfi->drap) { in update_cfi_state()
2344 if (op->src.reg == cfa->base && op->src.reg == cfi->drap_reg) { in update_cfi_state()
2348 cfa->offset = -cfi->stack_size; in update_cfi_state()
2351 cfi->drap_offset = -cfi->stack_size; in update_cfi_state()
2353 } else if (op->src.reg == CFI_BP && cfa->base == cfi->drap_reg) { in update_cfi_state()
2356 cfi->stack_size = 0; in update_cfi_state()
2361 save_reg(cfi, op->src.reg, CFI_BP, -cfi->stack_size); in update_cfi_state()
2367 save_reg(cfi, op->src.reg, CFI_CFA, -cfi->stack_size); in update_cfi_state()
2373 cfi->bp_scratch = true; in update_cfi_state()
2378 if (cfi->drap) { in update_cfi_state()
2379 if (op->src.reg == cfa->base && op->src.reg == cfi->drap_reg) { in update_cfi_state()
2386 cfi->drap_offset = op->dest.offset; in update_cfi_state()
2390 save_reg(cfi, op->src.reg, CFI_BP, op->dest.offset); in update_cfi_state()
2397 save_reg(cfi, op->src.reg, CFI_CFA, in update_cfi_state()
2398 op->dest.offset - cfi->cfa.offset); in update_cfi_state()
2403 save_reg(cfi, op->src.reg, CFI_CFA, in update_cfi_state()
2404 op->dest.offset - cfi->stack_size); in update_cfi_state()
2409 cfi->vals[op->dest.reg].base = CFI_SP_INDIRECT; in update_cfi_state()
2410 cfi->vals[op->dest.reg].offset = cfa->offset; in update_cfi_state()
2423 cfi->stack_size -= 8; in update_cfi_state()
2455 alt_cfi = insn->alt_group->cfi; in propagate_alt_cfi()
2459 alt_cfi[group_off] = &insn->cfi; in propagate_alt_cfi()
2461 if (memcmp(alt_cfi[group_off], &insn->cfi, sizeof(struct cfi_state))) { in propagate_alt_cfi()
2479 if (update_cfi_state(insn, next_insn, &state->cfi, op)) in handle_insn_ops()
2512 struct cfi_state *cfi1 = &insn->cfi; in insn_cfi_match()
2664 if (state->cfi.bp_scratch) { in validate_return()
2723 if (!insn->hint && !insn_cfi_match(insn, &state.cfi)) in validate_branch()
2734 state.cfi = insn->cfi; in validate_branch()
2736 insn->cfi = state.cfi; in validate_branch()
2880 if (state.cfi.cfa.base == CFI_UNDEFINED) in validate_branch()
3075 set_func_state(&state.cfi); in validate_section()