public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
* [RFA] Use FILENAME_CMP to compare filenames in compare_search_syms.
@ 2013-10-01  9:07 Joel Brobecker
  2013-10-01  9:54 ` Pedro Alves
  0 siblings, 1 reply; 5+ messages in thread
From: Joel Brobecker @ 2013-10-01  9:07 UTC (permalink / raw)
  To: gdb-patches

Hello,

While working on an unrelated issue, I noticed that two symbols were
sorted differently on Windows, compared to the other Unix platforms.
I tracked it down to compare_search_syms which compares filenames
using a plain strcmp instead of FILENAME_CMP.

Not sure how to create a testcase...

gdb/ChangeLog:

        * symtab.c (compare_search_syms): Use FILENAME_CMP instead of
        strcmp to compare two symtab filenames.

Tested on x86-windows and x86_64-linux, no regression.
OK to apply?

Thanks,
-- 
Joel

---
 gdb/symtab.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/gdb/symtab.c b/gdb/symtab.c
index dbff042..93d29d6 100644
--- a/gdb/symtab.c
+++ b/gdb/symtab.c
@@ -3336,7 +3336,7 @@ compare_search_syms (const void *sa, const void *sb)
   struct symbol_search *sym_b = *(struct symbol_search **) sb;
   int c;
 
-  c = strcmp (sym_a->symtab->filename, sym_b->symtab->filename);
+  c = FILENAME_CMP (sym_a->symtab->filename, sym_b->symtab->filename);
   if (c != 0)
     return c;
 
-- 
1.8.1.2

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [RFA] Use FILENAME_CMP to compare filenames in compare_search_syms.
  2013-10-01  9:07 [RFA] Use FILENAME_CMP to compare filenames in compare_search_syms Joel Brobecker
@ 2013-10-01  9:54 ` Pedro Alves
  2013-10-01 12:30   ` Joel Brobecker
  0 siblings, 1 reply; 5+ messages in thread
From: Pedro Alves @ 2013-10-01  9:54 UTC (permalink / raw)
  To: Joel Brobecker; +Cc: gdb-patches

On 10/01/2013 10:07 AM, Joel Brobecker wrote:
> Hello,
> 
> While working on an unrelated issue, I noticed that two symbols were
> sorted differently on Windows, compared to the other Unix platforms.
> I tracked it down to compare_search_syms which compares filenames
> using a plain strcmp instead of FILENAME_CMP.
> 
> Not sure how to create a testcase...
> 
> gdb/ChangeLog:
> 
>         * symtab.c (compare_search_syms): Use FILENAME_CMP instead of
>         strcmp to compare two symtab filenames.
> 
> Tested on x86-windows and x86_64-linux, no regression.
> OK to apply?

I'd say that use of FILENAME_CMP instead of strcmp is an obvious change.

However, this is not complete.  This function is called by:

/* Sort the NFOUND symbols in list FOUND and remove duplicates.
   The duplicates are freed, and the new list is returned in
   *NEW_HEAD, *NEW_TAIL.  */

static void
sort_search_symbols_remove_dups (struct symbol_search *found, int nfound,
				 struct symbol_search **new_head,
				 struct symbol_search **new_tail)
{
...
  qsort (symbols, nfound, sizeof (struct symbol_search *),
	 compare_search_syms);

So this is sorting symbols, to then walk over the sorted list
linearly and remove dups.  That happens right afterwards:

  /* Collapse out the dups.  */
  for (i = 1, j = 1; i < nfound; ++i)
    {
      if (! search_symbols_equal (symbols[j - 1], symbols[i]))
	symbols[j++] = symbols[i];
      else
	xfree (symbols[i]);
    }

So the compare_search_syms and search_symbols_equal predicates
_must_ agree.  And, lo, search_symbols_equal also has that strcmp
that would need adjustment as well:

 static int
 search_symbols_equal (const struct symbol_search *a,
 		      const struct symbol_search *b)
 {
   return (strcmp (a->symtab->filename, b->symtab->filename) == 0
 	  && a->block == b->block
 	  && strcmp (SYMBOL_PRINT_NAME (a->symbol),
 		     SYMBOL_PRINT_NAME (b->symbol)) == 0);
 }


But really, so that this sort of out-of-sync bugs doesn't
happen, it'd be better if search_symbols_equal were reimplemented
in terms of compare_search_syms or even be eliminated.

-- 
Pedro Alves

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [RFA] Use FILENAME_CMP to compare filenames in compare_search_syms.
  2013-10-01  9:54 ` Pedro Alves
