diff options
Diffstat (limited to 'contrib/binutils/opcodes/cgen-dis.c')
-rw-r--r-- | contrib/binutils/opcodes/cgen-dis.c | 176 |
1 files changed, 0 insertions, 176 deletions
diff --git a/contrib/binutils/opcodes/cgen-dis.c b/contrib/binutils/opcodes/cgen-dis.c deleted file mode 100644 index f7ee88fca8c7..000000000000 --- a/contrib/binutils/opcodes/cgen-dis.c +++ /dev/null @@ -1,176 +0,0 @@ -/* CGEN generic disassembler support code. - - Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc. - - This file is part of the GNU Binutils and GDB, the GNU debugger. - - 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, or (at your option) - any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - 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. */ - -#include "sysdep.h" -#include <stdio.h> -#include "ansidecl.h" -#include "libiberty.h" -#include "bfd.h" -#include "symcat.h" -#include "opcode/cgen.h" - -/* This is not published as part of the public interface so we don't - declare this in cgen.h. */ -extern CGEN_OPCODE_DATA * cgen_current_opcode_data; - -/* Disassembler instruction hash table. */ -static CGEN_INSN_LIST ** dis_hash_table; - -void -cgen_dis_init () -{ - if (dis_hash_table) - { - free (dis_hash_table); - dis_hash_table = NULL; - } -} - -/* Build the disassembler instruction hash table. */ - -static void -build_dis_hash_table () -{ - int bigend = cgen_current_endian == CGEN_ENDIAN_BIG; - unsigned int hash; - char buf [4]; - unsigned long value; - int count = cgen_insn_count (); - CGEN_OPCODE_DATA * data = cgen_current_opcode_data; - CGEN_INSN_TABLE * insn_table = data->insn_table; - unsigned int entry_size = insn_table->entry_size; - unsigned int hash_size = insn_table->dis_hash_table_size; - const CGEN_INSN * insn; - CGEN_INSN_LIST * insn_lists; - CGEN_INSN_LIST * new_insns; - - /* The space allocated for the hash table consists of two parts: - the hash table and the hash lists. */ - - dis_hash_table = (CGEN_INSN_LIST **) - xmalloc (hash_size * sizeof (CGEN_INSN_LIST *) - + count * sizeof (CGEN_INSN_LIST)); - memset (dis_hash_table, 0, - hash_size * sizeof (CGEN_INSN_LIST *) - + count * sizeof (CGEN_INSN_LIST)); - insn_lists = (CGEN_INSN_LIST *) (dis_hash_table + hash_size); - - /* Add compiled in insns. - The table is scanned backwards as later additions are inserted in - front of earlier ones and we want earlier ones to be prefered. - We stop at the first one as it is a reserved entry. - This is a bit tricky as the attribute member of CGEN_INSN is variable - among architectures. This code could be moved to cgen-asm.in, but - I prefer to keep it here for now. */ - - for (insn = (CGEN_INSN *) - ((char *) insn_table->init_entries - + entry_size * (insn_table->num_init_entries - 1)); - insn > insn_table->init_entries; - insn = (CGEN_INSN *) ((char *) insn - entry_size), ++ insn_lists) - { - /* We don't know whether the target uses the buffer or the base insn - to hash on, so set both up. */ - value = CGEN_INSN_VALUE (insn); - switch (CGEN_INSN_MASK_BITSIZE (insn)) - { - case 8: - buf[0] = value; - break; - case 16: - if (bigend) - bfd_putb16 ((bfd_vma) value, buf); - else - bfd_putl16 ((bfd_vma) value, buf); - break; - case 32: - if (bigend) - bfd_putb32 ((bfd_vma) value, buf); - else - bfd_putl32 ((bfd_vma) value, buf); - break; - default: - abort (); - } - - hash = insn_table->dis_hash (buf, value); - - insn_lists->next = dis_hash_table [hash]; - insn_lists->insn = insn; - - dis_hash_table [hash] = insn_lists; - } - - /* Add runtime added insns. - ??? Currently later added insns will be prefered over earlier ones. - Not sure this is a bug or not. */ - for (new_insns = insn_table->new_entries; - new_insns != NULL; - new_insns = new_insns->next, ++ insn_lists) - { - /* We don't know whether the target uses the buffer or the base insn - to hash on, so set both up. */ - value = CGEN_INSN_VALUE (new_insns->insn); - switch (CGEN_INSN_MASK_BITSIZE (new_insns->insn)) - { - case 8: - buf[0] = value; - break; - case 16: - if (bigend) - bfd_putb16 ((bfd_vma) value, buf); - else - bfd_putl16 ((bfd_vma) value, buf); - break; - case 32: - if (bigend) - bfd_putb32 ((bfd_vma) value, buf); - else - bfd_putl32 ((bfd_vma) value, buf); - break; - default: - abort (); - } - - hash = insn_table->dis_hash (buf, value); - - insn_lists->next = dis_hash_table [hash]; - insn_lists->insn = new_insns->insn; - - dis_hash_table [hash] = insn_lists; - } -} - -/* Return the first entry in the hash list for INSN. */ - -CGEN_INSN_LIST * -cgen_dis_lookup_insn (buf, value) - const char * buf; - unsigned long value; -{ - unsigned int hash; - - if (dis_hash_table == NULL) - build_dis_hash_table (); - - hash = cgen_current_opcode_data->insn_table->dis_hash (buf, value); - - return dis_hash_table [hash]; -} |