This is the mail archive of the libc-alpha@sources.redhat.com mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix profiling on hppa (arch specific changes)


libc-alpha,

Thanks for applying the first patch.

This is the second part of the gprof fixes required for hppa. All local
changes.  First redefine _start so monstartup is passed a proper
function descriptor. Then we add proper _MCOUNT_DEC_ and profil_counter
implementations.

Tested on hppa. If you run a 64-bit box, you need a recent 2.6 kernel
for profiling to work (due to compat_siginfo_t changes).

Thanks,
c.

 sysdeps/hppa/elf/entry.h                      |   10 +++
 sysdeps/hppa/machine-gmon.h                   |   25 +++++++++
 sysdeps/unix/sysv/linux/hppa/profil-counter.h |   27 +++++++++-
 3 files changed, 60 insertions(+), 2 deletions(-)

2004-04-18  Randolph Chung  <tausq@debian.org>

	* sysdeps/hppa/elf/entry.h (ENTRY_POINT): Use
	__canonicalize_funcptr_for_compare for loading _start to handle	lazy
	binding.
	* sysdeps/hppa/machine-gmon.h: New file.
	* sysdeps/unix/sysv/linux/hppa/profil-counter.h: New file.

--- libc-orig/sysdeps/hppa/elf/entry.h	1969-12-31 19:00:00.000000000 -0500
+++ libc/sysdeps/hppa/elf/entry.h	2003-12-15 00:38:40.000000000 -0500
@@ -0,0 +1,10 @@
+#ifndef __ASSEMBLY__
+extern void _start (void);
+#endif
+
+/* The function's entry point is stored in the first word of the
+   function descriptor (plabel) of _start().  */
+#define ENTRY_POINT __canonicalize_funcptr_for_compare(_start)
+
+/* We have to provide a special declaration.  */
+#define ENTRY_POINT_DECL(class) class void _start (void);
--- libc-orig/sysdeps/hppa/machine-gmon.h	1969-12-31 19:00:00.000000000 -0500
+++ libc/sysdeps/hppa/machine-gmon.h	2003-12-15 00:38:40.000000000 -0500
@@ -0,0 +1,25 @@
+/* Machine-specific calling sequence for `mcount' profiling function.  PA-RISC
+   Copyright (C) 1995, 1996, 1997, 2000 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+/* We can call _mcount directly since gcc supplies the correct
+ * arguments */
+#define _MCOUNT_DECL(from, self) \
+ void _mcount (u_long from, u_long self)
+
+#define MCOUNT
--- libc-orig/sysdeps/unix/sysv/linux/hppa/profil-counter.h	2000-10-14 23:27:46.000000000 -0400
+++ libc/sysdeps/unix/sysv/linux/hppa/profil-counter.h	2003-12-15 00:38:40.000000000 -0500
@@ -1,2 +1,25 @@
-/* We can use the ix86 version.  */
-#include <sysdeps/unix/sysv/linux/i386/profil-counter.h>
+/* Machine-dependent SIGPROF signal handler.  PA-RISC version
+   Copyright (C) 1996, 1997, 2000 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+static void
+profil_counter (int signr, siginfo_t *si, struct ucontext *uctx)
+{
+  unsigned long ip = uctx->uc_mcontext.sc_iaoq[0] & ~0x3;
+  profil_count ((void *) ip);
+}


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]