1 /* trace.c --- tracing output for the M32C simulator.
3 Copyright (C) 2005, 2007, 2008, 2009, 2010, 2011
4 Free Software Foundation, Inc.
5 Contributed by Red Hat, Inc.
7 This file is part of the GNU simulators.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
27 #include <sys/types.h>
33 #include "m32c-desc.h"
40 sim_dis_read (bfd_vma memaddr
, bfd_byte
* ptr
, unsigned int length
,
41 struct disassemble_info
*info
)
43 mem_get_blk (memaddr
, ptr
, length
);
47 /* Filter out (in place) symbols that are useless for disassembly.
48 COUNT is the number of elements in SYMBOLS.
49 Return the number of useful symbols. */
52 remove_useless_symbols (asymbol
** symbols
, long count
)
54 register asymbol
**in_ptr
= symbols
, **out_ptr
= symbols
;
58 asymbol
*sym
= *in_ptr
++;
60 if (strstr (sym
->name
, "gcc2_compiled"))
62 if (sym
->name
== NULL
|| sym
->name
[0] == '\0')
64 if (sym
->flags
& (BSF_DEBUGGING
))
66 if (bfd_is_und_section (sym
->section
)
67 || bfd_is_com_section (sym
->section
))
72 return out_ptr
- symbols
;
76 compare_symbols (const PTR ap
, const PTR bp
)
78 const asymbol
*a
= *(const asymbol
**) ap
;
79 const asymbol
*b
= *(const asymbol
**) bp
;
81 if (bfd_asymbol_value (a
) > bfd_asymbol_value (b
))
83 else if (bfd_asymbol_value (a
) < bfd_asymbol_value (b
))
88 static char opbuf
[1000];
91 op_printf (char *buf
, char *fmt
, ...)
97 ret
= vsprintf (opbuf
+ strlen (opbuf
), fmt
, ap
);
102 static bfd
*current_bfd
;
105 sim_disasm_init (bfd
* prog
)
121 load_file_and_line (const char *filename
, int lineno
)
124 for (f
= files
; f
; f
= f
->next
)
125 if (strcmp (f
->filename
, filename
) == 0)
131 const char *found_filename
, *slash
;
133 found_filename
= filename
;
136 if (stat (found_filename
, &s
) == 0)
138 slash
= strchr (found_filename
, '/');
141 found_filename
= slash
+ 1;
144 f
= (Files
*) malloc (sizeof (Files
));
147 f
->filename
= strdup (filename
);
148 f
->data
= (char *) malloc (s
.st_size
+ 2);
149 FILE *file
= fopen (found_filename
, "rb");
150 fread (f
->data
, 1, s
.st_size
, file
);
151 f
->data
[s
.st_size
] = 0;
155 for (i
= 0; i
< s
.st_size
; i
++)
156 if (f
->data
[i
] == '\n')
158 f
->lines
= (char **) malloc (f
->nlines
* sizeof (char *));
159 f
->lines
[0] = f
->data
;
161 for (i
= 0; i
< s
.st_size
; i
++)
162 if (f
->data
[i
] == '\n')
164 f
->lines
[f
->nlines
] = f
->data
+ i
+ 1;
165 while (*f
->lines
[f
->nlines
] == ' '
166 || *f
->lines
[f
->nlines
] == '\t')
167 f
->lines
[f
->nlines
]++;
172 if (lineno
< 1 || lineno
> f
->nlines
)
174 return f
->lines
[lineno
- 1];
180 static int initted
= 0;
181 static asymbol
**symtab
= 0;
182 static int symcount
= 0;
183 static int last_sym
= -1;
184 static struct disassemble_info info
;
185 int storage
, sym
, bestaddr
;
187 static asection
*code_section
= 0;
188 static bfd_vma code_base
= 0;
190 int save_trace
= trace
;
192 static const char *prev_filename
= "";
193 static int prev_lineno
= 0;
194 const char *filename
;
195 const char *functionname
;
198 int mypc
= get_reg (pc
);
200 if (current_bfd
== 0)
208 memset (&info
, 0, sizeof (info
));
209 INIT_DISASSEMBLE_INFO (info
, stdout
, op_printf
);
210 info
.read_memory_func
= sim_dis_read
;
211 info
.arch
= bfd_get_arch (current_bfd
);
212 info
.mach
= bfd_get_mach (current_bfd
);
215 info
.arch
= bfd_arch_m32c
;
216 info
.mach
= default_machine
;
218 disassemble_init_for_target (&info
);
220 storage
= bfd_get_symtab_upper_bound (current_bfd
);
223 symtab
= (asymbol
**) malloc (storage
);
224 symcount
= bfd_canonicalize_symtab (current_bfd
, symtab
);
225 symcount
= remove_useless_symbols (symtab
, symcount
);
226 qsort (symtab
, symcount
, sizeof (asymbol
*), compare_symbols
);
228 for (s
= current_bfd
->sections
; s
; s
= s
->next
)
230 if (s
->flags
& SEC_CODE
|| code_section
== 0)
233 code_base
= bfd_section_lma (current_bfd
, s
);
239 filename
= functionname
= 0;
241 if (bfd_find_nearest_line
242 (current_bfd
, code_section
, symtab
, mypc
- code_base
, &filename
,
243 &functionname
, &lineno
))
245 if (filename
&& functionname
&& lineno
)
247 if (lineno
!= prev_lineno
|| strcmp (prev_filename
, filename
))
249 char *the_line
= load_file_and_line (filename
, lineno
);
250 const char *slash
= strrchr (filename
, '/');
256 ("========================================"
257 "=====================================\n");
258 printf ("\033[37;41m %s:%d: \033[33;40m %s\033[K\033[0m\n",
259 slash
, lineno
, the_line
);
261 prev_lineno
= lineno
;
262 prev_filename
= filename
;
269 while (min
< max
- 1)
272 sym
= (min
+ max
) / 2;
273 sa
= bfd_asymbol_value (symtab
[sym
]);
274 /*printf("checking %4d %08x %s\n",
275 sym, sa, bfd_asymbol_name (symtab[sym])); */
286 if (min
!= -1 && min
!= last_sym
)
288 bestaddr
= bfd_asymbol_value (symtab
[min
]);
289 printf ("\033[43;30m%s", bfd_asymbol_name (symtab
[min
]));
290 if (bestaddr
!= mypc
)
291 printf ("+%d", mypc
- bestaddr
);
292 printf (":\t\t\t\033[0m\n");
296 if (strcmp (bfd_asymbol_name (symtab
[min
]), "abort") == 0
297 || strcmp (bfd_asymbol_name (symtab
[min
]), "exit") == 0)
304 printf ("\033[33m%06x: ", mypc
);
305 max
= print_insn_m32c (mypc
, &info
);
306 for (i
= 0; i
< max
; i
++)
307 printf ("%02x", mem_get_qi (mypc
+ i
));
310 printf ("%-16s ", opbuf
);
312 printf ("\033[0m\n");
This page took 0.036462 seconds and 4 git commands to generate.