+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>
* resolv/res_data.c (res_isourserver): Fix cast.
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
from setmntent(). Is this a glibc bug?
+3.23. I get "undefined reference to `atexit'"
4. Miscellaneous
won't always work. Unfortunately, for compatibility reasons, we can't
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.
+
\f
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Version 2.7.2.3 does and future versions of GCC will automatically
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
linking on my Linux system I get error messages. How is
this supposed to work?
won't always work. Unfortunately, for compatibility reasons, we can't
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
# write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA.
-pcprofileso=@LIBDIR@/libpcprofile.so
+pcprofileso=@SLIBDIR@/libpcprofile.so
pcprofiledump=@BINDIR@/pcprofiledump
# Print usage message.
# write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA.
-memusageso=@LIBDIR@/libmemusage.so
+memusageso=@SLIBDIR@/libmemusage.so
memusagestat=@BINDIR@/memusagestat
# Print usage message.
@end smallexample
@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
@code{"file(s)"}. Both look unnatural and should be avoided. First
tries to solve the problem correctly looked like this:
bit of information is provided.
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
-be something like:
+header entry (the one with the empty (@code{msgid} string). It looks
+like this:
@smallexample
- nplurals=2; plural=n == 1 ? 0 : 1
+Plural-Forms: nplurals=2; plural=n == 1 ? 0 : 1;
@end smallexample
The @code{nplurals} value must be a decimal number which specifies how
@table @asis
@item Only one form:
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:
@smallexample
-nplurals=1; plural=0
+Plural-Forms: nplurals=1; plural=0;
@end smallexample
@noindent
is using. A header entry would look like this:
@smallexample
-nplurals=2; plural=n != 1
+Plural-Forms: nplurals=2; plural=n != 1;
@end smallexample
(Note: this uses the feature of C expressions that boolean expressions
Exceptional case in the language family. The header entry would be:
@smallexample
-nplurals=2; plural=n>1
+Plural-Forms: nplurals=2; plural=n>1;
@end smallexample
@noindent
The header entry would be:
@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
@noindent
The header entry would look like this:
@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
@noindent
The header entry would look like this:
@smallexample
-nplurals=3; plural=n==1 ? 0 : \
- n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2
+Plural-Forms: nplurals=3; \
+ plural=n==1 ? 0 : \
+ n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;
@end smallexample
(Continuation in the next line is possible.)
The header entry would look like this:
@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
@noindent
/* 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.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
last_slash = path != NULL ? strrchr (path, '/') : NULL;
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)
{
+ /* Determine whether all remaining characters are slashes. */
+ char *runp;
+
+ for (runp = last_slash; runp != path; --runp)
+ if (runp[-1] != '/')
+ break;
+
/* Terminate the path. */
- if (last_slash == path)
- /* The last slash is the first character in the string. We have to
- return "/". */
- ++last_slash;
+ if (runp == path)
+ {
+ /* The last slash is the first character in the string. We have to
+ 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';
}
/* 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.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
/* Some more tests. */
result |= test ("/usr/lib/", "/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;
}
-/* 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.
Contributed by Thorsten Kukuk <kukuk@suse.de>, 1996.
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;
}
else
__yp_unbind (ydb);
clnt_destroy (clnt);
- if (status != YP_NOMORE)
+ if (res == YPERR_SUCCESS && status != YP_NOMORE)
{
__set_errno (saved_errno);
return ypprot_err (status);
#include <signal.h>
#include <sys/wait.h>
-#define TMPFILE "/tmp/macros"
#define HEADER_MAX 256
+static const char *macrofile;
+
/* <aio.h>. */
static const char *const aio_syms[] =
{
FILE *input;
int first = 1;
+ macrofile = tmpnam (NULL);
+
command = malloc (sizeof fmt + sizeof "/dev/null" + 2 * strlen (CC)
- + strlen (INC) + strlen (TMPFILE));
+ + strlen (INC) + strlen (macrofile));
if (command == NULL)
{
exit (1);
}
- sprintf (command, fmt, "/dev/null", CC, INC, CC, TMPFILE);
+ sprintf (command, fmt, "/dev/null", CC, INC, CC, macrofile);
if (xsystem (command))
{
return NULL;
}
free (command);
- input = fopen (TMPFILE, "r");
+ input = fopen (macrofile, "r");
if (input == NULL)
{
- printf ("Could not read %s: ", TMPFILE);
+ printf ("Could not read %s: ", macrofile);
perror (NULL);
return NULL;
}
}
result[result_len] = NULL;
fclose (input);
- remove (TMPFILE);
+ remove (macrofile);
return (const char **) result;
}
memset (found, '\0', header->nsyms * sizeof (int));
command = alloca (sizeof fmt + strlen (header->name) + 2 * strlen (CC)
- + strlen (INC) + strlen (TMPFILE));
+ + strlen (INC) + strlen (macrofile));
if (command == NULL)
}
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. */
if (header->subset != NULL)
{
sprintf (line, testfmt, header->subset, header->subset, CC, INC, CC,
- TMPFILE);
+ macrofile);
if (xsystem (line))
{
printf ("!! not available\n");
puts ("system() returned nonzero");
result = 1;
}
- input = fopen (TMPFILE, "r");
+ input = fopen (macrofile, "r");
if (input == NULL)
{
- printf ("Could not read %s: ", TMPFILE);
+ printf ("Could not read %s: ", macrofile);
perror (NULL);
return 1;
}
result |= 1;
}
fclose (input);
- remove (TMPFILE);
+ remove (macrofile);
for (i = 0; i < header->nsyms; ++i)
if (found[i] == 0)
preprocessor has something similar to gcc's -dM option. Tune
PRINT_MACROS in this case. This program assumes headers are found
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
of ISO C, by the way.
#include <stdlib.h>
#include <string.h>
-#define TMPFILE "/tmp/macros"
#define HEADER_MAX 256
+static const char *macrofile;
+
/* ISO C header names including Amendment 1 (without ".h" suffix). */
static char *header[] =
{
FILE *input;
int first = 1;
+ macrofile = tmpnam (NULL);
+
command = malloc (sizeof fmt + sizeof "/dev/null" + 2 * strlen (CC)
- + strlen (INC) + strlen (TMPFILE));
+ + strlen (INC) + strlen (macrofile));
if (command == NULL)
{
exit (1);
}
- sprintf (command, fmt, "/dev/null", CC, INC, CC, TMPFILE);
+ sprintf (command, fmt, "/dev/null", CC, INC, CC, macrofile);
if (system (command))
{
return NULL;
}
free (command);
- input = fopen (TMPFILE, "r");
+ input = fopen (macrofile, "r");
if (input == NULL)
{
- printf ("Could not read %s: ", TMPFILE);
+ printf ("Could not read %s: ", macrofile);
perror (NULL);
return NULL;
}
}
result[result_len] = NULL;
fclose (input);
- remove (TMPFILE);
+ remove (macrofile);
return (const char **) result;
}
int result = 0;
command = malloc (sizeof fmt + strlen (file_name) + 2 * strlen (CC)
- + strlen (INC) + strlen (TMPFILE));
+ + strlen (INC) + strlen (macrofile));
if (command == NULL)
{
}
puts (file_name);
- sprintf (command, fmt, file_name, CC, INC, CC, TMPFILE);
+ sprintf (command, fmt, file_name, CC, INC, CC, macrofile);
if (system (command))
{
result = 1;
}
free (command);
- input = fopen (TMPFILE, "r");
+ input = fopen (macrofile, "r");
if (input == NULL)
{
- printf ("Could not read %s: ", TMPFILE);
+ printf ("Could not read %s: ", macrofile);
perror (NULL);
return 1;
}
}
}
fclose (input);
- remove (TMPFILE);
+ remove (macrofile);
return result;
}
exchange_and_add (volatile uint32_t *mem, int val)
{
int tmp, result;
- __asm__ ("\
-0: lwarx %0,0,%2
- add%I3 %1,%0,%3
- stwcx. %1,0,%2
- bne- 0b
+ __asm__ ("\n\
+0: lwarx %0,0,%2 \n\
+ add%I3 %1,%0,%3 \n\
+ stwcx. %1,0,%2 \n\
+ bne- 0b \n\
" : "=&b"(result), "=&r"(tmp) : "r" (mem), "Ir"(val) : "cr0", "memory");
return result;
}
atomic_add (volatile uint32_t *mem, int val)
{
int tmp;
- __asm__ ("\
-0: lwarx %0,0,%1
- add%I2 %0,%0,%2
- stwcx. %0,0,%1
- bne- 0b
+ __asm__ ("\n\
+0: lwarx %0,0,%1 \n\
+ add%I2 %0,%0,%2 \n\
+ stwcx. %0,0,%1 \n\
+ bne- 0b \n\
" : "=&b"(tmp) : "r" (mem), "Ir"(val) : "cr0", "memory");
}
compare_and_swap (volatile long int *p, long int oldval, long int newval)
{
int result;
- __asm__ ("\
-0: lwarx %0,0,%1
- sub%I2c. %0,%0,%2
- cntlzw %0,%0
- bne- 1f
- stwcx. %3,0,%1
- bne- 0b
-1:
+ __asm__ ("\n\
+0: lwarx %0,0,%1 \n\
+ sub%I2c. %0,%0,%2 \n\
+ cntlzw %0,%0 \n\
+ bne- 1f \n\
+ stwcx. %3,0,%1 \n\
+ bne- 0b \n\
+1: \n\
" : "=&b"(result) : "r"(p), "Ir"(oldval), "r"(newval) : "cr0", "memory");
return result >> 5;
}
always_swap (volatile long int *p, long int newval)
{
long int result;
- __asm__ ("\
-0: lwarx %0,0,%1
- stwcx. %2,0,%1
- bne- 0b
+ __asm__ ("\n\
+0: lwarx %0,0,%1 \n\
+ stwcx. %2,0,%1 \n\
+ bne- 0b \n\
" : "=&r"(result) : "r"(p), "r"(newval) : "cr0", "memory");
return result;
}
test_and_set (volatile long int *p, long int newval)
{
int result;
- __asm__ ("\
-0: lwarx %0,0,%1
- cmpwi %0,0
- bne- 1f
- stwcx. %2,0,%1
- bne- 0b
-1:
+ __asm__ ("\n\
+0: lwarx %0,0,%1 \n\
+ cmpwi %0,0 \n\
+ bne- 1f \n\
+ stwcx. %2,0,%1 \n\
+ bne- 0b \n\
+1: \n\
" : "=&r"(result) : "r"(p), "r"(newval) : "cr0", "memory");
return result;
}
/* This code is used in dl-runtime.c to call the `fixup' function
and then redirect to the address it returns. It is called
from code built in the PLT by elf_machine_runtime_setup. */
-#define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\
- .section \".text\"
- .align 2
- .globl _dl_runtime_resolve
- .type _dl_runtime_resolve,@function
-_dl_runtime_resolve:
- # We need to save the registers used to pass parameters, and register 0,
- # which is used by _mcount; the registers are saved in a stack frame.
- stwu 1,-64(1)
- stw 0,12(1)
- stw 3,16(1)
- stw 4,20(1)
- # The code that calls this has put parameters for `fixup' in r12 and r11.
- mr 3,12
- stw 5,24(1)
- mr 4,11
- stw 6,28(1)
- mflr 0
- # We also need to save some of the condition register fields.
- stw 7,32(1)
- stw 0,48(1)
- stw 8,36(1)
- mfcr 0
- stw 9,40(1)
- stw 10,44(1)
- stw 0,8(1)
- bl fixup@local
- # 'fixup' returns the address we want to branch to.
- mtctr 3
- # Put the registers back...
- lwz 0,48(1)
- lwz 10,44(1)
- lwz 9,40(1)
- mtlr 0
- lwz 8,36(1)
- lwz 0,8(1)
- lwz 7,32(1)
- lwz 6,28(1)
- mtcrf 0xFF,0
- lwz 5,24(1)
- lwz 4,20(1)
- lwz 3,16(1)
- lwz 0,12(1)
- # ...unwind the stack frame, and jump to the PLT entry we updated.
- addi 1,1,64
- bctr
- .size _dl_runtime_resolve,.-_dl_runtime_resolve
-
- .align 2
- .globl _dl_prof_resolve
- .type _dl_prof_resolve,@function
-_dl_prof_resolve:
- # We need to save the registers used to pass parameters, and register 0,
- # which is used by _mcount; the registers are saved in a stack frame.
- stwu 1,-64(1)
- stw 0,12(1)
- stw 3,16(1)
- stw 4,20(1)
- # The code that calls this has put parameters for `fixup' in r12 and r11.
- mr 3,12
- stw 5,24(1)
- mr 4,11
- stw 6,28(1)
- mflr 5
- # We also need to save some of the condition register fields.
- stw 7,32(1)
- stw 5,48(1)
- stw 8,36(1)
- mfcr 0
- stw 9,40(1)
- stw 10,44(1)
- stw 0,8(1)
- bl profile_fixup@local
- # 'fixup' returns the address we want to branch to.
- mtctr 3
- # Put the registers back...
- lwz 0,48(1)
- lwz 10,44(1)
- lwz 9,40(1)
- mtlr 0
- lwz 8,36(1)
- lwz 0,8(1)
- lwz 7,32(1)
- lwz 6,28(1)
- mtcrf 0xFF,0
- lwz 5,24(1)
- lwz 4,20(1)
- lwz 3,16(1)
- lwz 0,12(1)
- # ...unwind the stack frame, and jump to the PLT entry we updated.
- addi 1,1,64
- bctr
- .size _dl_prof_resolve,.-_dl_prof_resolve
- # Undo '.section text'.
- .previous
+#define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\n\
+ .section \".text\" \n\
+ .align 2 \n\
+ .globl _dl_runtime_resolve \n\
+ .type _dl_runtime_resolve,@function \n\
+_dl_runtime_resolve: \n\
+ # 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.\n\
+ stwu 1,-64(1) \n\
+ stw 0,12(1) \n\
+ stw 3,16(1) \n\
+ stw 4,20(1) \n\
+ # The code that calls this has put parameters for `fixup' in r12 and r11.\n\
+ mr 3,12 \n\
+ stw 5,24(1) \n\
+ mr 4,11 \n\
+ stw 6,28(1) \n\
+ mflr 0 \n\
+ # We also need to save some of the condition register fields.\n\
+ stw 7,32(1) \n\
+ stw 0,48(1) \n\
+ stw 8,36(1) \n\
+ mfcr 0 \n\
+ stw 9,40(1) \n\
+ stw 10,44(1) \n\
+ stw 0,8(1) \n\
+ bl fixup@local \n\
+ # 'fixup' returns the address we want to branch to.\n\
+ mtctr 3 \n\
+ # Put the registers back...\n\
+ lwz 0,48(1) \n\
+ lwz 10,44(1) \n\
+ lwz 9,40(1) \n\
+ mtlr 0 \n\
+ lwz 8,36(1) \n\
+ lwz 0,8(1) \n\
+ lwz 7,32(1) \n\
+ lwz 6,28(1) \n\
+ mtcrf 0xFF,0 \n\
+ lwz 5,24(1) \n\
+ lwz 4,20(1) \n\
+ lwz 3,16(1) \n\
+ lwz 0,12(1) \n\
+ # ...unwind the stack frame, and jump to the PLT entry we updated.\n\
+ addi 1,1,64 \n\
+ bctr \n\
+ .size _dl_runtime_resolve,.-_dl_runtime_resolve \n\
+ \n\
+ .align 2 \n\
+ .globl _dl_prof_resolve \n\
+ .type _dl_prof_resolve,@function \n\
+_dl_prof_resolve: \n\
+ # 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.\n\
+ stwu 1,-64(1) \n\
+ stw 0,12(1) \n\
+ stw 3,16(1) \n\
+ stw 4,20(1) \n\
+ # The code that calls this has put parameters for `fixup' in r12 and r11.\n\
+ mr 3,12 \n\
+ stw 5,24(1) \n\
+ mr 4,11 \n\
+ stw 6,28(1) \n\
+ mflr 5 \n\
+ # We also need to save some of the condition register fields.\n\
+ stw 7,32(1) \n\
+ stw 5,48(1) \n\
+ stw 8,36(1) \n\
+ mfcr 0 \n\
+ stw 9,40(1) \n\
+ stw 10,44(1) \n\
+ stw 0,8(1) \n\
+ bl profile_fixup@local \n\
+ # 'fixup' returns the address we want to branch to.\n\
+ mtctr 3 \n\
+ # Put the registers back...\n\
+ lwz 0,48(1) \n\
+ lwz 10,44(1) \n\
+ lwz 9,40(1) \n\
+ mtlr 0 \n\
+ lwz 8,36(1) \n\
+ lwz 0,8(1) \n\
+ lwz 7,32(1) \n\
+ lwz 6,28(1) \n\
+ mtcrf 0xFF,0 \n\
+ lwz 5,24(1) \n\
+ lwz 4,20(1) \n\
+ lwz 3,16(1) \n\
+ lwz 0,12(1) \n\
+ # ...unwind the stack frame, and jump to the PLT entry we updated.\n\
+ addi 1,1,64 \n\
+ bctr \n\
+ .size _dl_prof_resolve,.-_dl_prof_resolve \n\
+ # Undo '.section text'.\n\
+ .previous \n\
");
/* The actual _start code is in dl-start.S. Use a really
weak_alias (__lrint, lrint)
/* This code will also work for a 'float' argument. */
-asm ("\
- .globl __lrintf
- .globl lrintf
- .weak lrintf
- .set __lrintf,__lrint
- .set lrintf,__lrint
+asm ("\n\
+ .globl __lrintf \n\
+ .globl lrintf \n\
+ .weak lrintf \n\
+ .set __lrintf,__lrint \n\
+ .set lrintf,__lrint \n\
");
#ifdef NO_LONG_DOUBLE
/* This prints out the information in the following form: */
static const char dumpform[] = "\
-Register dump:
-fp0-3: 0000030%0000031% 0000032%0000033% 0000034%0000035% 0000036%0000037%
-fp4-7: 0000038%0000039% 000003a%000003b% 000003c%000003d% 000003e%000003f%
-fp8-11: 0000040%0000041% 0000042%0000043% 0000044%0000045% 0000046%0000047%
-fp12-15: 0000048%0000049% 000004a%000004b% 000004c%000004d% 000004e%000004f%
-fp16-19: 0000050%0000051% 0000052%0000053% 0000054%0000055% 0000056%0000057%
-fp20-23: 0000058%0000059% 000005a%000005b% 000005c%000005d% 000005e%000005f%
-fp24-27: 0000060%0000061% 0000062%0000063% 0000064%0000065% 0000066%0000067%
-fp28-31: 0000068%0000069% 000006a%000006b% 000006c%000006d% 000006e%000006f%
-r0 =0000000% sp =0000001% r2 =0000002% r3 =0000003% trap=0000028%
-r4 =0000004% r5 =0000005% r6 =0000006% r7 =0000007% sr0=0000020% sr1=0000021%
-r8 =0000008% r9 =0000009% r10=000000a% r11=000000b% dar=0000029% dsi=000002a%
-r12=000000c% r13=000000d% r14=000000e% r15=000000f% r3*=0000022%
-r16=0000010% r17=0000011% r18=0000012% r19=0000013%
-r20=0000014% r21=0000015% r22=0000016% r23=0000017% lr=0000024% xer=0000025%
-r24=0000018% r25=0000019% r26=000001a% r27=000001b% mq=0000027% ctr=0000023%
-r28=000001c% r29=000001d% r30=000001e% r31=000001f% fscr=0000071% ccr=0000026%
+Register dump:\n\
+fp0-3: 0000030%0000031% 0000032%0000033% 0000034%0000035% 0000036%0000037%\n\
+fp4-7: 0000038%0000039% 000003a%000003b% 000003c%000003d% 000003e%000003f%\n\
+fp8-11: 0000040%0000041% 0000042%0000043% 0000044%0000045% 0000046%0000047%\n\
+fp12-15: 0000048%0000049% 000004a%000004b% 000004c%000004d% 000004e%000004f%\n\
+fp16-19: 0000050%0000051% 0000052%0000053% 0000054%0000055% 0000056%0000057%\n\
+fp20-23: 0000058%0000059% 000005a%000005b% 000005c%000005d% 000005e%000005f%\n\
+fp24-27: 0000060%0000061% 0000062%0000063% 0000064%0000065% 0000066%0000067%\n\
+fp28-31: 0000068%0000069% 000006a%000006b% 000006c%000006d% 000006e%000006f%\n\
+r0 =0000000% sp =0000001% r2 =0000002% r3 =0000003% trap=0000028%\n\
+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%\n\
+r12=000000c% r13=000000d% r14=000000e% r15=000000f% r3*=0000022%\n\
+r16=0000010% r17=0000011% r18=0000012% r19=0000013%\n\
+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%\n\
+r28=000001c% r29=000001d% r30=000001e% r31=000001f% fscr=0000071% ccr=0000026%\n\
";
/* Most of the fields are self-explanatory. 'sr0' is the next
-/* 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.
Copyright (C) 2000, 2001 Free Software Foundation, Inc.
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
-/*
- * R2 = address of source
- * R3 = address of destination
- * R4 = number of bytes to copy
- */
+/* INPUT PARAMETERS
+ %r2 = address of source
+ %r3 = address of destination
+ %r4 = number of bytes to copy. */
#include "sysdep.h"
#include "asm-syntax.h"
.text
ENTRY(__bcopy)
+ ltr %r1,%r4 # zero bcopy ?
+ jz .L4
clr %r2,%r3 # check against destructive overlap
jnl .L0
- lr %r1,%r2
- alr %r1,%r4
+ alr %r1,%r2
clr %r1,%r3
- jh .L2
-.L0:
- lr %r5,%r4 # source length
- lr %r4,%r2 # source address
- sr %r1,%r1 # set pad byte to zero
- lr %r2,%r3 # set destination
- lr %r3,%r5 # destination length = source length
-.L1: mvcle %r2,%r4,0(%r1) # thats it, MVCLE is your friend
- jo .L1
- br %r14
-.L2: # destructive overlay, can not use mvcle
+ jh .L5
+.L0: ahi %r4,-1 # length - 1
+ lr %r1,%r4
+ srl %r1,8
+ ltr %r1,%r1
+ jz .L2
+.L1: mvc 0(256,%r3),0(%r2) # move in 256 byte chunks
+ la %r2,256(%r2)
+ la %r3,256(%r3)
+ brct %r1,.L1
+.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 %r2,%r3 # memmove with dest,source! Oh, well...
lr %r3,%r1
basr %r1,0
-.L3:
+.L6:
#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
l %r1,memmove@GOT12(%r1)
br %r1
-.L4: .long _GLOBAL_OFFSET_TABLE_-.L3
+.L7: .long _GLOBAL_OFFSET_TABLE_-.L6
#else
- al %r1,.L4-.L3(%r1) # load address of memmove
+ al %r1,.L7-.L6(%r1) # load address of memmove
br %r1 # jump to memmove
-.L4: .long memmove-.L3
+.L7: .long memmove-.L6
#endif
END(__bcopy)
#ifndef NO_WEAK_ALIAS
weak_alias (__bcopy, bcopy)
#endif
+
-/* 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.
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
-/*
- * R2 = address to destination memory area
- * R3 = address to source memory area
- * R4 = number of bytes to copy
- */
+/* INPUT PARAMETERS
+ %r2 = address of destination memory area
+ %r3 = address of source memory area
+ %r4 = number of bytes to copy. */
#include "sysdep.h"
#include "asm-syntax.h"
.text
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
- lr %r4,%r3 # %r4/%r5 = source ptr/len
- lr %r3,%r5 # %r2/%r3 = dest ptr/len
- lr %r0,%r2 # save source address
-.L0: mvcle %r2,%r4,0 # thats it, MVCLE is your friend
- jo .L0
- lr %r2,%r0 # return value is source address
-.L1:
- br %r14
-END(memset)
+.L0: mvc 0(256,%r1),0(%r3) # move in 256 byte chunks
+ la %r1,256(%r1)
+ la %r3,256(%r3)
+ brct %r5,.L0
+.L1: bras %r5,.L2 # setup base pointer for execute
+ mvc 0(1,%r1),0(%r3) # instruction for execute
+.L2: ex %r4,0(%r5) # execute mvc with length ((%r4)&255)+1
+.L3: br %r14
+END(memcpy)
+
/* bcopy -- copy a block from source to destination. 64 bit S/390 version.
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).
The GNU C Library is free software ; you can redistribute it and/or
#include "sysdep.h"
#include "asm-syntax.h"
- .text
+ .text
ENTRY(__bcopy)
- clgr %r2,%r3 # check against destructive overlap
- jnl .L0
- lgr %r1,%r2
- algr %r1,%r4
- clgr %r1,%r3
- jh .L2
-.L0:
- lgr %r5,%r4 # source length
- lgr %r4,%r2 # source address
- sgr %r1,%r1 # set pad byte to zero
- lgr %r2,%r3 # set destination
- lgr %r3,%r5 # destination length = source length
-.L1: mvcle %r2,%r4,0(%r1) # thats it, MVCLE is your friend
- jo .L1
- br %r14
-.L2: # 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
+ ltgr %r1,%r4 # zero bcopy ?
+ jz .L4
+ clgr %r2,%r3 # check against destructive overlap
+ jnl .L0
+ algr %r1,%r2
+ clgr %r1,%r3
+ jh .L5
+.L0: aghi %r4,-1 # length - 1
+ srlg %r1,%r4,8
+ ltgr %r1,%r1
+ jz .L2
+.L1: mvc 0(256,%r3),0(%r2) # move in 256 byte chunks
+ la %r2,256(%r2)
+ la %r3,256(%r3)
+ brctg %r1,.L1
+.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
+ lgr %r1,%r2 # bcopy is called with source,dest
+ lgr %r2,%r3 # memmove with dest,source! Oh, well...
+ lgr %r3,%r1
#ifdef PIC
jg memmove@PLT
#else
AGHI 15,-160
STG 1,0(15)
LARL 12,_GLOBAL_OFFSET_TABLE_
- LGHI 1,__gmon_start__@GOT
- LG 1,0(1,12)
+ LARL 1,__gmon_start__@GOTENT
+ LG 1,0(1)
LTGR 1,1
JE .L22
BASR 14,1
-/* Set a block of memory to some byte value. 64 bit S/390 version.
- Copyright (C) 2001 Free Software Foundation, Inc.
+/* memcpy - copy a block from source to destination. 64 bit S/390 version.
+ Copyright (C) 2000, 2001 Free Software Foundation, Inc.
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
modify it under the terms of the GNU Library General Public License as
Boston, MA 02111-1307, USA. */
/* INPUT PARAMETERS
- %r2 = address to destination memory area
- %r3 = address to source memory area
+ %r2 = address of destination memory area
+ %r3 = address of source memory area
%r4 = number of bytes to copy. */
#include "sysdep.h"
.text
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
- lgr %r4,%r3 # %r4/%r5 = source ptr/len
- lgr %r3,%r5 # %r2/%r3 = dest ptr/len
- lgr %r0,%r2 # save source address
-.L0: mvcle %r2,%r4,0 # thats it, MVCLE is your friend
- jo .L0
- lgr %r2,%r0 # return value is source address
-.L1:
- br %r14
-END(memset)
+.L0: mvc 0(256,%r1),0(%r3) # move in 256 byte chunks
+ la %r1,256(%r1)
+ la %r3,256(%r3)
+ brctg %r5,.L0
+.L1: bras %r5,.L2 # setup base pointer for execute
+ mvc 0(1,%r1),0(%r3) # instruction for execute
+.L2: ex %r4,0(%r5) # execute mvc with length ((%r4)&255)+1
+.L3: br %r14
+END(memcpy)
+