aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Kenner <kenner@gcc.gnu.org>1995-10-29 07:42:53 -0500
committerRichard Kenner <kenner@gcc.gnu.org>1995-10-29 07:42:53 -0500
commit139eda626f1994d1f1b0bac849db4e0836850990 (patch)
treead86752ef723885c5281f2800c78364a00b95e83 /gcc
parent2c3aa1ba73a602e91676d7c2c0a905e1e57576b3 (diff)
downloadgcc-139eda626f1994d1f1b0bac849db4e0836850990.zip
gcc-139eda626f1994d1f1b0bac849db4e0836850990.tar.gz
gcc-139eda626f1994d1f1b0bac849db4e0836850990.tar.bz2
(L_eh: __unwind_function): Implement for VAX.
From-SVN: r10539
Diffstat (limited to 'gcc')
-rw-r--r--gcc/libgcc2.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/gcc/libgcc2.c b/gcc/libgcc2.c
index d266a4a..4656597 100644
--- a/gcc/libgcc2.c
+++ b/gcc/libgcc2.c
@@ -2390,6 +2390,22 @@ __unwind_function(void *ptr)
asm("# br");
asm("mtctr 3;bctr # b 3");
}
+#elif #machine(vax)
+__unwind_function(void *ptr)
+{
+ __label__ return_again;
+
+ /* Replace our frame's return address with the label below.
+ During execution, we will first return here instead of to
+ caller, then second return takes caller's frame off the stack.
+ Two returns matches two actual calls, so is less likely to
+ confuse debuggers. `16' corresponds to RETURN_ADDRESS_OFFSET. */
+ __asm ("movl %0,16(fp)" : : "p" (&& return_again));
+ return;
+
+ return_again:
+ return;
+}
#else
__unwind_function(void *ptr)
{