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.
}
-/* 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. */
/* 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
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,
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);
#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,
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)];