about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--elf/dl-load.c18
-rw-r--r--elf/dl-runtime.c20
3 files changed, 13 insertions, 30 deletions
diff --git a/ChangeLog b/ChangeLog
index 02e16d47f4..39a310a3ed 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 2004-02-08  Ulrich Drepper  <drepper@redhat.com>
 
+	* elf/dl-load.c (lose): Use noinline attribute instead of silly
+	alloca to prevent inlining.
+	* elf/dl-runtime.c (fixup): Likewise.
+	(profile_fixup): Likewise.
+
 	* stdio-common/printf_size.c: Undo parts of patch from 2000-2-11.
 	Initialize width correctly.
 
diff --git a/elf/dl-load.c b/elf/dl-load.c
index a3b8532955..8b9e508571 100644
--- a/elf/dl-load.c
+++ b/elf/dl-load.c
@@ -764,26 +764,14 @@ _dl_init_paths (const char *llp)
 }
 
 
-/* Think twice before changing anything in this function.  It is placed
-   here and prepared using the `alloca' magic to prevent it from being
-   inlined.  The function is only called in case of an error.  But then
-   performance does not count.  The function used to be "inlinable" and
-   the compiled did so all the time.  This increased the code size for
-   absolutely no good reason.  */
 static void
-__attribute__ ((noreturn))
+__attribute__ ((noreturn, noinline))
 lose (int code, int fd, const char *name, char *realname, struct link_map *l,
       const char *msg)
 {
-  /* The use of `alloca' here looks ridiculous but it helps.  The goal
-     is to avoid the function from being inlined.  There is no official
-     way to do this so we use this trick.  gcc never inlines functions
-     which use `alloca'.  */
-  int *a = (int *) alloca (sizeof (int));
-  a[0] = fd;
   /* The file might already be closed.  */
-  if (a[0] != -1)
-    (void) __close (a[0]);
+  if (fd != -1)
+    (void) __close (fd);
   if (l != NULL)
     {
       /* Remove the stillborn object from the list and free it.  */
diff --git a/elf/dl-runtime.c b/elf/dl-runtime.c
index 58e4c6c3e6..2992f652c6 100644
--- a/elf/dl-runtime.c
+++ b/elf/dl-runtime.c
@@ -1,5 +1,5 @@
 /* On-demand PLT fixup for shared objects.
-   Copyright (C) 1995-2002, 2003 Free Software Foundation, Inc.
+   Copyright (C) 1995-2002, 2003, 2004 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -45,7 +45,8 @@
    function.  */
 
 #ifndef ELF_MACHINE_NO_PLT
-static ElfW(Addr) __attribute_used__
+static ElfW(Addr)
+__attribute ((used, noinline))
 fixup (
 # ifdef ELF_MACHINE_RUNTIME_FIXUP_ARGS
         ELF_MACHINE_RUNTIME_FIXUP_ARGS,
@@ -65,12 +66,6 @@ fixup (
   lookup_t result;
   ElfW(Addr) value;
 
-  /* The use of `alloca' here looks ridiculous but it helps.  The goal is
-     to prevent the function from being inlined and thus optimized out.
-     There is no official way to do this so we use this trick.  gcc never
-     inlines functions which use `alloca'.  */
-  alloca (sizeof (int));
-
   /* Sanity check that we're really looking at a PLT relocation.  */
   assert (ELFW(R_TYPE)(reloc->r_info) == ELF_MACHINE_JMP_SLOT);
 
@@ -132,7 +127,8 @@ fixup (
 
 #if !defined PROF && !defined ELF_MACHINE_NO_PLT && !__BOUNDED_POINTERS__
 
-static ElfW(Addr) __attribute_used__
+static ElfW(Addr)
+__attribute ((used, noinline))
 profile_fixup (
 #ifdef ELF_MACHINE_RUNTIME_FIXUP_ARGS
        ELF_MACHINE_RUNTIME_FIXUP_ARGS,
@@ -144,12 +140,6 @@ profile_fixup (
   lookup_t result;
   ElfW(Addr) value;
 
-  /* The use of `alloca' here looks ridiculous but it helps.  The goal is
-     to prevent the function from being inlined, and thus optimized out.
-     There is no official way to do this so we use this trick.  gcc never
-     inlines functions which use `alloca'.  */
-  alloca (sizeof (int));
-
   /* This is the address in the array where we store the result of previous
      relocations.  */
   resultp = &l->l_reloc_result[reloc_offset / sizeof (PLTREL)];