sparc.c

来自「基于4个mips核的noc设计」· C语言 代码 · 共 92 行

C
92
字号
/* * Copyright (c) 1983 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"    /*     *        opcode of the `callf' instruction     */#define	CALL	(0xc0000000)voidsparc_find_call (parent, p_lowpc, p_highpc)     Sym *parent;     bfd_vma p_lowpc;     bfd_vma p_highpc;{  bfd_vma dest_pc, delta;  unsigned int *instr;  Sym *child;  delta = (bfd_vma) core_text_space - core_text_sect->vma;  if (core_text_space == 0)    {      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 (instr = (unsigned int *) (((p_lowpc + delta) + 3) &~ 3);       instr < (unsigned int *) (p_highpc + delta);       ++instr)    {      if ((*instr & CALL))	{	  DBG (CALLDEBUG,	       printf ("[find_call] 0x%lx: callf",		       (unsigned long) instr - delta));	  /*	   * Regular pc relative addressing check that this is the	   * address of a function.	   */	  dest_pc = ((bfd_vma) (instr + (*instr & ~CALL))) - delta;	  if (dest_pc >= s_lowpc && dest_pc <= s_highpc)	    {	      child = sym_lookup (&symtab, dest_pc);	      DBG (CALLDEBUG,		   printf ("\tdest_pc=0x%lx, (name=%s, addr=0x%lx)\n",			   (unsigned long) dest_pc, child->name,			   (unsigned long) child->addr));	      if (child->addr == dest_pc)		{		  /* a hit:  */		  arc_add (parent, child, (unsigned long) 0);		  continue;		}	    }	  /*	   * Something funny going on.	   */	  DBG (CALLDEBUG, printf ("\tbut it's a botch\n"));	}    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?