X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=opcodes%2Fmetag-dis.c;h=b1cf6331b5dc583f76a2d821543911d54ddf2c26;hb=50d036364fb2a71b3ac9a0b0cdbe58296832a1b2;hp=1fdd43d0775bf11b89aaae07c760cf0efc308342;hpb=6f2750feaf2827ef8a1a0a5b2f90c1e9a6cabbd1;p=deliverable%2Fbinutils-gdb.git diff --git a/opcodes/metag-dis.c b/opcodes/metag-dis.c index 1fdd43d077..b1cf6331b5 100644 --- a/opcodes/metag-dis.c +++ b/opcodes/metag-dis.c @@ -1,5 +1,5 @@ /* Disassemble Imagination Technologies Meta instructions. - Copyright (C) 2013-2016 Free Software Foundation, Inc. + Copyright (C) 2013-2020 Free Software Foundation, Inc. Contributed by Imagination Technologies Ltd. This library is free software; you can redistribute it and/or modify @@ -18,7 +18,7 @@ MA 02110-1301, USA. */ #include "sysdep.h" -#include "dis-asm.h" +#include "disassemble.h" #include "opintl.h" #include @@ -1762,7 +1762,11 @@ print_fmmov (unsigned int insn_word, bfd_vma pc ATTRIBUTE_UNUSED, const insn_template *template, disassemble_info *outf) { - char buf[OPERAND_WIDTH]; + /* We used to have buf[OPERAND_WIDTH] here, but gcc v8 complains + about the snprintf()s below possibly truncating the output. + (There is no way to tell gcc that this truncation is intentional). + So now we use an extra wide buffer. */ + char buf[OPERAND_WIDTH * 2]; char data_buf[REG_WIDTH]; char fpu_buf[REG_WIDTH]; bfd_boolean to_fpu = MAJOR_OPCODE (insn_word) == OPC_GET; @@ -1783,9 +1787,9 @@ print_fmmov (unsigned int insn_word, bfd_vma pc ATTRIBUTE_UNUSED, convert_fx_rmask (rmask), is_mmovl); if (to_fpu) - snprintf (buf, OPERAND_WIDTH, "%s,%s", fpu_buf, data_buf); + snprintf (buf, sizeof buf, "%s,%s", fpu_buf, data_buf); else - snprintf (buf, OPERAND_WIDTH, "%s,%s", data_buf, fpu_buf); + snprintf (buf, sizeof buf, "%s,%s", data_buf, fpu_buf); print_insn (outf, "F", template->name, buf); } @@ -3360,9 +3364,15 @@ print_insn_metag (bfd_vma pc, disassemble_info *outf) bfd_byte buf[4]; unsigned int insn_word; size_t i; - outf->bytes_per_chunk = 4; + int status; - (*outf->read_memory_func) (pc & ~0x03, buf, 4, outf); + outf->bytes_per_chunk = 4; + status = (*outf->read_memory_func) (pc & ~0x03, buf, 4, outf); + if (status) + { + (*outf->memory_error_func) (status, pc, outf); + return -1; + } insn_word = bfd_getl32 (buf); for (i = 0; i < sizeof(metag_optab)/sizeof(metag_optab[0]); i++)