mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-21 01:12:32 +08:00
1d506c26d9
This commit is the result of the following actions: - Running gdb/copyright.py to update all of the copyright headers to include 2024, - Manually updating a few files the copyright.py script told me to update, these files had copyright headers embedded within the file, - Regenerating gdbsupport/Makefile.in to refresh it's copyright date, - Using grep to find other files that still mentioned 2023. If these files were updated last year from 2022 to 2023 then I've updated them this year to 2024. I'm sure I've probably missed some dates. Feel free to fix them up as you spot them.
157 lines
5.8 KiB
C
157 lines
5.8 KiB
C
/* General Cpu tools GENerated simulator support.
|
||
Copyright (C) 1996-2024 Free Software Foundation, Inc.
|
||
Contributed by Cygnus Support.
|
||
|
||
This file is part of 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 3 of the License, 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, see <http://www.gnu.org/licenses/>. */
|
||
|
||
#ifndef CGEN_DEFS_H
|
||
#define CGEN_DEFS_H
|
||
|
||
#include "cgen-types.h"
|
||
|
||
/* Compute number of longs required to hold N bits. */
|
||
#define HOST_LONGS_FOR_BITS(n) \
|
||
(((n) + sizeof (long) * 8 - 1) / sizeof (long) * 8)
|
||
|
||
/* Forward decls. Defined in the machine generated files. */
|
||
|
||
/* This holds the contents of the extracted insn.
|
||
There are a few common entries (e.g. pc address), and then one big
|
||
union with an entry for each of the instruction formats. */
|
||
typedef struct argbuf ARGBUF;
|
||
|
||
/* ARGBUF accessors. */
|
||
#define ARGBUF_ADDR(abuf) ((abuf)->addr)
|
||
#define ARGBUF_IDESC(abuf) ((abuf)->idesc)
|
||
#define ARGBUF_TRACE_P(abuf) ((abuf)->trace_p)
|
||
#define ARGBUF_PROFILE_P(abuf) ((abuf)->profile_p)
|
||
|
||
/* This is one ARGBUF plus whatever else is needed for WITH_SCACHE support.
|
||
At present there is nothing else, but it also provides a level of
|
||
abstraction. */
|
||
typedef struct scache SCACHE;
|
||
|
||
/* This is a union with one entry for each instruction format.
|
||
Each entry contains all of the non-constant inputs of the instruction
|
||
in the case of read-before-exec support, or all outputs of the instruction
|
||
in the case of write-after-exec support. */
|
||
typedef struct parexec PAREXEC;
|
||
|
||
/* An "Instruction DESCriptor".
|
||
This is the main handle on an instruction for the simulator. */
|
||
typedef struct idesc IDESC;
|
||
|
||
/* Engine support.
|
||
??? This is here because it's needed before eng.h (built by genmloop.sh)
|
||
which is needed before cgen-engine.h and cpu.h.
|
||
??? This depends on a cpu family specific type, IADDR, but no machine
|
||
generated headers will have been included yet. sim/common currently
|
||
requires the typedef of sim_cia in sim-main.h between the inclusion of
|
||
sim-basics.h and sim-base.h so this is no different. */
|
||
|
||
/* SEM_ARG is intended to hide whether or not the scache is in use from the
|
||
semantic routines. In reality for the with-extraction case it is always
|
||
an SCACHE * even when not using the SCACHE since there's no current win to
|
||
making it something else ("not using the SCACHE" is like having a cache
|
||
size of 1).
|
||
The without-extraction case still uses an ARGBUF:
|
||
- consistency with scache version
|
||
- still need to record which operands are written
|
||
This wouldn't be needed if modeling was done in the semantic routines
|
||
but this isn't as general as handling it outside of the semantic routines.
|
||
For example Shade allows calling user-supplied code before/after each
|
||
instruction and this is something that is being planned.
|
||
??? There is still some clumsiness in how much of ARGBUF to use. */
|
||
typedef SCACHE *SEM_ARG;
|
||
|
||
/* instruction address
|
||
??? This was intended to be a struct of two elements in the WITH_SCACHE_PBB
|
||
case. The first element is the IADDR, the second element is the SCACHE *.
|
||
Haven't found the time yet to make this work, but it seemed a nicer approach
|
||
than the current br_cache stuff. */
|
||
typedef IADDR PCADDR;
|
||
|
||
/* Current instruction address, used by common. */
|
||
typedef IADDR CIA;
|
||
|
||
/* Semantic routines' version of the PC. */
|
||
#if WITH_SCACHE_PBB
|
||
typedef SCACHE *SEM_PC;
|
||
#else
|
||
typedef IADDR SEM_PC;
|
||
#endif
|
||
|
||
/* Kinds of branches. */
|
||
typedef enum {
|
||
SEM_BRANCH_UNTAKEN,
|
||
/* Branch to an uncacheable address (e.g. j reg). */
|
||
SEM_BRANCH_UNCACHEABLE,
|
||
/* Branch to a cacheable (fixed) address. */
|
||
SEM_BRANCH_CACHEABLE
|
||
} SEM_BRANCH_TYPE;
|
||
|
||
/* Virtual insn support. */
|
||
|
||
/* Opcode table for virtual insns (only used by the simulator). */
|
||
extern const CGEN_INSN cgen_virtual_insn_table[];
|
||
|
||
/* -ve of indices of virtual insns in cgen_virtual_insn_table. */
|
||
typedef enum {
|
||
VIRTUAL_INSN_X_INVALID = 0,
|
||
VIRTUAL_INSN_X_BEFORE = -1, VIRTUAL_INSN_X_AFTER = -2,
|
||
VIRTUAL_INSN_X_BEGIN = -3,
|
||
VIRTUAL_INSN_X_CHAIN= -4, VIRTUAL_INSN_X_CTI_CHAIN = -5
|
||
} CGEN_INSN_VIRTUAL_TYPE;
|
||
|
||
/* Return non-zero if CGEN_INSN* INSN is a virtual insn. */
|
||
#define CGEN_INSN_VIRTUAL_P(insn) \
|
||
CGEN_INSN_ATTR_VALUE ((insn), CGEN_INSN_VIRTUAL)
|
||
|
||
/* GNU C's "computed goto" facility is used to speed things up where
|
||
possible. These macros provide a portable way to use them.
|
||
Nesting of these switch statements is done by providing an extra argument
|
||
that distinguishes them. `N' can be a number or symbol.
|
||
Variable `labels_##N' must be initialized with the labels of each case. */
|
||
|
||
#ifdef __GNUC__
|
||
#define SWITCH(N, X) goto *X;
|
||
#define CASE(N, X) case_##N##_##X
|
||
#define BREAK(N) goto end_switch_##N
|
||
#define DEFAULT(N) default_##N
|
||
#define ENDSWITCH(N) end_switch_##N:;
|
||
#else
|
||
#define SWITCH(N, X) switch (X)
|
||
#define CASE(N, X) case X /* FIXME: old sem-switch had (@arch@_,X) here */
|
||
#define BREAK(N) break
|
||
#define DEFAULT(N) default
|
||
#define ENDSWITCH(N)
|
||
#endif
|
||
|
||
/* Various utilities. */
|
||
|
||
/* Return the name of an insn. */
|
||
extern CPU_INSN_NAME_FN cgen_insn_name;
|
||
|
||
/* Return the maximum number of extra bytes required for a sim_cpu struct. */
|
||
/* ??? Ok, yes, this is less pretty than it should be. Give me a better
|
||
language [or suggest a better way]. */
|
||
extern int cgen_cpu_max_extra_bytes (SIM_DESC);
|
||
|
||
/* Target supplied routine to process an invalid instruction. */
|
||
extern SEM_PC sim_engine_invalid_insn (SIM_CPU *, IADDR, SEM_PC);
|
||
|
||
#endif /* CGEN_DEFS_H */
|