aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog2
-rw-r--r--elf/dl-load.c41
2 files changed, 24 insertions, 19 deletions
diff --git a/ChangeLog b/ChangeLog
index 86d9a67..12d4217 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,7 @@
2001-03-20 Ulrich Drepper <drepper@redhat.com>
+ * elf/dl-load.c: Various little optimizations.
+
* sysdeps/unix/sysv/linux/pathconf.c (__pathconf): Return
LINUX_LINK_MAX only if the statfs function is not implemented for
the filesystem.
diff --git a/elf/dl-load.c b/elf/dl-load.c
index 6f56f97..098da6c 100644
--- a/elf/dl-load.c
+++ b/elf/dl-load.c
@@ -306,7 +306,7 @@ expand_dynamic_string_token (struct link_map *l, const char *s)
cnt = DL_DST_COUNT (s, 1);
/* If we do not have to replace anything simply copy the string. */
- if (cnt == 0)
+ if (__builtin_expect (cnt, 0) == 0)
return local_strdup (s);
/* Determine the length of the substituted string. */
@@ -905,8 +905,8 @@ _dl_map_object_from_fd (const char *name, int fd, struct filebuf *fbp,
if (ph->p_flags & PF_X)
c->prot |= PROT_EXEC;
}
- break;
}
+ break;
}
/* Now process the load commands and map segments into memory. */
@@ -953,7 +953,7 @@ _dl_map_object_from_fd (const char *name, int fd, struct filebuf *fbp,
{
/* This object is loaded at a fixed address. This must never
happen for objects loaded with dlopen(). */
- if (mode & __RTLD_DLOPEN)
+ if (__builtin_expect (mode & __RTLD_DLOPEN, 0))
{
LOSE (0, N_("cannot dynamically load executable"));
}
@@ -1007,7 +1007,7 @@ _dl_map_object_from_fd (const char *name, int fd, struct filebuf *fbp,
_dl_pagesize, c->prot|PROT_WRITE) < 0)
LOSE (errno, N_("cannot change memory protections"));
}
- memset ((void *) zero, 0, zeropage - zero);
+ memset ((void *) zero, '\0', zeropage - zero);
if ((c->prot & PROT_WRITE) == 0)
__mprotect ((caddr_t) (zero & ~(_dl_pagesize - 1)),
_dl_pagesize, c->prot);
@@ -1030,7 +1030,7 @@ _dl_map_object_from_fd (const char *name, int fd, struct filebuf *fbp,
if (l->l_phdr == NULL)
{
- /* The program header is not contained in any of the segmenst.
+ /* The program header is not contained in any of the segments.
We have to allocate memory ourself and copy it over from
out temporary place. */
ElfW(Phdr) *newp = (ElfW(Phdr) *) malloc (header->e_phnum
@@ -1138,7 +1138,7 @@ _dl_map_object_from_fd (const char *name, int fd, struct filebuf *fbp,
}
/* Remember whether this object must be initialized first. */
- if (l->l_flags_1 & DF_1_INITFIRST)
+ if (__builtin_expect (l->l_flags_1 & DF_1_INITFIRST, 0))
_dl_initfirst = l;
/* Finally the file information. */
@@ -1220,7 +1220,7 @@ open_verify (const char *name, struct filebuf *fbp)
};
static const struct {
ElfW(Word) vendorlen, datalen, type;
- char vendor [4];
+ char vendor[4];
} expected_note = { 4, 16, 1, "GNU" };
int fd;
@@ -1339,10 +1339,10 @@ open_verify (const char *name, struct filebuf *fbp)
if (memcmp (abi_note, &expected_note, sizeof (expected_note)))
continue;
- osversion = (abi_note [5] & 0xff) * 65536
- + (abi_note [6] & 0xff) * 256
- + (abi_note [7] & 0xff);
- if (abi_note [4] != __ABI_TAG_OS
+ osversion = (abi_note[5] & 0xff) * 65536
+ + (abi_note[6] & 0xff) * 256
+ + (abi_note[7] & 0xff);
+ if (abi_note[4] != __ABI_TAG_OS
|| (_dl_osversion && _dl_osversion < osversion))
{
close_and_out:
@@ -1384,6 +1384,7 @@ open_path (const char *name, size_t namelen, int preloaded,
size_t cnt;
char *edp;
int here_any = 0;
+ int err;
/* If we are debugging the search for libraries print the path
now if it hasn't happened now. */
@@ -1436,7 +1437,8 @@ open_path (const char *name, size_t namelen, int preloaded,
/* Remember whether we found any existing directory. */
here_any |= this_dir->status[cnt] == existing;
- if (fd != -1 && preloaded && __libc_enable_secure)
+ if (fd != -1 && __builtin_expect (preloaded, 0)
+ && __libc_enable_secure)
{
/* This is an extra security effort to make sure nobody can
preload broken shared objects which are in the trusted
@@ -1474,7 +1476,7 @@ open_path (const char *name, size_t namelen, int preloaded,
return -1;
}
}
- if (here_any && errno != ENOENT && errno != EACCES)
+ if (here_any && (err = errno) != ENOENT && err != EACCES)
/* The file exists and is readable, but something went wrong. */
return -1;
@@ -1484,7 +1486,7 @@ open_path (const char *name, size_t namelen, int preloaded,
while (*++dirs != NULL);
/* Remove the whole path if none of the directories exists. */
- if (! any)
+ if (__builtin_expect (! any, 0))
{
/* Paths which were allocated using the minimal malloc() in ld.so
must not be freed using the general free() in libc. */
@@ -1515,7 +1517,7 @@ _dl_map_object (struct link_map *loader, const char *name, int preloaded,
/* If the requested name matches the soname of a loaded object,
use that object. Elide this check for names that have not
yet been opened. */
- if (l->l_faked != 0)
+ if (__builtin_expect (l->l_faked, 0) != 0)
continue;
if (!_dl_name_match_p (name, l))
{
@@ -1626,7 +1628,8 @@ _dl_map_object (struct link_map *loader, const char *name, int preloaded,
&loader->l_runpath_dirs, &realname, &fb);
}
- if (fd == -1 && (! preloaded || ! __libc_enable_secure))
+ if (fd == -1
+ && (__builtin_expect (! preloaded, 1) || ! __libc_enable_secure))
{
/* Check the list of libraries in the file /etc/ld.so.cache,
for compatibility with Linux's ldconfig program. */
@@ -1665,7 +1668,7 @@ _dl_map_object (struct link_map *loader, const char *name, int preloaded,
if (cached)
{
fd = open_verify (cached, &fb);
- if (fd != -1)
+ if (__builtin_expect (fd, 0) != -1)
{
realname = local_strdup (cached);
if (realname == NULL)
@@ -1701,12 +1704,12 @@ _dl_map_object (struct link_map *loader, const char *name, int preloaded,
else
{
fd = open_verify (realname, &fb);
- if (fd == -1)
+ if (__builtin_expect (fd, 0) == -1)
free (realname);
}
}
- if (fd == -1)
+ if (__builtin_expect (fd, 0) == -1)
{
if (trace_mode)
{