diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | elf/dl-load.c | 18 | ||||
-rw-r--r-- | elf/dl-runtime.c | 20 |
3 files changed, 13 insertions, 30 deletions
@@ -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)]; |