1998-04-16 07:42  Geoff Keating  <geoffk@ozemail.com.au>

	* Makeconfig [!build-static]: Link `static' binaries with libc_pic.a.
	Still need *FLAGS-.o because we still sometimes build .o files.
	* db2/Makefile: Don't build libndbm.a if !build-static.

1998-04-16 07:42  Geoff Keating  <geoffk@ozemail.com.au>

	* configure.in: New test for broken gcc on PowerPC.
	* sysdeps/powerpc/atomicity.h: Use result of test.
	* linuxthreads/sysdeps/powerpc/pt-machine.h: Use result of test.

	* math/libm-test.c: Update many of the epsilon to match actual
	performance.

	* sysdeps/libm-ieee754/e_exp.c: Reduce the number of branches.
	* sysdeps/libm-ieee754/e_expf.c: Likewise.
	* sysdeps/libm-ieee754/s_exp2.c: Likewise.
	* sysdeps/libm-ieee754/s_exp2f.c: Likewise.

	* sysdeps/libm-ieee754/e_pow.c: Correct typo.

	* sysdeps/powerpc/elf/libc-start.c: New file.
	* sysdeps/powerpc/elf/start.S: New file, use libc-start.
	* sysdeps/powerpc/elf/start.c: Delete.

	* sysdeps/unix/sysv/linux/powerpc/Dist: Remove syscall.h
	* sysdeps/unix/sysv/linux/powerpc/syscall.h: Delete.  It was unused.

	* sysdeps/unix/sysv/linux/powerpc/dl-sysdep.c: Correct previous
	few patches.
This commit is contained in:
Ulrich Drepper 1998-05-06 14:43:15 +00:00
parent b22fc5f565
commit 6600049466
15 changed files with 297 additions and 123 deletions

View File

@ -1,3 +1,35 @@
1998-04-16 07:42 Geoff Keating <geoffk@ozemail.com.au>
* Makeconfig [!build-static]: Link `static' binaries with libc_pic.a.
Still need *FLAGS-.o because we still sometimes build .o files.
* db2/Makefile: Don't build libndbm.a if !build-static.
1998-04-16 07:42 Geoff Keating <geoffk@ozemail.com.au>
* configure.in: New test for broken gcc on PowerPC.
* sysdeps/powerpc/atomicity.h: Use result of test.
* linuxthreads/sysdeps/powerpc/pt-machine.h: Use result of test.
* math/libm-test.c: Update many of the epsilon to match actual
performance.
* sysdeps/libm-ieee754/e_exp.c: Reduce the number of branches.
* sysdeps/libm-ieee754/e_expf.c: Likewise.
* sysdeps/libm-ieee754/s_exp2.c: Likewise.
* sysdeps/libm-ieee754/s_exp2f.c: Likewise.
* sysdeps/libm-ieee754/e_pow.c: Correct typo.
* sysdeps/powerpc/elf/libc-start.c: New file.
* sysdeps/powerpc/elf/start.S: New file, use libc-start.
* sysdeps/powerpc/elf/start.c: Delete.
* sysdeps/unix/sysv/linux/powerpc/Dist: Remove syscall.h
* sysdeps/unix/sysv/linux/powerpc/syscall.h: Delete. It was unused.
* sysdeps/unix/sysv/linux/powerpc/dl-sysdep.c: Correct previous
few patches.
1998-05-06 12:51 Ulrich Drepper <drepper@cygnus.com>
* sysdeps/i386/fpu/bits/mathinline.h (pow): Use long long int for

View File

@ -440,8 +440,16 @@ endif
endif
# The static libraries.
ifeq (yes,$(build-static))
link-libc-static = $(common-objpfx)libc.a $(gnulib) $(common-objpfx)libc.a
link-extra-libs-static = $(foreach lib,$(LDLIBS-$(@F)),$(common-objpfx)$(lib).a)
else
ifeq (yes,$(build-shared))
# We can try to link the programs with lib*_pic.a...
link-libc-static = $(link-libc) $(common-objpfx)libc_pic.a
link-extra-libs-static = $(link-extra-libs)
endif
endif
ifndef gnulib
gnulib := -lgcc
@ -584,9 +592,9 @@ endif
libtypes = $(foreach o,$(object-suffixes-for-libc),$(libtype$o))
all-object-suffixes := .o .os .op .og .ob .oS
object-suffixes :=
ifeq (yes,$(build-static))
CPPFLAGS-.o = $(pic-default)
CFLAGS-.o = $(filter %frame-pointer,$(+cflags))
ifeq (yes,$(build-static))
libtype.o := lib%.a
object-suffixes += .o
endif

