mirror of
https://sourceware.org/git/glibc.git
synced 2025-08-07 06:43:00 +03:00
Update.
2001-04-03 Ulrich Drepper <drepper@redhat.com> * misc/dirname.c (dirname): Handle multiple slashes correctly. 2001-04-03 Martin Schwidefsky <schwidefsky@de.ibm.com> * sysdeps/s390/s390-64/initfini.c: Fix __gmon_start__ GOT access. 2001-04-03 Martin Schwidefsky <schwidefsky@de.ibm.com> * sysdeps/s390/s390-32/bcopy.S: Optimize for speed. * sysdeps/s390/s390-64/bcopy.S: Likewise. * sysdeps/s390/s390-32/mempcy.S: Likewise. * sysdeps/s390/s390-64/memcpy.S: Likewise. 2001-04-02 Bruno Haible <haible@clisp.cons.org> * manual/message.texi (Advanced gettext functions): More specific syntax in the plural formula examples. 2001-04-02 Franz Sirl <Franz.Sirl-kernel@lauterbach.com> * sysdeps/powerpc/atomicity.h: Silence warnings. * sysdeps/powerpc/dl-machine.h: Likewise. * sysdeps/powerpc/register-dump.h: Likewise. * sysdeps/powerpc/fpu/s_lrint.c: Likewise. 2001-04-02 Andreas Jaeger <aj@suse.de> * misc/tst-dirname.c (main): Add more tests, derived from a bug report by Michael Kerrisk <mtk16@ext.canterbury.ac.nz>. 2001-04-01 Andreas Jaeger <aj@suse.de> * debug/xtrace.sh (pcprofileso): Use SLIBDIR since libpcprofile.so is installed there. * malloc/memusage.sh (memusageso): Likewise for libmemusage.so. 2001-04-01 H.J. Lu <hjl@gnu.org> * posix/annexc.c (macrofile): Renamed from TMPFILE and set to tmpnam (NULL). * stdlib/isomac.c (macrofile): Likewise. 2001-03-30 Thorsten Kukuk <kukuk@suse.de> * inet/rcmd.c: Allow AF_UNSPEC as parameter. * nis/ypclnt.c (yp_all): Print error message only at last try, check for protocoll error only if we don't have a network error.
This commit is contained in:
50
ChangeLog
50
ChangeLog
@@ -1,3 +1,53 @@
|
|||||||
|
2001-04-03 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
|
* misc/dirname.c (dirname): Handle multiple slashes correctly.
|
||||||
|
|
||||||
|
2001-04-03 Martin Schwidefsky <schwidefsky@de.ibm.com>
|
||||||
|
|
||||||
|
* sysdeps/s390/s390-64/initfini.c: Fix __gmon_start__ GOT access.
|
||||||
|
|
||||||
|
2001-04-03 Martin Schwidefsky <schwidefsky@de.ibm.com>
|
||||||
|
|
||||||
|
* sysdeps/s390/s390-32/bcopy.S: Optimize for speed.
|
||||||
|
* sysdeps/s390/s390-64/bcopy.S: Likewise.
|
||||||
|
* sysdeps/s390/s390-32/mempcy.S: Likewise.
|
||||||
|
* sysdeps/s390/s390-64/memcpy.S: Likewise.
|
||||||
|
|
||||||
|
2001-04-02 Bruno Haible <haible@clisp.cons.org>
|
||||||
|
|
||||||
|
* manual/message.texi (Advanced gettext functions): More specific
|
||||||
|
syntax in the plural formula examples.
|
||||||
|
|
||||||
|
2001-04-02 Franz Sirl <Franz.Sirl-kernel@lauterbach.com>
|
||||||
|
|
||||||
|
* sysdeps/powerpc/atomicity.h: Silence warnings.
|
||||||
|
* sysdeps/powerpc/dl-machine.h: Likewise.
|
||||||
|
* sysdeps/powerpc/register-dump.h: Likewise.
|
||||||
|
* sysdeps/powerpc/fpu/s_lrint.c: Likewise.
|
||||||
|
|
||||||
|
2001-04-02 Andreas Jaeger <aj@suse.de>
|
||||||
|
|
||||||
|
* misc/tst-dirname.c (main): Add more tests, derived from a bug
|
||||||
|
report by Michael Kerrisk <mtk16@ext.canterbury.ac.nz>.
|
||||||
|
|
||||||
|
2001-04-01 Andreas Jaeger <aj@suse.de>
|
||||||
|
|
||||||
|
* debug/xtrace.sh (pcprofileso): Use SLIBDIR since libpcprofile.so
|
||||||
|
is installed there.
|
||||||
|
* malloc/memusage.sh (memusageso): Likewise for libmemusage.so.
|
||||||
|
|
||||||
|
2001-04-01 H.J. Lu <hjl@gnu.org>
|
||||||
|
|
||||||
|
* posix/annexc.c (macrofile): Renamed from TMPFILE and set to
|
||||||
|
tmpnam (NULL).
|
||||||
|
* stdlib/isomac.c (macrofile): Likewise.
|
||||||
|
|
||||||
|
2001-03-30 Thorsten Kukuk <kukuk@suse.de>
|
||||||
|
|
||||||
|
* inet/rcmd.c: Allow AF_UNSPEC as parameter.
|
||||||
|
* nis/ypclnt.c (yp_all): Print error message only at last try,
|
||||||
|
check for protocoll error only if we don't have a network error.
|
||||||
|
|
||||||
2001-04-02 Andreas Schwab <schwab@suse.de>
|
2001-04-02 Andreas Schwab <schwab@suse.de>
|
||||||
|
|
||||||
* resolv/res_data.c (res_isourserver): Fix cast.
|
* resolv/res_data.c (res_isourserver): Fix cast.
|
||||||
|
12
FAQ
12
FAQ
@@ -163,6 +163,7 @@ please let me know.
|
|||||||
when I try to use it, it always returns -1 and sets errno to ENOSYS.
|
when I try to use it, it always returns -1 and sets errno to ENOSYS.
|
||||||
3.22. My program segfaults when I call fclose() on the FILE* returned
|
3.22. My program segfaults when I call fclose() on the FILE* returned
|
||||||
from setmntent(). Is this a glibc bug?
|
from setmntent(). Is this a glibc bug?
|
||||||
|
3.23. I get "undefined reference to `atexit'"
|
||||||
|
|
||||||
4. Miscellaneous
|
4. Miscellaneous
|
||||||
|
|
||||||
@@ -1683,6 +1684,17 @@ In the case of setmntent(), it may appear to work in most cases, but it
|
|||||||
won't always work. Unfortunately, for compatibility reasons, we can't
|
won't always work. Unfortunately, for compatibility reasons, we can't
|
||||||
change the return type of setmntent() to something other than FILE *.
|
change the return type of setmntent() to something other than FILE *.
|
||||||
|
|
||||||
|
|
||||||
|
3.23. I get "undefined reference to `atexit'"
|
||||||
|
|
||||||
|
{UD} This means that your installation is somehow broken. The situation is
|
||||||
|
the same as for 'stat', 'fstat', etc (see question 2.7). Investigate why the
|
||||||
|
linker does not pick up libc_nonshared.a.
|
||||||
|
|
||||||
|
If a similar message is issued at runtime this means that the application or
|
||||||
|
DSO is not linked against libc. This can cause problems since 'atexit' is
|
||||||
|
not exported anymore.
|
||||||
|
|
||||||
|
|
||||||
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
||||||
|
|
||||||
|
12
FAQ.in
12
FAQ.in
@@ -565,7 +565,7 @@ exactly what to use.
|
|||||||
Version 2.7.2.3 does and future versions of GCC will automatically
|
Version 2.7.2.3 does and future versions of GCC will automatically
|
||||||
provide the correct specs.
|
provide the correct specs.
|
||||||
|
|
||||||
?? Looking through the shared libc file I haven't found the
|
??nonsh Looking through the shared libc file I haven't found the
|
||||||
functions `stat', `lstat', `fstat', and `mknod' and while
|
functions `stat', `lstat', `fstat', and `mknod' and while
|
||||||
linking on my Linux system I get error messages. How is
|
linking on my Linux system I get error messages. How is
|
||||||
this supposed to work?
|
this supposed to work?
|
||||||
@@ -1438,6 +1438,16 @@ In the case of setmntent(), it may appear to work in most cases, but it
|
|||||||
won't always work. Unfortunately, for compatibility reasons, we can't
|
won't always work. Unfortunately, for compatibility reasons, we can't
|
||||||
change the return type of setmntent() to something other than FILE *.
|
change the return type of setmntent() to something other than FILE *.
|
||||||
|
|
||||||
|
?? I get "undefined reference to `atexit'"
|
||||||
|
|
||||||
|
{UD} This means that your installation is somehow broken. The situation is
|
||||||
|
the same as for 'stat', 'fstat', etc (see ?nonsh). Investigate why the
|
||||||
|
linker does not pick up libc_nonshared.a.
|
||||||
|
|
||||||
|
If a similar message is issued at runtime this means that the application or
|
||||||
|
DSO is not linked against libc. This can cause problems since 'atexit' is
|
||||||
|
not exported anymore.
|
||||||
|
|
||||||
|
|
||||||
? Miscellaneous
|
? Miscellaneous
|
||||||
|
|
||||||
|
@@ -18,7 +18,7 @@
|
|||||||
# write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
# write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
# Boston, MA 02111-1307, USA.
|
# Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
pcprofileso=@LIBDIR@/libpcprofile.so
|
pcprofileso=@SLIBDIR@/libpcprofile.so
|
||||||
pcprofiledump=@BINDIR@/pcprofiledump
|
pcprofiledump=@BINDIR@/pcprofiledump
|
||||||
|
|
||||||
# Print usage message.
|
# Print usage message.
|
||||||
|
@@ -18,7 +18,7 @@
|
|||||||
# write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
# write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
# Boston, MA 02111-1307, USA.
|
# Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
memusageso=@LIBDIR@/libmemusage.so
|
memusageso=@SLIBDIR@/libmemusage.so
|
||||||
memusagestat=@BINDIR@/memusagestat
|
memusagestat=@BINDIR@/memusagestat
|
||||||
|
|
||||||
# Print usage message.
|
# Print usage message.
|
||||||
|
@@ -1075,7 +1075,7 @@ code similar to the following:
|
|||||||
@end smallexample
|
@end smallexample
|
||||||
|
|
||||||
@noindent
|
@noindent
|
||||||
After the first complains from people internationalizing the code people
|
After the first complaints from people internationalizing the code people
|
||||||
either completely avoided formulations like this or used strings like
|
either completely avoided formulations like this or used strings like
|
||||||
@code{"file(s)"}. Both look unnatural and should be avoided. First
|
@code{"file(s)"}. Both look unnatural and should be avoided. First
|
||||||
tries to solve the problem correctly looked like this:
|
tries to solve the problem correctly looked like this:
|
||||||
@@ -1193,11 +1193,11 @@ details are explained in the GNU @code{gettext} manual. Here only a a
|
|||||||
bit of information is provided.
|
bit of information is provided.
|
||||||
|
|
||||||
The information about the plural form selection has to be stored in the
|
The information about the plural form selection has to be stored in the
|
||||||
header entry (the one with the empty (@code{msgid} string). There should
|
header entry (the one with the empty (@code{msgid} string). It looks
|
||||||
be something like:
|
like this:
|
||||||
|
|
||||||
@smallexample
|
@smallexample
|
||||||
nplurals=2; plural=n == 1 ? 0 : 1
|
Plural-Forms: nplurals=2; plural=n == 1 ? 0 : 1;
|
||||||
@end smallexample
|
@end smallexample
|
||||||
|
|
||||||
The @code{nplurals} value must be a decimal number which specifies how
|
The @code{nplurals} value must be a decimal number which specifies how
|
||||||
@@ -1222,11 +1222,11 @@ below).@footnote{Additions are welcome. Send appropriate information to
|
|||||||
@table @asis
|
@table @asis
|
||||||
@item Only one form:
|
@item Only one form:
|
||||||
Some languages only require one single form. There is no distinction
|
Some languages only require one single form. There is no distinction
|
||||||
between the singular and plural form. And appropriate header entry
|
between the singular and plural form. An appropriate header entry
|
||||||
would look like this:
|
would look like this:
|
||||||
|
|
||||||
@smallexample
|
@smallexample
|
||||||
nplurals=1; plural=0
|
Plural-Forms: nplurals=1; plural=0;
|
||||||
@end smallexample
|
@end smallexample
|
||||||
|
|
||||||
@noindent
|
@noindent
|
||||||
@@ -1246,7 +1246,7 @@ This is the form used in most existing programs since it is what English
|
|||||||
is using. A header entry would look like this:
|
is using. A header entry would look like this:
|
||||||
|
|
||||||
@smallexample
|
@smallexample
|
||||||
nplurals=2; plural=n != 1
|
Plural-Forms: nplurals=2; plural=n != 1;
|
||||||
@end smallexample
|
@end smallexample
|
||||||
|
|
||||||
(Note: this uses the feature of C expressions that boolean expressions
|
(Note: this uses the feature of C expressions that boolean expressions
|
||||||
@@ -1274,7 +1274,7 @@ Esperanto
|
|||||||
Exceptional case in the language family. The header entry would be:
|
Exceptional case in the language family. The header entry would be:
|
||||||
|
|
||||||
@smallexample
|
@smallexample
|
||||||
nplurals=2; plural=n>1
|
Plural-Forms: nplurals=2; plural=n>1;
|
||||||
@end smallexample
|
@end smallexample
|
||||||
|
|
||||||
@noindent
|
@noindent
|
||||||
@@ -1289,7 +1289,7 @@ French
|
|||||||
The header entry would be:
|
The header entry would be:
|
||||||
|
|
||||||
@smallexample
|
@smallexample
|
||||||
nplurals=3; plural=n==1 ? 0 : n==2 ? 1 : 2
|
Plural-Forms: nplurals=3; plural=n==1 ? 0 : n==2 ? 1 : 2;
|
||||||
@end smallexample
|
@end smallexample
|
||||||
|
|
||||||
@noindent
|
@noindent
|
||||||
@@ -1304,7 +1304,8 @@ Gaeilge
|
|||||||
The header entry would look like this:
|
The header entry would look like this:
|
||||||
|
|
||||||
@smallexample
|
@smallexample
|
||||||
nplurals=3; plural=n%100/10==1 ? 2 : n%10==1 ? 0 : (n+9)%10>3 ? 2 : 1
|
Plural-Forms: nplurals=3; \
|
||||||
|
plural=n%100/10==1 ? 2 : n%10==1 ? 0 : (n+9)%10>3 ? 2 : 1;
|
||||||
@end smallexample
|
@end smallexample
|
||||||
|
|
||||||
@noindent
|
@noindent
|
||||||
@@ -1319,8 +1320,9 @@ Czech, Russian, Slovak
|
|||||||
The header entry would look like this:
|
The header entry would look like this:
|
||||||
|
|
||||||
@smallexample
|
@smallexample
|
||||||
nplurals=3; plural=n==1 ? 0 : \
|
Plural-Forms: nplurals=3; \
|
||||||
n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2
|
plural=n==1 ? 0 : \
|
||||||
|
n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;
|
||||||
@end smallexample
|
@end smallexample
|
||||||
|
|
||||||
(Continuation in the next line is possible.)
|
(Continuation in the next line is possible.)
|
||||||
@@ -1337,7 +1339,8 @@ Polish
|
|||||||
The header entry would look like this:
|
The header entry would look like this:
|
||||||
|
|
||||||
@smallexample
|
@smallexample
|
||||||
nplurals=4; plural=n==1 ? 0 : n%10==2 ? 1 : n%10==3 || n%10==4 ? 2 : 3
|
Plural-Forms: nplurals=4; \
|
||||||
|
plural=n==1 ? 0 : n%10==2 ? 1 : n%10==3 || n%10==4 ? 2 : 3;
|
||||||
@end smallexample
|
@end smallexample
|
||||||
|
|
||||||
@noindent
|
@noindent
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
/* dirname - return directory part of PATH.
|
/* dirname - return directory part of PATH.
|
||||||
Copyright (C) 1996, 2000 Free Software Foundation, Inc.
|
Copyright (C) 1996, 2000, 2001 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
|
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
|
||||||
|
|
||||||
@@ -32,16 +32,40 @@ dirname (char *path)
|
|||||||
last_slash = path != NULL ? strrchr (path, '/') : NULL;
|
last_slash = path != NULL ? strrchr (path, '/') : NULL;
|
||||||
|
|
||||||
if (last_slash != NULL && last_slash != path && last_slash[1] == '\0')
|
if (last_slash != NULL && last_slash != path && last_slash[1] == '\0')
|
||||||
/* The '/' is the last character, we have to look further. */
|
{
|
||||||
last_slash = __memrchr (path, '/', last_slash - path);
|
/* Determine whether all remaining characters are slashes. */
|
||||||
|
char *runp;
|
||||||
|
|
||||||
|
for (runp = last_slash; runp != path; --runp)
|
||||||
|
if (runp[-1] != '/')
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* The '/' is the last character, we have to look further. */
|
||||||
|
if (runp != path)
|
||||||
|
last_slash = __memrchr (path, '/', runp - path);
|
||||||
|
}
|
||||||
|
|
||||||
if (last_slash != NULL)
|
if (last_slash != NULL)
|
||||||
{
|
{
|
||||||
|
/* Determine whether all remaining characters are slashes. */
|
||||||
|
char *runp;
|
||||||
|
|
||||||
|
for (runp = last_slash; runp != path; --runp)
|
||||||
|
if (runp[-1] != '/')
|
||||||
|
break;
|
||||||
|
|
||||||
/* Terminate the path. */
|
/* Terminate the path. */
|
||||||
if (last_slash == path)
|
if (runp == path)
|
||||||
/* The last slash is the first character in the string. We have to
|
{
|
||||||
return "/". */
|
/* The last slash is the first character in the string. We have to
|
||||||
++last_slash;
|
return "/". As a special case we have to return "//" if there
|
||||||
|
are exactly two slashes at the beginning of the string. See
|
||||||
|
XBD 4.10 Path Name Resolution for more information. */
|
||||||
|
if (last_slash == path + 1)
|
||||||
|
++last_slash;
|
||||||
|
else
|
||||||
|
last_slash = path + 1;
|
||||||
|
}
|
||||||
|
|
||||||
last_slash[0] = '\0';
|
last_slash[0] = '\0';
|
||||||
}
|
}
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
/* Test program for dirname function a la XPG.
|
/* Test program for dirname function a la XPG.
|
||||||
Copyright (C) 1996, 2000 Free Software Foundation, Inc.
|
Copyright (C) 1996, 2000, 2001 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
|
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
|
||||||
|
|
||||||
@@ -54,6 +54,13 @@ main (void)
|
|||||||
/* Some more tests. */
|
/* Some more tests. */
|
||||||
result |= test ("/usr/lib/", "/usr");
|
result |= test ("/usr/lib/", "/usr");
|
||||||
result |= test ("/usr", "/");
|
result |= test ("/usr", "/");
|
||||||
|
result |= test ("a//", ".");
|
||||||
|
result |= test ("a////", ".");
|
||||||
|
result |= test ("////usr", "/");
|
||||||
|
result |= test ("////usr//", "/");
|
||||||
|
result |= test ("//usr", "//");
|
||||||
|
result |= test ("//usr//", "//");
|
||||||
|
result |= test ("//", "//");
|
||||||
|
|
||||||
return result != 0;
|
return result != 0;
|
||||||
}
|
}
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
|
/* Copyright (C) 1996,1997,1998,1999,2000,2001 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Thorsten Kukuk <kukuk@suse.de>, 1996.
|
Contributed by Thorsten Kukuk <kukuk@suse.de>, 1996.
|
||||||
|
|
||||||
@@ -729,7 +729,9 @@ yp_all (const char *indomain, const char *inmap,
|
|||||||
|
|
||||||
if (result != RPC_SUCCESS)
|
if (result != RPC_SUCCESS)
|
||||||
{
|
{
|
||||||
clnt_perror (clnt, "yp_all: clnt_call");
|
/* Print the error message only on the last try */
|
||||||
|
if (try == MAXTRIES - 1)
|
||||||
|
clnt_perror (clnt, "yp_all: clnt_call");
|
||||||
res = YPERR_RPC;
|
res = YPERR_RPC;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -738,7 +740,7 @@ yp_all (const char *indomain, const char *inmap,
|
|||||||
__yp_unbind (ydb);
|
__yp_unbind (ydb);
|
||||||
clnt_destroy (clnt);
|
clnt_destroy (clnt);
|
||||||
|
|
||||||
if (status != YP_NOMORE)
|
if (res == YPERR_SUCCESS && status != YP_NOMORE)
|
||||||
{
|
{
|
||||||
__set_errno (saved_errno);
|
__set_errno (saved_errno);
|
||||||
return ypprot_err (status);
|
return ypprot_err (status);
|
||||||
|
@@ -25,9 +25,10 @@
|
|||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
|
|
||||||
#define TMPFILE "/tmp/macros"
|
|
||||||
#define HEADER_MAX 256
|
#define HEADER_MAX 256
|
||||||
|
|
||||||
|
static const char *macrofile;
|
||||||
|
|
||||||
/* <aio.h>. */
|
/* <aio.h>. */
|
||||||
static const char *const aio_syms[] =
|
static const char *const aio_syms[] =
|
||||||
{
|
{
|
||||||
@@ -712,8 +713,10 @@ get_null_defines (void)
|
|||||||
FILE *input;
|
FILE *input;
|
||||||
int first = 1;
|
int first = 1;
|
||||||
|
|
||||||
|
macrofile = tmpnam (NULL);
|
||||||
|
|
||||||
command = malloc (sizeof fmt + sizeof "/dev/null" + 2 * strlen (CC)
|
command = malloc (sizeof fmt + sizeof "/dev/null" + 2 * strlen (CC)
|
||||||
+ strlen (INC) + strlen (TMPFILE));
|
+ strlen (INC) + strlen (macrofile));
|
||||||
|
|
||||||
if (command == NULL)
|
if (command == NULL)
|
||||||
{
|
{
|
||||||
@@ -721,7 +724,7 @@ get_null_defines (void)
|
|||||||
exit (1);
|
exit (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
sprintf (command, fmt, "/dev/null", CC, INC, CC, TMPFILE);
|
sprintf (command, fmt, "/dev/null", CC, INC, CC, macrofile);
|
||||||
|
|
||||||
if (xsystem (command))
|
if (xsystem (command))
|
||||||
{
|
{
|
||||||
@@ -729,11 +732,11 @@ get_null_defines (void)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
free (command);
|
free (command);
|
||||||
input = fopen (TMPFILE, "r");
|
input = fopen (macrofile, "r");
|
||||||
|
|
||||||
if (input == NULL)
|
if (input == NULL)
|
||||||
{
|
{
|
||||||
printf ("Could not read %s: ", TMPFILE);
|
printf ("Could not read %s: ", macrofile);
|
||||||
perror (NULL);
|
perror (NULL);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -782,7 +785,7 @@ get_null_defines (void)
|
|||||||
}
|
}
|
||||||
result[result_len] = NULL;
|
result[result_len] = NULL;
|
||||||
fclose (input);
|
fclose (input);
|
||||||
remove (TMPFILE);
|
remove (macrofile);
|
||||||
|
|
||||||
return (const char **) result;
|
return (const char **) result;
|
||||||
}
|
}
|
||||||
@@ -799,7 +802,7 @@ check_header (const struct header *header, const char **except)
|
|||||||
|
|
||||||
memset (found, '\0', header->nsyms * sizeof (int));
|
memset (found, '\0', header->nsyms * sizeof (int));
|
||||||
command = alloca (sizeof fmt + strlen (header->name) + 2 * strlen (CC)
|
command = alloca (sizeof fmt + strlen (header->name) + 2 * strlen (CC)
|
||||||
+ strlen (INC) + strlen (TMPFILE));
|
+ strlen (INC) + strlen (macrofile));
|
||||||
|
|
||||||
|
|
||||||
if (command == NULL)
|
if (command == NULL)
|
||||||
@@ -809,13 +812,13 @@ check_header (const struct header *header, const char **except)
|
|||||||
}
|
}
|
||||||
|
|
||||||
printf ("=== %s ===\n", header->name);
|
printf ("=== %s ===\n", header->name);
|
||||||
sprintf (command, fmt, header->name, CC, INC, CC, TMPFILE);
|
sprintf (command, fmt, header->name, CC, INC, CC, macrofile);
|
||||||
|
|
||||||
/* First see whether this subset is supported at all. */
|
/* First see whether this subset is supported at all. */
|
||||||
if (header->subset != NULL)
|
if (header->subset != NULL)
|
||||||
{
|
{
|
||||||
sprintf (line, testfmt, header->subset, header->subset, CC, INC, CC,
|
sprintf (line, testfmt, header->subset, header->subset, CC, INC, CC,
|
||||||
TMPFILE);
|
macrofile);
|
||||||
if (xsystem (line))
|
if (xsystem (line))
|
||||||
{
|
{
|
||||||
printf ("!! not available\n");
|
printf ("!! not available\n");
|
||||||
@@ -828,11 +831,11 @@ check_header (const struct header *header, const char **except)
|
|||||||
puts ("system() returned nonzero");
|
puts ("system() returned nonzero");
|
||||||
result = 1;
|
result = 1;
|
||||||
}
|
}
|
||||||
input = fopen (TMPFILE, "r");
|
input = fopen (macrofile, "r");
|
||||||
|
|
||||||
if (input == NULL)
|
if (input == NULL)
|
||||||
{
|
{
|
||||||
printf ("Could not read %s: ", TMPFILE);
|
printf ("Could not read %s: ", macrofile);
|
||||||
perror (NULL);
|
perror (NULL);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@@ -884,7 +887,7 @@ check_header (const struct header *header, const char **except)
|
|||||||
result |= 1;
|
result |= 1;
|
||||||
}
|
}
|
||||||
fclose (input);
|
fclose (input);
|
||||||
remove (TMPFILE);
|
remove (macrofile);
|
||||||
|
|
||||||
for (i = 0; i < header->nsyms; ++i)
|
for (i = 0; i < header->nsyms; ++i)
|
||||||
if (found[i] == 0)
|
if (found[i] == 0)
|
||||||
|
@@ -52,7 +52,7 @@
|
|||||||
preprocessor has something similar to gcc's -dM option. Tune
|
preprocessor has something similar to gcc's -dM option. Tune
|
||||||
PRINT_MACROS in this case. This program assumes headers are found
|
PRINT_MACROS in this case. This program assumes headers are found
|
||||||
under /usr/include and that there is a writable /tmp directory.
|
under /usr/include and that there is a writable /tmp directory.
|
||||||
Tune SYSTEM_INCLUDE and TMPFILE if your system differs.
|
Tune SYSTEM_INCLUDE if your system differs.
|
||||||
#define BROKEN_SYSTEM if system(NULL) bombs -- one more violation
|
#define BROKEN_SYSTEM if system(NULL) bombs -- one more violation
|
||||||
of ISO C, by the way.
|
of ISO C, by the way.
|
||||||
|
|
||||||
@@ -75,9 +75,10 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#define TMPFILE "/tmp/macros"
|
|
||||||
#define HEADER_MAX 256
|
#define HEADER_MAX 256
|
||||||
|
|
||||||
|
static const char *macrofile;
|
||||||
|
|
||||||
/* ISO C header names including Amendment 1 (without ".h" suffix). */
|
/* ISO C header names including Amendment 1 (without ".h" suffix). */
|
||||||
static char *header[] =
|
static char *header[] =
|
||||||
{
|
{
|
||||||
@@ -247,8 +248,10 @@ get_null_defines (void)
|
|||||||
FILE *input;
|
FILE *input;
|
||||||
int first = 1;
|
int first = 1;
|
||||||
|
|
||||||
|
macrofile = tmpnam (NULL);
|
||||||
|
|
||||||
command = malloc (sizeof fmt + sizeof "/dev/null" + 2 * strlen (CC)
|
command = malloc (sizeof fmt + sizeof "/dev/null" + 2 * strlen (CC)
|
||||||
+ strlen (INC) + strlen (TMPFILE));
|
+ strlen (INC) + strlen (macrofile));
|
||||||
|
|
||||||
if (command == NULL)
|
if (command == NULL)
|
||||||
{
|
{
|
||||||
@@ -256,7 +259,7 @@ get_null_defines (void)
|
|||||||
exit (1);
|
exit (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
sprintf (command, fmt, "/dev/null", CC, INC, CC, TMPFILE);
|
sprintf (command, fmt, "/dev/null", CC, INC, CC, macrofile);
|
||||||
|
|
||||||
if (system (command))
|
if (system (command))
|
||||||
{
|
{
|
||||||
@@ -264,11 +267,11 @@ get_null_defines (void)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
free (command);
|
free (command);
|
||||||
input = fopen (TMPFILE, "r");
|
input = fopen (macrofile, "r");
|
||||||
|
|
||||||
if (input == NULL)
|
if (input == NULL)
|
||||||
{
|
{
|
||||||
printf ("Could not read %s: ", TMPFILE);
|
printf ("Could not read %s: ", macrofile);
|
||||||
perror (NULL);
|
perror (NULL);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -321,7 +324,7 @@ get_null_defines (void)
|
|||||||
}
|
}
|
||||||
result[result_len] = NULL;
|
result[result_len] = NULL;
|
||||||
fclose (input);
|
fclose (input);
|
||||||
remove (TMPFILE);
|
remove (macrofile);
|
||||||
|
|
||||||
return (const char **) result;
|
return (const char **) result;
|
||||||
}
|
}
|
||||||
@@ -335,7 +338,7 @@ check_header (const char *file_name, const char **except)
|
|||||||
int result = 0;
|
int result = 0;
|
||||||
|
|
||||||
command = malloc (sizeof fmt + strlen (file_name) + 2 * strlen (CC)
|
command = malloc (sizeof fmt + strlen (file_name) + 2 * strlen (CC)
|
||||||
+ strlen (INC) + strlen (TMPFILE));
|
+ strlen (INC) + strlen (macrofile));
|
||||||
|
|
||||||
if (command == NULL)
|
if (command == NULL)
|
||||||
{
|
{
|
||||||
@@ -344,7 +347,7 @@ check_header (const char *file_name, const char **except)
|
|||||||
}
|
}
|
||||||
|
|
||||||
puts (file_name);
|
puts (file_name);
|
||||||
sprintf (command, fmt, file_name, CC, INC, CC, TMPFILE);
|
sprintf (command, fmt, file_name, CC, INC, CC, macrofile);
|
||||||
|
|
||||||
if (system (command))
|
if (system (command))
|
||||||
{
|
{
|
||||||
@@ -352,11 +355,11 @@ check_header (const char *file_name, const char **except)
|
|||||||
result = 1;
|
result = 1;
|
||||||
}
|
}
|
||||||
free (command);
|
free (command);
|
||||||
input = fopen (TMPFILE, "r");
|
input = fopen (macrofile, "r");
|
||||||
|
|
||||||
if (input == NULL)
|
if (input == NULL)
|
||||||
{
|
{
|
||||||
printf ("Could not read %s: ", TMPFILE);
|
printf ("Could not read %s: ", macrofile);
|
||||||
perror (NULL);
|
perror (NULL);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@@ -430,7 +433,7 @@ check_header (const char *file_name, const char **except)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
fclose (input);
|
fclose (input);
|
||||||
remove (TMPFILE);
|
remove (macrofile);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@@ -33,11 +33,11 @@ __attribute__ ((unused))
|
|||||||
exchange_and_add (volatile uint32_t *mem, int val)
|
exchange_and_add (volatile uint32_t *mem, int val)
|
||||||
{
|
{
|
||||||
int tmp, result;
|
int tmp, result;
|
||||||
__asm__ ("\
|
__asm__ ("\n\
|
||||||
0: lwarx %0,0,%2
|
0: lwarx %0,0,%2 \n\
|
||||||
add%I3 %1,%0,%3
|
add%I3 %1,%0,%3 \n\
|
||||||
stwcx. %1,0,%2
|
stwcx. %1,0,%2 \n\
|
||||||
bne- 0b
|
bne- 0b \n\
|
||||||
" : "=&b"(result), "=&r"(tmp) : "r" (mem), "Ir"(val) : "cr0", "memory");
|
" : "=&b"(result), "=&r"(tmp) : "r" (mem), "Ir"(val) : "cr0", "memory");
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@@ -47,11 +47,11 @@ __attribute__ ((unused))
|
|||||||
atomic_add (volatile uint32_t *mem, int val)
|
atomic_add (volatile uint32_t *mem, int val)
|
||||||
{
|
{
|
||||||
int tmp;
|
int tmp;
|
||||||
__asm__ ("\
|
__asm__ ("\n\
|
||||||
0: lwarx %0,0,%1
|
0: lwarx %0,0,%1 \n\
|
||||||
add%I2 %0,%0,%2
|
add%I2 %0,%0,%2 \n\
|
||||||
stwcx. %0,0,%1
|
stwcx. %0,0,%1 \n\
|
||||||
bne- 0b
|
bne- 0b \n\
|
||||||
" : "=&b"(tmp) : "r" (mem), "Ir"(val) : "cr0", "memory");
|
" : "=&b"(tmp) : "r" (mem), "Ir"(val) : "cr0", "memory");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -60,14 +60,14 @@ __attribute__ ((unused))
|
|||||||
compare_and_swap (volatile long int *p, long int oldval, long int newval)
|
compare_and_swap (volatile long int *p, long int oldval, long int newval)
|
||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
__asm__ ("\
|
__asm__ ("\n\
|
||||||
0: lwarx %0,0,%1
|
0: lwarx %0,0,%1 \n\
|
||||||
sub%I2c. %0,%0,%2
|
sub%I2c. %0,%0,%2 \n\
|
||||||
cntlzw %0,%0
|
cntlzw %0,%0 \n\
|
||||||
bne- 1f
|
bne- 1f \n\
|
||||||
stwcx. %3,0,%1
|
stwcx. %3,0,%1 \n\
|
||||||
bne- 0b
|
bne- 0b \n\
|
||||||
1:
|
1: \n\
|
||||||
" : "=&b"(result) : "r"(p), "Ir"(oldval), "r"(newval) : "cr0", "memory");
|
" : "=&b"(result) : "r"(p), "Ir"(oldval), "r"(newval) : "cr0", "memory");
|
||||||
return result >> 5;
|
return result >> 5;
|
||||||
}
|
}
|
||||||
@@ -77,10 +77,10 @@ __attribute__ ((unused))
|
|||||||
always_swap (volatile long int *p, long int newval)
|
always_swap (volatile long int *p, long int newval)
|
||||||
{
|
{
|
||||||
long int result;
|
long int result;
|
||||||
__asm__ ("\
|
__asm__ ("\n\
|
||||||
0: lwarx %0,0,%1
|
0: lwarx %0,0,%1 \n\
|
||||||
stwcx. %2,0,%1
|
stwcx. %2,0,%1 \n\
|
||||||
bne- 0b
|
bne- 0b \n\
|
||||||
" : "=&r"(result) : "r"(p), "r"(newval) : "cr0", "memory");
|
" : "=&r"(result) : "r"(p), "r"(newval) : "cr0", "memory");
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@@ -90,13 +90,13 @@ __attribute__ ((unused))
|
|||||||
test_and_set (volatile long int *p, long int newval)
|
test_and_set (volatile long int *p, long int newval)
|
||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
__asm__ ("\
|
__asm__ ("\n\
|
||||||
0: lwarx %0,0,%1
|
0: lwarx %0,0,%1 \n\
|
||||||
cmpwi %0,0
|
cmpwi %0,0 \n\
|
||||||
bne- 1f
|
bne- 1f \n\
|
||||||
stwcx. %2,0,%1
|
stwcx. %2,0,%1 \n\
|
||||||
bne- 0b
|
bne- 0b \n\
|
||||||
1:
|
1: \n\
|
||||||
" : "=&r"(result) : "r"(p), "r"(newval) : "cr0", "memory");
|
" : "=&r"(result) : "r"(p), "r"(newval) : "cr0", "memory");
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@@ -102,101 +102,101 @@ elf_machine_load_address (void)
|
|||||||
/* This code is used in dl-runtime.c to call the `fixup' function
|
/* This code is used in dl-runtime.c to call the `fixup' function
|
||||||
and then redirect to the address it returns. It is called
|
and then redirect to the address it returns. It is called
|
||||||
from code built in the PLT by elf_machine_runtime_setup. */
|
from code built in the PLT by elf_machine_runtime_setup. */
|
||||||
#define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\
|
#define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\n\
|
||||||
.section \".text\"
|
.section \".text\" \n\
|
||||||
.align 2
|
.align 2 \n\
|
||||||
.globl _dl_runtime_resolve
|
.globl _dl_runtime_resolve \n\
|
||||||
.type _dl_runtime_resolve,@function
|
.type _dl_runtime_resolve,@function \n\
|
||||||
_dl_runtime_resolve:
|
_dl_runtime_resolve: \n\
|
||||||
# We need to save the registers used to pass parameters, and register 0,
|
# We need to save the registers used to pass parameters, and register 0,\n\
|
||||||
# which is used by _mcount; the registers are saved in a stack frame.
|
# which is used by _mcount; the registers are saved in a stack frame.\n\
|
||||||
stwu 1,-64(1)
|
stwu 1,-64(1) \n\
|
||||||
stw 0,12(1)
|
stw 0,12(1) \n\
|
||||||
stw 3,16(1)
|
stw 3,16(1) \n\
|
||||||
stw 4,20(1)
|
stw 4,20(1) \n\
|
||||||
# The code that calls this has put parameters for `fixup' in r12 and r11.
|
# The code that calls this has put parameters for `fixup' in r12 and r11.\n\
|
||||||
mr 3,12
|
mr 3,12 \n\
|
||||||
stw 5,24(1)
|
stw 5,24(1) \n\
|
||||||
mr 4,11
|
mr 4,11 \n\
|
||||||
stw 6,28(1)
|
stw 6,28(1) \n\
|
||||||
mflr 0
|
mflr 0 \n\
|
||||||
# We also need to save some of the condition register fields.
|
# We also need to save some of the condition register fields.\n\
|
||||||
stw 7,32(1)
|
stw 7,32(1) \n\
|
||||||
stw 0,48(1)
|
stw 0,48(1) \n\
|
||||||
stw 8,36(1)
|
stw 8,36(1) \n\
|
||||||
mfcr 0
|
mfcr 0 \n\
|
||||||
stw 9,40(1)
|
stw 9,40(1) \n\
|
||||||
stw 10,44(1)
|
stw 10,44(1) \n\
|
||||||
stw 0,8(1)
|
stw 0,8(1) \n\
|
||||||
bl fixup@local
|
bl fixup@local \n\
|
||||||
# 'fixup' returns the address we want to branch to.
|
# 'fixup' returns the address we want to branch to.\n\
|
||||||
mtctr 3
|
mtctr 3 \n\
|
||||||
# Put the registers back...
|
# Put the registers back...\n\
|
||||||
lwz 0,48(1)
|
lwz 0,48(1) \n\
|
||||||
lwz 10,44(1)
|
lwz 10,44(1) \n\
|
||||||
lwz 9,40(1)
|
lwz 9,40(1) \n\
|
||||||
mtlr 0
|
mtlr 0 \n\
|
||||||
lwz 8,36(1)
|
lwz 8,36(1) \n\
|
||||||
lwz 0,8(1)
|
lwz 0,8(1) \n\
|
||||||
lwz 7,32(1)
|
lwz 7,32(1) \n\
|
||||||
lwz 6,28(1)
|
lwz 6,28(1) \n\
|
||||||
mtcrf 0xFF,0
|
mtcrf 0xFF,0 \n\
|
||||||
lwz 5,24(1)
|
lwz 5,24(1) \n\
|
||||||
lwz 4,20(1)
|
lwz 4,20(1) \n\
|
||||||
lwz 3,16(1)
|
lwz 3,16(1) \n\
|
||||||
lwz 0,12(1)
|
lwz 0,12(1) \n\
|
||||||
# ...unwind the stack frame, and jump to the PLT entry we updated.
|
# ...unwind the stack frame, and jump to the PLT entry we updated.\n\
|
||||||
addi 1,1,64
|
addi 1,1,64 \n\
|
||||||
bctr
|
bctr \n\
|
||||||
.size _dl_runtime_resolve,.-_dl_runtime_resolve
|
.size _dl_runtime_resolve,.-_dl_runtime_resolve \n\
|
||||||
|
\n\
|
||||||
.align 2
|
.align 2 \n\
|
||||||
.globl _dl_prof_resolve
|
.globl _dl_prof_resolve \n\
|
||||||
.type _dl_prof_resolve,@function
|
.type _dl_prof_resolve,@function \n\
|
||||||
_dl_prof_resolve:
|
_dl_prof_resolve: \n\
|
||||||
# We need to save the registers used to pass parameters, and register 0,
|
# We need to save the registers used to pass parameters, and register 0,\n\
|
||||||
# which is used by _mcount; the registers are saved in a stack frame.
|
# which is used by _mcount; the registers are saved in a stack frame.\n\
|
||||||
stwu 1,-64(1)
|
stwu 1,-64(1) \n\
|
||||||
stw 0,12(1)
|
stw 0,12(1) \n\
|
||||||
stw 3,16(1)
|
stw 3,16(1) \n\
|
||||||
stw 4,20(1)
|
stw 4,20(1) \n\
|
||||||
# The code that calls this has put parameters for `fixup' in r12 and r11.
|
# The code that calls this has put parameters for `fixup' in r12 and r11.\n\
|
||||||
mr 3,12
|
mr 3,12 \n\
|
||||||
stw 5,24(1)
|
stw 5,24(1) \n\
|
||||||
mr 4,11
|
mr 4,11 \n\
|
||||||
stw 6,28(1)
|
stw 6,28(1) \n\
|
||||||
mflr 5
|
mflr 5 \n\
|
||||||
# We also need to save some of the condition register fields.
|
# We also need to save some of the condition register fields.\n\
|
||||||
stw 7,32(1)
|
stw 7,32(1) \n\
|
||||||
stw 5,48(1)
|
stw 5,48(1) \n\
|
||||||
stw 8,36(1)
|
stw 8,36(1) \n\
|
||||||
mfcr 0
|
mfcr 0 \n\
|
||||||
stw 9,40(1)
|
stw 9,40(1) \n\
|
||||||
stw 10,44(1)
|
stw 10,44(1) \n\
|
||||||
stw 0,8(1)
|
stw 0,8(1) \n\
|
||||||
bl profile_fixup@local
|
bl profile_fixup@local \n\
|
||||||
# 'fixup' returns the address we want to branch to.
|
# 'fixup' returns the address we want to branch to.\n\
|
||||||
mtctr 3
|
mtctr 3 \n\
|
||||||
# Put the registers back...
|
# Put the registers back...\n\
|
||||||
lwz 0,48(1)
|
lwz 0,48(1) \n\
|
||||||
lwz 10,44(1)
|
lwz 10,44(1) \n\
|
||||||
lwz 9,40(1)
|
lwz 9,40(1) \n\
|
||||||
mtlr 0
|
mtlr 0 \n\
|
||||||
lwz 8,36(1)
|
lwz 8,36(1) \n\
|
||||||
lwz 0,8(1)
|
lwz 0,8(1) \n\
|
||||||
lwz 7,32(1)
|
lwz 7,32(1) \n\
|
||||||
lwz 6,28(1)
|
lwz 6,28(1) \n\
|
||||||
mtcrf 0xFF,0
|
mtcrf 0xFF,0 \n\
|
||||||
lwz 5,24(1)
|
lwz 5,24(1) \n\
|
||||||
lwz 4,20(1)
|
lwz 4,20(1) \n\
|
||||||
lwz 3,16(1)
|
lwz 3,16(1) \n\
|
||||||
lwz 0,12(1)
|
lwz 0,12(1) \n\
|
||||||
# ...unwind the stack frame, and jump to the PLT entry we updated.
|
# ...unwind the stack frame, and jump to the PLT entry we updated.\n\
|
||||||
addi 1,1,64
|
addi 1,1,64 \n\
|
||||||
bctr
|
bctr \n\
|
||||||
.size _dl_prof_resolve,.-_dl_prof_resolve
|
.size _dl_prof_resolve,.-_dl_prof_resolve \n\
|
||||||
# Undo '.section text'.
|
# Undo '.section text'.\n\
|
||||||
.previous
|
.previous \n\
|
||||||
");
|
");
|
||||||
|
|
||||||
/* The actual _start code is in dl-start.S. Use a really
|
/* The actual _start code is in dl-start.S. Use a really
|
||||||
|
@@ -32,12 +32,12 @@ __lrint (double x)
|
|||||||
weak_alias (__lrint, lrint)
|
weak_alias (__lrint, lrint)
|
||||||
|
|
||||||
/* This code will also work for a 'float' argument. */
|
/* This code will also work for a 'float' argument. */
|
||||||
asm ("\
|
asm ("\n\
|
||||||
.globl __lrintf
|
.globl __lrintf \n\
|
||||||
.globl lrintf
|
.globl lrintf \n\
|
||||||
.weak lrintf
|
.weak lrintf \n\
|
||||||
.set __lrintf,__lrint
|
.set __lrintf,__lrint \n\
|
||||||
.set lrintf,__lrint
|
.set lrintf,__lrint \n\
|
||||||
");
|
");
|
||||||
|
|
||||||
#ifdef NO_LONG_DOUBLE
|
#ifdef NO_LONG_DOUBLE
|
||||||
|
@@ -22,23 +22,23 @@
|
|||||||
|
|
||||||
/* This prints out the information in the following form: */
|
/* This prints out the information in the following form: */
|
||||||
static const char dumpform[] = "\
|
static const char dumpform[] = "\
|
||||||
Register dump:
|
Register dump:\n\
|
||||||
fp0-3: 0000030%0000031% 0000032%0000033% 0000034%0000035% 0000036%0000037%
|
fp0-3: 0000030%0000031% 0000032%0000033% 0000034%0000035% 0000036%0000037%\n\
|
||||||
fp4-7: 0000038%0000039% 000003a%000003b% 000003c%000003d% 000003e%000003f%
|
fp4-7: 0000038%0000039% 000003a%000003b% 000003c%000003d% 000003e%000003f%\n\
|
||||||
fp8-11: 0000040%0000041% 0000042%0000043% 0000044%0000045% 0000046%0000047%
|
fp8-11: 0000040%0000041% 0000042%0000043% 0000044%0000045% 0000046%0000047%\n\
|
||||||
fp12-15: 0000048%0000049% 000004a%000004b% 000004c%000004d% 000004e%000004f%
|
fp12-15: 0000048%0000049% 000004a%000004b% 000004c%000004d% 000004e%000004f%\n\
|
||||||
fp16-19: 0000050%0000051% 0000052%0000053% 0000054%0000055% 0000056%0000057%
|
fp16-19: 0000050%0000051% 0000052%0000053% 0000054%0000055% 0000056%0000057%\n\
|
||||||
fp20-23: 0000058%0000059% 000005a%000005b% 000005c%000005d% 000005e%000005f%
|
fp20-23: 0000058%0000059% 000005a%000005b% 000005c%000005d% 000005e%000005f%\n\
|
||||||
fp24-27: 0000060%0000061% 0000062%0000063% 0000064%0000065% 0000066%0000067%
|
fp24-27: 0000060%0000061% 0000062%0000063% 0000064%0000065% 0000066%0000067%\n\
|
||||||
fp28-31: 0000068%0000069% 000006a%000006b% 000006c%000006d% 000006e%000006f%
|
fp28-31: 0000068%0000069% 000006a%000006b% 000006c%000006d% 000006e%000006f%\n\
|
||||||
r0 =0000000% sp =0000001% r2 =0000002% r3 =0000003% trap=0000028%
|
r0 =0000000% sp =0000001% r2 =0000002% r3 =0000003% trap=0000028%\n\
|
||||||
r4 =0000004% r5 =0000005% r6 =0000006% r7 =0000007% sr0=0000020% sr1=0000021%
|
r4 =0000004% r5 =0000005% r6 =0000006% r7 =0000007% sr0=0000020% sr1=0000021%\n\
|
||||||
r8 =0000008% r9 =0000009% r10=000000a% r11=000000b% dar=0000029% dsi=000002a%
|
r8 =0000008% r9 =0000009% r10=000000a% r11=000000b% dar=0000029% dsi=000002a%\n\
|
||||||
r12=000000c% r13=000000d% r14=000000e% r15=000000f% r3*=0000022%
|
r12=000000c% r13=000000d% r14=000000e% r15=000000f% r3*=0000022%\n\
|
||||||
r16=0000010% r17=0000011% r18=0000012% r19=0000013%
|
r16=0000010% r17=0000011% r18=0000012% r19=0000013%\n\
|
||||||
r20=0000014% r21=0000015% r22=0000016% r23=0000017% lr=0000024% xer=0000025%
|
r20=0000014% r21=0000015% r22=0000016% r23=0000017% lr=0000024% xer=0000025%\n\
|
||||||
r24=0000018% r25=0000019% r26=000001a% r27=000001b% mq=0000027% ctr=0000023%
|
r24=0000018% r25=0000019% r26=000001a% r27=000001b% mq=0000027% ctr=0000023%\n\
|
||||||
r28=000001c% r29=000001d% r30=000001e% r31=000001f% fscr=0000071% ccr=0000026%
|
r28=000001c% r29=000001d% r30=000001e% r31=000001f% fscr=0000071% ccr=0000026%\n\
|
||||||
";
|
";
|
||||||
|
|
||||||
/* Most of the fields are self-explanatory. 'sr0' is the next
|
/* Most of the fields are self-explanatory. 'sr0' is the next
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
/* bcopy -- copy a block from source to destination. For IBM S390
|
/* bcopy -- copy a block from source to destination. S/390 version.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Copyright (C) 2000, 2001 Free Software Foundation, Inc.
|
Copyright (C) 2000, 2001 Free Software Foundation, Inc.
|
||||||
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
||||||
@@ -18,48 +18,53 @@
|
|||||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Boston, MA 02111-1307, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
/*
|
/* INPUT PARAMETERS
|
||||||
* R2 = address of source
|
%r2 = address of source
|
||||||
* R3 = address of destination
|
%r3 = address of destination
|
||||||
* R4 = number of bytes to copy
|
%r4 = number of bytes to copy. */
|
||||||
*/
|
|
||||||
|
|
||||||
#include "sysdep.h"
|
#include "sysdep.h"
|
||||||
#include "asm-syntax.h"
|
#include "asm-syntax.h"
|
||||||
|
|
||||||
.text
|
.text
|
||||||
ENTRY(__bcopy)
|
ENTRY(__bcopy)
|
||||||
|
ltr %r1,%r4 # zero bcopy ?
|
||||||
|
jz .L4
|
||||||
clr %r2,%r3 # check against destructive overlap
|
clr %r2,%r3 # check against destructive overlap
|
||||||
jnl .L0
|
jnl .L0
|
||||||
lr %r1,%r2
|
alr %r1,%r2
|
||||||
alr %r1,%r4
|
|
||||||
clr %r1,%r3
|
clr %r1,%r3
|
||||||
jh .L2
|
jh .L5
|
||||||
.L0:
|
.L0: ahi %r4,-1 # length - 1
|
||||||
lr %r5,%r4 # source length
|
lr %r1,%r4
|
||||||
lr %r4,%r2 # source address
|
srl %r1,8
|
||||||
sr %r1,%r1 # set pad byte to zero
|
ltr %r1,%r1
|
||||||
lr %r2,%r3 # set destination
|
jz .L2
|
||||||
lr %r3,%r5 # destination length = source length
|
.L1: mvc 0(256,%r3),0(%r2) # move in 256 byte chunks
|
||||||
.L1: mvcle %r2,%r4,0(%r1) # thats it, MVCLE is your friend
|
la %r2,256(%r2)
|
||||||
jo .L1
|
la %r3,256(%r3)
|
||||||
br %r14
|
brct %r1,.L1
|
||||||
.L2: # destructive overlay, can not use mvcle
|
.L2: bras %r1,.L3 # setup base pointer for execute
|
||||||
|
mvc 0(1,%r3),0(%r2) # instruction for execute
|
||||||
|
.L3: ex %r4,0(%r1) # execute mvc with length ((%r4)&255)+1
|
||||||
|
.L4: br %r14
|
||||||
|
|
||||||
|
.L5: # destructive overlay, can not use mvcle
|
||||||
lr %r1,%r2 # bcopy is called with source,dest
|
lr %r1,%r2 # bcopy is called with source,dest
|
||||||
lr %r2,%r3 # memmove with dest,source! Oh, well...
|
lr %r2,%r3 # memmove with dest,source! Oh, well...
|
||||||
lr %r3,%r1
|
lr %r3,%r1
|
||||||
basr %r1,0
|
basr %r1,0
|
||||||
.L3:
|
.L6:
|
||||||
#ifdef PIC
|
#ifdef PIC
|
||||||
al %r1,.L4-.L3(%r1) # get address of global offset table
|
al %r1,.L7-.L6(%r1) # get address of global offset table
|
||||||
# load address of memmove
|
# load address of memmove
|
||||||
l %r1,memmove@GOT12(%r1)
|
l %r1,memmove@GOT12(%r1)
|
||||||
br %r1
|
br %r1
|
||||||
.L4: .long _GLOBAL_OFFSET_TABLE_-.L3
|
.L7: .long _GLOBAL_OFFSET_TABLE_-.L6
|
||||||
#else
|
#else
|
||||||
al %r1,.L4-.L3(%r1) # load address of memmove
|
al %r1,.L7-.L6(%r1) # load address of memmove
|
||||||
br %r1 # jump to memmove
|
br %r1 # jump to memmove
|
||||||
.L4: .long memmove-.L3
|
.L7: .long memmove-.L6
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
END(__bcopy)
|
END(__bcopy)
|
||||||
@@ -67,3 +72,4 @@ END(__bcopy)
|
|||||||
#ifndef NO_WEAK_ALIAS
|
#ifndef NO_WEAK_ALIAS
|
||||||
weak_alias (__bcopy, bcopy)
|
weak_alias (__bcopy, bcopy)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
/* Set a block of memory to some byte value. For IBM S390
|
/* memcpy - copy a block from source to destination. S/390 version.
|
||||||
Copyright (C) 2000, 2001 Free Software Foundation, Inc.
|
Copyright (C) 2000, 2001 Free Software Foundation, Inc.
|
||||||
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
||||||
|
|
||||||
@@ -17,25 +17,30 @@
|
|||||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Boston, MA 02111-1307, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
/*
|
/* INPUT PARAMETERS
|
||||||
* R2 = address to destination memory area
|
%r2 = address of destination memory area
|
||||||
* R3 = address to source memory area
|
%r3 = address of source memory area
|
||||||
* R4 = number of bytes to copy
|
%r4 = number of bytes to copy. */
|
||||||
*/
|
|
||||||
|
|
||||||
#include "sysdep.h"
|
#include "sysdep.h"
|
||||||
#include "asm-syntax.h"
|
#include "asm-syntax.h"
|
||||||
|
|
||||||
.text
|
.text
|
||||||
ENTRY(memcpy)
|
ENTRY(memcpy)
|
||||||
ltr %r5,%r4
|
ltr %r4,%r4
|
||||||
|
jz .L3
|
||||||
|
ahi %r4,-1 # length - 1
|
||||||
|
lr %r1,%r2 # copy destination address
|
||||||
|
lr %r5,%r4
|
||||||
|
sra %r5,8
|
||||||
jz .L1
|
jz .L1
|
||||||
lr %r4,%r3 # %r4/%r5 = source ptr/len
|
.L0: mvc 0(256,%r1),0(%r3) # move in 256 byte chunks
|
||||||
lr %r3,%r5 # %r2/%r3 = dest ptr/len
|
la %r1,256(%r1)
|
||||||
lr %r0,%r2 # save source address
|
la %r3,256(%r3)
|
||||||
.L0: mvcle %r2,%r4,0 # thats it, MVCLE is your friend
|
brct %r5,.L0
|
||||||
jo .L0
|
.L1: bras %r5,.L2 # setup base pointer for execute
|
||||||
lr %r2,%r0 # return value is source address
|
mvc 0(1,%r1),0(%r3) # instruction for execute
|
||||||
.L1:
|
.L2: ex %r4,0(%r5) # execute mvc with length ((%r4)&255)+1
|
||||||
br %r14
|
.L3: br %r14
|
||||||
END(memset)
|
END(memcpy)
|
||||||
|
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
/* bcopy -- copy a block from source to destination. 64 bit S/390 version.
|
/* bcopy -- copy a block from source to destination. 64 bit S/390 version.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Copyright (C) 2001 Free Software Foundation, Inc.
|
Copyright (C) 2000, 2001 Free Software Foundation, Inc.
|
||||||
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
||||||
|
|
||||||
The GNU C Library is free software ; you can redistribute it and/or
|
The GNU C Library is free software ; you can redistribute it and/or
|
||||||
@@ -26,27 +26,32 @@
|
|||||||
#include "sysdep.h"
|
#include "sysdep.h"
|
||||||
#include "asm-syntax.h"
|
#include "asm-syntax.h"
|
||||||
|
|
||||||
.text
|
.text
|
||||||
ENTRY(__bcopy)
|
ENTRY(__bcopy)
|
||||||
clgr %r2,%r3 # check against destructive overlap
|
ltgr %r1,%r4 # zero bcopy ?
|
||||||
jnl .L0
|
jz .L4
|
||||||
lgr %r1,%r2
|
clgr %r2,%r3 # check against destructive overlap
|
||||||
algr %r1,%r4
|
jnl .L0
|
||||||
clgr %r1,%r3
|
algr %r1,%r2
|
||||||
jh .L2
|
clgr %r1,%r3
|
||||||
.L0:
|
jh .L5
|
||||||
lgr %r5,%r4 # source length
|
.L0: aghi %r4,-1 # length - 1
|
||||||
lgr %r4,%r2 # source address
|
srlg %r1,%r4,8
|
||||||
sgr %r1,%r1 # set pad byte to zero
|
ltgr %r1,%r1
|
||||||
lgr %r2,%r3 # set destination
|
jz .L2
|
||||||
lgr %r3,%r5 # destination length = source length
|
.L1: mvc 0(256,%r3),0(%r2) # move in 256 byte chunks
|
||||||
.L1: mvcle %r2,%r4,0(%r1) # thats it, MVCLE is your friend
|
la %r2,256(%r2)
|
||||||
jo .L1
|
la %r3,256(%r3)
|
||||||
br %r14
|
brctg %r1,.L1
|
||||||
.L2: # destructive overlay, can not use mvcle
|
.L2: bras %r1,.L3 # setup base pointer for execute
|
||||||
lgr %r1,%r2 # bcopy is called with source,dest
|
mvc 0(1,%r3),0(%r2) # instruction for execute
|
||||||
lgr %r2,%r3 # memmove with dest,source! Oh, well...
|
.L3: ex %r4,0(%r1) # execute mvc with length ((%r4)&255)+1
|
||||||
lgr %r3,%r1
|
.L4: br %r14
|
||||||
|
|
||||||
|
.L5: # destructive overlay, can not use mvcle
|
||||||
|
lgr %r1,%r2 # bcopy is called with source,dest
|
||||||
|
lgr %r2,%r3 # memmove with dest,source! Oh, well...
|
||||||
|
lgr %r3,%r1
|
||||||
#ifdef PIC
|
#ifdef PIC
|
||||||
jg memmove@PLT
|
jg memmove@PLT
|
||||||
#else
|
#else
|
||||||
|
@@ -68,8 +68,8 @@ _init:
|
|||||||
AGHI 15,-160
|
AGHI 15,-160
|
||||||
STG 1,0(15)
|
STG 1,0(15)
|
||||||
LARL 12,_GLOBAL_OFFSET_TABLE_
|
LARL 12,_GLOBAL_OFFSET_TABLE_
|
||||||
LGHI 1,__gmon_start__@GOT
|
LARL 1,__gmon_start__@GOTENT
|
||||||
LG 1,0(1,12)
|
LG 1,0(1)
|
||||||
LTGR 1,1
|
LTGR 1,1
|
||||||
JE .L22
|
JE .L22
|
||||||
BASR 14,1
|
BASR 14,1
|
||||||
|
@@ -1,7 +1,6 @@
|
|||||||
/* Set a block of memory to some byte value. 64 bit S/390 version.
|
/* memcpy - copy a block from source to destination. 64 bit S/390 version.
|
||||||
Copyright (C) 2001 Free Software Foundation, Inc.
|
Copyright (C) 2000, 2001 Free Software Foundation, Inc.
|
||||||
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
||||||
This file is part of the GNU C Library.
|
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
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
|
modify it under the terms of the GNU Library General Public License as
|
||||||
@@ -19,8 +18,8 @@
|
|||||||
Boston, MA 02111-1307, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
/* INPUT PARAMETERS
|
/* INPUT PARAMETERS
|
||||||
%r2 = address to destination memory area
|
%r2 = address of destination memory area
|
||||||
%r3 = address to source memory area
|
%r3 = address of source memory area
|
||||||
%r4 = number of bytes to copy. */
|
%r4 = number of bytes to copy. */
|
||||||
|
|
||||||
#include "sysdep.h"
|
#include "sysdep.h"
|
||||||
@@ -28,14 +27,19 @@
|
|||||||
|
|
||||||
.text
|
.text
|
||||||
ENTRY(memcpy)
|
ENTRY(memcpy)
|
||||||
ltgr %r5,%r4
|
ltgr %r4,%r4
|
||||||
|
jz .L3
|
||||||
|
aghi %r4,-1 # length - 1
|
||||||
|
lgr %r1,%r2 # copy destination address
|
||||||
|
srag %r5,%r4,8
|
||||||
jz .L1
|
jz .L1
|
||||||
lgr %r4,%r3 # %r4/%r5 = source ptr/len
|
.L0: mvc 0(256,%r1),0(%r3) # move in 256 byte chunks
|
||||||
lgr %r3,%r5 # %r2/%r3 = dest ptr/len
|
la %r1,256(%r1)
|
||||||
lgr %r0,%r2 # save source address
|
la %r3,256(%r3)
|
||||||
.L0: mvcle %r2,%r4,0 # thats it, MVCLE is your friend
|
brctg %r5,.L0
|
||||||
jo .L0
|
.L1: bras %r5,.L2 # setup base pointer for execute
|
||||||
lgr %r2,%r0 # return value is source address
|
mvc 0(1,%r1),0(%r3) # instruction for execute
|
||||||
.L1:
|
.L2: ex %r4,0(%r5) # execute mvc with length ((%r4)&255)+1
|
||||||
br %r14
|
.L3: br %r14
|
||||||
END(memset)
|
END(memcpy)
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user