X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=opcodes%2For32-opc.c;h=df99d56163633916d94b06752510b00a96548eec;hb=2f81ff928644e457e4edbff1257e663845857f6b;hp=aa94c1365ce666fdbf8f08c8247857ab48642779;hpb=0af1713e7cd57b52f6c81f73aa58934132198880;p=deliverable%2Fbinutils-gdb.git diff --git a/opcodes/or32-opc.c b/opcodes/or32-opc.c index aa94c1365c..df99d56163 100644 --- a/opcodes/or32-opc.c +++ b/opcodes/or32-opc.c @@ -1,5 +1,6 @@ /* Table of opcodes for the OpenRISC 1000 ISA. - Copyright 2002, 2004, 2005, 2007, 2008 Free Software Foundation, Inc. + Copyright 2002, 2004, 2005, 2007, 2008, 2009, 2012 + Free Software Foundation, Inc. Contributed by Damjan Lampret (lampret@opencores.org). This file is part of the GNU opcodes library. @@ -19,18 +20,17 @@ Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ -/* We treat all letters the same in encode/decode routines so - we need to assign some characteristics to them like signess etc. */ +#include "sysdep.h" #include #include #include #include "safe-ctype.h" #include "ansidecl.h" -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif #include "opcode/or32.h" +/* We treat all letters the same in encode/decode routines so + we need to assign some characteristics to them like signess etc. */ + const struct or32_letter or32_letters[] = { { 'A', NUM_UNSIGNED }, @@ -345,7 +345,7 @@ const unsigned int or32_num_opcodes = ((sizeof(or32_opcodes)) / (sizeof(struct o /* Calculates instruction length in bytes. Always 4 for OR32. */ int -insn_len (int insn_index ATTRIBUTE_UNUSED) +insn_len (int i_index ATTRIBUTE_UNUSED) { return 4; } @@ -409,10 +409,10 @@ insn_index (char *insn) } const char * -insn_name (int index) +insn_name (int op_index) { - if (index >= 0 && index < (int) or32_num_opcodes) - return or32_opcodes[index].name; + if (op_index >= 0 && op_index < (int) or32_num_opcodes) + return or32_opcodes[op_index].name; else return "???"; } @@ -898,7 +898,7 @@ or32_extract (char param_ch, char *enc_initial, unsigned long insn) { unsigned long tmp = strtol (enc, NULL, 16); #if DEBUG - printf (" enc=%s, tmp=%x ", enc, tmp); + printf (" enc=%s, tmp=%lx ", enc, tmp); #endif if (param_ch == '0') tmp = 15 - tmp; @@ -918,7 +918,7 @@ or32_extract (char param_ch, char *enc_initial, unsigned long insn) opc_pos--; param_pos--; #if DEBUG - printf ("\n ret=%x opc_pos=%x, param_pos=%x\n", ret, opc_pos, param_pos); + printf ("\n ret=%lx opc_pos=%x, param_pos=%x\n", ret, opc_pos, param_pos); #endif if (ISLOWER (param_ch)) ret -= ((insn >> opc_pos) & 0x1) << param_pos; @@ -940,7 +940,7 @@ or32_extract (char param_ch, char *enc_initial, unsigned long insn) enc++; #if DEBUG - printf ("ret=%x\n", ret); + printf ("ret=%lx\n", ret); #endif return ret; } @@ -951,8 +951,10 @@ static void or32_print_register (char param_ch, char *encoding, unsigned long insn) { int regnum = or32_extract(param_ch, encoding, insn); - - sprintf (disassembled, "%sr%d", disassembled, regnum); + char s_regnum[20]; + + sprintf (s_regnum, "r%d", regnum); + strcat (disassembled, s_regnum); } /* Print immediate. Used only by print_insn. */ @@ -961,18 +963,20 @@ static void or32_print_immediate (char param_ch, char *encoding, unsigned long insn) { int imm = or32_extract (param_ch, encoding, insn); + char s_imm[20]; imm = extend_imm (imm, param_ch); - + if (letter_signed (param_ch)) { if (imm < 0) - sprintf (disassembled, "%s%d", disassembled, imm); + sprintf (s_imm, "%d", imm); else - sprintf (disassembled, "%s0x%x", disassembled, imm); + sprintf (s_imm, "0x%x", imm); } else - sprintf (disassembled, "%s%#x", disassembled, imm); + sprintf (s_imm, "%#x", imm); + strcat (disassembled, s_imm); } /* Disassemble one instruction from insn to disassemble. @@ -981,12 +985,12 @@ or32_print_immediate (char param_ch, char *encoding, unsigned long insn) int disassemble_insn (unsigned long insn) { - int index; - index = insn_decode (insn); + int op_index; + op_index = insn_decode (insn); - if (index >= 0) + if (op_index >= 0) { - struct or32_opcode const *opcode = &or32_opcodes[index]; + struct or32_opcode const *opcode = &or32_opcodes[op_index]; char *s; sprintf (disassembled, "%s ", opcode->name); @@ -1005,14 +1009,22 @@ disassemble_insn (unsigned long insn) if (strchr (opcode->encoding, *s)) or32_print_immediate (*s, opcode->encoding, insn); else - sprintf (disassembled, "%s%c", disassembled, *s); + { + char s_encoding[2] = { *s, '\0' }; + + strcat (disassembled, s_encoding); + } + } } } else { + char s_insn[20]; + /* This used to be %8x for binutils. */ - sprintf (disassembled, "%s.word 0x%08lx", disassembled, insn); + sprintf (s_insn, ".word 0x%08lx", insn); + strcat (disassembled, s_insn); } return insn_len (insn);