summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ada/s-fatgen.adb28
-rw-r--r--gcc/ada/tracebak.c20
2 files changed, 31 insertions, 17 deletions
diff --git a/gcc/ada/s-fatgen.adb b/gcc/ada/s-fatgen.adb
index 50b5e63548c..ac0b0a5f559 100644
--- a/gcc/ada/s-fatgen.adb
+++ b/gcc/ada/s-fatgen.adb
@@ -81,7 +81,10 @@ package body System.Fat_Gen is
-----------------------
procedure Decompose (XX : T; Frac : out T; Expo : out UI);
- -- Decomposes a floating-point number into fraction and exponent parts
+ -- Decomposes a floating-point number into fraction and exponent parts.
+ -- Both results are signed, with Frac having the sign of XX, and UI has
+ -- the sign of the exponent. The absolute value of Frac is in the range
+ -- 0.0 <= Frac < 1.0. If Frac = 0.0 or -0.0, then Expo is always zero.
function Gradual_Scaling (Adjustment : UI) return T;
-- Like Scaling with a first argument of 1.0, but returns the smallest
@@ -131,7 +134,6 @@ package body System.Fat_Gen is
function Compose (Fraction : T; Exponent : UI) return T is
Arg_Frac : T;
Arg_Exp : UI;
-
begin
Decompose (Fraction, Arg_Frac, Arg_Exp);
return Scaling (Arg_Frac, Exponent);
@@ -306,7 +308,6 @@ package body System.Fat_Gen is
Y := 2.0 ** T'Machine_Emin;
Y1 := Y;
Ex := Ex - T'Machine_Emin;
-
while Ex < 0 loop
Y := T'Machine (Y / 2.0);
@@ -346,7 +347,6 @@ package body System.Fat_Gen is
Z := Scaling (Y, L);
return Z;
end if;
-
end Leading_Part;
-------------
@@ -361,7 +361,6 @@ package body System.Fat_Gen is
function Machine (X : T) return T is
Temp : T;
pragma Volatile (Temp);
-
begin
Temp := X;
return Temp;
@@ -406,10 +405,14 @@ package body System.Fat_Gen is
-- two, then we want to subtract half of what we would otherwise
-- subtract, since the exponent is going to be reduced.
- if X_Frac = 0.5 and then X > 0.0 then
+ -- Note that X_Frac has the same sign as X, so if X_Frac is 0.5,
+ -- then we know that we have a positive number (and hence a
+ -- positive power of 2).
+
+ if X_Frac = 0.5 then
return X - Gradual_Scaling (X_Exp - T'Machine_Mantissa - 1);
- -- Otherwise the exponent stays the same
+ -- Otherwise the exponent is unchanged
else
return X - Gradual_Scaling (X_Exp - T'Machine_Mantissa);
@@ -495,7 +498,6 @@ package body System.Fat_Gen is
end if;
return Sign_X * IEEE_Rem;
-
end Remainder;
--------------
@@ -525,7 +527,6 @@ package body System.Fat_Gen is
else
return X;
end if;
-
end Rounding;
-------------
@@ -590,6 +591,7 @@ package body System.Fat_Gen is
-- Ex = 0
end if;
+
return Y;
end;
end Scaling;
@@ -629,10 +631,14 @@ package body System.Fat_Gen is
-- two, then we want to add half of what we would otherwise add,
-- since the exponent is going to be reduced.
- if X_Frac = 0.5 and then X < 0.0 then
+ -- Note that X_Frac has the same sign as X, so if X_Frac is -0.5,
+ -- then we know that we have a ngeative number (and hence a
+ -- negative power of 2).
+
+ if X_Frac = -0.5 then
return X + Gradual_Scaling (X_Exp - T'Machine_Mantissa - 1);
- -- Otherwise the exponent stays the same
+ -- Otherwise the exponent is unchanged
else
return X + Gradual_Scaling (X_Exp - T'Machine_Mantissa);
diff --git a/gcc/ada/tracebak.c b/gcc/ada/tracebak.c
index 45b2df11bb8..83d51ccfd28 100644
--- a/gcc/ada/tracebak.c
+++ b/gcc/ada/tracebak.c
@@ -278,6 +278,13 @@ struct layout
#elif defined (i386)
+#ifdef __WIN32
+#include <windows.h>
+#define IS_BAD_PTR(ptr) (IsBadCodePtr((void *)ptr))
+#else
+#define IS_BAD_PTR(ptr) 0
+#endif
+
#define USE_GENERIC_UNWINDER
struct layout
@@ -291,7 +298,8 @@ struct layout
#define FRAME_OFFSET 0
#define PC_ADJUST -2
#define STOP_FRAME(CURRENT, TOP_STACK) \
- ((unsigned int)(CURRENT)->return_address < LOWEST_ADDR \
+ (IS_BAD_PTR((long)(CURRENT)->return_address) \
+ || (unsigned int)(CURRENT)->return_address < LOWEST_ADDR \
|| (CURRENT)->return_address == 0|| (CURRENT)->next == 0 \
|| (void *) (CURRENT) < (TOP_STACK))
@@ -310,10 +318,11 @@ struct layout
*/
#define VALID_STACK_FRAME(ptr) \
- (((*((ptr) - 3) & 0xff) == 0xe8) \
- || ((*((ptr) - 5) & 0xff) == 0x9a) \
- || ((*((ptr) - 1) & 0xff) == 0xff) \
- || (((*(ptr) & 0xd0ff) == 0xd0ff)))
+ (!IS_BAD_PTR(ptr) \
+ && (((*((ptr) - 3) & 0xff) == 0xe8) \
+ || ((*((ptr) - 5) & 0xff) == 0x9a) \
+ || ((*((ptr) - 1) & 0xff) == 0xff) \
+ || (((*(ptr) & 0xd0ff) == 0xd0ff))))
/*------------------------------- mips-irix -------------------------------*/
@@ -324,7 +333,6 @@ struct layout
#endif
-
/*---------------------------------------------------------------------*
*-- The post GCC 3.3 infrastructure based implementation --*
*---------------------------------------------------------------------*/