alpha.c 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. /*
  2. * Copyright (c) 1983, 1993, 1998
  3. * The Regents of the University of California. All rights reserved.
  4. *
  5. * Redistribution and use in source and binary forms, with or without
  6. * modification, are permitted provided that the following conditions
  7. * are met:
  8. * 1. Redistributions of source code must retain the above copyright
  9. * notice, this list of conditions and the following disclaimer.
  10. * 2. Redistributions in binary form must reproduce the above copyright
  11. * notice, this list of conditions and the following disclaimer in the
  12. * documentation and/or other materials provided with the distribution.
  13. * 3. Neither the name of the University nor the names of its contributors
  14. * may be used to endorse or promote products derived from this software
  15. * without specific prior written permission.
  16. *
  17. * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  18. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  19. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  20. * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  21. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  22. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  23. * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  24. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  25. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  26. * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  27. * SUCH DAMAGE.
  28. */
  29. #include "gprof.h"
  30. #include "search_list.h"
  31. #include "source.h"
  32. #include "symtab.h"
  33. #include "cg_arcs.h"
  34. #include "corefile.h"
  35. #include "hist.h"
  36. /*
  37. * Opcodes of the call instructions:
  38. */
  39. #define OP_Jxx 0x1aU
  40. #define OP_BSR 0x34U
  41. #define Jxx_FUNC_JMP 0U
  42. #define Jxx_FUNC_JSR 1U
  43. #define Jxx_FUNC_RET 2U
  44. #define Jxx_FUNC_JSR_COROUTINE 3U
  45. /* *INDENT-OFF* */
  46. /* Here to document only. We can't use this when cross compiling as
  47. the bitfield layout might not be the same as native.
  48. typedef union
  49. {
  50. struct
  51. {
  52. unsigned other:26;
  53. unsigned op_code:6;
  54. }
  55. a; -- any format
  56. struct
  57. {
  58. int disp:21;
  59. unsigned ra:5;
  60. unsigned op_code:6;
  61. }
  62. b; -- branch format
  63. struct
  64. {
  65. int hint:14;
  66. unsigned func:2;
  67. unsigned rb:5;
  68. unsigned ra:5;
  69. unsigned op_code:6;
  70. }
  71. j; -- jump format
  72. }
  73. alpha_Instruction;
  74. */
  75. /* *INDENT-ON* */
  76. static Sym indirect_child;
  77. void alpha_find_call (Sym *, bfd_vma, bfd_vma);
  78. /*
  79. * On the Alpha we can only detect PC relative calls, which are
  80. * usually generated for calls to functions within the same
  81. * object file only. This is still better than nothing, however.
  82. * (In particular it should be possible to find functions that
  83. * potentially call integer division routines, for example.)
  84. */
  85. void
  86. alpha_find_call (Sym *parent, bfd_vma p_lowpc, bfd_vma p_highpc)
  87. {
  88. bfd_vma pc, dest_pc;
  89. unsigned int insn;
  90. Sym *child;
  91. if (indirect_child.name == NULL)
  92. {
  93. sym_init (&indirect_child);
  94. indirect_child.name = _("<indirect child>");
  95. indirect_child.cg.prop.fract = 1.0;
  96. indirect_child.cg.cyc.head = &indirect_child;
  97. }
  98. DBG (CALLDEBUG, printf (_("[find_call] %s: 0x%lx to 0x%lx\n"),
  99. parent->name, (unsigned long) p_lowpc,
  100. (unsigned long) p_highpc));
  101. for (pc = (p_lowpc + 3) & ~(bfd_vma) 3; pc < p_highpc; pc += 4)
  102. {
  103. insn = bfd_get_32 (core_bfd, ((unsigned char *) core_text_space
  104. + pc - core_text_sect->vma));
  105. switch (insn & (0x3fU << 26))
  106. {
  107. case OP_Jxx << 26:
  108. /*
  109. * There is no simple and reliable way to determine the
  110. * target of a jsr (the hint bits help, but there aren't
  111. * enough bits to get a satisfactory hit rate). Instead,
  112. * for any indirect jump we simply add an arc from PARENT
  113. * to INDIRECT_CHILD---that way the user it at least able
  114. * to see that there are other calls as well.
  115. */
  116. if ((insn & (3 << 14)) == Jxx_FUNC_JSR << 14
  117. || (insn & (3 << 14)) == Jxx_FUNC_JSR_COROUTINE << 14)
  118. {
  119. DBG (CALLDEBUG,
  120. printf (_("[find_call] 0x%lx: jsr%s <indirect_child>\n"),
  121. (unsigned long) pc,
  122. ((insn & (3 << 14)) == Jxx_FUNC_JSR << 14
  123. ? "" : "_coroutine")));
  124. arc_add (parent, &indirect_child, (unsigned long) 0);
  125. }
  126. break;
  127. case OP_BSR << 26:
  128. DBG (CALLDEBUG,
  129. printf (_("[find_call] 0x%lx: bsr"), (unsigned long) pc));
  130. /*
  131. * Regular PC relative addressing. Check that this is the
  132. * address of a function. The linker sometimes redirects
  133. * the entry point by 8 bytes to skip loading the global
  134. * pointer, so we allow for either address:
  135. */
  136. dest_pc = pc + 4 + (((bfd_signed_vma) (insn & 0x1fffff)
  137. ^ 0x100000) - 0x100000);
  138. if (hist_check_address (dest_pc))
  139. {
  140. child = sym_lookup (&symtab, dest_pc);
  141. if (child)
  142. {
  143. DBG (CALLDEBUG,
  144. printf (" 0x%lx\t; name=%s, addr=0x%lx",
  145. (unsigned long) dest_pc, child->name,
  146. (unsigned long) child->addr));
  147. if (child->addr == dest_pc || child->addr == dest_pc - 8)
  148. {
  149. DBG (CALLDEBUG, printf ("\n"));
  150. /* a hit: */
  151. arc_add (parent, child, (unsigned long) 0);
  152. continue;
  153. }
  154. }
  155. }
  156. /*
  157. * Something funny going on.
  158. */
  159. DBG (CALLDEBUG, printf ("\tbut it's a botch\n"));
  160. break;
  161. default:
  162. break;
  163. }
  164. }
  165. }