aboutsummaryrefslogtreecommitdiff
path: root/gdb/tm-rs6000.h
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/tm-rs6000.h')
-rw-r--r--gdb/tm-rs6000.h64
1 files changed, 48 insertions, 16 deletions
diff --git a/gdb/tm-rs6000.h b/gdb/tm-rs6000.h
index ce4f212..5465c6a 100644
--- a/gdb/tm-rs6000.h
+++ b/gdb/tm-rs6000.h
@@ -72,15 +72,27 @@ extern char *corefile;
/* We are missing register descriptions in the system header files. Sigh! */
struct regs {
- int gregs [32]; /* general purpose registers */
- int pc; /* program conter */
- int ps; /* processor status, or machine state */
+ int gregs [32]; /* general purpose registers */
+ int pc; /* program conter */
+ int ps; /* processor status, or machine state */
};
struct fp_status {
- double fpregs [32]; /* floating GP registers */
+ double fpregs [32]; /* floating GP registers */
};
+
+/* To be used by function_frame_info. */
+
+struct aix_framedata {
+ int offset; /* # of bytes in gpr's and fpr's are saved */
+ int saved_gpr; /* smallest # of saved gpr */
+ int saved_fpr; /* smallest # of saved fpr */
+ int alloca_reg; /* alloca register number (frame ptr) */
+ char frameless; /* true if frameless functions. */
+};
+
+
/* Define the byte order of the machine. */
#define TARGET_BYTE_ORDER BIG_ENDIAN
@@ -418,12 +430,25 @@ extern unsigned int rs6000_struct_return_address;
#define FRAMELESS_FUNCTION_INVOCATION(FI, FRAMELESS) \
FRAMELESS = frameless_function_invocation (FI)
+/* Functions calling alloca() change the value of the stack pointer. We
+ need to use initial stack pointer (which is saved in r31 by gcc) in
+ such cases. If a compiler emits traceback table, then we should use the
+ alloca register specified in traceback table. FIXME. */
+/* Also, it is a good idea to cache information about frame's saved registers
+ in the frame structure to speed things up. See tm-m88k.h. FIXME. */
+
+#define EXTRA_FRAME_INFO \
+ CORE_ADDR initial_sp; /* initial stack pointer. */ \
+ struct frame_saved_regs *cache_fsr; /* saved registers */
+
/* Frameless function invocation in IBM RS/6000 is half-done. It perfectly
sets up a new frame, e.g. a new frame (in fact stack) pointer, etc, but it
doesn't save the %pc. In the following, even though it is considered a
frameless invocation, we still need to walk one frame up. */
#define INIT_EXTRA_FRAME_INFO(fromleaf, fi) \
+ fi->initial_sp = 0; \
+ fi->cache_fsr = 0; \
if (fromleaf) { \
int tmp = 0; \
read_memory ((fi)->frame, &tmp, sizeof (int)); \
@@ -433,9 +458,13 @@ extern unsigned int rs6000_struct_return_address;
#define FRAME_SAVED_PC(FRAME) \
read_memory_integer (read_memory_integer ((FRAME)->frame, 4)+8, 4)
-#define FRAME_ARGS_ADDRESS(fi) ((fi)->frame)
+#define FRAME_ARGS_ADDRESS(FI) \
+ (((struct frame_info*)(FI))->initial_sp ? \
+ ((struct frame_info*)(FI))->initial_sp : \
+ frame_initial_stack_address (FI))
+
+#define FRAME_LOCALS_ADDRESS(FI) FRAME_ARGS_ADDRESS(FI)
-#define FRAME_LOCALS_ADDRESS(fi) ((fi)->frame)
/* Set VAL to the number of args passed to frame described by FI.
Can set VAL to -1, meaning no way to tell. */
@@ -460,39 +489,42 @@ extern unsigned int rs6000_struct_return_address;
#define FRAME_FIND_SAVED_REGS(FRAME_INFO, FRAME_SAVED_REGS) \
{ \
- int frameless, offset, saved_gpr, saved_fpr, ii, frame_addr, func_start; \
+ int ii, frame_addr, func_start; \
+ struct aix_framedata fdata; \
\
/* find the start of the function and collect info about its frame. */ \
\
func_start = get_pc_function_start ((FRAME_INFO)->pc) + FUNCTION_START_OFFSET;\
- function_frame_info (func_start, &frameless, &offset, &saved_gpr, &saved_fpr);\
+ function_frame_info (func_start, &fdata); \
bzero (&(FRAME_SAVED_REGS), sizeof (FRAME_SAVED_REGS)); \
\
/* if there were any saved registers, figure out parent's stack pointer. */ \
frame_addr = 0; \
- if (saved_fpr >= 0 || saved_gpr >= 0) { \
+ /* the following is true only if the frame doesn't have a call to alloca(), \
+ FIXME. */ \
+ if (fdata.saved_fpr >= 0 || fdata.saved_gpr >= 0) { \
if ((FRAME_INFO)->prev && (FRAME_INFO)->prev->frame) \
frame_addr = (FRAME_INFO)->prev->frame; \
else \
frame_addr = read_memory_integer ((FRAME_INFO)->frame, 4); \
} \
\
- /* if != -1, saved_fpr is the smallest number of saved_fpr. All fpr's \
+ /* if != -1, fdata.saved_fpr is the smallest number of saved_fpr. All fpr's \
from saved_fpr to fp31 are saved right underneath caller stack pointer, \
starting from fp31 first. */ \
\
- if (saved_fpr >= 0) { \
- for (ii=31; ii >= saved_fpr; --ii) \
+ if (fdata.saved_fpr >= 0) { \
+ for (ii=31; ii >= fdata.saved_fpr; --ii) \
(FRAME_SAVED_REGS).regs [FP0_REGNUM + ii] = frame_addr - ((32 - ii) * 8); \
- frame_addr -= (32 - saved_fpr) * 8; \
+ frame_addr -= (32 - fdata.saved_fpr) * 8; \
} \
\
- /* if != -1, saved_gpr is the smallest number of saved_gpr. All gpr's \
+ /* if != -1, fdata.saved_gpr is the smallest number of saved_gpr. All gpr's \
from saved_gpr to gpr31 are saved right under saved fprs, starting \
from r31 first. */ \
\
- if (saved_gpr >= 0) \
- for (ii=31; ii >= saved_gpr; --ii) \
+ if (fdata.saved_gpr >= 0) \
+ for (ii=31; ii >= fdata.saved_gpr; --ii) \
(FRAME_SAVED_REGS).regs [ii] = frame_addr - ((32 - ii) * 4); \
}