From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 4397 invoked by alias); 7 Aug 2006 21:56:45 -0000 Received: (qmail 4388 invoked by uid 22791); 7 Aug 2006 21:56:45 -0000 X-Spam-Check-By: sourceware.org Received: from smtp108.sbc.mail.mud.yahoo.com (HELO smtp108.sbc.mail.mud.yahoo.com) (68.142.198.207) by sourceware.org (qpsmtpd/0.31) with SMTP; Mon, 07 Aug 2006 21:56:42 +0000 Received: (qmail 71797 invoked from network); 7 Aug 2006 21:56:40 -0000 Received: from unknown (HELO lucon.org) (hjjean@sbcglobal.net@71.146.93.16 with login) by smtp108.sbc.mail.mud.yahoo.com with SMTP; 7 Aug 2006 21:56:40 -0000 Received: by lucon.org (Postfix, from userid 1000) id C780E63EFA; Mon, 7 Aug 2006 14:56:37 -0700 (PDT) Date: Mon, 07 Aug 2006 21:56:00 -0000 From: "H. J. Lu" To: Sonal Santan Cc: binutils@sources.redhat.com Subject: PATCH ld/3006: Linker --sort-section name is broken Message-ID: <20060807215637.GA20521@lucon.org> References: <20060807181041.GA18835@lucon.org> <44D7B4A3.2030805@xilinx.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <44D7B4A3.2030805@xilinx.com> User-Agent: Mutt/1.4.2.1i Mailing-List: contact binutils-help@sourceware.org; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: binutils-owner@sourceware.org X-SW-Source: 2006-08/txt/msg00080.txt.bz2 On Mon, Aug 07, 2006 at 02:46:11PM -0700, Sonal Santan wrote: > Hello H.J. > > Looks like ld lacks the kind of examples you tried in its testsuite. I > can think of the following two ways to fix this: > > [1] A quick fix would be to change the logic which triggers BST sorting > in wild() to the following-- > if (s->handler_data[0] > && s->handler_data[0]->spec.sorted == by_name > && !s->filenames_sorted > && !handler_data[1]) > {... > [2] A better fix would be grow the handler_data[] array in struct > lang_wild_statement_struct to size 5. Make the BST logic exclusively use > handler_data[4] for all its needs. > > What do you think? > I would prefer to add a new field for BST. Casting may hide problems. This patch seems to work for me. Also in wild (): tree = (lang_section_bst_type *) s->handler_data[1]; if (tree) output_section_callback_tree_to_list (s, tree, output); s->handler_data[1] = NULL; we don't need to set s->handler_data[1] to NULL when it is NULL to begin with. H.J. ---- 2007-08-07 H.J. Lu PR ld/3006 * ldlang.c (lang_section_bst_type): Moved to ... * ldlang.h: Here. * ldlang.h (lang_wild_statement_struct): Add a tree field. * ldlang.c (wild_sort_fast): Use the tree field for BST. (wild): Likeise. (analyze_walk_wild_section_handler): Initialize the tree field. --- ld/ldlang.c.bst 2006-08-07 14:09:12.000000000 -0700 +++ ld/ldlang.c 2006-08-07 14:41:04.000000000 -0700 @@ -45,15 +45,6 @@ #define offsetof(TYPE, MEMBER) ((size_t) & (((TYPE*) 0)->MEMBER)) #endif -/* Binary search tree structure to - efficiently sort sections by name. */ -typedef struct lang_section_bst -{ - asection *section; - struct lang_section_bst *left; - struct lang_section_bst *right; -} lang_section_bst_type; - /* Locals variables. */ static struct obstack stat_obstack; static struct obstack map_obstack; @@ -377,7 +368,7 @@ wild_sort_fast (lang_wild_statement_type { lang_section_bst_type **tree; - tree = (lang_section_bst_type **) &wild->handler_data[1]; + tree = &wild->tree; if (!wild->filenames_sorted && (sec == NULL || sec->spec.sorted == none)) { @@ -674,6 +665,7 @@ analyze_walk_wild_section_handler (lang_ ptr->handler_data[1] = NULL; ptr->handler_data[2] = NULL; ptr->handler_data[3] = NULL; + ptr->tree = NULL; /* Count how many wildcard_specs there are, and how many of those actually use wildcards in the name. Also, bail out if any of the @@ -2553,10 +2545,12 @@ wild (lang_wild_statement_type *s, walk_wild (s, output_section_callback_fast, output); - tree = (lang_section_bst_type *) s->handler_data[1]; + tree = s->tree; if (tree) - output_section_callback_tree_to_list (s, tree, output); - s->handler_data[1] = NULL; + { + output_section_callback_tree_to_list (s, tree, output); + s->tree = NULL; + } } else walk_wild (s, output_section_callback, output); --- ld/ldlang.h.bst 2006-08-07 08:46:00.000000000 -0700 +++ ld/ldlang.h 2006-08-07 14:38:15.000000000 -0700 @@ -305,6 +305,15 @@ typedef void (*walk_wild_section_handler typedef bfd_boolean (*lang_match_sec_type_func) (bfd *, const asection *, bfd *, const asection *); +/* Binary search tree structure to efficiently sort sections by + name. */ +typedef struct lang_section_bst +{ + asection *section; + struct lang_section_bst *left; + struct lang_section_bst *right; +} lang_section_bst_type; + struct lang_wild_statement_struct { lang_statement_header_type header; @@ -316,6 +325,7 @@ struct lang_wild_statement_struct walk_wild_section_handler_t walk_wild_section_handler; struct wildcard_list *handler_data[4]; + lang_section_bst_type *tree; }; typedef struct lang_address_statement_struct