2013-05-07 09:09:29 +08:00
|
|
|
/* Target-dependent header for the Nios II architecture, for GDB.
|
2024-01-12 23:30:44 +08:00
|
|
|
Copyright (C) 2012-2024 Free Software Foundation, Inc.
|
2013-05-07 09:09:29 +08:00
|
|
|
Contributed by Mentor Graphics, Inc.
|
|
|
|
|
|
|
|
This file is part of GDB.
|
|
|
|
|
|
|
|
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 NIOS2_TDEP_H
|
|
|
|
#define NIOS2_TDEP_H
|
|
|
|
|
gdb: fix gdbarch_tdep ODR violation
I would like to be able to use non-trivial types in gdbarch_tdep types.
This is not possible at the moment (in theory), because of the one
definition rule.
To allow it, rename all gdbarch_tdep types to <arch>_gdbarch_tdep, and
make them inherit from a gdbarch_tdep base class. The inheritance is
necessary to be able to pass pointers to all these <arch>_gdbarch_tdep
objects to gdbarch_alloc, which takes a pointer to gdbarch_tdep.
These objects are never deleted through a base class pointer, so I
didn't include a virtual destructor. In the future, if gdbarch objects
deletable, I could imagine that the gdbarch_tdep objects could become
owned by the gdbarch objects, and then it would become useful to have a
virtual destructor (so that the gdbarch object can delete the owned
gdbarch_tdep object). But that's not necessary right now.
It turns out that RISC-V already has a gdbarch_tdep that is
non-default-constructible, so that provides a good motivation for this
change.
Most changes are fairly straightforward, mostly needing to add some
casts all over the place. There is however the xtensa architecture,
doing its own little weird thing to define its gdbarch_tdep. I did my
best to adapt it, but I can't test those changes.
Change-Id: Ic001903f91ddd106bd6ca09a79dabe8df2d69f3b
2021-11-16 00:29:39 +08:00
|
|
|
#include "gdbarch.h"
|
|
|
|
|
2015-08-04 02:39:52 +08:00
|
|
|
/* Nios II ISA specific encodings and macros. */
|
|
|
|
#include "opcode/nios2.h"
|
|
|
|
|
2013-05-07 09:09:29 +08:00
|
|
|
/* Registers. */
|
|
|
|
#define NIOS2_Z_REGNUM 0 /* Zero */
|
|
|
|
#define NIOS2_R2_REGNUM 2 /* used for return value */
|
|
|
|
#define NIOS2_R3_REGNUM 3 /* used for return value */
|
|
|
|
/* Used for hidden zero argument to store ptr to struct return value. */
|
|
|
|
#define NIOS2_R4_REGNUM 4
|
|
|
|
#define NIOS2_R7_REGNUM 7
|
|
|
|
#define NIOS2_GP_REGNUM 26 /* Global Pointer */
|
|
|
|
#define NIOS2_SP_REGNUM 27 /* Stack Pointer */
|
|
|
|
#define NIOS2_FP_REGNUM 28 /* Frame Pointer */
|
|
|
|
#define NIOS2_EA_REGNUM 29 /* Exception address */
|
|
|
|
#define NIOS2_BA_REGNUM 30 /* Breakpoint return address */
|
|
|
|
#define NIOS2_RA_REGNUM 31 /* Return address */
|
|
|
|
#define NIOS2_PC_REGNUM 32
|
|
|
|
|
|
|
|
/* Control registers. */
|
|
|
|
#define NIOS2_STATUS_REGNUM 33
|
|
|
|
#define NIOS2_ESTATUS_REGNUM 34
|
|
|
|
#define NIOS2_BSTATUS_REGNUM 35
|
|
|
|
#define NIOS2_IENABLE_REGNUM 36
|
|
|
|
#define NIOS2_IPENDING_REGNUM 37
|
|
|
|
#define NIOS2_CPUID_REGNUM 38
|
|
|
|
#define NIOS2_EXCEPTION_REGNUM 40
|
|
|
|
#define NIOS2_PTEADDR_REGNUM 41
|
|
|
|
#define NIOS2_TLBACC_REGNUM 42
|
|
|
|
#define NIOS2_TLBMISC_REGNUM 43
|
|
|
|
#define NIOS2_ECCINJ_REGNUM 44
|
|
|
|
#define NIOS2_BADADDR_REGNUM 45
|
|
|
|
#define NIOS2_CONFIG_REGNUM 46
|
|
|
|
#define NIOS2_MPUBASE_REGNUM 47
|
|
|
|
#define NIOS2_MPUACC_REGNUM 48
|
|
|
|
|
|
|
|
/* R4-R7 are used for argument passing. */
|
|
|
|
#define NIOS2_FIRST_ARGREG NIOS2_R4_REGNUM
|
|
|
|
#define NIOS2_LAST_ARGREG NIOS2_R7_REGNUM
|
|
|
|
|
|
|
|
/* Number of all registers. */
|
|
|
|
#define NIOS2_NUM_REGS 49
|
|
|
|
|
|
|
|
/* Size of an instruction, in bytes. */
|
|
|
|
#define NIOS2_OPCODE_SIZE 4
|
2015-08-04 02:39:52 +08:00
|
|
|
#define NIOS2_CDX_OPCODE_SIZE 2
|
2013-05-07 09:09:29 +08:00
|
|
|
|
|
|
|
/* Target-dependent structure in gdbarch. */
|
2022-07-25 19:07:11 +08:00
|
|
|
struct nios2_gdbarch_tdep : gdbarch_tdep_base
|
2013-05-07 09:09:29 +08:00
|
|
|
{
|
|
|
|
/* Assumes FRAME is stopped at a syscall (trap) instruction; returns
|
|
|
|
the expected next PC. */
|
gdb: pass frames as `const frame_info_ptr &`
We currently pass frames to function by value, as `frame_info_ptr`.
This is somewhat expensive:
- the size of `frame_info_ptr` is 64 bytes, which is a bit big to pass
by value
- the constructors and destructor link/unlink the object in the global
`frame_info_ptr::frame_list` list. This is an `intrusive_list`, so
it's not so bad: it's just assigning a few points, there's no memory
allocation as if it was `std::list`, but still it's useless to do
that over and over.
As suggested by Tom Tromey, change many function signatures to accept
`const frame_info_ptr &` instead of `frame_info_ptr`.
Some functions reassign their `frame_info_ptr` parameter, like:
void
the_func (frame_info_ptr frame)
{
for (; frame != nullptr; frame = get_prev_frame (frame))
{
...
}
}
I wondered what to do about them, do I leave them as-is or change them
(and need to introduce a separate local variable that can be
re-assigned). I opted for the later for consistency. It might not be
clear why some functions take `const frame_info_ptr &` while others take
`frame_info_ptr`. Also, if a function took a `frame_info_ptr` because
it did re-assign its parameter, I doubt that we would think to change it
to `const frame_info_ptr &` should the implementation change such that
it doesn't need to take `frame_info_ptr` anymore. It seems better to
have a simple rule and apply it everywhere.
Change-Id: I59d10addef687d157f82ccf4d54f5dde9a963fd0
Approved-By: Andrew Burgess <aburgess@redhat.com>
2024-02-20 02:07:47 +08:00
|
|
|
CORE_ADDR (*syscall_next_pc) (const frame_info_ptr &frame,
|
gdb: fix gdbarch_tdep ODR violation
I would like to be able to use non-trivial types in gdbarch_tdep types.
This is not possible at the moment (in theory), because of the one
definition rule.
To allow it, rename all gdbarch_tdep types to <arch>_gdbarch_tdep, and
make them inherit from a gdbarch_tdep base class. The inheritance is
necessary to be able to pass pointers to all these <arch>_gdbarch_tdep
objects to gdbarch_alloc, which takes a pointer to gdbarch_tdep.
These objects are never deleted through a base class pointer, so I
didn't include a virtual destructor. In the future, if gdbarch objects
deletable, I could imagine that the gdbarch_tdep objects could become
owned by the gdbarch objects, and then it would become useful to have a
virtual destructor (so that the gdbarch object can delete the owned
gdbarch_tdep object). But that's not necessary right now.
It turns out that RISC-V already has a gdbarch_tdep that is
non-default-constructible, so that provides a good motivation for this
change.
Most changes are fairly straightforward, mostly needing to add some
casts all over the place. There is however the xtensa architecture,
doing its own little weird thing to define its gdbarch_tdep. I did my
best to adapt it, but I can't test those changes.
Change-Id: Ic001903f91ddd106bd6ca09a79dabe8df2d69f3b
2021-11-16 00:29:39 +08:00
|
|
|
const struct nios2_opcode *op) = nullptr;
|
2013-05-07 09:09:29 +08:00
|
|
|
|
2019-03-29 00:29:22 +08:00
|
|
|
/* Returns true if PC points to a kernel helper function. */
|
gdb: fix gdbarch_tdep ODR violation
I would like to be able to use non-trivial types in gdbarch_tdep types.
This is not possible at the moment (in theory), because of the one
definition rule.
To allow it, rename all gdbarch_tdep types to <arch>_gdbarch_tdep, and
make them inherit from a gdbarch_tdep base class. The inheritance is
necessary to be able to pass pointers to all these <arch>_gdbarch_tdep
objects to gdbarch_alloc, which takes a pointer to gdbarch_tdep.
These objects are never deleted through a base class pointer, so I
didn't include a virtual destructor. In the future, if gdbarch objects
deletable, I could imagine that the gdbarch_tdep objects could become
owned by the gdbarch objects, and then it would become useful to have a
virtual destructor (so that the gdbarch object can delete the owned
gdbarch_tdep object). But that's not necessary right now.
It turns out that RISC-V already has a gdbarch_tdep that is
non-default-constructible, so that provides a good motivation for this
change.
Most changes are fairly straightforward, mostly needing to add some
casts all over the place. There is however the xtensa architecture,
doing its own little weird thing to define its gdbarch_tdep. I did my
best to adapt it, but I can't test those changes.
Change-Id: Ic001903f91ddd106bd6ca09a79dabe8df2d69f3b
2021-11-16 00:29:39 +08:00
|
|
|
bool (*is_kernel_helper) (CORE_ADDR pc) = nullptr;
|
2019-03-29 00:29:22 +08:00
|
|
|
|
2013-05-07 09:09:29 +08:00
|
|
|
/* Offset to PC value in jump buffer.
|
|
|
|
If this is negative, longjmp support will be disabled. */
|
gdb: fix gdbarch_tdep ODR violation
I would like to be able to use non-trivial types in gdbarch_tdep types.
This is not possible at the moment (in theory), because of the one
definition rule.
To allow it, rename all gdbarch_tdep types to <arch>_gdbarch_tdep, and
make them inherit from a gdbarch_tdep base class. The inheritance is
necessary to be able to pass pointers to all these <arch>_gdbarch_tdep
objects to gdbarch_alloc, which takes a pointer to gdbarch_tdep.
These objects are never deleted through a base class pointer, so I
didn't include a virtual destructor. In the future, if gdbarch objects
deletable, I could imagine that the gdbarch_tdep objects could become
owned by the gdbarch objects, and then it would become useful to have a
virtual destructor (so that the gdbarch object can delete the owned
gdbarch_tdep object). But that's not necessary right now.
It turns out that RISC-V already has a gdbarch_tdep that is
non-default-constructible, so that provides a good motivation for this
change.
Most changes are fairly straightforward, mostly needing to add some
casts all over the place. There is however the xtensa architecture,
doing its own little weird thing to define its gdbarch_tdep. I did my
best to adapt it, but I can't test those changes.
Change-Id: Ic001903f91ddd106bd6ca09a79dabe8df2d69f3b
2021-11-16 00:29:39 +08:00
|
|
|
int jb_pc = 0;
|
2013-05-07 09:09:29 +08:00
|
|
|
};
|
|
|
|
|
Constify target_desc declarations
This patch changes various global target_desc declarations to const, thereby
correcting a prominent source of ODR violations in PowerPC-related target code.
The majority of files/changes are mechanical const-ifications accomplished by
regenerating the C files in features/.
This also required manually updating mips-linux-tdep.h, s390-linux-tdep.h,
nios2-tdep.h, s390-tdep.h, arch/ppc-linux-tdesc.h, arch/ppc-linux-common.c,
and rs6000-tdep.c.
Patch tested against the sourceware trybot, and fully regression tested against
our (Red Hat's) internal test infrastructure on Rawhide aarch64, s390x, x86_64,
and powerpcle.
With this patch, I can finally enable LTO in our GDB package builds. [Tested
with a rawhide scratch build containing this patch.]
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=22395
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=24835
2022-09-09 23:44:50 +08:00
|
|
|
extern const struct target_desc *tdesc_nios2_linux;
|
|
|
|
extern const struct target_desc *tdesc_nios2;
|
2013-05-07 09:09:29 +08:00
|
|
|
|
|
|
|
#endif /* NIOS2_TDEP_H */
|