View File

@ -59,10 +59,14 @@
with static variable. */
#undef HAVE_DWARF2_UNWIND_INFO_STATIC
/* Define is the regparm attribute shall be used for local functions
/* Define if the regparm attribute shall be used for local functions
(gcc on ix86 only). */
#undef USE_REGPARMS
/* Defined on PowerPC if the GCC being used has a problem with clobbering
certain registers (CR0, MQ, CTR, LR) in asm statements. */
#undef BROKEN_PPC_ASM_CR0
/* Defined to some form of __attribute__ ((...)) if the compiler supports
a different, more efficient calling convention. */

View File

@ -921,6 +921,18 @@ else
fi
fi
if test "$host_cpu" = powerpc ; then
# Check for a bug present in at least versions 2.8.x of GCC
# and versions 1.0.x of EGCS.
AC_CACHE_CHECK(whether clobbering cr0 causes problems,libc_cv_c_asmcr0_bug,[dnl
AC_TRY_COMPILE([int tester(int x) { asm ("" : : : "cc"); return x & 123; }],,
libc_cv_c_asmcr0_bug='no',
libc_cv_c_asmcr0_bug='yes')])
if test "$libc_cv_c_asmcr0_bug" != 'no'; then
AC_DEFINE(BROKEN_PPC_ASM_CR0)
fi
fi
AC_CACHE_CHECK(for DWARF2 unwind info support, libc_cv_gcc_dwarf2_unwind_info,
[cat > conftest.c <<EOF
#line __oline__ "configure"

View File

@ -111,9 +111,11 @@ endif
# Depend on libc.so so a DT_NEEDED is generated in the shared objects.
$(objpfx)libdb.so: $(common-objpfx)libc.so
ifeq ($(build-static),yes)
subdir_install: $(inst_libdir)/libndbm.a
$(inst_libdir)/libndbm.a: $(inst_libdir)/libdb.a $(+force)
$(make-link)
endif
ifeq ($(build-shared),yes)
subdir_install: $(inst_libdir)/libndbm.so

View File

@ -1,6 +1,6 @@
/* Machine-dependent pthreads configuration and inline functions.
powerpc version.
Copyright (C) 1996, 1997 Free Software Foundation, Inc.
Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Richard Henderson <rth@tamu.edu>.
@ -32,7 +32,12 @@
#endif
/* Spinlock implementation; required. */
extern inline int
#if BROKEN_PPC_ASM_CR0
static
#else
extern inline
#endif
int
testandset (int *spinlock)
{
int ret;
@ -63,7 +68,12 @@ register char * stack_pointer __asm__ ("r1");
/* note that test-and-set(x) is the same as compare-and-swap(x, 0, 1) */
#define HAS_COMPARE_AND_SWAP
extern inline int
#if BROKEN_PPC_ASM_CR0
static
#else
extern inline
#endif
int
__compare_and_swap (int *p, int oldval, int newval)
{
int ret;

View File

@ -1072,7 +1072,7 @@ cbrt_test (void)
check_eps ("cbrt (-27) == -3", FUNC(cbrt) (-27.0), -3.0,
CHOOSE (3e-16L, 5e-16, 0));
check_eps ("cbrt (0.970299) == 0.99", FUNC(cbrt) (0.970299), 0.99,
CHOOSE (2e-17L, 0, 0));
CHOOSE (2e-17L, 2e-16, 0));
check_eps ("cbrt (0.7) == .8879040017...", FUNC(cbrt) (0.7),
0.8879040017426007084L, CHOOSE(2e-17L, 6e-16, 0));
@ -1113,7 +1113,7 @@ cos_test (void)
0, CHOOSE (1e-19L, 1e-16L, 1e-7L));
check_eps ("cos (0.7) == 0.7648421872...", FUNC(cos) (0.7),
0.7648421872844884262L, CHOOSE(3e-17, 2e-16, 0));
0.7648421872844884262L, CHOOSE(3e-17, 2e-16, 6e-8));
}
static void
@ -1608,7 +1608,7 @@ log10_test (void)
check_eps ("log10 (e) == M_LOG10E", FUNC(log10) (M_El), M_LOG10El,
CHOOSE (1e-18, 0, 9e-8));
check_eps ("log10 (0.7) == -0.1549019599...", FUNC(log10) (0.7),
-0.15490195998574316929L, CHOOSE(3e-17L, 3e-17, 0));
-0.15490195998574316929L, CHOOSE(3e-17L, 3e-17, 2e-8));
}
@ -1857,7 +1857,7 @@ sinh_test (void)
#endif
check_eps ("sinh (0.7) == 0.7585837018...", FUNC(sinh) (0.7),
0.75858370183953350346L, CHOOSE(6e-17L, 0, 6e-8));
0.75858370183953350346L, CHOOSE(6e-17L, 2e-16, 6e-8));
}
@ -1914,7 +1914,7 @@ sincos_test (void)
check_eps ("sincos (0.7, &sin, &cos) puts 0.6442176872... in sin", sin_res,
0.64421768723769105367L, CHOOSE(4e-17L, 0, 0));
check_eps ("sincos (0.7, &sin, &cos) puts 0.7648421872... in cos", cos_res,
0.76484218728448842626L, CHOOSE(3e-17L, 2e-16, 0));
0.76484218728448842626L, CHOOSE(3e-17L, 2e-16, 6e-8));
}
@ -1946,7 +1946,7 @@ tanh_test (void)
check ("tanh (-inf) == -1", FUNC(tanh) (minus_infty), -1);
#endif
check_eps ("tanh (0.7) == 0.6043677771...", FUNC(tanh) (0.7),
0.60436777711716349631L, CHOOSE(3e-17L, 0, 6e-8));
0.60436777711716349631L, CHOOSE(3e-17L, 2e-16, 6e-8));
}
@ -3437,7 +3437,7 @@ ccosh_test (void)
check_eps ("real(ccosh(0.7 + i 1.2)) == 0.45482...", __real__ result,
0.4548202223691477654L, CHOOSE(5e-17L, 6e-17, 9e-8));
check_eps ("imag(ccosh(0.7 + i 1.2)) == 0.70702...", __imag__ result,
0.7070296600921537682L, CHOOSE(7e-17L, 0, 0));
0.7070296600921537682L, CHOOSE(7e-17L, 2e-16, 0));
result = FUNC(ccosh) (BUILD_COMPLEX (-2, -3));
check_eps ("real(ccosh(-2 - i 3)) == -3.72454...", __real__ result,
@ -3579,7 +3579,7 @@ cacos_test (void)
check_eps ("real(cacos(0.7 + i 1.2)) == 1.13518...", __real__ result,
1.1351827477151551089L, CHOOSE(2e-17L, 3e-16, 2e-7));
check_eps ("imag(cacos(0.7 + i 1.2)) == -1.09276...", __imag__ result,
-1.0927647857577371459L, CHOOSE(4e-17L, 0, 3e-7));
-1.0927647857577371459L, CHOOSE(4e-17L, 3e-16, 3e-7));
result = FUNC(cacos) (BUILD_COMPLEX (-2, -3));
check_eps ("real(cacos(-2 - i 3)) == 2.14144...", __real__ result,
@ -3717,7 +3717,7 @@ cacosh_test (void)
result = FUNC(cacosh) (BUILD_COMPLEX (0.7, 1.2));
check_eps ("real(cacosh(0.7 + i 1.2)) == 1.09276...", __real__ result,
1.0927647857577371459L, CHOOSE(4e-17L, 3e-16, 0));
1.0927647857577371459L, CHOOSE(4e-17L, 3e-16, 2e-7));
check_eps ("imag(cacosh(0.7 + i 1.2)) == 1.13518...", __imag__ result,
1.1351827477151551089L, CHOOSE(2e-17L, 0, 0));
@ -3864,7 +3864,7 @@ casin_test (void)
check_eps ("real(casin(0.7 + i 1.2)) == 0.43561...", __real__ result,
0.4356135790797415103L, CHOOSE(2e-17L, 2e-16, 2e-7));
check_eps ("imag(casin(0.7 + i 1.2)) == 1.09276...", __imag__ result,
1.0927647857577371459L, CHOOSE(4e-17L, 0, 3e-7));
1.0927647857577371459L, CHOOSE(4e-17L, 3e-16, 3e-7));
result = FUNC(casin) (BUILD_COMPLEX (-2, -3));
check_eps ("real(casin(-2 - i 3)) == -0.57065...", __real__ result,
@ -4157,13 +4157,13 @@ catan_test (void)
result = FUNC(catan) (BUILD_COMPLEX (0.7, 1.2));
check_eps ("real(catan(0.7 + i 1.2)) == 1.07857...", __real__ result,
1.0785743834118921877L, CHOOSE (3e-17, 0, 0));
1.0785743834118921877L, CHOOSE (3e-17, 0, 5e-7));
check_eps ("imag(catan(0.7 + i 1.2)) == 0.57705...", __imag__ result,
0.5770573776534306764L, CHOOSE(3e-17L, 0, 6e-8));
0.5770573776534306764L, CHOOSE(3e-17L, 2e-16, 6e-8));
result = FUNC(catan) (BUILD_COMPLEX (-2, -3));
check ("real(catan(-2 - i 3)) == -1.40992...", __real__ result,
-1.4099210495965755225L);
check_eps ("real(catan(-2 - i 3)) == -1.40992...", __real__ result,
-1.4099210495965755225L, CHOOSE(0, 0, 4e-7));
check_eps ("imag(catan(-2 - i 3)) == -0.22907...", __imag__ result,
-0.2290726829685387662L, CHOOSE(1.1e-19L, 3e-17, 2e-8));
}
@ -4309,13 +4309,13 @@ catanh_test (void)
check_eps ("real(catanh(0.7 + i 1.2)) == 0.26007...", __real__ result,
0.2600749516525135959L, CHOOSE (2e-18, 6e-17, 0));
check_eps ("imag(catanh(0.7 + i 1.2)) == 0.97024...", __imag__ result,
0.9702403077950989849L, CHOOSE (3e-17, 0, 0));
0.9702403077950989849L, CHOOSE (3e-17, 2e-16, 4e-7));
result = FUNC(catanh) (BUILD_COMPLEX (-2, -3));
check_eps ("real(catanh(-2 - i 3)) == -0.14694...", __real__ result,
-0.1469466662255297520L, CHOOSE (9e-20L, 6e-17, 2e-8));
-0.1469466662255297520L, CHOOSE (9e-20L, 2e-16, 2e-8));
check_eps ("imag(catanh(-2 - i 3)) == -1.33897...", __imag__ result,
-1.3389725222944935611L, CHOOSE (7e-19L, 0, 0));
-1.3389725222944935611L, CHOOSE (7e-19L, 0, 5e-7));
}
@ -4459,11 +4459,11 @@ ctan_test (void)
check_eps ("real(ctan(0.7 + i 1.2)) == 0.17207...", __real__ result,
0.1720734197630349001L, CHOOSE(1e-17L, 3e-17, 2e-8));
check_eps ("imag(ctan(0.7 + i 1.2)) == 0.95448...", __imag__ result,
0.9544807059989405538L, CHOOSE(2e-17L, 2e-16, 0));
0.9544807059989405538L, CHOOSE(2e-17L, 2e-16, 6e-8));
result = FUNC(ctan) (BUILD_COMPLEX (-2, -3));
check_eps ("real(ctan(-2 - i 3)) == -0.00376...", __real__ result,
0.0037640256415042482L, CHOOSE(1e-19L, 0, 0));
0.0037640256415042482L, CHOOSE(1e-19L, 5e-19, 0));
check_eps ("imag(ctan(-2 - i 3)) == -1.00323...", __imag__ result,
-1.0032386273536098014L, CHOOSE(2e-19L, 0, 2e-7));
}
@ -4610,15 +4610,15 @@ ctanh_test (void)
result = FUNC(ctanh) (BUILD_COMPLEX (0.7, 1.2));
check_eps ("real(ctanh(0.7 + i 1.2)) == 1.34721...", __real__ result,
1.3472197399061191630L, CHOOSE(4e-17L, 3e-16, 2e-7));
1.3472197399061191630L, CHOOSE(4e-17L, 5e-16, 2e-7));
check_eps ("imag(ctanh(0.7 + i 1.2)) == -0.47786...", __imag__ result,
0.4778641038326365540L, CHOOSE(9e-17L, 6e-17, 9e-8));
0.4778641038326365540L, CHOOSE(9e-17L, 2e-16, 9e-8));
result = FUNC(ctanh) (BUILD_COMPLEX (-2, -3));
check_eps ("real(ctanh(-2 - i 3)) == -0.96538...", __real__ result,
-0.9653858790221331242L, CHOOSE(2e-19L, 0, 0));
-0.9653858790221331242L, CHOOSE(2e-19L, 2e-16, 2e-7));
check_eps ("imag(ctanh(-2 - i 3)) == 0.00988...", __imag__ result,
0.0098843750383224937L, CHOOSE(7e-20L, 0, 1e-9));
0.0098843750383224937L, CHOOSE(7e-20L, 2e-16, 1e-9));
}
@ -4786,7 +4786,7 @@ clog_test (void)
check_eps ("real(clog(-2 - i 3)) == 1.28247...", __real__ result,
1.2824746787307683680L, CHOOSE(3e-19L, 0, 0));
check_eps ("imag(clog(-2 - i 3)) == -2.15879...", __imag__ result,
-2.1587989303424641704L, CHOOSE(2e-18L, 0, 0));
-2.1587989303424641704L, CHOOSE(2e-18L, 5e-16, 8e-7));
}
@ -4968,7 +4968,7 @@ clog10_test (void)
check_eps ("real(clog10(-2 - i 3)) == 0.55697...", __real__ result,
0.5569716761534183846L, CHOOSE(6e-20L, 0, 0));
check_eps ("imag(clog10(-2 - i 3)) == -0.93755...", __imag__ result,
-0.9375544629863747085L, CHOOSE (7e-19L, 2e-16, 0));
-0.9375544629863747085L, CHOOSE (7e-19L, 2e-16, 3e-7));
}

