From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 31443 invoked by alias); 22 Jun 2009 18:15:42 -0000 Received: (qmail 31419 invoked by uid 22791); 22 Jun 2009 18:15:35 -0000 X-SWARE-Spam-Status: No, hits=-2.5 required=5.0 tests=AWL,BAYES_00 X-Spam-Check-By: sourceware.org Received: from smtp-outbound-2.vmware.com (HELO smtp-outbound-2.vmware.com) (65.115.85.73) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 22 Jun 2009 18:15:27 +0000 Received: from mailhost4.vmware.com (mailhost4.vmware.com [10.16.67.124]) by smtp-outbound-2.vmware.com (Postfix) with ESMTP id 7802E5701D; Mon, 22 Jun 2009 11:15:25 -0700 (PDT) Received: from [10.20.94.141] (msnyder-server.eng.vmware.com [10.20.94.141]) by mailhost4.vmware.com (Postfix) with ESMTP id 330F7C9CC1; Mon, 22 Jun 2009 11:15:17 -0700 (PDT) Message-ID: <4A3FCA0A.3020403@vmware.com> Date: Mon, 22 Jun 2009 18:15:00 -0000 From: Michael Snyder User-Agent: Thunderbird 1.5.0.12 (X11/20080411) MIME-Version: 1.0 To: Jan Kratochvil CC: "gdb-patches@sourceware.org" Subject: Re: [patch] Accelerate blocks sorting References: <20090622173856.GA6649@host0.dyn.jankratochvil.net> In-Reply-To: <20090622173856.GA6649@host0.dyn.jankratochvil.net> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2009-06/txt/msg00571.txt.bz2 Jan Kratochvil wrote: > Hi, > > GDB has been reported as hanging on crashed webkit. > https://bugzilla.redhat.com/show_bug.cgi?id=507267 > > Time of (using webkitgtk-debuginfo-1.1.8-1.fc11.x86_64) > gdb -nx -ex 'info line *0x350080' ~/t/libwebkit-1.0.so.2.6.0.debug > the patch reduces from 40.1s to 4.6s. (0x350080 is in a CU of 0x8d6ed bytes.) > > Regression tested on {x86_64,i686}-fedora-linux-gnu. Is it actually hanging? Or is it just taking a long time? The patch looks ok at first glance, but I'm a little confused about the problem being fixed. > 2009-06-22 Jan Kratochvil > > Accelerate blocks sorting while reading debug info. > * buildsym.c (block_compar): New function. > (end_symtab): Replace the bubble sort by a qsort based code. > > --- gdb-6.8.50.20090302/gdb/buildsym.c-orig 2009-06-22 15:20:39.000000000 +0200 > +++ gdb-6.8.50.20090302/gdb/buildsym.c 2009-06-22 17:50:54.000000000 +0200 > @@ -900,6 +900,19 @@ watch_main_source_file_lossage (void) > } > } > > +/* Helper function for qsort. Parametes are `struct block *' pointers, > + function sorts them in descending order by their BLOCK_START. */ > + > +static int > +block_compar (const void *ap, const void *bp) > +{ > + const struct block *a = *(const struct block **) ap; > + const struct block *b = *(const struct block **) bp; > + > + return (BLOCK_START (b) > BLOCK_START (a)) > + - (BLOCK_START (b) < BLOCK_START (a)); > +} > + > /* Finish the symbol definitions for one main source file, close off > all the lexical contexts for that file (creating struct block's for > them), then make the struct symtab for that file and put it in the > @@ -953,32 +966,28 @@ end_symtab (CORE_ADDR end_addr, struct o > OBJF_REORDERED is true, then sort the pending blocks. */ > if ((objfile->flags & OBJF_REORDERED) && pending_blocks) > { > - /* FIXME! Remove this horrid bubble sort and use merge sort!!! */ > - int swapped; > - do > - { > - struct pending_block *pb, *pbnext; > + unsigned count = 0; > + struct pending_block *pb; > + struct block **barray, **bp; > + struct cleanup *back_to; > > - pb = pending_blocks; > - pbnext = pb->next; > - swapped = 0; > + for (pb = pending_blocks; pb != NULL; pb = pb->next) > + count++; > > - while (pbnext) > - { > - /* swap blocks if unordered! */ > + barray = xmalloc (sizeof (*barray) * count); > + back_to = make_cleanup (xfree, barray); > > - if (BLOCK_START (pb->block) < BLOCK_START (pbnext->block)) > - { > - struct block *tmp = pb->block; > - pb->block = pbnext->block; > - pbnext->block = tmp; > - swapped = 1; > - } > - pb = pbnext; > - pbnext = pbnext->next; > - } > - } > - while (swapped); > + bp = barray; > + for (pb = pending_blocks; pb != NULL; pb = pb->next) > + *bp++ = pb->block; > + > + qsort (barray, count, sizeof (*barray), block_compar); > + > + bp = barray; > + for (pb = pending_blocks; pb != NULL; pb = pb->next) > + pb->block = *bp++; > + > + do_cleanups (back_to); > } > > /* Cleanup any undefined types that have been left hanging around