* elf/dl-minimal.c: Define _itoa for 32-bit machines with HP timing.
	* elf/dl-reloc.c: Pretty printing.
	* sysdeps/generic/ldsodefs.h: Move _dl_hp_timing_overhead and
	procinfo-related variables in rtld_global struct.
	* elf/dl-support.c: Likewise.
	* elf/rtld.c: Likewise.
	* sysdeps/i386/i686/Makefile: Likewise.
	* sysdeps/i386/i686/hp-timing.c: Likewise.
	* sysdeps/i386/i686/hp-timing.h: Likewise.
	* sysdeps/ia64/Makefile: Likewise.
	* sysdeps/ia64/hp-timing.c: Likewise.
	* sysdeps/sparc/sparc32/sparcv9/Makefile: Likewise.
	* sysdeps/sparc/sparc32/sparcv9/hp-timing.c: Likewise.
	* sysdeps/unix/sysv/linux/arm/dl-procinfo.c: Likewise.
	* sysdeps/unix/sysv/linux/arm/dl-procinfo.h: Likewise.
	* sysdeps/unix/sysv/linux/i386/Makefile: Likewise.
	* sysdeps/unix/sysv/linux/i386/dl-procinfo.c: Likewise.
	* sysdeps/unix/sysv/linux/i386/dl-procinfo.h: Likewise.
	* sysdeps/x86_64/Makefile: Likewise.
This commit is contained in:
Ulrich Drepper 2002-02-01 07:49:47 +00:00
parent 5688da5537
commit ccdf0cab1d
19 changed files with 188 additions and 66 deletions

View File

@ -1,5 +1,25 @@
2002-01-31 Ulrich Drepper <drepper@redhat.com>
* elf/dl-minimal.c: Define _itoa for 32-bit machines with HP timing.
* elf/dl-reloc.c: Pretty printing.
* sysdeps/generic/ldsodefs.h: Move _dl_hp_timing_overhead and
procinfo-related variables in rtld_global struct.
* elf/dl-support.c: Likewise.
* elf/rtld.c: Likewise.
* sysdeps/i386/i686/Makefile: Likewise.
* sysdeps/i386/i686/hp-timing.c: Likewise.
* sysdeps/i386/i686/hp-timing.h: Likewise.
* sysdeps/ia64/Makefile: Likewise.
* sysdeps/ia64/hp-timing.c: Likewise.
* sysdeps/sparc/sparc32/sparcv9/Makefile: Likewise.
* sysdeps/sparc/sparc32/sparcv9/hp-timing.c: Likewise.
* sysdeps/unix/sysv/linux/arm/dl-procinfo.c: Likewise.
* sysdeps/unix/sysv/linux/arm/dl-procinfo.h: Likewise.
* sysdeps/unix/sysv/linux/i386/Makefile: Likewise.
* sysdeps/unix/sysv/linux/i386/dl-procinfo.c: Likewise.
* sysdeps/unix/sysv/linux/i386/dl-procinfo.h: Likewise.
* sysdeps/x86_64/Makefile: Likewise.
* sysdeps/generic/ldsodefs.h: Add _dl_load_lock, _dl_lazy,
_dl_dynamic_weak, _dl_fpu_control, _dl_cpuclock_offset, and
_dl_debug_fd to rtld_global.

View File

@ -268,3 +268,26 @@ __strtoul_internal (const char *nptr, char **endptr, int base, int group)
*endptr = (char *) nptr;
return result * sign;
}
#if HP_TIMING_AVAIL && ULONG_MAX <= 4294967295UL
/* We need this function to print the cycle count. On 64-bit machines the
_itoa_word function should be used. */
char *
_itoa (value, buflim, base, upper_case)
unsigned long long int value;
char *buflim;
unsigned int base;
int upper_case;
{
char *bp = buflim;
assert (base == 10);
do
*--bp = '0' + value % 10;
while ((value /= 10) != 0);
return bp;
}
#endif

View File

