summaryrefslogtreecommitdiffstats
path: root/gcc
diff options
context:
space:
mode:
authorcharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>2007-06-06 10:50:46 +0000
committercharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>2007-06-06 10:50:46 +0000
commitb54cbc53aa994dc5984875ae17572bf681345b31 (patch)
treecf17ce1d24179926c078cbe0624f445ff19e1382 /gcc
parent982a5d65d917248bc0e05700769eaa745a4fbc1b (diff)
downloadppe42-gcc-b54cbc53aa994dc5984875ae17572bf681345b31.tar.gz
ppe42-gcc-b54cbc53aa994dc5984875ae17572bf681345b31.zip
2007-04-20 Eric Botcazou <ebotcazou@adacore.com>
* tracebak.c (FRAME_OFFSET): Add parameter FP. On SPARC/Solaris, do not add the stack bias if the offset is computed from a frame address. (__gnat_backtrace): Adjust for above change. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@125472 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ada/tracebak.c25
1 files changed, 13 insertions, 12 deletions
diff --git a/gcc/ada/tracebak.c b/gcc/ada/tracebak.c
index 03b32acb0ce..80d1a78f67c 100644
--- a/gcc/ada/tracebak.c
+++ b/gcc/ada/tracebak.c
@@ -34,6 +34,7 @@
functions.
It has been tested on the following configurations:
PowerPC/AiX
+ PowerPC/Darwin
PowerPC/VxWorks
SPARC/Solaris
i386/GNU/Linux
@@ -115,7 +116,7 @@ extern void (*Unlock_Task) (void);
we store in the tracebacks array. The latter allows us to loop over the
successive frames in the chain.
- To initiate the process, we retrieve an initial frame pointer using the
+ To initiate the process, we retrieve an initial frame address using the
appropriate GCC builtin (__builtin_frame_address).
This scheme is unfortunately not applicable on every target because the
@@ -125,8 +126,8 @@ extern void (*Unlock_Task) (void);
o struct layout, describing the expected stack data layout relevant to the
information we are interested in,
- o FRAME_OFFSET, the offset, from a given frame pointer, at which this
- layout will be found,
+ o FRAME_OFFSET, the offset, from a given frame address or frame pointer
+ value, at which this layout will be found,
o FRAME_LEVEL, controls how many frames up we get at to start with,
from the initial frame pointer we compute by way of the GCC builtin,
@@ -205,7 +206,7 @@ struct layout
void *return_address;
};
-#define FRAME_OFFSET 0
+#define FRAME_OFFSET(FP) 0
#define PC_ADJUST -4
#define STOP_FRAME(CURRENT, TOP_STACK) ((void *) (CURRENT) < (TOP_STACK))
@@ -237,7 +238,7 @@ struct layout
#define FRAME_LEVEL 1
/* See the PPC AIX case for an explanation of these values. */
-#define FRAME_OFFSET 0
+#define FRAME_OFFSET(FP) 0
#define PC_ADJUST -4
#define STOP_FRAME(CURRENT, TOP_STACK) ((CURRENT)->next == 0)
@@ -265,13 +266,13 @@ struct layout
#endif
#define FRAME_LEVEL 0
-#define FRAME_OFFSET (14 * sizeof (void*) + STACK_BIAS)
+#define FRAME_OFFSET(FP) (14 * sizeof (void*) + (FP ? STACK_BIAS : 0))
#define PC_ADJUST 0
#define STOP_FRAME(CURRENT, TOP_STACK) \
((CURRENT)->return_address == 0|| (CURRENT)->next == 0 \
|| (void *) (CURRENT) < (TOP_STACK))
-/* The sparc register windows need to be flushed before we may access them
+/* The SPARC register windows need to be flushed before we may access them
from the stack. This is achieved by way of builtin_frame_address only
when the "count" argument is positive, so force at least one such call. */
#define FETCH_UP_FRAME_ADDRESS
@@ -306,7 +307,7 @@ struct layout
return the soft stack pointer, which does not designate a location where a
backchain and a return address might be found. */
-#define FRAME_OFFSET 0
+#define FRAME_OFFSET(FP) 0
#define PC_ADJUST -2
#define STOP_FRAME(CURRENT, TOP_STACK) \
(IS_BAD_PTR((long)(CURRENT)->return_address) \
@@ -432,7 +433,7 @@ __gnat_backtrace (void **array,
forced_callee ();
/* Force a call to builtin_frame_address with a positive argument
- if required. This is necessary e.g. on sparc to have the register
+ if required. This is necessary e.g. on SPARC to have the register
windows flushed before we attempt to access them on the stack. */
#if defined (FETCH_UP_FRAME_ADDRESS) && (FRAME_LEVEL == 0)
__builtin_frame_address (1);
@@ -440,7 +441,7 @@ __gnat_backtrace (void **array,
top_frame = __builtin_frame_address (FRAME_LEVEL);
top_stack = CURRENT_STACK_FRAME;
- current = (struct layout *) ((size_t) top_frame + FRAME_OFFSET);
+ current = (struct layout *) ((size_t) top_frame + FRAME_OFFSET (0));
/* Skip the number of calls we have been requested to skip, accounting for
the BASE_SKIP parameter.
@@ -453,7 +454,7 @@ __gnat_backtrace (void **array,
while (cnt < skip_frames)
{
- current = (struct layout *) ((size_t) current->next + FRAME_OFFSET);
+ current = (struct layout *) ((size_t) current->next + FRAME_OFFSET (1));
cnt++;
}
@@ -468,7 +469,7 @@ __gnat_backtrace (void **array,
|| current->return_address > exclude_max)
array[cnt++] = current->return_address + PC_ADJUST;
- current = (struct layout *) ((size_t) current->next + FRAME_OFFSET);
+ current = (struct layout *) ((size_t) current->next + FRAME_OFFSET (1));
}
return cnt;
OpenPOWER on IntegriCloud