Index: Makefile.am =================================================================== RCS file: /cvs/src/src/gprof/Makefile.am,v retrieving revision 1.11 diff -c -r1.11 Makefile.am *** Makefile.am 2001/10/02 06:03:15 1.11 --- Makefile.am 2002/01/20 23:04:07 *************** *** 23,29 **** sources = basic_blocks.c call_graph.c cg_arcs.c cg_dfn.c \ cg_print.c corefile.c gmon_io.c gprof.c hertz.c hist.c source.c \ search_list.c symtab.c sym_ids.c utils.c \ ! i386.c alpha.c vax.c tahoe.c sparc.c gprof_SOURCES = $(sources) flat_bl.c bsd_callg_bl.c fsf_callg_bl.c gprof_DEPENDENCIES = ../bfd/libbfd.la ../libiberty/libiberty.a $(INTLDEPS) gprof_LDADD = ../bfd/libbfd.la ../libiberty/libiberty.a $(INTLLIBS) --- 23,29 ---- sources = basic_blocks.c call_graph.c cg_arcs.c cg_dfn.c \ cg_print.c corefile.c gmon_io.c gprof.c hertz.c hist.c source.c \ search_list.c symtab.c sym_ids.c utils.c \ ! i386.c alpha.c vax.c tahoe.c sparc.c mips.c gprof_SOURCES = $(sources) flat_bl.c bsd_callg_bl.c fsf_callg_bl.c gprof_DEPENDENCIES = ../bfd/libbfd.la ../libiberty/libiberty.a $(INTLDEPS) gprof_LDADD = ../bfd/libbfd.la ../libiberty/libiberty.a $(INTLLIBS) *************** *** 216,221 **** --- 216,226 ---- $(INCDIR)/symcat.h source.h search_list.h corefile.h \ hist.h sparc.o: sparc.c gprof.h $(INCDIR)/ansidecl.h $(BFDDIR)/sysdep.h \ + ../bfd/config.h $(INCDIR)/fopen-same.h $(INCDIR)/filenames.h \ + gconfig.h $(INCDIR)/bin-bugs.h cg_arcs.h symtab.h ../bfd/bfd.h \ + $(INCDIR)/symcat.h source.h search_list.h corefile.h \ + hist.h + mips.o: mips.c gprof.h $(INCDIR)/ansidecl.h $(BFDDIR)/sysdep.h \ ../bfd/config.h $(INCDIR)/fopen-same.h $(INCDIR)/filenames.h \ gconfig.h $(INCDIR)/bin-bugs.h cg_arcs.h symtab.h ../bfd/bfd.h \ $(INCDIR)/symcat.h source.h search_list.h corefile.h \ Index: Makefile.in =================================================================== RCS file: /cvs/src/src/gprof/Makefile.in,v retrieving revision 1.16 diff -c -r1.16 Makefile.in *** Makefile.in 2001/10/02 06:03:15 1.16 --- Makefile.in 2002/01/20 23:04:07 *************** *** 123,129 **** sources = basic_blocks.c call_graph.c cg_arcs.c cg_dfn.c \ cg_print.c corefile.c gmon_io.c gprof.c hertz.c hist.c source.c \ search_list.c symtab.c sym_ids.c utils.c \ ! i386.c alpha.c vax.c tahoe.c sparc.c gprof_SOURCES = $(sources) flat_bl.c bsd_callg_bl.c fsf_callg_bl.c gprof_DEPENDENCIES = ../bfd/libbfd.la ../libiberty/libiberty.a $(INTLDEPS) --- 123,129 ---- sources = basic_blocks.c call_graph.c cg_arcs.c cg_dfn.c \ cg_print.c corefile.c gmon_io.c gprof.c hertz.c hist.c source.c \ search_list.c symtab.c sym_ids.c utils.c \ ! i386.c alpha.c vax.c tahoe.c sparc.c mips.c gprof_SOURCES = $(sources) flat_bl.c bsd_callg_bl.c fsf_callg_bl.c gprof_DEPENDENCIES = ../bfd/libbfd.la ../libiberty/libiberty.a $(INTLDEPS) *************** *** 167,174 **** corefile.$(OBJEXT) gmon_io.$(OBJEXT) gprof.$(OBJEXT) hertz.$(OBJEXT) \ hist.$(OBJEXT) source.$(OBJEXT) search_list.$(OBJEXT) symtab.$(OBJEXT) \ sym_ids.$(OBJEXT) utils.$(OBJEXT) i386.$(OBJEXT) alpha.$(OBJEXT) \ ! vax.$(OBJEXT) tahoe.$(OBJEXT) sparc.$(OBJEXT) flat_bl.$(OBJEXT) \ ! bsd_callg_bl.$(OBJEXT) fsf_callg_bl.$(OBJEXT) gprof_LDFLAGS = CFLAGS = @CFLAGS@ COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) --- 167,174 ---- corefile.$(OBJEXT) gmon_io.$(OBJEXT) gprof.$(OBJEXT) hertz.$(OBJEXT) \ hist.$(OBJEXT) source.$(OBJEXT) search_list.$(OBJEXT) symtab.$(OBJEXT) \ sym_ids.$(OBJEXT) utils.$(OBJEXT) i386.$(OBJEXT) alpha.$(OBJEXT) \ ! vax.$(OBJEXT) tahoe.$(OBJEXT) sparc.$(OBJEXT) mips.$(OBJEXT) \ ! flat_bl.$(OBJEXT) bsd_callg_bl.$(OBJEXT) fsf_callg_bl.$(OBJEXT) gprof_LDFLAGS = CFLAGS = @CFLAGS@ COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) *************** *** 879,884 **** --- 879,889 ---- $(INCDIR)/symcat.h source.h search_list.h corefile.h \ hist.h sparc.o: sparc.c gprof.h $(INCDIR)/ansidecl.h $(BFDDIR)/sysdep.h \ + ../bfd/config.h $(INCDIR)/fopen-same.h $(INCDIR)/filenames.h \ + gconfig.h $(INCDIR)/bin-bugs.h cg_arcs.h symtab.h ../bfd/bfd.h \ + $(INCDIR)/symcat.h source.h search_list.h corefile.h \ + hist.h + mips.o: mips.c gprof.h $(INCDIR)/ansidecl.h $(BFDDIR)/sysdep.h \ ../bfd/config.h $(INCDIR)/fopen-same.h $(INCDIR)/filenames.h \ gconfig.h $(INCDIR)/bin-bugs.h cg_arcs.h symtab.h ../bfd/bfd.h \ $(INCDIR)/symcat.h source.h search_list.h corefile.h \ Index: corefile.c =================================================================== RCS file: /cvs/src/src/gprof/corefile.c,v retrieving revision 1.7 diff -c -r1.7 corefile.c *** corefile.c 2001/03/14 03:14:56 1.7 --- corefile.c 2002/01/20 23:04:08 *************** *** 1,6 **** /* corefile.c ! Copyright 2000, 2001 Free Software Foundation, Inc. This file is part of GNU Binutils. --- 1,6 ---- /* corefile.c ! Copyright 2000, 2001, 2002 Free Software Foundation, Inc. This file is part of GNU Binutils. *************** *** 48,53 **** --- 48,54 ---- extern void vax_find_call PARAMS ((Sym *, bfd_vma, bfd_vma)); extern void tahoe_find_call PARAMS ((Sym *, bfd_vma, bfd_vma)); extern void sparc_find_call PARAMS ((Sym *, bfd_vma, bfd_vma)); + extern void mips_find_call PARAMS ((Sym *, bfd_vma, bfd_vma)); static void DEFUN (read_function_mappings, (filename), const char *filename) *************** *** 259,264 **** --- 260,269 ---- case bfd_arch_tahoe: tahoe_find_call (parent, p_lowpc, p_highpc); + break; + + case bfd_arch_mips: + mips_find_call (parent, p_lowpc, p_highpc); break; default: Index: mips.c =================================================================== RCS file: mips.c diff -N mips.c *** /dev/null Tue May 5 13:32:27 1998 --- mips.c Sun Jan 20 15:04:08 2002 *************** *** 0 **** --- 1,102 ---- + /* + * Copyright (c) 1983, 1998 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that: (1) source distributions retain this entire copyright + * notice and comment, and (2) distributions including binaries display + * the following acknowledgement: ``This product includes software + * developed by the University of California, Berkeley and its contributors'' + * in the documentation or other materials provided with the distribution + * and in all advertising materials mentioning features or use of this + * software. Neither the name of the University nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + #include "gprof.h" + #include "cg_arcs.h" + #include "corefile.h" + #include "hist.h" + #include "symtab.h" + + static Sym indirect_child; + + void mips_find_call PARAMS ((Sym *, bfd_vma, bfd_vma)); + + void + mips_find_call (parent, p_lowpc, p_highpc) + Sym *parent; + bfd_vma p_lowpc; + bfd_vma p_highpc; + { + bfd_vma pc, dest_pc; + unsigned int op; + int offset; + Sym *child; + static bool inited = FALSE; + + if (!inited) + { + inited = TRUE; + sym_init (&indirect_child); + indirect_child.name = _(""); + indirect_child.cg.prop.fract = 1.0; + indirect_child.cg.cyc.head = &indirect_child; + } + + if (!core_text_space) + { + return; + } + if (p_lowpc < s_lowpc) + { + p_lowpc = s_lowpc; + } + if (p_highpc > s_highpc) + { + p_highpc = s_highpc; + } + DBG (CALLDEBUG, printf (_("[find_call] %s: 0x%lx to 0x%lx\n"), + parent->name, (unsigned long) p_lowpc, + (unsigned long) p_highpc)); + for (pc = p_lowpc; pc < p_highpc; pc += 4) + { + op = bfd_get_32 (core_bfd, &((char *)core_text_space)[pc - s_lowpc]); + if ((op & 0xfc000000) == 0x0c000000) + { + /* This is a "jal" instruction. Check that the destination + is the address of a function. */ + DBG (CALLDEBUG, + printf (_("[find_call] 0x%lx: jal"), (unsigned long) pc)); + offset = (op & 0x03ffffff) << 2; + dest_pc = (pc & ~0xfffffff) | offset; + if (dest_pc >= s_lowpc && dest_pc <= s_highpc) + { + child = sym_lookup (&symtab, dest_pc); + DBG (CALLDEBUG, + printf (" 0x%lx\t; name=%s, addr=0x%lx", + (unsigned long) dest_pc, child->name, + (unsigned long) child->addr)); + if (child->addr == dest_pc) + { + DBG (CALLDEBUG, printf ("\n")); + /* a hit: */ + arc_add (parent, child, (unsigned long) 0); + continue; + } + } + /* Something funny going on. */ + DBG (CALLDEBUG, printf ("\tbut it's a botch\n")); + } + else if ((op & 0xfc00f83f) == 0x0000f809) + { + /* This is a "jalr" instruction (indirect call). */ + DBG (CALLDEBUG, + printf (_("[find_call] 0x%lx: jalr\n"), (unsigned long) pc)); + arc_add (parent, &indirect_child, (unsigned long) 0); + } + } + }