View File

@ -76,8 +76,8 @@ __ieee754_exp (double x)
/* Check for usual case. */
if (isless (x, himark) && isgreater (x, lomark))
{
static const double TWO43 = 8796093022208.0;
static const double TWO52 = 4503599627370496.0;
static const double THREEp42 = 13194139533312.0;
static const double THREEp51 = 6755399441055744.0;
/* 1/ln(2). */
static const double M_1_LN2 = 1.442695040888963387;
/* ln(2), part 1 */
@ -94,40 +94,22 @@ __ieee754_exp (double x)
fesetround (FE_TONEAREST);
/* Calculate n. */
if (x >= 0)
{
n = x * M_1_LN2 + TWO52;
n -= TWO52;
}
else
{
n = x * M_1_LN2 - TWO52;
n += TWO52;
}
n = x * M_1_LN2 + THREEp51;
n -= THREEp51;
x = x - n*M_LN2_0;
if (x >= 0)
{
/* Calculate t/512. */
t = x + TWO43;
t -= TWO43;
x -= t;
/* Compute tval = t. */
tval = (int) (t * 512.0);
/* Calculate t/512. */
t = x + THREEp42;
t -= THREEp42;
x -= t;
x -= __exp_deltatable[tval];
}
/* Compute tval = t. */
tval = (int) (t * 512.0);
if (t >= 0)
x -= __exp_deltatable[tval];
else
{
/* As above, but x is negative. */
t = x - TWO43;
t += TWO43;
x -= t;
tval = (int) (t * 512.0);
x += __exp_deltatable[-tval];
}
x += __exp_deltatable[-tval];
/* Now, the variable x contains x + n*ln(2)_1. */
dely = n*M_LN2_1;

View File

@ -71,8 +71,8 @@ __ieee754_expf (float x)
/* Check for usual case. */
if (isless (x, himark) && isgreater (x, lomark))
{
static const float TWO43 = 8796093022208.0;
static const float TWO23 = 8388608.0;
static const float THREEp42 = 13194139533312.0;
static const float THREEp22 = 12582912.0;
/* 1/ln(2). */
#undef M_1_LN2
static const float M_1_LN2 = 1.44269502163f;
@ -90,40 +90,22 @@ __ieee754_expf (float x)
fesetround (FE_TONEAREST);
/* Calculate n. */
if (x >= 0)
{
n = x * M_1_LN2 + TWO23;
n -= TWO23;
}
else
{
n = x * M_1_LN2 - TWO23;
n += TWO23;
}
n = x * M_1_LN2 + THREEp22;
n -= THREEp22;
dx = x - n*M_LN2;
if (dx >= 0)
{
/* Calculate t/512. */
t = dx + TWO43;
t -= TWO43;
dx -= t;
/* Compute tval = t. */
tval = (int) (t * 512.0);
/* Calculate t/512. */
t = dx + THREEp42;
t -= THREEp42;
dx -= t;
delta = - __exp_deltatable[tval];
}
/* Compute tval = t. */
tval = (int) (t * 512.0);
if (t >= 0)
delta = - __exp_deltatable[tval];
else
{
/* As above, but x is negative. */
t = dx - TWO43;
t += TWO43;
dx -= t;
tval = (int) (t * 512.0);
delta = __exp_deltatable[-tval];
}
delta = __exp_deltatable[-tval];
/* Compute ex2 = 2^n e^(t/512+delta[t]). */
ex2_u.d = __exp_atable[tval+177];

View File

@ -48,7 +48,7 @@ __ieee754_exp2 (double x)
/* Check for usual case. */
if (isless (x, himark) && isgreater (x, lomark))
{
static const double TWO43 = 8796093022208.0;
static const double THREEp42 = 13194139533312.0;
int tval, unsafe;
double rx, x22, result;
union ieee754_double ex2_u, scale_u;
@ -66,16 +66,8 @@ __ieee754_exp2 (double x)
x = ex + t/512 + x1.
First, calculate rx = ex + t/512. */
if (x >= 0)
{
rx = x + TWO43;
rx -= TWO43;
}
else
{
rx = x - TWO43;
rx += TWO43;
}
rx = x + THREEp42;
rx -= THREEp42;
x -= rx; /* Compute x=x1. */
/* Compute tval = (ex*512 + t)+256.
Now, t = (tval mod 512)-256 and ex=tval/512 [that's mod, NOT %; and

View File

@ -49,7 +49,7 @@ __ieee754_exp2f (float x)
/* Check for usual case. */
if (isless (x, himark) && isgreater (x, lomark))
{
static const float TWO15 = 32768.0;
static const float THREEp14 = 49152.0;
int tval, unsafe;
float rx, x22, result;
union ieee754_float ex2_u, scale_u;
@ -67,16 +67,8 @@ __ieee754_exp2f (float x)
x = ex + t/512 + x1.
First, calculate rx = ex + t/256. */
if (x >= 0)
{
rx = x + TWO15;
rx -= TWO15;
}
else
{
rx = x - TWO15;
rx += TWO15;
}
rx = x + THREEp14;
rx -= THREEp14;
x -= rx; /* Compute x=x1. */
/* Compute tval = (ex*256 + t)+128.
Now, t = (tval mod 256)-128 and ex=tval/256 [that's mod, NOT %; and

View File

@ -1,5 +1,5 @@
/* Low-level functions for atomic operations. PowerPC version.
Copyright (C) 1997 Free Software Foundation, Inc.
Copyright (C) 1997, 1998 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
@ -22,7 +22,13 @@
#include <inttypes.h>
static inline int
#if BROKEN_PPC_ASM_CR0
# define __ATOMICITY_INLINE /* nothing */
#else
# define __ATOMICITY_INLINE inline
#endif
static __ATOMICITY_INLINE int
__attribute__ ((unused))
exchange_and_add (volatile uint32_t *mem, int val)
{
@ -36,7 +42,7 @@ exchange_and_add (volatile uint32_t *mem, int val)
return result;
}
static inline void
static __ATOMICITY_INLINE void
__attribute__ ((unused))
atomic_add (volatile uint32_t *mem, int val)
{
@ -49,7 +55,7 @@ atomic_add (volatile uint32_t *mem, int val)
" : "=&r"(tmp) : "r" (mem), "r"(val) : "cr0");
}
static inline int
static __ATOMICITY_INLINE int
__attribute__ ((unused))
compare_and_swap (volatile long int *p, long int oldval, long int newval)
{
@ -66,7 +72,7 @@ compare_and_swap (volatile long int *p, long int oldval, long int newval)
return result;
}
static inline long int
static __ATOMICITY_INLINE long int
__attribute__ ((unused))
always_swap (volatile long int *p, long int newval)
{
@ -79,7 +85,7 @@ always_swap (volatile long int *p, long int newval)
return result;
}
static inline int
static __ATOMICITY_INLINE int
__attribute__ ((unused))
test_and_set (volatile long int *p, long int oldval, long int newval)
{

View File

@ -0,0 +1,100 @@
/* Copyright (C) 1998 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
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <stdlib.h>
#include <unistd.h>
#include <elf/ldsodefs.h>
extern void __libc_init_first (int argc, char **argv, char **envp);
extern int _dl_starting_up;
weak_extern (_dl_starting_up)
extern int __libc_multiple_libcs;
struct startup_info
{
void *sda_base;
int (*main) (int, char **, char **, void *);
int (*init) (int, char **, char **, void *);
void (*fini) (void);
};
int
__libc_start_main (int argc, char **argv, char **envp,
void *auxvec, void (*rtld_fini) (void),
struct startup_info *stinfo,
char **stack_on_entry)
{
#ifndef PIC
/* The next variable is only here to work around a bug in gcc <= 2.7.2.2.
If the address would be taken inside the expression the optimizer
would try to be too smart and throws it away. Grrr. */
int *dummy_addr = &_dl_starting_up;
__libc_multiple_libcs = dummy_addr && !_dl_starting_up;
#endif
/* the PPC SVR4 ABI says that the top thing on the stack will
be a NULL pointer, so if not we assume that we're being called
as a statically-linked program by Linux... */
if (*stack_on_entry != NULL)
{
/* ...in which case, we have argc as the top thing on the
stack, followed by argv (NULL-terminated), envp (likewise),
and the auxilary vector. */
argc = *(int *) stack_on_entry;
argv = stack_on_entry + 1;
envp = argv + argc + 1;
auxvec = envp;
while (*(char **) auxvec != NULL)
++auxvec;
++auxvec;
rtld_fini = NULL;
}
/* Register the destructor of the dynamic linker if there is any. */
if (rtld_fini != NULL)
atexit (rtld_fini);
/* Set the global _environ variable correctly. */
__environ = envp;
/* Call the initializer of the libc. */
#ifdef PIC
if (_dl_debug_impcalls)
_dl_debug_message (1, "\ninitialize libc\n\n", NULL);
#endif
__libc_init_first (argc, argv, envp);
/* Call the initializer of the program. */
#ifdef PIC
if (_dl_debug_impcalls)
_dl_debug_message (1, "\ninitialize program: ", argv[0], "\n\n", NULL);
#endif
stinfo->init (argc, argv, __environ, auxvec);
/* Register the destructor of the program. */
atexit (stinfo->fini);
#ifdef PIC
if (_dl_debug_impcalls)
_dl_debug_message (1, "\ntransferring control: ", argv[0], "\n\n", NULL);
#endif
exit (stinfo->main (argc, argv, __environ, auxvec));
}

View File

@ -0,0 +1,53 @@
/* Startup code for programs linked with GNU libc.
Copyright (C) 1998 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
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <sysdep.h>
/* These are the various addresses we require. */
.section ".rodata"
.align 2
L(start_addresses):
.long _SDA_BASE_
.long JUMPTARGET(main)
.long JUMPTARGET(_init)
.long JUMPTARGET(_fini)
ASM_SIZE_DIRECTIVE(L(start_addresses))
.section ".text"
ENTRY(_start)
/* Save the stack pointer, in case we're statically linked under Linux. */
mr %r9,%r1
/* Set up an initial stack frame, and clear the LR. */
clrrwi %r1,%r1,4
li %r0,0
stwu %r1,-16(%r1)
mtlr %r0
stw %r0,0(%r1)
/* Set r13 to point at the 'small data area', and put the address of
start_addresses in r8... */
lis %r8,L(start_addresses)@ha
lwzu %r13,L(start_addresses)@l(%r8)
/* and continue in libc-start, in glibc. */
b JUMPTARGET(__libc_start_main)
END(_start)
/* Define a symbol for the first piece of initialized data. */
.section ".data"
__data_start:
weak_alias (__data_start, data_start)

View File

@ -3,4 +3,3 @@ clone.S
kernel_stat.h
kernel_termios.h
init-first.h
syscall.h