@ -138,7 +138,7 @@ _dl_relocate_object (struct link_map *l, struct r_scope_elem *scope[],
(ELFW(ST_BIND) ((*ref)->st_info) != STB_LOCAL \
? ((__builtin_expect ((*ref) == l->l_lookup_cache.sym, 0) \
&& elf_machine_type_class (r_type) == l->l_lookup_cache.type_class) \
? (bump_num_cache_relocations (), \
? (bump_num_cache_relocations (), \
(*ref) = l->l_lookup_cache.ret, \
l->l_lookup_cache.value) \
: ({ lookup_t _lr; \

View File

@ -91,6 +91,9 @@ struct r_scope_elem *_dl_main_searchlist = &_dl_initial_searchlist;
/* Nonzero during startup. */
int _dl_starting_up = 1;
/* Get architecture specific initializer. */
#include <dl-procinfo.c>
/* We expect less than a second for relocation. */
#ifdef HP_SMALL_TIMING_AVAIL
# undef HP_TIMING_AVAIL

View File

@ -74,6 +74,8 @@ int _dl_starting_up;
(except those which cannot be added for some reason). */
struct rtld_global _rtld_global =
{
/* Get architecture specific initializer. */
#include <dl-procinfo.c>
._dl_debug_fd = STDERR_FILENO,
#if 1
/* XXX I know about at least one case where we depend on the old

View File

@ -278,9 +278,12 @@ struct rtld_global
/* The object to be initialized first. */
EXTERN struct link_map *_dl_initfirst;
/* Start time on CPU clock. */
#if HP_TIMING_AVAIL
/* Start time on CPU clock. */
EXTERN hp_timing_t _dl_cpuclock_offset;
/* Overhead of a high-precision timing measurement. */
EXTERN hp_timing_t _dl_hp_timing_overhead;
#endif
/* Name of the shared object to be profiled (if any). */
@ -320,6 +323,10 @@ struct rtld_global
/* File descriptor to write debug messages to. */
EXTERN int _dl_debug_fd;
/* Get architecture specific definitions. */
#define PROCINFO_DECL
#include <dl-procinfo.c>
/* Structure describing the dynamic linker itself. */
EXTERN struct link_map _dl_rtld_map;
#ifdef SHARED

View File

@ -1,3 +1,4 @@
ifeq ($(subdir),csu)
sysdep_routines += hp-timing
static-only-routines += hp-timing
endif

View File

@ -1,5 +1,5 @@
/* Support for high precision, low overhead timing functions. i686 version.
Copyright (C) 1998 Free Software Foundation, Inc.
Copyright (C) 1998, 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
@ -21,4 +21,4 @@
#include <hp-timing.h>
/* We have to define the variable for the overhead. */
hp_timing_t __libc_hp_timing_overhead;
hp_timing_t _dl_hp_timing_overhead;

View File

@ -1,5 +1,5 @@
/* High precision, low overhead timing functions. i686 version.
Copyright (C) 1998 Free Software Foundation, Inc.
Copyright (C) 1998, 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
@ -84,10 +84,6 @@
/* We use 64bit values for the times. */
typedef unsigned long long int hp_timing_t;
/* Internal variable used to store the overhead of the measurement
opcodes. */
extern hp_timing_t __libc_hp_timing_overhead;
/* Set timestamp value to zero. */
#define HP_TIMING_ZERO(Var) (Var) = (0)
@ -101,17 +97,20 @@ extern hp_timing_t __libc_hp_timing_overhead;
/* Use two 'rdtsc' instructions in a row to find out how long it takes. */
#define HP_TIMING_DIFF_INIT() \
do { \
int __cnt = 5; \
__libc_hp_timing_overhead = ~0ull; \
do \
if (GL(dl_hp_timing_overhead) == 0) \
{ \
hp_timing_t __t1, __t2; \
HP_TIMING_NOW (__t1); \
HP_TIMING_NOW (__t2); \
if (__t2 - __t1 < __libc_hp_timing_overhead) \
__libc_hp_timing_overhead = __t2 - __t1; \
int __cnt = 5; \
GL(dl_hp_timing_overhead) = ~0ull; \
do \
{ \
hp_timing_t __t1, __t2; \
HP_TIMING_NOW (__t1); \
HP_TIMING_NOW (__t2); \
if (__t2 - __t1 < GL(dl_hp_timing_overhead)) \
GL(dl_hp_timing_overhead) = __t2 - __t1; \
} \
while (--__cnt > 0); \
} \
while (--__cnt > 0); \
} while (0)
/* It's simple arithmetic for us. */
@ -122,7 +121,7 @@ extern hp_timing_t __libc_hp_timing_overhead;
do { \
char __not_done; \
hp_timing_t __oldval = (Sum); \
hp_timing_t __diff = (Diff) - __libc_hp_timing_overhead; \
hp_timing_t __diff = (Diff) - GL(dl_hp_timing_overhead); \
do \
{ \
hp_timing_t __newval = __oldval + __diff; \

View File

@ -8,6 +8,7 @@ endif
ifeq ($(subdir), csu)
CPPFLAGS-start.S = -D__ASSEMBLY__
sysdep_routines += hp-timing
static-only-routines += hp-timing
endif
ifeq ($(subdir),elf)

View File

@ -1,5 +1,5 @@
/* Support for high precision, low overhead timing functions. IA-64 version.
Copyright (C) 2001 Free Software Foundation, Inc.
Copyright (C) 2001, 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 2001.
@ -21,4 +21,4 @@
#include <hp-timing.h>
/* We have to define the variable for the overhead. */
hp_timing_t __libc_hp_timing_overhead;
hp_timing_t _dl_hp_timing_overhead;

View File

@ -2,6 +2,7 @@ sysdep-CFLAGS += -mcpu=v8 -mtune=ultrasparc -Wa,-Av9a
ifeq ($(subdir),csu)
sysdep_routines += hp-timing
static-only-routines += hp-timing
endif
ifeq ($(subst gnulib,string,$(subdir)),string)

View File

@ -1,5 +1,5 @@
/* Support for high precision, low overhead timing functions. sparcv9 version.
Copyright (C) 2001 Free Software Foundation, Inc.
Copyright (C) 2001, 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by David S. Miller <davem@redhat.com>, 2001.
@ -21,4 +21,4 @@
#include <hp-timing.h>
/* We have to define the variable for the overhead. */
hp_timing_t __libc_hp_timing_overhead;
hp_timing_t _dl_hp_timing_overhead;

View File

@ -1,5 +1,5 @@
/* Data for Linux/ARM version of processor capability information.
Copyright (C) 2001 Free Software Foundation, Inc.
Copyright (C) 2001, 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Philip Blundell <philb@gnu.org>, 2001.
@ -19,13 +19,44 @@
02111-1307 USA. */
/* This information must be kept in sync with the _DL_HWCAP_COUNT and
_DL_PLATFORM_COUNT definitions in procinfo.h. */
_DL_PLATFORM_COUNT definitions in procinfo.h.
If anything should be added here check whether the size of each string
is still ok with the given array size.
/* If anything should be added here check whether the size of each string
is still ok with the given array size. */
const char _dl_arm_cap_flags[][10] =
{
All the #ifdefs in the definitions ar equite irritating but
necessary if we want to avoid duplicating the information. There
are three different modes:
- PROCINFO_DECL is defined. This means we are only interested in
declarations.
- PROCINFO_DECL is not defined:
+ if SHARED is defined the file is included in an array
initializer. The .element = { ... } syntax is needed.
+ if SHARED is not defined a normal array initialization is
needed.
*/
#ifdef PROCINFO_DECL
EXTERN
#endif
#if !defined PROCINFO_DECL && defined SHARED
._dl_arm_cap_flags
#else
const char _dl_arm_cap_flags[][10]
#endif
#ifndef PROCINFO_DECL
= {
"swp", "half", "thumb", "26bit", "fast-mult", "fpa", "vfp", "edsp",
};
}
#endif
#if !defined SHARED || defined PROCINFO_DECL
;
#else
,
#endif
#undef PROCINFO_DECL

View File

@ -1,5 +1,5 @@
/* Linux/ARM version of processor capability information handling macros.
Copyright (C) 2001 Free Software Foundation, Inc.
Copyright (C) 2001, 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Philip Blundell <philb@gnu.org>, 2001.
@ -23,9 +23,6 @@
#include <ldsodefs.h>
/* If anything should be added here check whether the size of each string
is still ok with the given array size. */
extern const char _dl_arm_cap_flags[][10];
#define _DL_HWCAP_COUNT 32
/* The kernel provides platform data but it is not interesting. */
@ -42,7 +39,7 @@ _dl_procinfo (int word)
for (i = 0; i < _DL_HWCAP_COUNT; ++i)
if (word & (1 << i))
_dl_printf (" %s", _dl_arm_cap_flags[i]);
_dl_printf (" %s", GL(dl_arm_cap_flags)[i]);
_dl_printf ("\n");
@ -53,7 +50,7 @@ static inline const char *
__attribute__ ((unused))
_dl_hwcap_string (int idx)
{
return _dl_arm_cap_flags[idx];
return GL(dl_arm_cap_flags)[idx];
};
enum
@ -78,7 +75,7 @@ _dl_string_hwcap (const char *str)
for (i = 0; i < _DL_HWCAP_COUNT; i++)
{
if (strcmp (str, _dl_arm_cap_flags[i]) == 0)
if (strcmp (str, GL(dl_arm_cap_flags)[i]) == 0)
return i;
}
return -1;

View File

@ -7,12 +7,6 @@ ifeq ($(subdir),elf)
sysdep-others += lddlibc4
install-bin += lddlibc4
# extra shared linker files to link into dl-allobjs.so and libc
sysdep-dl-routines += dl-procinfo
sysdep_routines += dl-procinfo
# extra shared linker files to link only into dl-allobjs.so
sysdep-rtld-routines += dl-procinfo
ifeq (yes,$(build-shared))
# This is needed to support g++ v2 and v3.
sysdep_routines += framestate

View File

@ -1,7 +1,7 @@
/* Data for Linux/i386 version of processor capability information.
Copyright (C) 2001 Free Software Foundation, Inc.
Copyright (C) 2001, 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 2001.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2001.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
@ -19,20 +19,66 @@
02111-1307 USA. */
/* This information must be kept in sync with the _DL_HWCAP_COUNT and
_DL_PLATFORM_COUNT definitions in procinfo.h. */
_DL_PLATFORM_COUNT definitions in procinfo.h.
If anything should be added here check whether the size of each string
is still ok with the given array size.
/* If anything should be added here check whether the size of each string
is still ok with the given array size. */
const char _dl_x86_cap_flags[][7] =
{
All the #ifdefs in the definitions ar equite irritating but
necessary if we want to avoid duplicating the information. There
are three different modes:
- PROCINFO_DECL is defined. This means we are only interested in
declarations.
- PROCINFO_DECL is not defined:
+ if SHARED is defined the file is included in an array
initializer. The .element = { ... } syntax is needed.
+ if SHARED is not defined a normal array initialization is
needed.
*/
#ifdef PROCINFO_DECL
EXTERN
#endif
#if !defined PROCINFO_DECL && defined SHARED
._dl_x86_cap_flags
#else
const char _dl_x86_cap_flags[32][8]
#endif
#ifndef PROCINFO_DECL
= {
"fpu", "vme", "de", "pse", "tsc", "msr", "pae", "mce",
"cx8", "apic", "10", "sep", "mtrr", "pge", "mca", "cmov",
"pat", "pse36", "psn", "19", "20", "21", "22", "mmx",
"osfxsr", "xmm", "xmm2", "27", "28", "29", "30", "amd3d"
};
"pat", "pse36", "pn", "clflush", "20", "dts", "acpi", "mmx",
"fxsr", "sse", "sse2", "ss", "ht", "tm", "ia64", "amd3d"
}
#endif
#if !defined SHARED || defined PROCINFO_DECL
;
#else
,
#endif
const char _dl_x86_platforms[][5] =
{
#ifdef PROCINFO_DECL
EXTERN
#endif
#if !defined PROCINFO_DECL && defined SHARED
._dl_x86_platforms
#else
const char _dl_x86_platforms[4][5]
#endif
#ifndef PROCINFO_DECL
= {
"i386", "i486", "i586", "i686"
};
}
#endif
#if !defined SHARED || defined PROCINFO_DECL
;
#else
,
#endif
#undef PROCINFO_DECL

View File

@ -1,5 +1,5 @@
/* Linux/i386 version of processor capability information handling macros.
Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
@ -23,12 +23,8 @@
#include <ldsodefs.h>
/* If anything should be added here check whether the size of each string
is still ok with the given array size. */
extern const char _dl_x86_cap_flags[][7];
#define _DL_HWCAP_COUNT 32
extern const char _dl_x86_platforms[][5];
#define _DL_PLATFORMS_COUNT 4
/* Start at 48 to reserve some space. */
@ -49,7 +45,7 @@ _dl_procinfo (int word)
for (i = 0; i < _DL_HWCAP_COUNT; ++i)
if (word & (1 << i))
_dl_printf (" %s", _dl_x86_cap_flags[i]);
_dl_printf (" %s", GL(dl_x86_cap_flags)[i]);
_dl_printf ("\n");
@ -60,14 +56,14 @@ static inline const char *
__attribute__ ((unused))
_dl_hwcap_string (int idx)
{
return _dl_x86_cap_flags[idx];
return GL(dl_x86_cap_flags)[idx];
};
static inline const char *
__attribute__ ((unused))
_dl_platform_string (int idx)
{
return _dl_x86_platforms [idx - _DL_FIRST_PLATFORM];
return GL(dl_x86_platforms)[idx - _DL_FIRST_PLATFORM];
};
enum
@ -107,7 +103,7 @@ _dl_string_hwcap (const char *str)
for (i = 0; i < _DL_HWCAP_COUNT; i++)
{
if (strcmp (str, _dl_x86_cap_flags[i]) == 0)
if (strcmp (str, GL(dl_x86_cap_flags)[i]) == 0)
return i;
}
return -1;
@ -123,7 +119,7 @@ _dl_string_platform (const char *str)
if (str != NULL)
for (i = 0; i < _DL_PLATFORMS_COUNT; ++i)
{
if (strcmp (str, _dl_x86_platforms[i]) == 0)
if (strcmp (str, GL(dl_x86_platforms)[i]) == 0)
return _DL_FIRST_PLATFORM + i;
}
return -1;

View File

@ -3,4 +3,5 @@ long-double-fcts = yes
ifeq ($(subdir),csu)
sysdep_routines += hp-timing
static-only-routines += hp-timing
endif