struct block * get_frame_block (struct frame_info *frame, CORE_ADDR *addr_in_block) { CORE_ADDR pc; struct block *bl; int inline_count; if (!get_frame_address_in_block_if_available (frame, &pc)) return NULL; if (addr_in_block) *addr_in_block = pc; bl = block_for_pc (pc); if (bl == NULL) return NULL; inline_count = frame_inlined_callees (frame); while (inline_count > 0) { if (block_inlined_p (bl)) inline_count--; bl = BLOCK_SUPERBLOCK (bl); gdb_assert (bl != NULL); } return bl; }
struct symbol * block_linkage_function (const struct block *bl) { while ((BLOCK_FUNCTION (bl) == NULL || block_inlined_p (bl)) && BLOCK_SUPERBLOCK (bl) != NULL) bl = BLOCK_SUPERBLOCK (bl); return BLOCK_FUNCTION (bl); }
int contained_in (const struct block *a, const struct block *b) { if (!a || !b) return 0; do { if (a == b) return 1; /* If A is a function block, then A cannot be contained in B, except if A was inlined. */ if (BLOCK_FUNCTION (a) != NULL && !block_inlined_p (a)) return 0; a = BLOCK_SUPERBLOCK (a); } while (a != NULL); return 0; }