From 7dc56b36b8c9b8fde03ac0f1d8279105ebb58cfb Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Wed, 15 Feb 2006 10:47:09 +0100 Subject: tracebak.c (PPC AIX/Darwin): Define FORCE_CALL to 1. 2006-02-13 Eric Botcazou * 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 --- gcc/ada/tracebak.c | 31 ++++++++++++++++++------------- 1 file 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 -- cgit v1.1