X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fobjfiles.c;h=b5bc09f41eafc7f335567d6d8cfc4348dc0af82e;hb=39f34d7b64ee76e07b82a3e57800905d249d8005;hp=bae556a1ff0b56eca5ef1799da0f7365e34ee7cb;hpb=85102364b2d1845fe9ae7d70096671a3ea4bccf3;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/objfiles.c b/gdb/objfiles.c index bae556a1ff..b5bc09f41e 100644 --- a/gdb/objfiles.c +++ b/gdb/objfiles.c @@ -473,10 +473,31 @@ separate_debug_iterator::operator++ () return *this; } +/* Unlink OBJFILE from the list of known objfiles. */ + +static void +unlink_objfile (struct objfile *objfile) +{ + struct objfile **objpp; + + for (objpp = &object_files; *objpp != NULL; objpp = &((*objpp)->next)) + { + if (*objpp == objfile) + { + *objpp = (*objpp)->next; + objfile->next = NULL; + return; + } + } + + internal_error (__FILE__, __LINE__, + _("unlink_objfile: objfile already unlinked")); +} + /* Put one object file before a specified on in the global list. This can be used to make sure an object file is destroyed before another when using objfiles_safe to free all objfiles. */ -void +static void put_objfile_before (struct objfile *objfile, struct objfile *before_this) { struct objfile **objp; @@ -497,38 +518,6 @@ put_objfile_before (struct objfile *objfile, struct objfile *before_this) _("put_objfile_before: before objfile not in list")); } -/* Unlink OBJFILE from the list of known objfiles, if it is found in the - list. - - It is not a bug, or error, to call this function if OBJFILE is not known - to be in the current list. This is done in the case of mapped objfiles, - for example, just to ensure that the mapped objfile doesn't appear twice - in the list. Since the list is threaded, linking in a mapped objfile - twice would create a circular list. - - If OBJFILE turns out to be in the list, we zap it's NEXT pointer after - unlinking it, just to ensure that we have completely severed any linkages - between the OBJFILE and the list. */ - -void -unlink_objfile (struct objfile *objfile) -{ - struct objfile **objpp; - - for (objpp = &object_files; *objpp != NULL; objpp = &((*objpp)->next)) - { - if (*objpp == objfile) - { - *objpp = (*objpp)->next; - objfile->next = NULL; - return; - } - } - - internal_error (__FILE__, __LINE__, - _("unlink_objfile: objfile already unlinked")); -} - /* Add OBJFILE as a separate debug objfile of PARENT. */ void @@ -1019,18 +1008,16 @@ have_minimal_symbols (void) /* Qsort comparison function. */ -static int -qsort_cmp (const void *a, const void *b) +static bool +sort_cmp (const struct obj_section *sect1, const obj_section *sect2) { - const struct obj_section *sect1 = *(const struct obj_section **) a; - const struct obj_section *sect2 = *(const struct obj_section **) b; const CORE_ADDR sect1_addr = obj_section_addr (sect1); const CORE_ADDR sect2_addr = obj_section_addr (sect2); if (sect1_addr < sect2_addr) - return -1; + return true; else if (sect1_addr > sect2_addr) - return 1; + return false; else { /* Sections are at the same address. This could happen if @@ -1047,29 +1034,33 @@ qsort_cmp (const void *a, const void *b) /* Case A. The ordering doesn't matter: separate debuginfo files will be filtered out later. */ - return 0; + return false; } /* Case B. Maintain stable sort order, so bugs in GDB are easier to triage. This section could be slow (since we iterate over all - objfiles in each call to qsort_cmp), but this shouldn't happen + objfiles in each call to sort_cmp), but this shouldn't happen very often (GDB is already in a confused state; one hopes this doesn't happen at all). If you discover that significant time is spent in the loops below, do 'set complaints 100' and examine the resulting complaints. */ - if (objfile1 == objfile2) { - /* Both sections came from the same objfile. We are really confused. - Sort on sequence order of sections within the objfile. */ + /* Both sections came from the same objfile. We are really + confused. Sort on sequence order of sections within the + objfile. The order of checks is important here, if we find a + match on SECT2 first then either SECT2 is before SECT1, or, + SECT2 == SECT1, in both cases we should return false. The + second case shouldn't occur during normal use, but std::sort + does check that '!(a < a)' when compiled in debug mode. */ const struct obj_section *osect; ALL_OBJFILE_OSECTIONS (objfile1, osect) - if (osect == sect1) - return -1; - else if (osect == sect2) - return 1; + if (osect == sect2) + return false; + else if (osect == sect1) + return true; /* We should have found one of the sections before getting here. */ gdb_assert_not_reached ("section not found"); @@ -1080,9 +1071,9 @@ qsort_cmp (const void *a, const void *b) for (objfile *objfile : current_program_space->objfiles ()) if (objfile == objfile1) - return -1; + return true; else if (objfile == objfile2) - return 1; + return false; /* We should have found one of the objfiles before getting here. */ gdb_assert_not_reached ("objfile not found"); @@ -1091,7 +1082,7 @@ qsort_cmp (const void *a, const void *b) /* Unreachable. */ gdb_assert_not_reached ("unexpected code path"); - return 0; + return false; } /* Select "better" obj_section to keep. We prefer the one that came from @@ -1283,7 +1274,7 @@ update_section_map (struct program_space *pspace, if (insert_section_p (objfile->obfd, s->the_bfd_section)) map[i++] = s; - qsort (map, alloc_size, sizeof (*map), qsort_cmp); + std::sort (map, map + alloc_size, sort_cmp); map_size = filter_debuginfo_sections(map, alloc_size); map_size = filter_overlapping_sections(map, map_size);