MR_Internal * MR_lookup_internal_by_addr(const MR_Code *addr) { MR_do_init_label_tables(); MR_do_init_modules(); #ifdef MR_LOWLEVEL_DEBUG if (MR_progdebug) { printf("looking for internal label at %p\n", addr); } #endif return (MR_Internal *) MR_lookup_hash_table(internal_addr_table, addr); }
MR_Entry * MR_prev_entry_by_addr(const MR_Code *addr) { int lo; int hi; int mid; int i; MR_do_init_label_tables(); MR_do_init_modules(); if (!entry_array_sorted) { qsort(entry_array, entry_array_next, sizeof(MR_Entry), compare_entry_addr); entry_array_sorted = MR_TRUE; } lo = 0; hi = entry_array_next-1; if (lo > hi || addr < entry_array[lo].MR_entry_addr) { return NULL; } while (lo <= hi) { mid = (lo + hi) / 2; if (entry_array[mid].MR_entry_addr == addr) { return &entry_array[mid]; } else if (entry_array[mid].MR_entry_addr < addr) { lo = mid + 1; } else { hi = mid - 1; } } if (lo < entry_array_next && entry_array[lo].MR_entry_addr < addr) { return &entry_array[lo]; } else { return &entry_array[lo - 1]; } }