mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-08-06 14:49:38 +08:00
import gdb-1999-07-07 post reformat
This commit is contained in:
@ -1,21 +1,22 @@
|
||||
/* Target-dependent code for the Matsushita MN10200 for GDB, the GNU debugger.
|
||||
Copyright 1997 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GDB.
|
||||
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 2 of the License, or
|
||||
(at your option) any later version.
|
||||
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 2 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.
|
||||
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, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
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., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include "defs.h"
|
||||
#include "frame.h"
|
||||
@ -28,7 +29,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
#include "gdbcore.h"
|
||||
#include "symfile.h"
|
||||
|
||||
|
||||
|
||||
/* Should call_function allocate stack space for a struct return? */
|
||||
int
|
||||
mn10200_use_struct_convention (gcc_p, type)
|
||||
@ -37,8 +38,6 @@ mn10200_use_struct_convention (gcc_p, type)
|
||||
{
|
||||
return (TYPE_NFIELDS (type) > 1 || TYPE_LENGTH (type) > 8);
|
||||
}
|
||||
|
||||
|
||||
/* *INDENT-OFF* */
|
||||
/* The main purpose of this file is dealing with prologues to extract
|
||||
information about stack frames and saved registers.
|
||||
@ -104,15 +103,18 @@ mn10200_use_struct_convention (gcc_p, type)
|
||||
frame chain to not bother trying to unwind past this frame. */
|
||||
/* *INDENT-ON* */
|
||||
|
||||
|
||||
|
||||
|
||||
#define MY_FRAME_IN_SP 0x1
|
||||
#define MY_FRAME_IN_FP 0x2
|
||||
#define CALLER_A2_IN_A0 0x4
|
||||
#define NO_MORE_FRAMES 0x8
|
||||
|
||||
|
||||
static CORE_ADDR
|
||||
mn10200_analyze_prologue (fi, pc)
|
||||
struct frame_info *fi;
|
||||
CORE_ADDR pc;
|
||||
struct frame_info *fi;
|
||||
CORE_ADDR pc;
|
||||
{
|
||||
CORE_ADDR func_addr, func_end, addr, stop;
|
||||
CORE_ADDR stack_size;
|
||||
@ -137,7 +139,7 @@ mn10200_analyze_prologue (fi, pc)
|
||||
if (strcmp (name, "start") == 0)
|
||||
{
|
||||
if (fi)
|
||||
fi->status = NO_MORE_FRAMES;
|
||||
fi->status = NO_MORE_FRAMES;
|
||||
return pc;
|
||||
}
|
||||
|
||||
@ -204,14 +206,14 @@ mn10200_analyze_prologue (fi, pc)
|
||||
}
|
||||
|
||||
/* Now see if we have a frame pointer.
|
||||
|
||||
|
||||
Search for mov a2,a0 (0xf278)
|
||||
then mov a3,a2 (0xf27e). */
|
||||
then mov a3,a2 (0xf27e). */
|
||||
|
||||
if (buf[0] == 0xf2 && buf[1] == 0x78)
|
||||
{
|
||||
/* Our caller's $a2 will be found in $a0 now. Note it for
|
||||
our callers. */
|
||||
our callers. */
|
||||
if (fi)
|
||||
fi->status |= CALLER_A2_IN_A0;
|
||||
addr += 2;
|
||||
@ -253,11 +255,11 @@ mn10200_analyze_prologue (fi, pc)
|
||||
}
|
||||
|
||||
/* Next we should allocate the local frame.
|
||||
|
||||
|
||||
Search for add imm8,a3 (0xd3XX)
|
||||
or add imm16,a3 (0xf70bXXXX)
|
||||
or add imm24,a3 (0xf467XXXXXX).
|
||||
|
||||
or add imm16,a3 (0xf70bXXXX)
|
||||
or add imm24,a3 (0xf467XXXXXX).
|
||||
|
||||
If none of the above was found, then this prologue has
|
||||
no stack, and therefore can't have any register saves,
|
||||
so quit now. */
|
||||
@ -335,11 +337,11 @@ mn10200_analyze_prologue (fi, pc)
|
||||
status = target_read_memory (addr + 1, buf, 2);
|
||||
if (status != 0)
|
||||
{
|
||||
if (fi && fi->next == NULL && (fi->status & MY_FRAME_IN_SP))
|
||||
fi->frame = read_sp ();
|
||||
if (fi && fi->next == NULL && (fi->status & MY_FRAME_IN_SP))
|
||||
fi->frame = read_sp ();
|
||||
return addr;
|
||||
}
|
||||
|
||||
|
||||
/* Get the PC this instruction will branch to. */
|
||||
temp = (extract_signed_integer (buf, 2) + addr + 3) & 0xffffff;
|
||||
|
||||
@ -347,8 +349,8 @@ mn10200_analyze_prologue (fi, pc)
|
||||
status = find_pc_partial_function (temp, &name, NULL, NULL);
|
||||
if (status == 0)
|
||||
{
|
||||
if (fi && fi->next == NULL && (fi->status & MY_FRAME_IN_SP))
|
||||
fi->frame = read_sp ();
|
||||
if (fi && fi->next == NULL && (fi->status & MY_FRAME_IN_SP))
|
||||
fi->frame = read_sp ();
|
||||
return addr;
|
||||
}
|
||||
|
||||
@ -376,11 +378,11 @@ mn10200_analyze_prologue (fi, pc)
|
||||
status = target_read_memory (addr + 2, buf, 3);
|
||||
if (status != 0)
|
||||
{
|
||||
if (fi && fi->next == NULL && (fi->status & MY_FRAME_IN_SP))
|
||||
fi->frame = read_sp ();
|
||||
if (fi && fi->next == NULL && (fi->status & MY_FRAME_IN_SP))
|
||||
fi->frame = read_sp ();
|
||||
return addr;
|
||||
}
|
||||
|
||||
|
||||
/* Get the PC this instruction will branch to. */
|
||||
temp = (extract_signed_integer (buf, 3) + addr + 5) & 0xffffff;
|
||||
|
||||
@ -388,8 +390,8 @@ mn10200_analyze_prologue (fi, pc)
|
||||
status = find_pc_partial_function (temp, &name, NULL, NULL);
|
||||
if (status == 0)
|
||||
{
|
||||
if (fi && fi->next == NULL && (fi->status & MY_FRAME_IN_SP))
|
||||
fi->frame = read_sp ();
|
||||
if (fi && fi->next == NULL && (fi->status & MY_FRAME_IN_SP))
|
||||
fi->frame = read_sp ();
|
||||
return addr;
|
||||
}
|
||||
|
||||
@ -417,7 +419,7 @@ mn10200_analyze_prologue (fi, pc)
|
||||
int outgoing_args_size = 0;
|
||||
|
||||
/* First adjust the stack size for this function. The out of
|
||||
line prologue saves 4 registers (16bytes of data). */
|
||||
line prologue saves 4 registers (16bytes of data). */
|
||||
if (fi)
|
||||
fi->stack_size -= 16;
|
||||
|
||||
@ -426,12 +428,12 @@ mn10200_analyze_prologue (fi, pc)
|
||||
fi->frame = read_sp () - fi->stack_size;
|
||||
|
||||
/* After the out of line prologue, there may be another
|
||||
stack adjustment for the outgoing arguments.
|
||||
stack adjustment for the outgoing arguments.
|
||||
|
||||
Search for add imm8,a3 (0xd3XX)
|
||||
or add imm16,a3 (0xf70bXXXX)
|
||||
or add imm24,a3 (0xf467XXXXXX). */
|
||||
|
||||
Search for add imm8,a3 (0xd3XX)
|
||||
or add imm16,a3 (0xf70bXXXX)
|
||||
or add imm24,a3 (0xf467XXXXXX). */
|
||||
|
||||
status = target_read_memory (addr, buf, 2);
|
||||
if (status != 0)
|
||||
{
|
||||
@ -488,12 +490,12 @@ mn10200_analyze_prologue (fi, pc)
|
||||
outgoing_args_size = 0;
|
||||
|
||||
/* Now that we know the size of the outgoing arguments, fix
|
||||
fi->frame again if this is the innermost frame. */
|
||||
fi->frame again if this is the innermost frame. */
|
||||
if (fi && fi->next == NULL)
|
||||
fi->frame -= outgoing_args_size;
|
||||
|
||||
/* Note the register save information and update the stack
|
||||
size for this frame too. */
|
||||
size for this frame too. */
|
||||
if (fi)
|
||||
{
|
||||
fi->fsr.regs[2] = fi->frame + fi->stack_size + 4;
|
||||
@ -519,12 +521,12 @@ mn10200_analyze_prologue (fi, pc)
|
||||
and thus the number of different instructions we need to
|
||||
check is greatly reduced because we know the displacements
|
||||
will be small.
|
||||
|
||||
|
||||
Search for movx d2,(X,a3) (0xf55eXX)
|
||||
then movx d3,(X,a3) (0xf55fXX)
|
||||
then mov a1,(X,a3) (0x5dXX) No frame pointer case
|
||||
then mov a2,(X,a3) (0x5eXX) No frame pointer case
|
||||
or mov a0,(X,a3) (0x5cXX) Frame pointer case. */
|
||||
then movx d3,(X,a3) (0xf55fXX)
|
||||
then mov a1,(X,a3) (0x5dXX) No frame pointer case
|
||||
then mov a2,(X,a3) (0x5eXX) No frame pointer case
|
||||
or mov a0,(X,a3) (0x5cXX) Frame pointer case. */
|
||||
|
||||
status = target_read_memory (addr, buf, 2);
|
||||
if (status != 0)
|
||||
@ -598,7 +600,7 @@ mn10200_analyze_prologue (fi, pc)
|
||||
}
|
||||
return addr;
|
||||
}
|
||||
|
||||
|
||||
/* Function: frame_chain
|
||||
Figure out and return the caller's frame pointer given current
|
||||
frame_info struct.
|
||||
@ -615,7 +617,7 @@ mn10200_frame_chain (fi)
|
||||
/* Walk through the prologue to determine the stack size,
|
||||
location of saved registers, end of the prologue, etc. */
|
||||
if (fi->status == 0)
|
||||
mn10200_analyze_prologue (fi, (CORE_ADDR)0);
|
||||
mn10200_analyze_prologue (fi, (CORE_ADDR) 0);
|
||||
|
||||
/* Quit now if mn10200_analyze_prologue set NO_MORE_FRAMES. */
|
||||
if (fi->status & NO_MORE_FRAMES)
|
||||
@ -624,19 +626,19 @@ mn10200_frame_chain (fi)
|
||||
/* Now that we've analyzed our prologue, determine the frame
|
||||
pointer for our caller.
|
||||
|
||||
If our caller has a frame pointer, then we need to
|
||||
find the entry value of $a2 to our function.
|
||||
If our caller has a frame pointer, then we need to
|
||||
find the entry value of $a2 to our function.
|
||||
|
||||
If CALLER_A2_IN_A0, then the chain is in $a0.
|
||||
If CALLER_A2_IN_A0, then the chain is in $a0.
|
||||
|
||||
If fsr.regs[6] is nonzero, then it's at the memory
|
||||
location pointed to by fsr.regs[6].
|
||||
If fsr.regs[6] is nonzero, then it's at the memory
|
||||
location pointed to by fsr.regs[6].
|
||||
|
||||
Else it's still in $a2.
|
||||
Else it's still in $a2.
|
||||
|
||||
If our caller does not have a frame pointer, then his
|
||||
frame base is fi->frame + -caller's stack size + 4. */
|
||||
|
||||
If our caller does not have a frame pointer, then his
|
||||
frame base is fi->frame + -caller's stack size + 4. */
|
||||
|
||||
/* The easiest way to get that info is to analyze our caller's frame.
|
||||
|
||||
So we set up a dummy frame and call mn10200_analyze_prologue to
|
||||
@ -651,7 +653,7 @@ mn10200_frame_chain (fi)
|
||||
if (dummy_frame.status & MY_FRAME_IN_FP)
|
||||
{
|
||||
/* Our caller has a frame pointer. So find the frame in $a2, $a0,
|
||||
or in the stack. */
|
||||
or in the stack. */
|
||||
if (fi->fsr.regs[6])
|
||||
return (read_memory_integer (fi->fsr.regs[FP_REGNUM], REGISTER_SIZE)
|
||||
& 0xffffff);
|
||||
@ -663,7 +665,7 @@ mn10200_frame_chain (fi)
|
||||
else
|
||||
{
|
||||
/* Our caller does not have a frame pointer. So his frame starts
|
||||
at the base of our frame (fi->frame) + <his size> + 4 (saved pc). */
|
||||
at the base of our frame (fi->frame) + <his size> + 4 (saved pc). */
|
||||
return fi->frame + -dummy_frame.stack_size + 4;
|
||||
}
|
||||
}
|
||||
@ -690,7 +692,7 @@ mn10200_pop_frame (frame)
|
||||
{
|
||||
int regnum;
|
||||
|
||||
if (PC_IN_CALL_DUMMY(frame->pc, frame->frame, frame->frame))
|
||||
if (PC_IN_CALL_DUMMY (frame->pc, frame->frame, frame->frame))
|
||||
generic_pop_dummy_frame ();
|
||||
else
|
||||
{
|
||||
@ -703,7 +705,7 @@ mn10200_pop_frame (frame)
|
||||
ULONGEST value;
|
||||
|
||||
value = read_memory_unsigned_integer (frame->fsr.regs[regnum],
|
||||
REGISTER_RAW_SIZE (regnum));
|
||||
REGISTER_RAW_SIZE (regnum));
|
||||
write_register (regnum, value);
|
||||
}
|
||||
|
||||
@ -747,16 +749,16 @@ mn10200_push_arguments (nargs, args, sp, struct_return, struct_addr)
|
||||
int arg_length = (TYPE_LENGTH (VALUE_TYPE (args[argnum])) + 1) & ~1;
|
||||
|
||||
/* If we've used all argument registers, then this argument is
|
||||
pushed. */
|
||||
pushed. */
|
||||
if (regsused >= 2 || arg_length > 4)
|
||||
{
|
||||
regsused = 2;
|
||||
len += arg_length;
|
||||
}
|
||||
/* We know we've got some arg register space left. If this argument
|
||||
will fit entirely in regs, then put it there. */
|
||||
will fit entirely in regs, then put it there. */
|
||||
else if (arg_length <= 2
|
||||
|| TYPE_CODE (VALUE_TYPE (args[argnum])) == TYPE_CODE_PTR)
|
||||
|| TYPE_CODE (VALUE_TYPE (args[argnum])) == TYPE_CODE_PTR)
|
||||
{
|
||||
regsused++;
|
||||
}
|
||||
@ -786,13 +788,13 @@ mn10200_push_arguments (nargs, args, sp, struct_return, struct_addr)
|
||||
&& TYPE_LENGTH (VALUE_TYPE (*args)) > 8)
|
||||
{
|
||||
/* XXX Wrong, we want a pointer to this argument. */
|
||||
len = TYPE_LENGTH (VALUE_TYPE (*args));
|
||||
val = (char *)VALUE_CONTENTS (*args);
|
||||
len = TYPE_LENGTH (VALUE_TYPE (*args));
|
||||
val = (char *) VALUE_CONTENTS (*args);
|
||||
}
|
||||
else
|
||||
{
|
||||
len = TYPE_LENGTH (VALUE_TYPE (*args));
|
||||
val = (char *)VALUE_CONTENTS (*args);
|
||||
val = (char *) VALUE_CONTENTS (*args);
|
||||
}
|
||||
|
||||
if (regsused < 2
|
||||
@ -829,7 +831,7 @@ mn10200_push_arguments (nargs, args, sp, struct_return, struct_addr)
|
||||
/* Function: push_return_address (pc)
|
||||
Set up the return address for the inferior function call.
|
||||
Needed for targets where we don't actually execute a JSR/BSR instruction */
|
||||
|
||||
|
||||
CORE_ADDR
|
||||
mn10200_push_return_address (pc, sp)
|
||||
CORE_ADDR pc;
|
||||
@ -845,7 +847,7 @@ mn10200_push_return_address (pc, sp)
|
||||
/* Function: store_struct_return (addr,sp)
|
||||
Store the structure value return address for an inferior function
|
||||
call. */
|
||||
|
||||
|
||||
CORE_ADDR
|
||||
mn10200_store_struct_return (addr, sp)
|
||||
CORE_ADDR addr;
|
||||
@ -855,7 +857,7 @@ mn10200_store_struct_return (addr, sp)
|
||||
write_register (0, addr);
|
||||
return sp;
|
||||
}
|
||||
|
||||
|
||||
/* Function: frame_saved_pc
|
||||
Find the caller of this frame. We do this by seeing if RP_REGNUM
|
||||
is saved in the stack anywhere, otherwise we get it from the
|
||||
@ -904,4 +906,3 @@ _initialize_mn10200_tdep ()
|
||||
{
|
||||
tm_print_insn = print_insn_mn10200;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user