From: "H. J. Lu" <hjl@lucon.org>
To: binutils@sources.redhat.com
Subject: PATCH: Should ld cache bfd_check_format return?
Date: Thu, 20 Apr 2006 05:08:00 -0000 [thread overview]
Message-ID: <20060419204444.GA26952@lucon.org> (raw)
In-Reply-To: <20060419142124.GA24515@lucon.org>
On Wed, Apr 19, 2006 at 07:21:24AM -0700, H. J. Lu wrote:
> load_symbols does
>
> ldfile_open_file (entry);
>
> if (! bfd_check_format (entry->the_bfd, bfd_archive)
> && ! bfd_check_format_matches (entry->the_bfd, bfd_object, &matching))
>
> ldfile_open_file also calls bfd_check_format. Should ld cache
> bfd_check_format return?
>
This patch caches bfd_check_format return.
H.J.
---
2006-04-19 H.J. Lu <hongjiu.lu@intel.com>
* ldfile.h (ldfile_check_format): New.
* ldlang.h (lang_input_statement_struct): Add format.
* ldfile.c (ldfile_check_format): New function.
(ldfile_try_open_bfd): Updated to use ldfile_check_format
instead of bfd_check_format.
* ldlang.c (walk_wild_file): Likewise.
(load_symbols): Likewise.
(open_input_bfds): Likewise.
(new_afile): Initialize format.
--- ld/ldfile.c.format 2005-05-16 11:04:40.000000000 -0700
+++ ld/ldfile.c 2006-04-19 13:26:02.000000000 -0700
@@ -125,6 +125,25 @@ ldfile_add_library_path (const char *nam
}
}
+/* Check format of an opened lang_input_statement. */
+
+bfd_boolean
+ldfile_check_format (lang_input_statement_type *entry,
+ bfd_format format)
+{
+ if (entry->format != bfd_unknown)
+ return entry->format == format;
+
+ if (bfd_check_format (entry->the_bfd, format))
+ {
+ entry->format = format;
+ return TRUE;
+ }
+ else
+ return FALSE;
+
+}
+
/* Try to open a BFD for a lang_input_statement. */
bfd_boolean
@@ -158,19 +177,21 @@ ldfile_try_open_bfd (const char *attempt
{
bfd *check;
- if (bfd_check_format (entry->the_bfd, bfd_archive))
- check = bfd_openr_next_archived_file (entry->the_bfd, NULL);
+ if (ldfile_check_format (entry, bfd_archive))
+ {
+ check = bfd_openr_next_archived_file (entry->the_bfd, NULL);
+ if (!check || !bfd_check_format (check, bfd_object))
+ /* No further check on unknown file. */
+ return TRUE;
+ }
else
- check = entry->the_bfd;
-
- if (check != NULL)
{
- if (! bfd_check_format (check, bfd_object))
+ check = entry->the_bfd;
+ if (!ldfile_check_format (entry, bfd_object))
{
- if (check == entry->the_bfd
- && entry->search_dirs_flag
+ if (entry->search_dirs_flag
&& bfd_get_error () == bfd_error_file_not_recognized
- && ! ldemul_unrecognized_file (entry))
+ && !ldemul_unrecognized_file (entry))
{
int token, skip = 0;
char *arg, *arg1, *arg2, *arg3;
@@ -254,37 +275,37 @@ ldfile_try_open_bfd (const char *attempt
{
einfo (_("%P: skipping incompatible %s when searching for %s\n"),
attempt, entry->local_sym_name);
- bfd_close (entry->the_bfd);
- entry->the_bfd = NULL;
- return FALSE;
+ goto bad;
}
}
+
+ /* No further check on unknown file. */
return TRUE;
}
- if (!entry->dynamic && (entry->the_bfd->flags & DYNAMIC) != 0)
+ if (!entry->dynamic
+ && (entry->the_bfd->flags & DYNAMIC) != 0)
{
einfo (_("%F%P: attempted static link of dynamic object `%s'\n"),
attempt);
- bfd_close (entry->the_bfd);
- entry->the_bfd = NULL;
- return FALSE;
+ goto bad;
}
+ }
- if (entry->search_dirs_flag
- && !bfd_arch_get_compatible (check, output_bfd,
- command_line.accept_unknown_input_arch)
- /* XCOFF archives can have 32 and 64 bit objects. */
- && ! (bfd_get_flavour (check) == bfd_target_xcoff_flavour
- && bfd_get_flavour (output_bfd) == bfd_target_xcoff_flavour
- && bfd_check_format (entry->the_bfd, bfd_archive)))
- {
- einfo (_("%P: skipping incompatible %s when searching for %s\n"),
- attempt, entry->local_sym_name);
- bfd_close (entry->the_bfd);
- entry->the_bfd = NULL;
- return FALSE;
- }
+ if (entry->search_dirs_flag
+ && !bfd_arch_get_compatible (check, output_bfd,
+ command_line.accept_unknown_input_arch)
+ /* XCOFF archives can have 32 and 64 bit objects. */
+ && ! (bfd_get_flavour (check) == bfd_target_xcoff_flavour
+ && bfd_get_flavour (output_bfd) == bfd_target_xcoff_flavour
+ && ldfile_check_format (entry, bfd_archive)))
+ {
+ einfo (_("%P: skipping incompatible %s when searching for %s\n"),
+ attempt, entry->local_sym_name);
+bad:
+ bfd_close (entry->the_bfd);
+ entry->the_bfd = NULL;
+ return FALSE;
}
}
--- ld/ldfile.h.format 2005-05-16 11:04:40.000000000 -0700
+++ ld/ldfile.h 2006-04-19 13:08:53.000000000 -0700
@@ -52,6 +52,8 @@ extern void ldfile_open_command_file
(const char *name);
extern void ldfile_open_file
(struct lang_input_statement_struct *);
+extern bfd_boolean ldfile_check_format
+ (struct lang_input_statement_struct *, bfd_format);
extern bfd_boolean ldfile_try_open_bfd
(const char *, struct lang_input_statement_struct *);
extern void ldfile_set_output_arch
--- ld/ldlang.c.format 2006-04-14 14:44:46.000000000 -0700
+++ ld/ldlang.c 2006-04-19 13:25:05.000000000 -0700
@@ -626,7 +626,7 @@ walk_wild_file (lang_wild_statement_type
void *data)
{
if (f->the_bfd == NULL
- || ! bfd_check_format (f->the_bfd, bfd_archive))
+ || ! ldfile_check_format (f, bfd_archive))
walk_wild_section (s, f, callback, data);
else
{
@@ -846,6 +846,7 @@ new_afile (const char *name,
FAIL ();
}
p->the_bfd = NULL;
+ p->format = bfd_unknown;
p->asymbols = NULL;
p->next_real_file = NULL;
p->next = NULL;
@@ -2309,15 +2310,13 @@ static bfd_boolean
load_symbols (lang_input_statement_type *entry,
lang_statement_list_type *place)
{
- char **matching;
-
if (entry->loaded)
return TRUE;
ldfile_open_file (entry);
- if (! bfd_check_format (entry->the_bfd, bfd_archive)
- && ! bfd_check_format_matches (entry->the_bfd, bfd_object, &matching))
+ if (! ldfile_check_format (entry, bfd_archive)
+ && ! ldfile_check_format (entry, bfd_object))
{
bfd_error_type err;
lang_statement_list_type *hold;
@@ -2337,7 +2336,10 @@ load_symbols (lang_input_statement_type
einfo (_("%B: file not recognized: %E\n"), entry->the_bfd);
einfo (_("%B: matching formats:"), entry->the_bfd);
- for (p = matching; *p != NULL; p++)
+
+ /* Get the list of matching formats. */
+ bfd_check_format_matches (entry->the_bfd, bfd_object, &p);
+ for (; *p != NULL; p++)
einfo (" %s", *p);
einfo ("%F\n");
}
@@ -2608,7 +2610,7 @@ get_first_input_target (void)
ldfile_open_file (s);
if (s->the_bfd != NULL
- && bfd_check_format (s->the_bfd, bfd_object))
+ && ldfile_check_format (s, bfd_object))
{
target = bfd_get_target (s->the_bfd);
@@ -2839,8 +2841,8 @@ open_input_bfds (lang_statement_union_ty
if (force
&& !s->input_statement.whole_archive
&& s->input_statement.loaded
- && bfd_check_format (s->input_statement.the_bfd,
- bfd_archive))
+ && ldfile_check_format (&s->input_statement,
+ bfd_archive))
s->input_statement.loaded = FALSE;
lang_list_init (&add);
--- ld/ldlang.h.format 2005-12-24 08:17:33.000000000 -0800
+++ ld/ldlang.h 2006-04-19 13:23:04.000000000 -0700
@@ -231,6 +231,9 @@ typedef struct lang_input_statement_stru
bfd *the_bfd;
+ /* Format of this file. */
+ bfd_format format;
+
bfd_boolean closed;
file_ptr passive_position;
next prev parent reply other threads:[~2006-04-19 20:44 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-04-19 16:19 H. J. Lu
2006-04-20 5:08 ` H. J. Lu [this message]
2006-04-20 9:03 ` PATCH: " Alan Modra
2006-04-20 16:29 ` H. J. Lu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20060419204444.GA26952@lucon.org \
--to=hjl@lucon.org \
--cc=binutils@sources.redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).