Lines Matching refs:func
67 struct symbol *func = insn_func(insn); in next_insn_same_func() local
69 if (!func) in next_insn_same_func()
72 if (next && insn_func(next) == func) in next_insn_same_func()
76 if (func == func->cfunc) in next_insn_same_func()
80 return find_insn(file, func->cfunc->sec, func->cfunc->offset); in next_insn_same_func()
112 #define func_for_each_insn(file, func, insn) \ argument
113 for (insn = find_insn(file, func->sec, func->offset); \
205 static bool is_rust_noreturn(const struct symbol *func) in is_rust_noreturn() argument
210 if (strncmp(func->name, "_R", 2)) in is_rust_noreturn()
219 return str_ends_with(func->name, "_4core5sliceSp15copy_from_slice17len_mismatch_fail") || in is_rust_noreturn()
220 str_ends_with(func->name, "_4core6option13unwrap_failed") || in is_rust_noreturn()
221 str_ends_with(func->name, "_4core6result13unwrap_failed") || in is_rust_noreturn()
222 str_ends_with(func->name, "_4core9panicking5panic") || in is_rust_noreturn()
223 str_ends_with(func->name, "_4core9panicking9panic_fmt") || in is_rust_noreturn()
224 str_ends_with(func->name, "_4core9panicking14panic_explicit") || in is_rust_noreturn()
225 str_ends_with(func->name, "_4core9panicking14panic_nounwind") || in is_rust_noreturn()
226 str_ends_with(func->name, "_4core9panicking18panic_bounds_check") || in is_rust_noreturn()
227 str_ends_with(func->name, "_4core9panicking18panic_nounwind_fmt") || in is_rust_noreturn()
228 str_ends_with(func->name, "_4core9panicking19assert_failed_inner") || in is_rust_noreturn()
229 str_ends_with(func->name, "_4core9panicking30panic_null_pointer_dereference") || in is_rust_noreturn()
230 str_ends_with(func->name, "_4core9panicking36panic_misaligned_pointer_dereference") || in is_rust_noreturn()
231 str_ends_with(func->name, "_7___rustc17rust_begin_unwind") || in is_rust_noreturn()
232 strstr(func->name, "_4core9panicking13assert_failed") || in is_rust_noreturn()
233 strstr(func->name, "_4core9panicking11panic_const24panic_const_") || in is_rust_noreturn()
234 (strstr(func->name, "_4core5slice5index") && in is_rust_noreturn()
235 strstr(func->name, "slice_") && in is_rust_noreturn()
236 str_ends_with(func->name, "_fail")); in is_rust_noreturn()
248 static bool __dead_end_function(struct objtool_file *file, struct symbol *func, in __dead_end_function() argument
255 #define NORETURN(func) __stringify(func), in __dead_end_function() argument
261 if (!func) in __dead_end_function()
264 if (func->bind == STB_GLOBAL || func->bind == STB_WEAK) { in __dead_end_function()
265 if (is_rust_noreturn(func)) in __dead_end_function()
269 if (!strcmp(func->name, global_noreturns[i])) in __dead_end_function()
273 if (func->bind == STB_WEAK) in __dead_end_function()
276 if (!func->len) in __dead_end_function()
279 insn = find_insn(file, func->sec, func->offset); in __dead_end_function()
283 func_for_each_insn(file, func, insn) { in __dead_end_function()
298 func_for_each_insn(file, func, insn) { in __dead_end_function()
323 static bool dead_end_function(struct objtool_file *file, struct symbol *func) in dead_end_function() argument
325 return __dead_end_function(file, func, 0); in dead_end_function()
430 struct symbol *func; in decode_instructions() local
502 sec_for_each_sym(sec, func) { in decode_instructions()
503 if (func->type != STT_NOTYPE && func->type != STT_FUNC) in decode_instructions()
506 if (func->offset == sec->sh.sh_size) { in decode_instructions()
508 if (func->type == STT_NOTYPE) in decode_instructions()
510 ERROR("%s(): STT_FUNC at end of section", func->name); in decode_instructions()
514 if (func->embedded_insn || func->alias != func) in decode_instructions()
517 if (!find_insn(file, sec, func->offset)) { in decode_instructions()
518 ERROR("%s(): can't find starting instruction", func->name); in decode_instructions()
522 sym_for_each_insn(file, func, insn) { in decode_instructions()
523 insn->sym = func; in decode_instructions()
524 if (func->type == STT_FUNC && in decode_instructions()
527 if (insn->offset == func->offset) { in decode_instructions()
549 struct symbol *sym, *func; in add_pv_ops() local
567 func = reloc->sym; in add_pv_ops()
568 if (func->type == STT_SECTION) in add_pv_ops()
569 func = find_symbol_by_offset(reloc->sym->sec, in add_pv_ops()
571 if (!func) { in add_pv_ops()
577 if (objtool_pv_add(file, idx, func)) in add_pv_ops()
990 struct symbol *func; in add_ignores() local
1000 func = reloc->sym; in add_ignores()
1004 func = find_func_by_offset(reloc->sym->sec, reloc_addend(reloc)); in add_ignores()
1005 if (!func) in add_ignores()
1015 func->ignore = true; in add_ignores()
1016 if (func->cfunc) in add_ignores()
1017 func->cfunc->ignore = true; in add_ignores()
1215 struct symbol *func; in add_uaccess_safe() local
1222 func = find_symbol_by_name(file->elf, *name); in add_uaccess_safe()
1223 if (!func) in add_uaccess_safe()
1226 func->uaccess_safe = true; in add_uaccess_safe()
1490 struct symbol *func = insn_func(insn); in add_jump_destinations() local
1517 } else if (func) { in add_jump_destinations()
1556 if (file->ignore_unreachables && func && in add_jump_destinations()
1558 dest_off == func->offset + func->len) in add_jump_destinations()
1587 if (func && insn_func(jump_dest) && func != insn_func(jump_dest)) { in add_jump_destinations()
1604 if (!strstr(func->name, ".cold") && in add_jump_destinations()
1606 func->cfunc = insn_func(jump_dest); in add_jump_destinations()
1607 insn_func(jump_dest)->pfunc = func; in add_jump_destinations()
1651 struct symbol *func = insn_func(insn); in add_call_destinations() local
1664 if (func && func->ignore) in add_call_destinations()
1672 if (func && insn_call_dest(insn)->type != STT_FUNC) { in add_call_destinations()
2061 static void find_jump_table(struct objtool_file *file, struct symbol *func, in find_jump_table() argument
2075 insn && insn_func(insn) && insn_func(insn)->pfunc == func; in find_jump_table()
2095 if (!dest_insn || !insn_func(dest_insn) || insn_func(dest_insn)->pfunc != func) in find_jump_table()
2111 struct symbol *func) in mark_func_jump_tables() argument
2115 func_for_each_insn(file, func, insn) { in mark_func_jump_tables()
2136 find_jump_table(file, func, insn); in mark_func_jump_tables()
2141 struct symbol *func) in add_func_jump_tables() argument
2146 func_for_each_insn(file, func, insn) { in add_func_jump_tables()
2165 struct symbol *func; in add_jump_table_alts() local
2171 for_each_sym(file, func) { in add_jump_table_alts()
2172 if (func->type != STT_FUNC) in add_jump_table_alts()
2175 mark_func_jump_tables(file, func); in add_jump_table_alts()
2176 ret = add_func_jump_tables(file, func); in add_jump_table_alts()
2296 int (*func)(struct objtool_file *file, int type, struct instruction *insn)) in read_annotate()
2332 ret = func(file, type, insn); in read_annotate()
2471 struct symbol *func; in classify_symbols() local
2473 for_each_sym(file, func) { in classify_symbols()
2474 if (func->type == STT_NOTYPE && strstarts(func->name, ".L")) in classify_symbols()
2475 func->local_label = true; in classify_symbols()
2477 if (func->bind != STB_GLOBAL) in classify_symbols()
2480 if (!strncmp(func->name, STATIC_CALL_TRAMP_PREFIX_STR, in classify_symbols()
2482 func->static_call_tramp = true; in classify_symbols()
2484 if (arch_is_retpoline(func)) in classify_symbols()
2485 func->retpoline_thunk = true; in classify_symbols()
2487 if (arch_is_rethunk(func)) in classify_symbols()
2488 func->return_thunk = true; in classify_symbols()
2490 if (arch_is_embedded_insn(func)) in classify_symbols()
2491 func->embedded_insn = true; in classify_symbols()
2493 if (arch_ftrace_match(func->name)) in classify_symbols()
2494 func->fentry = true; in classify_symbols()
2496 if (is_profiling_func(func->name)) in classify_symbols()
2497 func->profiling_func = true; in classify_symbols()
3318 static inline bool func_uaccess_safe(struct symbol *func) in func_uaccess_safe() argument
3320 if (func) in func_uaccess_safe()
3321 return func->uaccess_safe; in func_uaccess_safe()
3374 struct symbol *func) in noinstr_call_dest() argument
3380 if (!func) { in noinstr_call_dest()
3390 if (func->sec->noinstr) in noinstr_call_dest()
3396 if (func->static_call_tramp) in noinstr_call_dest()
3404 if (!strncmp(func->name, "__ubsan_handle_", 15)) in noinstr_call_dest()
3445 static int validate_return(struct symbol *func, struct instruction *insn, struct insn_state *state) in validate_return() argument
3452 if (state->uaccess && !func_uaccess_safe(func)) { in validate_return()
3457 if (!state->uaccess && func_uaccess_safe(func)) { in validate_return()
3467 if (func && has_modified_stack_frame(insn, state)) { in validate_return()
3547 static int validate_branch(struct objtool_file *file, struct symbol *func, in validate_branch() argument
3556 if (func && func->ignore) in validate_branch()
3564 if (func && insn_func(insn) && func != insn_func(insn)->pfunc) { in validate_branch()
3566 if (!strncmp(func->name, "__cfi_", 6) || in validate_branch()
3567 !strncmp(func->name, "__pfx_", 6)) in validate_branch()
3574 func->name, insn_func(insn)->name); in validate_branch()
3575 func->warned = 1; in validate_branch()
3601 sym_for_each_insn_continue_reverse(file, func, i) { in validate_branch()
3653 ret = validate_branch(file, func, alt->insn, state); in validate_branch()
3670 return validate_return(func, insn, &state); in validate_branch()
3678 if (opts.stackval && func && !is_special_call(insn) && in validate_branch()
3694 ret = validate_branch(file, func, in validate_branch()
3721 if (func && (!next_insn || !next_insn->hint)) { in validate_branch()
3729 if (func && (!next_insn || !next_insn->hint)) { in validate_branch()
3752 if (!state.uaccess && func) { in validate_branch()
3757 if (func_uaccess_safe(func) && !state.uaccess_stack) { in validate_branch()
3775 if (!state.df && func) { in validate_branch()
3797 func ? func->name : "", func ? "(): " : "", in validate_branch()
4023 struct symbol *func = insn_func(insn); in ignore_unreachable_insn() local
4027 if (insn->type == INSN_NOP || insn->type == INSN_TRAP || (func && func->ignore)) in ignore_unreachable_insn()
4046 if (opts.link && !func) { in ignore_unreachable_insn()
4079 if (!func) in ignore_unreachable_insn()
4082 if (func->static_call_tramp) in ignore_unreachable_insn()
4113 insn_func(insn->jump_dest) == func) { in ignore_unreachable_insn()
4121 if (insn->offset + insn->len >= func->offset + func->len) in ignore_unreachable_insn()
4130 static int add_prefix_symbol(struct objtool_file *file, struct symbol *func) in add_prefix_symbol() argument
4135 insn = find_insn(file, func->sec, func->offset); in add_prefix_symbol()
4147 offset = func->offset - prev->offset; in add_prefix_symbol()
4155 elf_create_prefix_symbol(file->elf, func, opts.prefix); in add_prefix_symbol()
4181 struct symbol *func; in add_prefix_symbols() local
4187 sec_for_each_sym(sec, func) { in add_prefix_symbols()
4188 if (func->type != STT_FUNC) in add_prefix_symbols()
4191 add_prefix_symbol(file, func); in add_prefix_symbols()
4228 struct symbol *func; in validate_section() local
4231 sec_for_each_sym(sec, func) { in validate_section()
4232 if (func->type != STT_FUNC) in validate_section()
4238 warnings += validate_symbol(file, sec, func, &state); in validate_section()