@ 2013-10-01 12:30   ` Joel Brobecker
  2013-10-01 15:14     ` Pedro Alves
  0 siblings, 1 reply; 5+ messages in thread
From: Joel Brobecker @ 2013-10-01 12:30 UTC (permalink / raw)
  To: Pedro Alves; +Cc: gdb-patches

[-- Attachment #1: Type: text/plain, Size: 1323 bytes --]

> I'd say that use of FILENAME_CMP instead of strcmp is an obvious change.
> 
> However, this is not complete.  This function is called by:
[...]
> But really, so that this sort of out-of-sync bugs doesn't
> happen, it'd be better if search_symbols_equal were reimplemented
> in terms of compare_search_syms or even be eliminated.

Indeed! I'm turning this fix into a 2-patch series:

  1. Delete search_symbols_equal

     This patch does not fix anything, other than removing the duplication.

     I pondered a bit over that change, thinking maybe we'd want
     to keep it, just because the arguments have the right type
     instead of "void *". In the end, I felt it was sufficiently
     localized that deleting was OK. Putting it back is easy,
     though, so whichever we want it shall be.

  2. The patch I initially proposed.

     This patch implements the strcmp -> FILENAME_CMP fix.

gdb/ChangeLog:

        * symtab.c (search_symbols_equal): Delete.
        (sort_search_symbols_remove_dups): Replace call to
        search_symbols_equal by call to compare_search_syms,
        adjusting as necessary.

gdb/ChangeLog:

        * symtab.c (compare_search_syms): Use FILENAME_CMP instead of
        strcmp to compare two symtab filenames.

Tested on x86_64-linux, no regression. OK to apply?

Thanks,
-- 
Joel

[-- Attachment #2: 0001-Delete-search_symbols_equal-use-compare_search_syms-.patch --]
[-- Type: text/x-diff, Size: 1845 bytes --]

From 56b13bd393e3e1a205888af374a236aae668140a Mon Sep 17 00:00:00 2001
From: Joel Brobecker <brobecker@adacore.com>
Date: Tue, 1 Oct 2013 14:15:46 +0200
Subject: [PATCH 1/2] Delete search_symbols_equal (use compare_search_syms
 instead).

This avoids duplicating the logic comparing two symbol_search
objects (in search_symbols_equal and compare_search_syms).

gdb/ChangeLog:

        * symtab.c (search_symbols_equal): Delete.
        (sort_search_symbols_remove_dups): Replace call to
        search_symbols_equal by call to compare_search_syms,
        adjusting as necessary.
---
 gdb/symtab.c | 15 +--------------
 1 file changed, 1 insertion(+), 14 deletions(-)

diff --git a/gdb/symtab.c b/gdb/symtab.c
index dbff042..cf03b43 100644
--- a/gdb/symtab.c
+++ b/gdb/symtab.c
@@ -3347,19 +3347,6 @@ compare_search_syms (const void *sa, const void *sb)
 		 SYMBOL_PRINT_NAME (sym_b->symbol));
 }
 
-/* Helper function for sort_search_symbols_remove_dups.
-   Return TRUE if symbols A, B are equal.  */
-
-static int
-search_symbols_equal (const struct symbol_search *a,
-		      const struct symbol_search *b)
-{
-  return (strcmp (a->symtab->filename, b->symtab->filename) == 0
-	  && a->block == b->block
-	  && strcmp (SYMBOL_PRINT_NAME (a->symbol),
-		     SYMBOL_PRINT_NAME (b->symbol)) == 0);
-}
-
 /* Sort the NFOUND symbols in list FOUND and remove duplicates.
    The duplicates are freed, and the new list is returned in
    *NEW_HEAD, *NEW_TAIL.  */
