diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2006-02-15 10:47:09 +0100 |
---|---|---|
committer | Arnaud Charlet <charlet@gcc.gnu.org> | 2006-02-15 10:47:09 +0100 |
commit | 7dc56b36b8c9b8fde03ac0f1d8279105ebb58cfb (patch) | |
tree | cf23c9d5805ebfe482f50161f153e2125e246ffb /gcc/ada | |
parent | 405b3ed444dd41d7818ab4da3da2f1ceb26ea4d4 (diff) | |
download | gcc-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
Diffstat (limited to 'gcc/ada')
-rw-r--r-- | gcc/ada/tracebak.c | 31 |
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 |