
The arc fix in create_map avoiding signed overflow by casting an unsigned char to unsigned int before shifting, shows one of the dangers of blinding doing that. The problem in this case was that the variable storing the value, newAuxRegister->address, was a long. Using the unsigned cast meant that the 32-bit value was zero extended when long is 64 bits. Previously we had a sign extension. Net result was that comparisons in arcExtMap_auxRegName didn't match. Of course, I could have cast the 32-bit unsigned value back to signed before storing in a long, but it's neater to just use an unsigned int for the address. opcodes/ * alpha-opc.c (OP): Avoid signed overflow. * arm-dis.c (print_insn): Likewise. * mcore-dis.c (print_insn_mcore): Likewise. * pj-dis.c (get_int): Likewise. * ppc-opc.c (EBD15, EBD15BI): Likewise. * score7-dis.c (s7_print_insn): Likewise. * tic30-dis.c (print_insn_tic30): Likewise. * v850-opc.c (insert_SELID): Likewise. * vax-dis.c (print_insn_vax): Likewise. * arc-ext.c (create_map): Likewise. (struct ExtAuxRegister): Make "address" field unsigned int. (arcExtMap_auxRegName): Pass unsigned address. (dump_ARC_extmap): Adjust. * arc-ext.h (arcExtMap_auxRegName): Update prototype.
142 lines
3.9 KiB
C
142 lines
3.9 KiB
C
/* ARC target-dependent stuff. Extension data structures.
|
|
Copyright (C) 1995-2019 Free Software Foundation, Inc.
|
|
|
|
This file is part of libopcodes.
|
|
|
|
This library 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 3, or (at your option)
|
|
any later version.
|
|
|
|
It 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., 51 Franklin Street - Fifth Floor, Boston,
|
|
MA 02110-1301, USA. */
|
|
|
|
/*This header file defines a table of extensions to the ARC processor
|
|
architecture. These extensions are read from the '.arcextmap' or
|
|
'.gnu.linkonce.arcextmap.<type>.<N>' sections in the ELF file which
|
|
is identified by the bfd parameter to the build_ARC_extmap function.
|
|
|
|
These extensions may include:
|
|
core registers
|
|
auxiliary registers
|
|
instructions
|
|
condition codes
|
|
|
|
Once the table has been constructed, accessor functions may be used
|
|
to retrieve information from it.
|
|
|
|
The build_ARC_extmap constructor function build_ARC_extmap may be
|
|
called as many times as required; it will re-initialize the table
|
|
each time. */
|
|
|
|
#ifndef ARC_EXTENSIONS_H
|
|
#define ARC_EXTENSIONS_H
|
|
|
|
#include "opcode/arc.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#define IGNORE_FIRST_OPD 1
|
|
|
|
/* Define this if we do not want to encode instructions based on the
|
|
ARCompact Programmer's Reference. */
|
|
#define UNMANGLED
|
|
|
|
/* This defines the kinds of extensions which may be read from the
|
|
ections in the executable files. */
|
|
enum ExtOperType
|
|
{
|
|
EXT_INSTRUCTION = 0,
|
|
EXT_CORE_REGISTER = 1,
|
|
EXT_AUX_REGISTER = 2,
|
|
EXT_COND_CODE = 3,
|
|
EXT_INSTRUCTION32 = 4,
|
|
EXT_AC_INSTRUCTION = 4,
|
|
EXT_REMOVE_CORE_REG = 5,
|
|
EXT_LONG_CORE_REGISTER = 6,
|
|
EXT_AUX_REGISTER_EXTENDED = 7,
|
|
EXT_INSTRUCTION32_EXTENDED = 8,
|
|
EXT_CORE_REGISTER_CLASS = 9
|
|
};
|
|
|
|
enum ExtReadWrite
|
|
{
|
|
REG_INVALID,
|
|
REG_READ,
|
|
REG_WRITE,
|
|
REG_READWRITE
|
|
};
|
|
|
|
/* Macro used when generating the patterns for an extension
|
|
instruction. */
|
|
#define INSERT_XOP(OP, NAME, CODE, MASK, CPU, ARG, FLG) \
|
|
do { \
|
|
(OP)->name = NAME; \
|
|
(OP)->opcode = CODE; \
|
|
(OP)->mask = MASK; \
|
|
(OP)->cpu = CPU; \
|
|
(OP)->insn_class = ARITH; \
|
|
(OP)->subclass = NONE; \
|
|
memcpy ((OP)->operands, (ARG), MAX_INSN_ARGS); \
|
|
memcpy ((OP)->flags, (FLG), MAX_INSN_FLGS); \
|
|
(OP++); \
|
|
} while (0)
|
|
|
|
/* Typedef to hold the extension instruction definition. */
|
|
typedef struct ExtInstruction
|
|
{
|
|
/* Name. */
|
|
char *name;
|
|
|
|
/* Major opcode. */
|
|
char major;
|
|
|
|
/* Minor(sub) opcode. */
|
|
char minor;
|
|
|
|
/* Flags, holds the syntax class and modifiers. */
|
|
char flags;
|
|
|
|
/* Syntax class. Use by assembler. */
|
|
unsigned char syntax;
|
|
|
|
/* Syntax class modifier. Used by assembler. */
|
|
unsigned char modsyn;
|
|
|
|
/* Suffix class. Used by assembler. */
|
|
unsigned char suffix;
|
|
|
|
/* Pointer to the next extension instruction. */
|
|
struct ExtInstruction* next;
|
|
} extInstruction_t;
|
|
|
|
/* Constructor function. */
|
|
extern void build_ARC_extmap (bfd *);
|
|
|
|
/* Accessor functions. */
|
|
extern enum ExtReadWrite arcExtMap_coreReadWrite (int);
|
|
extern const char * arcExtMap_coreRegName (int);
|
|
extern const char * arcExtMap_auxRegName (unsigned);
|
|
extern const char * arcExtMap_condCodeName (int);
|
|
extern const extInstruction_t *arcExtMap_insn (int, unsigned long long);
|
|
extern struct arc_opcode *arcExtMap_genOpcode (const extInstruction_t *,
|
|
unsigned arc_target,
|
|
const char **errmsg);
|
|
|
|
/* Dump function (for debugging). */
|
|
extern void dump_ARC_extmap (void);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* ARC_EXTENSIONS_H */
|