X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=opcodes%2Faarch64-gen.c;h=d2685dc3d1dea71afaec13adc0ae95d79295b27c;hb=cd3ea7c69acc5045eb28f9bf80d923116e15e4f5;hp=95bd0165f86888453b1c580eebc1c5bd906ac95f;hpb=a06ea96464a2928865beb2ac6f12deb0464bfcd7;p=deliverable%2Fbinutils-gdb.git diff --git a/opcodes/aarch64-gen.c b/opcodes/aarch64-gen.c index 95bd0165f8..d2685dc3d1 100644 --- a/opcodes/aarch64-gen.c +++ b/opcodes/aarch64-gen.c @@ -1,6 +1,6 @@ /* aarch64-gen.c -- Generate tables and routines for opcode lookup and instruction encoding and decoding. - Copyright 2012 Free Software Foundation, Inc. + Copyright (C) 2012-2017 Free Software Foundation, Inc. Contributed by ARM Ltd. This file is part of the GNU opcodes library. @@ -28,6 +28,7 @@ #include "getopt.h" #include "opcode/aarch64.h" +#define VERIFIER(x) NULL #include "aarch64-tbl.h" static int debug = 0; @@ -142,9 +143,9 @@ read_table (const struct aarch64_opcode* table) /* F_PSEUDO needs to be used together with F_ALIAS to indicate an alias opcode is a programmer friendly pseudo instruction available only in the assembly code (thus will not show up in the disassembly). */ - assert (pseudo_opcode_p (ent) == FALSE || alias_opcode_p (ent) == TRUE); + assert (!pseudo_opcode_p (ent) || alias_opcode_p (ent)); /* Skip alias (inc. pseudo) opcode. */ - if (alias_opcode_p (ent) == TRUE) + if (alias_opcode_p (ent)) { index++; continue; @@ -209,7 +210,7 @@ static int max_num_opcodes_at_leaf_node = 0; is decided to be undividable and OPCODE will be assigned to BITTREE->LIST. The function recursively call itself until OPCODE is undividable. - + N.B. the nature of this algrithm determines that given any value in the 32-bit space, the computed decision tree will always be able to find one or more opcodes entries for it, regardless whether there is a valid instruction @@ -377,13 +378,9 @@ initialize_decoder_tree (void) static void __attribute__ ((format (printf, 2, 3))) indented_print (unsigned int indent, const char *format, ...) { - /* 80 number of spaces pluc a NULL terminator. */ - static const char spaces[81] = - " "; va_list ap; va_start (ap, format); - assert (indent <= 80); - printf ("%s", &spaces[80 - indent]); + printf ("%*s", (int) indent, ""); vprintf (format, ap); va_end (ap); } @@ -690,22 +687,24 @@ opcode_node * find_alias_opcode (const aarch64_opcode *opcode) { int i; - /* Assume maximum of 8 disassemble preference candidates. */ - const int max_num_aliases = 8; + /* Assume maximum of 32 disassemble preference candidates. */ + const int max_num_aliases = 32; const aarch64_opcode *ent; - const aarch64_opcode *preferred[max_num_aliases]; + const aarch64_opcode *preferred[max_num_aliases + 1]; opcode_node head, **next; assert (opcode_has_alias (opcode)); i = 0; + if (opcode->name != NULL) + preferred[i++] = opcode; ent = aarch64_opcode_table; while (ent->name != NULL) { /* The mask of an alias opcode must be equal to or a super-set (i.e. more constrained) of that of the aliased opcode; so is the base opcode value. */ - if (alias_opcode_p (ent) == TRUE + if (alias_opcode_p (ent) && (ent->mask & opcode->mask) == opcode->mask && (opcode->mask & ent->opcode) == (opcode->mask & opcode->opcode)) { @@ -1242,7 +1241,7 @@ main (int argc, char **argv) print_divide_result (decoder_tree); printf ("/* This file is automatically generated by aarch64-gen. Do not edit! */\n"); - printf ("/* Copyright 2012 Free Software Foundation, Inc.\n\ + printf ("/* Copyright (C) 2012-2017 Free Software Foundation, Inc.\n\ Contributed by ARM Ltd.\n\ \n\ This file is part of the GNU opcodes library.\n\