bool msymbol_is_function (struct objfile *objfile, minimal_symbol *minsym, CORE_ADDR *func_address_p) { CORE_ADDR msym_addr = MSYMBOL_VALUE_ADDRESS (objfile, minsym); switch (minsym->type) { case mst_slot_got_plt: case mst_data: case mst_bss: case mst_abs: case mst_file_data: case mst_file_bss: case mst_data_gnu_ifunc: { struct gdbarch *gdbarch = get_objfile_arch (objfile); CORE_ADDR pc = gdbarch_convert_from_func_ptr_addr (gdbarch, msym_addr, current_top_target ()); if (pc != msym_addr) { if (func_address_p != NULL) *func_address_p = pc; return true; } return false; } default: if (func_address_p != NULL) *func_address_p = msym_addr; return true; } }
struct minimal_symbol * lookup_minimal_symbol_by_pc_name (CORE_ADDR pc, const char *name, struct objfile *objf) { struct objfile *objfile; struct minimal_symbol *msymbol; unsigned int hash = msymbol_hash (name) % MINIMAL_SYMBOL_HASH_SIZE; for (objfile = object_files; objfile != NULL; objfile = objfile->next) { if (objf == NULL || objf == objfile || objf == objfile->separate_debug_objfile_backlink) { for (msymbol = objfile->per_bfd->msymbol_hash[hash]; msymbol != NULL; msymbol = msymbol->hash_next) { if (MSYMBOL_VALUE_ADDRESS (objfile, msymbol) == pc && strcmp (MSYMBOL_LINKAGE_NAME (msymbol), name) == 0) return msymbol; } } } return NULL; }
static void convert_symbol_bmsym (struct compile_c_instance *context, struct bound_minimal_symbol bmsym) { struct minimal_symbol *msym = bmsym.minsym; struct objfile *objfile = bmsym.objfile; struct type *type; enum gcc_c_symbol_kind kind; gcc_type sym_type; gcc_decl decl; CORE_ADDR addr; addr = MSYMBOL_VALUE_ADDRESS (objfile, msym); /* Conversion copied from write_exp_msymbol. */ switch (MSYMBOL_TYPE (msym)) { case mst_text: case mst_file_text: case mst_solib_trampoline: type = objfile_type (objfile)->nodebug_text_symbol; kind = GCC_C_SYMBOL_FUNCTION; break; case mst_text_gnu_ifunc: /* nodebug_text_gnu_ifunc_symbol would cause: function return type cannot be function */ type = objfile_type (objfile)->nodebug_text_symbol; kind = GCC_C_SYMBOL_FUNCTION; addr = gnu_ifunc_resolve_addr (target_gdbarch (), addr); break; case mst_data: case mst_file_data: case mst_bss: case mst_file_bss: type = objfile_type (objfile)->nodebug_data_symbol; kind = GCC_C_SYMBOL_VARIABLE; break; case mst_slot_got_plt: type = objfile_type (objfile)->nodebug_got_plt_symbol; kind = GCC_C_SYMBOL_FUNCTION; break; default: type = objfile_type (objfile)->nodebug_unknown_symbol; kind = GCC_C_SYMBOL_VARIABLE; break; } sym_type = convert_type (context, type); decl = C_CTX (context)->c_ops->build_decl (C_CTX (context), MSYMBOL_NATURAL_NAME (msym), kind, sym_type, NULL, addr, NULL, 0); C_CTX (context)->c_ops->bind (C_CTX (context), decl, 1 /* is_global */); }