aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2006-02-15 10:47:09 +0100
committerArnaud Charlet <charlet@gcc.gnu.org>2006-02-15 10:47:09 +0100
commit7dc56b36b8c9b8fde03ac0f1d8279105ebb58cfb (patch)
treecf23c9d5805ebfe482f50161f153e2125e246ffb
parent405b3ed444dd41d7818ab4da3da2f1ceb26ea4d4 (diff)
downloadgcc-7dc56b36b8c9b8fde03ac0f1d8279105ebb58cfb.zip
gcc-7dc56b36b8c9b8fde03ac0f1d8279105ebb58cfb.tar.gz
gcc-7dc56b36b8c9b8fde03ac0f1d8279105ebb58cfb.tar.bz2
tracebak.c (PPC AIX/Darwin): Define FORCE_CALL to 1.
2006-02-13 Eric Botcazou <ebotcazou@adacore.com> * tracebak.c (PPC AIX/Darwin): Define FORCE_CALL to 1. (PPC VxWorks): Likewise. (Generic unwinder): Define FORCE_CALL to 0 if not already defined. (forced_callee): Make non-inlinable and non-pure. (__gnat_backtrace): Call forced_callee if FORCE_CALL is set to 1. From-SVN: r111103
-rw-r--r--gcc/ada/tracebak.c31
1 files changed, 18 insertions, 13 deletions
diff --git a/gcc/ada/tracebak.c b/gcc/ada/tracebak.c
index db825d1..55fa44a 100644
--- a/gcc/ada/tracebak.c
+++ b/gcc/ada/tracebak.c
@@ -6,7 +6,7 @@
* *
* C Implementation File *
* *
- * Copyright (C) 2000-2005, AdaCore *
+ * Copyright (C) 2000-2006, AdaCore *
* *
* 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- *
@@ -193,7 +193,8 @@ extern void (*Unlock_Task) (void);
/*--------------------------- PPC AIX/Darwin ----------------------------*/
-#if (defined (__ppc__) && ((defined (_AIX) || defined (__APPLE__))))
+#if ((defined (_POWER) && defined (_AIX)) || \
+(defined (__ppc__) && defined (__APPLE__)))
#define USE_GENERIC_UNWINDER
@@ -215,7 +216,7 @@ struct layout
To have __gnat_backtrace retrieve its own return address, we then
define ... */
-#define FORCE_CALL
+#define FORCE_CALL 1
#define FRAME_LEVEL 1
#define BASE_SKIP 1
@@ -232,7 +233,7 @@ struct layout
void *return_address;
};
-#define FORCE_CALL
+#define FORCE_CALL 1
#define FRAME_LEVEL 1
/* See the PPC AIX case for an explanation of these values. */
@@ -404,13 +405,19 @@ struct layout
#define MAX(x,y) ((x) > (y) ? (x) : (y))
#endif
-/* Define a dummy function to call if FORCE_CALL is defined. Don't
- define it otherwise, as this could lead to "defined but not used"
- warnings. */
-#if defined (FORCE_CALL)
-static void forced_callee () {}
+#ifndef FORCE_CALL
+#define FORCE_CALL 0
#endif
+/* Make sure the function is not inlined. */
+static void forced_callee (void) __attribute__ ((noinline));
+
+static void forced_callee (void)
+{
+ /* Make sure the function is not pure. */
+ volatile int i __attribute__ ((unused)) = 0;
+}
+
int
__gnat_backtrace (void **array,
int size,
@@ -423,10 +430,8 @@ __gnat_backtrace (void **array,
void *top_stack;
int cnt = 0;
- /* Honor FORCE_CALL when defined. */
-#if defined (FORCE_CALL)
- forced_callee ();
-#endif
+ if (FORCE_CALL)
+ 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