Sun Feb 25 22:36:10 1996 David Mosberger-Tang <davidm@azstarnet.com>
authorroland <roland>
Tue, 19 Mar 1996 19:53:09 +0000 (19:53 +0000)
committerroland <roland>
Tue, 19 Mar 1996 19:53:09 +0000 (19:53 +0000)
* gmon/sys/gmon_out.h, gmon/bb_exit_func.c,
  sysdeps/generic/bb_init_func.c, sysdeps/alpha/bb_init_func.S: new
  files.

gmon/bb_exit_func.c [new file with mode: 0644]
gmon/sys/gmon_out.h [new file with mode: 0644]
sysdeps/alpha/bb_init_func.S [new file with mode: 0644]
sysdeps/generic/bb_init_func.c [new file with mode: 0644]

diff --git a/gmon/bb_exit_func.c b/gmon/bb_exit_func.c
new file mode 100644 (file)
index 0000000..215f0ba
--- /dev/null
@@ -0,0 +1,156 @@
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+   Contributed by David Mosberger (davidm@cs.arizona.edu).
+
+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., 675 Mass Ave,
+Cambridge, MA 02139, USA.  */
+
+/* __bb_exit_func() dumps all the basic-block statistics linked into
+   the bb_head chain to .d files.  */
+
+#include <sys/gmon_out.h>
+#include <sys/types.h>
+
+#include <ansidecl.h>
+#include <stdio.h>
+#include <strings.h>
+
+/* structure emitted by -a */
+struct bb {
+  long                 zero_word;
+  const char           *filename;
+  long                 *counts;
+  long                 ncounts;
+  struct bb            *next;
+  const unsigned long  *addresses;
+};
+
+extern struct bb *__bb_head;   /* from gmon.c */
+
+#define OUT_NAME       "gmon.out"
+
+
+void
+DEFUN_VOID(__bb_exit_func)
+{
+  const int version = GMON_VERSION;
+  struct gmon_hdr ghdr;
+  struct bb *ptr;
+  FILE *fp;
+  fp = fopen(OUT_NAME, "wb");
+  if (!fp)
+    {
+      perror(OUT_NAME);
+      return;
+    }
+  bcopy(GMON_MAGIC, &ghdr.cookie[0], 4);
+  bcopy(&version, &ghdr.version, sizeof(version));
+  fwrite(&ghdr, sizeof(ghdr), 1, fp);
+
+  for (ptr = __bb_head; ptr != 0; ptr = ptr->next) {
+    u_int ncounts = ptr->ncounts;
+    u_char tag;
+    u_int i;
+
+    tag = GMON_TAG_BB_COUNT;
+    fwrite(&tag, sizeof(tag), 1, fp);
+    fwrite(&ncounts, sizeof(ncounts), 1, fp);
+
+    for (i = 0; i < ncounts; ++i) {
+      fwrite(&ptr->addresses[i], sizeof(ptr->addresses[0]), 1, fp);
+      fwrite(&ptr->counts[i], sizeof(ptr->counts[0]), 1, fp);
+    }
+  }
+  fclose (fp);
+}
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+   Contributed by David Mosberger (davidm@cs.arizona.edu).
+
+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., 675 Mass Ave,
+Cambridge, MA 02139, USA.  */
+
+/* __bb_exit_func() dumps all the basic-block statistics linked into
+   the bb_head chain to .d files.  */
+
+#include <sys/gmon_out.h>
+#include <sys/types.h>
+
+#include <ansidecl.h>
+#include <stdio.h>
+#include <strings.h>
+
+/* structure emitted by -a */
+struct bb {
+  long                 zero_word;
+  const char           *filename;
+  long                 *counts;
+  long                 ncounts;
+  struct bb            *next;
+  const unsigned long  *addresses;
+};
+
+extern struct bb *__bb_head;   /* from gmon.c */
+
+#define OUT_NAME       "gmon.out"
+
+
+void
+DEFUN_VOID(__bb_exit_func)
+{
+  const int version = GMON_VERSION;
+  struct gmon_hdr ghdr;
+  struct bb *ptr;
+  FILE *fp;
+  fp = fopen(OUT_NAME, "wb");
+  if (!fp)
+    {
+      perror(OUT_NAME);
+      return;
+    }
+  bcopy(GMON_MAGIC, &ghdr.cookie[0], 4);
+  bcopy(&version, &ghdr.version, sizeof(version));
+  fwrite(&ghdr, sizeof(ghdr), 1, fp);
+
+  for (ptr = __bb_head; ptr != 0; ptr = ptr->next) {
+    u_int ncounts = ptr->ncounts;
+    u_char tag;
+    u_int i;
+
+    tag = GMON_TAG_BB_COUNT;
+    fwrite(&tag, sizeof(tag), 1, fp);
+    fwrite(&ncounts, sizeof(ncounts), 1, fp);
+
+    for (i = 0; i < ncounts; ++i) {
+      fwrite(&ptr->addresses[i], sizeof(ptr->addresses[0]), 1, fp);
+      fwrite(&ptr->counts[i], sizeof(ptr->counts[0]), 1, fp);
+    }
+  }
+  fclose (fp);
+}
diff --git a/gmon/sys/gmon_out.h b/gmon/sys/gmon_out.h
new file mode 100644 (file)
index 0000000..6eab094
--- /dev/null
@@ -0,0 +1,132 @@
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+   Contributed by David Mosberger (davidm@cs.arizona.edu).
+
+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., 675 Mass Ave,
+Cambridge, MA 02139, USA.  */
+
+/* This file specifies the format of gmon.out files.  It should have
+as few external dependencies as possible as it is going to be included
+in many different programs.  That is, minimize the number of #include's.
+
+A gmon.out file consists of a header (defined by gmon_hdr) followed by
+a sequence of records.  Each record starts with a one-byte tag
+identifying the type of records, followed by records specific data. */
+
+#ifndef _SYS_GMON_OUT_H_
+#define _SYS_GMON_OUT_H_
+
+#define        GMON_MAGIC      "gmon"  /* magic cookie */
+#define GMON_VERSION   1       /* version number */
+
+/*
+ * Raw header as it appears on file (without padding).  This header
+ * always comes first in gmon.out and is then followed by a series
+ * records defined below.
+ */
+struct gmon_hdr {
+  char cookie[4];
+  char version[4];
+  char spare[3 * 4];
+};
+
+/* types of records in this file: */
+typedef enum {
+  GMON_TAG_TIME_HIST = 0, GMON_TAG_CG_ARC = 1, GMON_TAG_BB_COUNT = 2
+} GMON_Record_Tag;
+
+struct gmon_hist_hdr {
+  char low_pc[sizeof (char *)];        /* base pc address of sample buffer */
+  char high_pc[sizeof (char *)];       /* max pc address of sampled buffer */
+  char hist_size[4];                   /* size of sample buffer */
+  char prof_rate[4];                   /* profiling clock rate */
+  char dimen[15];                      /* phys. dim., usually "seconds" */
+  char dimen_abbrev;                   /* usually 's' for "seconds" */
+};
+
+struct gmon_cg_arc_record {
+  char from_pc[sizeof (char *)];       /* address within caller's body */
+  char self_pc[sizeof (char *)];       /* address within callee's body */
+  char count[4];                       /* number of arc traversals */
+};
+
+#endif /* !_SYS_GMON_OUT_H_ */
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+   Contributed by David Mosberger (davidm@cs.arizona.edu).
+
+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., 675 Mass Ave,
+Cambridge, MA 02139, USA.  */
+
+/* This file specifies the format of gmon.out files.  It should have
+as few external dependencies as possible as it is going to be included
+in many different programs.  That is, minimize the number of #include's.
+
+A gmon.out file consists of a header (defined by gmon_hdr) followed by
+a sequence of records.  Each record starts with a one-byte tag
+identifying the type of records, followed by records specific data. */
+
+#ifndef _SYS_GMON_OUT_H_
+#define _SYS_GMON_OUT_H_
+
+#define        GMON_MAGIC      "gmon"  /* magic cookie */
+#define GMON_VERSION   1       /* version number */
+
+/*
+ * Raw header as it appears on file (without padding).  This header
+ * always comes first in gmon.out and is then followed by a series
+ * records defined below.
+ */
+struct gmon_hdr {
+  char cookie[4];
+  char version[4];
+  char spare[3 * 4];
+};
+
+/* types of records in this file: */
+typedef enum {
+  GMON_TAG_TIME_HIST = 0, GMON_TAG_CG_ARC = 1, GMON_TAG_BB_COUNT = 2
+} GMON_Record_Tag;
+
+struct gmon_hist_hdr {
+  char low_pc[sizeof (char *)];        /* base pc address of sample buffer */
+  char high_pc[sizeof (char *)];       /* max pc address of sampled buffer */
+  char hist_size[4];                   /* size of sample buffer */
+  char prof_rate[4];                   /* profiling clock rate */
+  char dimen[15];                      /* phys. dim., usually "seconds" */
+  char dimen_abbrev;                   /* usually 's' for "seconds" */
+};
+
+struct gmon_cg_arc_record {
+  char from_pc[sizeof (char *)];       /* address within caller's body */
+  char self_pc[sizeof (char *)];       /* address within callee's body */
+  char count[4];                       /* number of arc traversals */
+};
+
+#endif /* !_SYS_GMON_OUT_H_ */
diff --git a/sysdeps/alpha/bb_init_func.S b/sysdeps/alpha/bb_init_func.S
new file mode 100644 (file)
index 0000000..9bf985c
--- /dev/null
@@ -0,0 +1,85 @@
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+   Contributed by David Mosberger (davidm@cs.arizona.edu).
+
+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., 675 Mass Ave,
+Cambridge, MA 02139, USA.  */
+
+/* __bb_init_func is invoked at the beginning of each function, before
+any registers have been saved.  It is therefore safe to use any
+caller-saved (call-used) registers (except for argument registers
+a1-a5). */
+
+#include <sysdep.h>
+#ifdef __linux__
+# include <alpha/regdef.h>
+#else
+# include <regdef.h>
+#endif
+
+/*
+ * These offsets should match with "struct bb" declared in gcc/libgcc2.c.
+ */
+#define        ZERO_WORD       0x00
+#define NEXT           0x20
+
+       .set    noat
+       .set    noreorder
+
+ENTRY(__bb_init_func)
+       ldq     t0, ZERO_WORD(a0)       /* t0 <- blocks->zero_word */
+       beq     t0, init                /* not initialized yet -> */
+       ret
+
+
+init:  subq    sp, 0x38, sp
+       stq     pv, 0x30(sp)
+       br      pv, 1f
+1:     ldgp    gp, 0(pv)
+
+       lda     t1, __bb_head
+       lda     t3, _gmonparam
+       ldq     t2, 0(t1)
+       ldl     t3, 0(t3)               /* t3 = _gmonparam.state */
+       ldi     t0, 1
+       stq     t0, ZERO_WORD(a0)       /* blocks->zero_word = 1 */
+       stq     t2, NEXT(a0)            /* blocks->next = __bb_head */
+       stq     a0, 0(t1)
+       bne     t2, leave
+       beq     t3, leave               /* t3 == GMON_PROF_ON? yes -> */
+
+       /* also need to initialize destructor: */
+       stq     ra, 0x00(sp)
+       lda     a0, __bb_exit_func
+       stq     a1, 0x08(sp)
+       lda     pv, atexit
+       stq     a2, 0x10(sp)
+       stq     a3, 0x18(sp)
+       stq     a4, 0x20(sp)
+       stq     a5, 0x28(sp)
+       jsr     ra, (pv), atexit
+       ldq     ra, 0x00(sp)
+       ldq     a1, 0x08(sp)
+       ldq     a2, 0x10(sp)
+       ldq     a3, 0x18(sp)
+       ldq     a4, 0x20(sp)
+       ldq     a5, 0x28(sp)
+
+leave: ldq     pv, 0x30(sp)
+       addq    sp, 0x38, sp
+       ret
+       
+       .end __bb_init_func
diff --git a/sysdeps/generic/bb_init_func.c b/sysdeps/generic/bb_init_func.c
new file mode 100644 (file)
index 0000000..0c768c3
--- /dev/null
@@ -0,0 +1,54 @@
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+   Contributed by David Mosberger (davidm@cs.arizona.edu).
+
+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., 675 Mass Ave,
+Cambridge, MA 02139, USA.  */
+
+/* __bb_init_func is invoked at the beginning of each function, before
+any registers have been saved.  This generic routine should work
+provided that calling this function doesn't mangle the arguments
+passed to the function being called.  If that's not the case, a system
+specific routine must be provided. */
+
+#include <sys/types.h>
+#include <sys/gmon.h>
+
+#include <ansidecl.h>
+#include <stdlib.h>
+
+void
+DEFUN(__bb_init_func, (bb), struct __bb *bb)
+{
+  struct gmonparam *p = &_gmonparam;
+
+  if (bb->zero_word != 0)
+    {
+      return;  /* handle common case quickly */
+    }
+
+  /* insert this basic-block into basic-block list: */
+  bb->zero_word = 1;
+  bb->next = __bb_head;
+  __bb_head = bb;
+
+  if (bb->next == 0 && p->state != GMON_PROF_ON)
+    {
+      /* we didn't register _mcleanup yet and pc profiling doesn't seem
+        to be active, so let's register it now: */
+      atexit(_mcleanup);
+    }
+}