about summary refs log tree commit diff
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 86d9a676f2..12d421713c 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 6f56f9772d..098da6c2c5 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)
 	{