diff options
author | charlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-06-16 08:21:46 +0000 |
---|---|---|
committer | charlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-06-16 08:21:46 +0000 |
commit | 5596b963691a36e388cd1a6ac2f2ec3b98f1cd45 (patch) | |
tree | ed2e629f0eec3c715bd1067b2330160070c0cfd0 | |
parent | 70b44d38dd0003b4cd7bc87bf4a79e1ab830dce5 (diff) | |
download | gcc-5596b963691a36e388cd1a6ac2f2ec3b98f1cd45.tar.gz |
2005-06-14 Olivier Hainque <hainque@adacore.com>
Eric Botcazou <ebotcazou@adacore.com>
* s-mastop-irix.adb (Pop_Frame): Revert shorcuts avoiding calls to
exc_unwind, now that we are generating proper .debug_frame output for
that target.
* tracebak.c: Remove the mips-irix section, as we are now using the
s-mastop based unwinder again.
Under SPARC/Solaris, take into account the stack bias to compute the
frame offset. The stack bias is 0 for the V8 ABI and 2047 for the V9
ABI.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@101012 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ada/s-mastop-irix.adb | 24 | ||||
-rw-r--r-- | gcc/ada/tracebak.c | 26 |
2 files changed, 24 insertions, 26 deletions
diff --git a/gcc/ada/s-mastop-irix.adb b/gcc/ada/s-mastop-irix.adb index c6d1d90c0c8..020cd1d3753 100644 --- a/gcc/ada/s-mastop-irix.adb +++ b/gcc/ada/s-mastop-irix.adb @@ -7,7 +7,7 @@ -- B o d y -- -- (Version for IRIX/MIPS) -- -- -- --- Copyright (C) 1999-2004 Free Software Foundation, Inc. -- +-- Copyright (C) 1999-2005 Free Software Foundation, Inc. -- -- -- -- GNAT is free software; you can redistribute it and/or modify it under -- -- terms of the GNU General Public License as published by the Free Soft- -- @@ -295,21 +295,7 @@ package body System.Machine_State_Operations is procedure Exc_Unwind (Scp : Sigcontext_Ptr; Fde : Long_Integer := 0); pragma Import (C, Exc_Unwind, "exc_unwind"); - -- ??? Calling exc_unwind in the current setup does not work and - -- triggers the emission of system warning messages. Why it does - -- not work remains to be investigated. Part of the problem is - -- probably a section naming issue (e.g. .eh_frame/.debug_frame). - - -- Instead of letting the call take place for nothing and emit - -- messages we don't expect, we just arrange things to pretend it - -- occurred and failed. - - -- ??? Until this is fixed, we shall document that the backtrace - -- computation facility does not work, and we inhibit the pragma below - -- because we arrange for the call not to be emitted and the linker - -- complains when a library is linked in but resolves nothing. - - -- pragma Linker_Options ("-lexc"); + pragma Linker_Options ("-lexc"); begin -- exc_unwind is apparently not thread-safe under IRIX, so protect it @@ -319,11 +305,7 @@ package body System.Machine_State_Operations is Lock_Task.all; - if False then - Exc_Unwind (Scp); - else - Scp.SC_PC := 0; - end if; + Exc_Unwind (Scp); Unlock_Task.all; diff --git a/gcc/ada/tracebak.c b/gcc/ada/tracebak.c index 773db24186a..ddeec9aee68 100644 --- a/gcc/ada/tracebak.c +++ b/gcc/ada/tracebak.c @@ -242,7 +242,7 @@ struct layout #define BASE_SKIP 1 -/*-------------------------- Sparc Solaris -----------------------------*/ +/*-------------------------- SPARC Solaris -----------------------------*/ #elif defined (sun) && defined (sparc) @@ -257,8 +257,14 @@ struct layout void *return_address; }; +#ifdef __arch64__ +#define STACK_BIAS 2047 /* V9 ABI */ +#else +#define STACK_BIAS 0 /* V8 ABI */ +#endif + #define FRAME_LEVEL 0 -#define FRAME_OFFSET (14 * (sizeof (void*))) +#define FRAME_OFFSET (14 * sizeof (void*) + STACK_BIAS) #define PC_ADJUST 0 #define STOP_FRAME(CURRENT, TOP_STACK) \ ((CURRENT)->return_address == 0|| (CURRENT)->next == 0 \ @@ -324,12 +330,22 @@ struct layout || ((*((ptr) - 1) & 0xff) == 0xff) \ || (((*(ptr) & 0xd0ff) == 0xd0ff)))) -/*------------------------------- mips-irix -------------------------------*/ +/*----------------------------- x86_64 ---------------------------------*/ -#elif defined (__mips) && defined (__sgi) +#elif defined (__x86_64__) #define USE_GCC_UNWINDER -#define PC_ADJUST -8 +/* The generic unwinder is not used for this target because it is based + on frame layout assumptions that are not reliable on this target (the + rbp register is very likely used for something else than storing the + frame pointer in optimized code). Hence, we use the GCC unwinder + based on DWARF 2 call frame information, although it has the drawback + of not being able to unwind through frames compiled without DWARF 2 + information. +*/ + +#define PC_ADJUST -2 +/* The minimum size of call instructions on this architecture is 2 bytes */ #endif |