@@ -3393,7 +3380,7 @@ sort_search_symbols_remove_dups (struct symbol_search *found, int nfound,
   /* Collapse out the dups.  */
   for (i = 1, j = 1; i < nfound; ++i)
     {
-      if (! search_symbols_equal (symbols[j - 1], symbols[i]))
+      if (compare_search_syms (&symbols[j - 1], &symbols[i]) != 0)
 	symbols[j++] = symbols[i];
       else
 	xfree (symbols[i]);
-- 
1.8.1.2


[-- Attachment #3: 0002-Use-FILENAME_CMP-to-compare-filenames-in-compare_sea.patch --]
[-- Type: text/x-diff, Size: 889 bytes --]

From a191522c5b61288616ef91780f4e89edbf4d33fb Mon Sep 17 00:00:00 2001
From: Joel Brobecker <brobecker@adacore.com>
Date: Thu, 12 Sep 2013 14:03:47 -0400
Subject: [PATCH 2/2] Use FILENAME_CMP to compare filenames in
 compare_search_syms.

gdb/ChangeLog:

        * symtab.c (compare_search_syms): Use FILENAME_CMP instead of
        strcmp to compare two symtab filenames.
---
 gdb/symtab.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/gdb/symtab.c b/gdb/symtab.c
index cf03b43..d3622e5 100644
--- a/gdb/symtab.c
+++ b/gdb/symtab.c
@@ -3336,7 +3336,7 @@ compare_search_syms (const void *sa, const void *sb)
   struct symbol_search *sym_b = *(struct symbol_search **) sb;
   int c;
 
-  c = strcmp (sym_a->symtab->filename, sym_b->symtab->filename);
+  c = FILENAME_CMP (sym_a->symtab->filename, sym_b->symtab->filename);
   if (c != 0)
     return c;
 
-- 
1.8.1.2


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [RFA] Use FILENAME_CMP to compare filenames in compare_search_syms.
  2013-10-01 12:30   ` Joel Brobecker
@ 2013-10-01 15:14     ` Pedro Alves
  2013-10-02  9:24       ` Joel Brobecker
  0 siblings, 1 reply; 5+ messages in thread
From: Pedro Alves @ 2013-10-01 15:14 UTC (permalink / raw)
  To: Joel Brobecker; +Cc: gdb-patches

On 10/01/2013 01:30 PM, Joel Brobecker wrote:
>> I'd say that use of FILENAME_CMP instead of strcmp is an obvious change.
>>
>> However, this is not complete.  This function is called by:
> [...]
>> But really, so that this sort of out-of-sync bugs doesn't
>> happen, it'd be better if search_symbols_equal were reimplemented
>> in terms of compare_search_syms or even be eliminated.
> 
> Indeed! I'm turning this fix into a 2-patch series:
> 
>   1. Delete search_symbols_equal
> 
>      This patch does not fix anything, other than removing the duplication.
> 
>      I pondered a bit over that change, thinking maybe we'd want
>      to keep it, just because the arguments have the right type
>      instead of "void *". In the end, I felt it was sufficiently
>      localized that deleting was OK. Putting it back is easy,
>      though, so whichever we want it shall be.

This is fine with me.

>         * symtab.c (compare_search_syms): Use FILENAME_CMP instead of
>         strcmp to compare two symtab filenames.

This one looks obvious to me.

Thanks,
-- 
Pedro Alves

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [RFA] Use FILENAME_CMP to compare filenames in compare_search_syms.
  2013-10-01 15:14     ` Pedro Alves
@ 2013-10-02  9:24       ` Joel Brobecker
  0 siblings, 0 replies; 5+ messages in thread
From: Joel Brobecker @ 2013-10-02  9:24 UTC (permalink / raw)
  To: Pedro Alves; +Cc: gdb-patches

> > Indeed! I'm turning this fix into a 2-patch series:
> > 
> >   1. Delete search_symbols_equal
> > 
> >      This patch does not fix anything, other than removing the duplication.
> > 
> >      I pondered a bit over that change, thinking maybe we'd want
> >      to keep it, just because the arguments have the right type
> >      instead of "void *". In the end, I felt it was sufficiently
> >      localized that deleting was OK. Putting it back is easy,
> >      though, so whichever we want it shall be.
> 
> This is fine with me.
> 
> >         * symtab.c (compare_search_syms): Use FILENAME_CMP instead of
> >         strcmp to compare two symtab filenames.
> 
> This one looks obvious to me.

Thanks, Pedro. Both patches are now in.

-- 
Joel

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2013-10-02  9:24 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-10-01  9:07 [RFA] Use FILENAME_CMP to compare filenames in compare_search_syms Joel Brobecker
2013-10-01  9:54 ` Pedro Alves
2013-10-01 12:30   ` Joel Brobecker
2013-10-01 15:14     ` Pedro Alves
2013-10-02  9:24       ` Joel Brobecker

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).