OSDN Git Service

2006-02-13 Eric Botcazou <ebotcazou@adacore.com>
authorcharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 15 Feb 2006 09:47:09 +0000 (09:47 +0000)
committercharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 15 Feb 2006 09:47:09 +0000 (09:47 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@111103 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ada/tracebak.c

index db825d1..55fa44a 100644 (file)
@@ -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