diff options
author | Graydon Hoare <graydon@redhat.com> | 2002-05-08 20:47:07 +0000 |
---|---|---|
committer | Graydon Hoare <graydon@redhat.com> | 2002-05-08 20:47:07 +0000 |
commit | 748f46d42a6d99e20427b5b7d4727cffd783cc71 (patch) | |
tree | 8e015ead61bc6e6eba6e3bc038658cd1834aa3bf /opcodes/cgen-dis.in | |
parent | 40af4b0c8bc36f24a8257e91b60b953d0d35d289 (diff) | |
download | binutils-748f46d42a6d99e20427b5b7d4727cffd783cc71.tar.gz binutils-748f46d42a6d99e20427b5b7d4727cffd783cc71.tar.bz2 binutils-748f46d42a6d99e20427b5b7d4727cffd783cc71.zip |
[ cgen/ChangeLog ]
2002-05-01 Graydon Hoare <graydon@redhat.com>
* desc-cpu.scm (@arch@_cgen_cpu_close): Fix memory leaks.
[ opcodes/ChangeLog ]
2002-05-07 Graydon Hoare <graydon@redhat.com>
* cgen-dis.in: (print_insn_@arch@): Cache list of opened CPUs rather
than just most-recently-opened.
Diffstat (limited to 'opcodes/cgen-dis.in')
-rw-r--r-- | opcodes/cgen-dis.in | 35 |
1 files changed, 32 insertions, 3 deletions
diff --git a/opcodes/cgen-dis.in b/opcodes/cgen-dis.in index c78723e2641..7c5934037df 100644 --- a/opcodes/cgen-dis.in +++ b/opcodes/cgen-dis.in @@ -351,11 +351,21 @@ default_print_insn (cd, pc, info) Print one instruction from PC on INFO->STREAM. Return the size of the instruction (in bytes). */ +typedef struct cpu_desc_list { + struct cpu_desc_list *next; + int isa; + int mach; + int endian; + CGEN_CPU_DESC cd; +} cpu_desc_list; + int print_insn_@arch@ (pc, info) bfd_vma pc; disassemble_info *info; { + static cpu_desc_list *cd_list = 0; + cpu_desc_list *cl = 0; static CGEN_CPU_DESC cd = 0; static int prev_isa; static int prev_mach; @@ -389,15 +399,24 @@ print_insn_@arch@ (pc, info) isa = info->insn_sets; #endif - /* If we've switched cpu's, close the current table and open a new one. */ + /* If we've switched cpu's, try to find a handle we've used before */ if (cd && (isa != prev_isa || mach != prev_mach || endian != prev_endian)) { - @arch@_cgen_cpu_close (cd); cd = 0; - } + for (cl = cd_list; cl; cl = cl->next) + { + if (cl->isa == isa && + cl->mach == mach && + cl->endian == endian) + { + cd = cl->cd; + break; + } + } + } /* If we haven't initialized yet, initialize the opcode table. */ if (! cd) @@ -418,6 +437,16 @@ print_insn_@arch@ (pc, info) CGEN_CPU_OPEN_END); if (!cd) abort (); + + /* save this away for future reference */ + cl = xmalloc (sizeof (struct cpu_desc_list)); + cl->cd = cd; + cl->isa = isa; + cl->mach = mach; + cl->endian = endian; + cl->next = cd_list; + cd_list = cl; + @arch@_cgen_init_dis (cd); } |