summaryrefslogtreecommitdiff
path: root/gcc/ada/tracebak.c
diff options
context:
space:
mode:
authorcharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>2013-01-03 10:52:31 +0000
committercharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>2013-01-03 10:52:31 +0000
commit25d7574bcf57e89237f41bcf625de9328730ba44 (patch)
treef3c3d8d086af3965e2a9c9812342b73df457703d /gcc/ada/tracebak.c
parent810b80edadcd62eb060af49c9af98f371146780a (diff)
downloadgcc-25d7574bcf57e89237f41bcf625de9328730ba44.tar.gz
2013-01-03 Thomas Quinot <quinot@adacore.com>
* sem_ch7.adb, sem_ch10.adb, einfo.adb, einfo.ads, sem_ch12.adb, rtsfind.adb, sem_elab.adb, sem_ch4.adb, sem_ch8.adb (Einfo.Is_Visible_Child_Unit, Einfo.Set_Is_Visible_Child_Unit): Rename to Is_Visible_Lib_Unit, Set_Is_Visible_Lib_Unit, and update spec accordingly (now also applies to root library units). (Sem_Ch10.Analyze_Subunit.Analyze_Subunit_Context): Toggle above flag on root library units, not only child units. (Sem_Ch10.Install[_Limited]_Withed_Unit): Same. (Sem_Ch10.Remove_Unit_From_Visibility): Reset Is_Visible_Lib_Unit even for root library units. (Sem_Ch8.Find_Expanded_Name): A selected component form whose prefix is Standard is an expanded name for a root library unit. 2013-01-03 Thomas Quinot <quinot@adacore.com> * exp_ch3.adb: Minor reformatting. 2013-01-03 Olivier Hainque <hainque@adacore.com> * tracebak.c: Reinstate changes to support ppc-lynx178. 2013-01-03 Ed Schonberg <schonberg@adacore.com> * atree.ads: Minor reformatting and documentation enhancement. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@194845 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ada/tracebak.c')
-rw-r--r--gcc/ada/tracebak.c25
1 files changed, 22 insertions, 3 deletions
diff --git a/gcc/ada/tracebak.c b/gcc/ada/tracebak.c
index 2c8335de68b..123df59881d 100644
--- a/gcc/ada/tracebak.c
+++ b/gcc/ada/tracebak.c
@@ -35,6 +35,7 @@
PowerPC/AiX
PowerPC/Darwin
PowerPC/VxWorks
+ PowerPC/LynxOS-178
SPARC/Solaris
i386/GNU/Linux
i386/Solaris
@@ -287,9 +288,10 @@ __gnat_backtrace (void **array,
#error Unhandled darwin architecture.
#endif
-/*------------------------ PPC AIX/Older Darwin -------------------------*/
+/*---------------------- PPC AIX/PPC Lynx 178/Older Darwin ------------------*/
#elif ((defined (_POWER) && defined (_AIX)) || \
-(defined (__ppc__) && defined (__APPLE__)))
+ (defined (__powerpc__) && defined (__Lynx__) && !defined(__ELF__)) || \
+ (defined (__ppc__) && defined (__APPLE__)))
#define USE_GENERIC_UNWINDER
@@ -307,9 +309,26 @@ struct layout
should to feature a null backchain, AIX might expose a null return
address instead. */
+/* Then LynxOS-178 features yet another variation, with return_address
+ == &<entrypoint>, with two possible entry points (one for the main
+ process and one for threads). Beware that &bla returns the address
+ of a descriptor when "bla" is a function. Getting the code address
+ requires an extra dereference. */
+
+#if defined (__Lynx__)
+extern void __start(); /* process entry point. */
+extern void __runnit(); /* thread entry point. */
+#define EXTRA_STOP_CONDITION(CURRENT) \
+ ((CURRENT)->return_address == *(void**)&__start \
+ || (CURRENT)->return_address == *(void**)&__runnit)
+#else
+#define EXTRA_STOP_CONDITION(CURRENT) (0)
+#endif
+
#define STOP_FRAME(CURRENT, TOP_STACK) \
(((void *) (CURRENT) < (TOP_STACK)) \
- || (CURRENT)->return_address == NULL)
+ || (CURRENT)->return_address == NULL \
+ || EXTRA_STOP_CONDITION(CURRENT))
/* The PPC ABI has an interesting specificity: the return address saved by a
function is located in it's caller's frame, and the save operation only