X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gprof%2Fcall_graph.c;h=ed30050b3887ee7ab5efb95b3a15f2d00f959d12;hb=8b8c7c9f49992750f66f81b4601d593a3858d98c;hp=c1fd6437a8ef2ed27ef8218e5a8db0b64af1ee0e;hpb=37503931d0e0114248e20c27c117f326a6e48963;p=deliverable%2Fbinutils-gdb.git diff --git a/gprof/call_graph.c b/gprof/call_graph.c index c1fd6437a8..ed30050b38 100644 --- a/gprof/call_graph.c +++ b/gprof/call_graph.c @@ -1,12 +1,12 @@ /* call_graph.c - Create call graphs. - Copyright 2000 Free Software Foundation, Inc. + Copyright (C) 1999-2016 Free Software Foundation, Inc. This file is part of GNU Binutils. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -16,20 +16,22 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA + 02110-1301, USA. */ +#include "gprof.h" +#include "search_list.h" +#include "source.h" +#include "symtab.h" #include "cg_arcs.h" #include "call_graph.h" #include "corefile.h" #include "gmon_io.h" #include "gmon_out.h" -#include "symtab.h" #include "sym_ids.h" -extern void -DEFUN (cg_tally, (from_pc, self_pc, count), - bfd_vma from_pc AND bfd_vma self_pc AND unsigned long count) +void +cg_tally (bfd_vma from_pc, bfd_vma self_pc, unsigned long count) { Sym *parent; Sym *child; @@ -46,7 +48,7 @@ DEFUN (cg_tally, (from_pc, self_pc, count), line number in the calling routing, but the child should always point to a function entry point, so we back up in the symbol table until we find it. - + For normal profiling, is_func will be set on all symbols, so this code will do nothing. */ while (child >= symtab.base && ! child->is_func) @@ -75,25 +77,24 @@ DEFUN (cg_tally, (from_pc, self_pc, count), for formatting error-messages only. */ void -DEFUN (cg_read_rec, (ifp, filename), FILE * ifp AND CONST char *filename) +cg_read_rec (FILE *ifp, const char *filename) { bfd_vma from_pc, self_pc; - struct gmon_cg_arc_record arc; - unsigned long count; + unsigned int count; - if (fread (&arc, sizeof (arc), 1, ifp) != 1) + if (gmon_io_read_vma (ifp, &from_pc) + || gmon_io_read_vma (ifp, &self_pc) + || gmon_io_read_32 (ifp, &count)) { fprintf (stderr, _("%s: %s: unexpected end of file\n"), whoami, filename); done (1); } - - from_pc = get_vma (core_bfd, (bfd_byte *) arc.from_pc); - self_pc = get_vma (core_bfd, (bfd_byte *) arc.self_pc); - count = bfd_get_32 (core_bfd, (bfd_byte *) arc.count); + DBG (SAMPLEDEBUG, printf ("[cg_read_rec] frompc 0x%lx selfpc 0x%lx count %lu\n", - (unsigned long) from_pc, (unsigned long) self_pc, count)); + (unsigned long) from_pc, (unsigned long) self_pc, + (unsigned long) count)); /* Add this arc: */ cg_tally (from_pc, self_pc, count); } @@ -103,10 +104,8 @@ DEFUN (cg_read_rec, (ifp, filename), FILE * ifp AND CONST char *filename) only. */ void -DEFUN (cg_write_arcs, (ofp, filename), FILE * ofp AND const char *filename) +cg_write_arcs (FILE *ofp, const char *filename) { - const unsigned char tag = GMON_TAG_CG_ARC; - struct gmon_cg_arc_record raw_arc; Arc *arc; Sym *sym; @@ -114,11 +113,10 @@ DEFUN (cg_write_arcs, (ofp, filename), FILE * ofp AND const char *filename) { for (arc = sym->cg.children; arc; arc = arc->next_child) { - put_vma (core_bfd, arc->parent->addr, (bfd_byte *) raw_arc.from_pc); - put_vma (core_bfd, arc->child->addr, (bfd_byte *) raw_arc.self_pc); - bfd_put_32 (core_bfd, arc->count, (bfd_byte *) raw_arc.count); - if (fwrite (&tag, sizeof (tag), 1, ofp) != 1 - || fwrite (&raw_arc, sizeof (raw_arc), 1, ofp) != 1) + if (gmon_io_write_8 (ofp, GMON_TAG_CG_ARC) + || gmon_io_write_vma (ofp, arc->parent->addr) + || gmon_io_write_vma (ofp, arc->child->addr) + || gmon_io_write_32 (ofp, arc->count)) { perror (filename); done (1);