1 /* More subroutines needed by GCC output code on some machines. */
2 /* Compile this one with gcc. */
3 /* Copyright (C) 1989, 92-97, 1998 Free Software Foundation, Inc.
5 This file is part of GNU CC.
7 GNU CC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
12 GNU CC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GNU CC; see the file COPYING. If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
22 /* As a special exception, if you link this library with other files,
23 some of which are compiled with GCC, to produce an executable,
24 this library does not by itself cause the resulting executable
25 to be covered by the GNU General Public License.
26 This exception does not however invalidate any other reasons why
27 the executable file might be covered by the GNU General Public License. */
29 /* It is incorrect to include config.h here, because this file is being
30 compiled for the target, and hence definitions concerning only the host
40 /* Don't use `fancy_abort' here even if config.h says to use it. */
45 #if (SUPPORTS_WEAK == 1) && (defined (ASM_OUTPUT_DEF) || defined (ASM_OUTPUT_WEAK_ALIAS))
49 /* In a cross-compilation situation, default to inhibiting compilation
50 of routines that use libc. */
52 #if defined(CROSS_COMPILE) && !defined(inhibit_libc)
56 /* Permit the tm.h file to select the endianness to use just for this
57 file. This is used when the endianness is determined when the
60 #ifndef LIBGCC2_WORDS_BIG_ENDIAN
61 #define LIBGCC2_WORDS_BIG_ENDIAN WORDS_BIG_ENDIAN
64 /* In the first part of this file, we are interfacing to calls generated
65 by the compiler itself. These calls pass values into these routines
66 which have very specific modes (rather than very specific types), and
67 these compiler-generated calls also expect any return values to have
68 very specific modes (rather than very specific types). Thus, we need
69 to avoid using regular C language type names in this part of the file
70 because the sizes for those types can be configured to be anything.
71 Instead we use the following special type names. */
73 typedef unsigned int UQItype __attribute__ ((mode (QI)));
74 typedef int SItype __attribute__ ((mode (SI)));
75 typedef unsigned int USItype __attribute__ ((mode (SI)));
76 typedef int DItype __attribute__ ((mode (DI)));
77 typedef unsigned int UDItype __attribute__ ((mode (DI)));
79 typedef float SFtype __attribute__ ((mode (SF)));
80 typedef float DFtype __attribute__ ((mode (DF)));
82 #if LONG_DOUBLE_TYPE_SIZE == 96
83 typedef float XFtype __attribute__ ((mode (XF)));
85 #if LONG_DOUBLE_TYPE_SIZE == 128
86 typedef float TFtype __attribute__ ((mode (TF)));
89 typedef int word_type __attribute__ ((mode (__word__)));
91 /* Make sure that we don't accidentally use any normal C language built-in
92 type names in the first part of this file. Instead we want to use *only*
93 the type names defined above. The following macro definitions insure
94 that if we *do* accidentally use some normal C language built-in type name,
95 we will get a syntax error. */
97 #define char bogus_type
98 #define short bogus_type
99 #define int bogus_type
100 #define long bogus_type
101 #define unsigned bogus_type
102 #define float bogus_type
103 #define double bogus_type
105 #define SI_TYPE_SIZE (sizeof (SItype) * BITS_PER_UNIT)
107 /* DIstructs are pairs of SItype values in the order determined by
108 LIBGCC2_WORDS_BIG_ENDIAN. */
110 #if LIBGCC2_WORDS_BIG_ENDIAN
111 struct DIstruct {SItype high, low;};
113 struct DIstruct {SItype low, high;};
116 /* We need this union to unpack/pack DImode values, since we don't have
117 any arithmetic yet. Incoming DImode parameters are stored into the
118 `ll' field, and the unpacked result is read from the struct `s'. */
126 #if (defined (L_udivmoddi4) || defined (L_muldi3) || defined (L_udiv_w_sdiv)\
127 || defined (L_divdi3) || defined (L_udivdi3) \
128 || defined (L_moddi3) || defined (L_umoddi3))
130 #include "longlong.h"
132 #endif /* udiv or mul */
134 extern DItype __fixunssfdi (SFtype a);
135 extern DItype __fixunsdfdi (DFtype a);
136 #if LONG_DOUBLE_TYPE_SIZE == 96
137 extern DItype __fixunsxfdi (XFtype a);
139 #if LONG_DOUBLE_TYPE_SIZE == 128
140 extern DItype __fixunstfdi (TFtype a);
143 #if defined (L_negdi2) || defined (L_divdi3) || defined (L_moddi3)
144 #if defined (L_divdi3) || defined (L_moddi3)
156 w.s.high = -uu.s.high - ((USItype) w.s.low > 0);
162 /* Unless shift functions are defined whith full ANSI prototypes,
163 parameter b will be promoted to int if word_type is smaller than an int. */
166 __lshrdi3 (DItype u, word_type b)
177 bm = (sizeof (SItype) * BITS_PER_UNIT) - b;
181 w.s.low = (USItype)uu.s.high >> -bm;
185 USItype carries = (USItype)uu.s.high << bm;
186 w.s.high = (USItype)uu.s.high >> b;
187 w.s.low = ((USItype)uu.s.low >> b) | carries;
196 __ashldi3 (DItype u, word_type b)
207 bm = (sizeof (SItype) * BITS_PER_UNIT) - b;
211 w.s.high = (USItype)uu.s.low << -bm;
215 USItype carries = (USItype)uu.s.low >> bm;
216 w.s.low = (USItype)uu.s.low << b;
217 w.s.high = ((USItype)uu.s.high << b) | carries;
226 __ashrdi3 (DItype u, word_type b)
237 bm = (sizeof (SItype) * BITS_PER_UNIT) - b;
240 /* w.s.high = 1..1 or 0..0 */
241 w.s.high = uu.s.high >> (sizeof (SItype) * BITS_PER_UNIT - 1);
242 w.s.low = uu.s.high >> -bm;
246 USItype carries = (USItype)uu.s.high << bm;
247 w.s.high = uu.s.high >> b;
248 w.s.low = ((USItype)uu.s.low >> b) | carries;
262 w.s.low = ffs (uu.s.low);
265 w.s.low = ffs (uu.s.high);
268 w.s.low += BITS_PER_UNIT * sizeof (SItype);
277 __muldi3 (DItype u, DItype v)
285 w.ll = __umulsidi3 (uu.s.low, vv.s.low);
286 w.s.high += ((USItype) uu.s.low * (USItype) vv.s.high
287 + (USItype) uu.s.high * (USItype) vv.s.low);
294 #if defined (sdiv_qrnnd)
296 __udiv_w_sdiv (USItype *rp, USItype a1, USItype a0, USItype d)
303 if (a1 < d - a1 - (a0 >> (SI_TYPE_SIZE - 1)))
305 /* dividend, divisor, and quotient are nonnegative */
306 sdiv_qrnnd (q, r, a1, a0, d);
310 /* Compute c1*2^32 + c0 = a1*2^32 + a0 - 2^31*d */
311 sub_ddmmss (c1, c0, a1, a0, d >> 1, d << (SI_TYPE_SIZE - 1));
312 /* Divide (c1*2^32 + c0) by d */
313 sdiv_qrnnd (q, r, c1, c0, d);
314 /* Add 2^31 to quotient */
315 q += (USItype) 1 << (SI_TYPE_SIZE - 1);
320 b1 = d >> 1; /* d/2, between 2^30 and 2^31 - 1 */
321 c1 = a1 >> 1; /* A/2 */
322 c0 = (a1 << (SI_TYPE_SIZE - 1)) + (a0 >> 1);
324 if (a1 < b1) /* A < 2^32*b1, so A/2 < 2^31*b1 */
326 sdiv_qrnnd (q, r, c1, c0, b1); /* (A/2) / (d/2) */
328 r = 2*r + (a0 & 1); /* Remainder from A/(2*b1) */
345 else if (c1 < b1) /* So 2^31 <= (A/2)/b1 < 2^32 */
348 c0 = ~c0; /* logical NOT */
350 sdiv_qrnnd (q, r, c1, c0, b1); /* (A/2) / (d/2) */
352 q = ~q; /* (A/2)/b1 */
355 r = 2*r + (a0 & 1); /* A/(2*b1) */
373 else /* Implies c1 = b1 */
374 { /* Hence a1 = d - 1 = 2*b1 - 1 */
392 /* If sdiv_qrnnd doesn't exist, define dummy __udiv_w_sdiv. */
394 __udiv_w_sdiv (USItype *rp, USItype a1, USItype a0, USItype d)
399 #if (defined (L_udivdi3) || defined (L_divdi3) || \
400 defined (L_umoddi3) || defined (L_moddi3))
405 static const UQItype __clz_tab[] =
407 0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
408 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
409 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
410 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
411 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
412 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
413 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
414 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
417 #if (defined (L_udivdi3) || defined (L_divdi3) || \
418 defined (L_umoddi3) || defined (L_moddi3))
422 __udivmoddi4 (UDItype n, UDItype d, UDItype *rp)
427 USItype d0, d1, n0, n1, n2;
439 #if !UDIV_NEEDS_NORMALIZATION
446 udiv_qrnnd (q0, n0, n1, n0, d0);
449 /* Remainder in n0. */
456 d0 = 1 / d0; /* Divide intentionally by zero. */
458 udiv_qrnnd (q1, n1, 0, n1, d0);
459 udiv_qrnnd (q0, n0, n1, n0, d0);
461 /* Remainder in n0. */
472 #else /* UDIV_NEEDS_NORMALIZATION */
480 count_leading_zeros (bm, d0);
484 /* Normalize, i.e. make the most significant bit of the
488 n1 = (n1 << bm) | (n0 >> (SI_TYPE_SIZE - bm));
492 udiv_qrnnd (q0, n0, n1, n0, d0);
495 /* Remainder in n0 >> bm. */
502 d0 = 1 / d0; /* Divide intentionally by zero. */
504 count_leading_zeros (bm, d0);
508 /* From (n1 >= d0) /\ (the most significant bit of d0 is set),
509 conclude (the most significant bit of n1 is set) /\ (the
510 leading quotient digit q1 = 1).
512 This special case is necessary, not an optimization.
513 (Shifts counts of SI_TYPE_SIZE are undefined.) */
522 b = SI_TYPE_SIZE - bm;
526 n1 = (n1 << bm) | (n0 >> b);
529 udiv_qrnnd (q1, n1, n2, n1, d0);
534 udiv_qrnnd (q0, n0, n1, n0, d0);
536 /* Remainder in n0 >> bm. */
546 #endif /* UDIV_NEEDS_NORMALIZATION */
557 /* Remainder in n1n0. */
569 count_leading_zeros (bm, d1);
572 /* From (n1 >= d1) /\ (the most significant bit of d1 is set),
573 conclude (the most significant bit of n1 is set) /\ (the
574 quotient digit q0 = 0 or 1).
576 This special case is necessary, not an optimization. */
578 /* The condition on the next line takes advantage of that
579 n1 >= d1 (true due to program flow). */
580 if (n1 > d1 || n0 >= d0)
583 sub_ddmmss (n1, n0, n1, n0, d1, d0);
602 b = SI_TYPE_SIZE - bm;
604 d1 = (d1 << bm) | (d0 >> b);
607 n1 = (n1 << bm) | (n0 >> b);
610 udiv_qrnnd (q0, n1, n2, n1, d1);
611 umul_ppmm (m1, m0, q0, d0);
613 if (m1 > n1 || (m1 == n1 && m0 > n0))
616 sub_ddmmss (m1, m0, m1, m0, d1, d0);
621 /* Remainder in (n1n0 - m1m0) >> bm. */
624 sub_ddmmss (n1, n0, n1, n0, m1, m0);
625 rr.s.low = (n1 << b) | (n0 >> bm);
626 rr.s.high = n1 >> bm;
640 UDItype __udivmoddi4 ();
643 __divdi3 (DItype u, DItype v)
654 uu.ll = __negdi2 (uu.ll);
657 vv.ll = __negdi2 (vv.ll);
659 w = __udivmoddi4 (uu.ll, vv.ll, (UDItype *) 0);
668 UDItype __udivmoddi4 ();
670 __moddi3 (DItype u, DItype v)
681 uu.ll = __negdi2 (uu.ll);
683 vv.ll = __negdi2 (vv.ll);
685 (void) __udivmoddi4 (uu.ll, vv.ll, &w);
694 UDItype __udivmoddi4 ();
696 __umoddi3 (UDItype u, UDItype v)
700 (void) __udivmoddi4 (u, v, &w);
707 UDItype __udivmoddi4 ();
709 __udivdi3 (UDItype n, UDItype d)
711 return __udivmoddi4 (n, d, (UDItype *) 0);
717 __cmpdi2 (DItype a, DItype b)
721 au.ll = a, bu.ll = b;
723 if (au.s.high < bu.s.high)
725 else if (au.s.high > bu.s.high)
727 if ((USItype) au.s.low < (USItype) bu.s.low)
729 else if ((USItype) au.s.low > (USItype) bu.s.low)
737 __ucmpdi2 (DItype a, DItype b)
741 au.ll = a, bu.ll = b;
743 if ((USItype) au.s.high < (USItype) bu.s.high)
745 else if ((USItype) au.s.high > (USItype) bu.s.high)
747 if ((USItype) au.s.low < (USItype) bu.s.low)
749 else if ((USItype) au.s.low > (USItype) bu.s.low)
755 #if defined(L_fixunstfdi) && (LONG_DOUBLE_TYPE_SIZE == 128)
756 #define WORD_SIZE (sizeof (SItype) * BITS_PER_UNIT)
757 #define HIGH_WORD_COEFF (((UDItype) 1) << WORD_SIZE)
760 __fixunstfdi (TFtype a)
768 /* Compute high word of result, as a flonum. */
769 b = (a / HIGH_WORD_COEFF);
770 /* Convert that to fixed (but not to DItype!),
771 and shift it into the high word. */
774 /* Remove high part from the TFtype, leaving the low part as flonum. */
776 /* Convert that to fixed (but not to DItype!) and add it in.
777 Sometimes A comes out negative. This is significant, since
778 A has more bits than a long int does. */
780 v -= (USItype) (- a);
787 #if defined(L_fixtfdi) && (LONG_DOUBLE_TYPE_SIZE == 128)
792 return - __fixunstfdi (-a);
793 return __fixunstfdi (a);
797 #if defined(L_fixunsxfdi) && (LONG_DOUBLE_TYPE_SIZE == 96)
798 #define WORD_SIZE (sizeof (SItype) * BITS_PER_UNIT)
799 #define HIGH_WORD_COEFF (((UDItype) 1) << WORD_SIZE)
802 __fixunsxfdi (XFtype a)
810 /* Compute high word of result, as a flonum. */
811 b = (a / HIGH_WORD_COEFF);
812 /* Convert that to fixed (but not to DItype!),
813 and shift it into the high word. */
816 /* Remove high part from the XFtype, leaving the low part as flonum. */
818 /* Convert that to fixed (but not to DItype!) and add it in.
819 Sometimes A comes out negative. This is significant, since
820 A has more bits than a long int does. */
822 v -= (USItype) (- a);
829 #if defined(L_fixxfdi) && (LONG_DOUBLE_TYPE_SIZE == 96)
834 return - __fixunsxfdi (-a);
835 return __fixunsxfdi (a);
840 #define WORD_SIZE (sizeof (SItype) * BITS_PER_UNIT)
841 #define HIGH_WORD_COEFF (((UDItype) 1) << WORD_SIZE)
844 __fixunsdfdi (DFtype a)
852 /* Compute high word of result, as a flonum. */
853 b = (a / HIGH_WORD_COEFF);
854 /* Convert that to fixed (but not to DItype!),
855 and shift it into the high word. */
858 /* Remove high part from the DFtype, leaving the low part as flonum. */
860 /* Convert that to fixed (but not to DItype!) and add it in.
861 Sometimes A comes out negative. This is significant, since
862 A has more bits than a long int does. */
864 v -= (USItype) (- a);
876 return - __fixunsdfdi (-a);
877 return __fixunsdfdi (a);
882 #define WORD_SIZE (sizeof (SItype) * BITS_PER_UNIT)
883 #define HIGH_WORD_COEFF (((UDItype) 1) << WORD_SIZE)
886 __fixunssfdi (SFtype original_a)
888 /* Convert the SFtype to a DFtype, because that is surely not going
889 to lose any bits. Some day someone else can write a faster version
890 that avoids converting to DFtype, and verify it really works right. */
891 DFtype a = original_a;
898 /* Compute high word of result, as a flonum. */
899 b = (a / HIGH_WORD_COEFF);
900 /* Convert that to fixed (but not to DItype!),
901 and shift it into the high word. */
904 /* Remove high part from the DFtype, leaving the low part as flonum. */
906 /* Convert that to fixed (but not to DItype!) and add it in.
907 Sometimes A comes out negative. This is significant, since
908 A has more bits than a long int does. */
910 v -= (USItype) (- a);
922 return - __fixunssfdi (-a);
923 return __fixunssfdi (a);
927 #if defined(L_floatdixf) && (LONG_DOUBLE_TYPE_SIZE == 96)
928 #define WORD_SIZE (sizeof (SItype) * BITS_PER_UNIT)
929 #define HIGH_HALFWORD_COEFF (((UDItype) 1) << (WORD_SIZE / 2))
930 #define HIGH_WORD_COEFF (((UDItype) 1) << WORD_SIZE)
933 __floatdixf (DItype u)
941 d = (USItype) (u >> WORD_SIZE);
942 d *= HIGH_HALFWORD_COEFF;
943 d *= HIGH_HALFWORD_COEFF;
944 d += (USItype) (u & (HIGH_WORD_COEFF - 1));
946 return (negate ? -d : d);
950 #if defined(L_floatditf) && (LONG_DOUBLE_TYPE_SIZE == 128)
951 #define WORD_SIZE (sizeof (SItype) * BITS_PER_UNIT)
952 #define HIGH_HALFWORD_COEFF (((UDItype) 1) << (WORD_SIZE / 2))
953 #define HIGH_WORD_COEFF (((UDItype) 1) << WORD_SIZE)
956 __floatditf (DItype u)
964 d = (USItype) (u >> WORD_SIZE);
965 d *= HIGH_HALFWORD_COEFF;
966 d *= HIGH_HALFWORD_COEFF;
967 d += (USItype) (u & (HIGH_WORD_COEFF - 1));
969 return (negate ? -d : d);
974 #define WORD_SIZE (sizeof (SItype) * BITS_PER_UNIT)
975 #define HIGH_HALFWORD_COEFF (((UDItype) 1) << (WORD_SIZE / 2))
976 #define HIGH_WORD_COEFF (((UDItype) 1) << WORD_SIZE)
979 __floatdidf (DItype u)
987 d = (USItype) (u >> WORD_SIZE);
988 d *= HIGH_HALFWORD_COEFF;
989 d *= HIGH_HALFWORD_COEFF;
990 d += (USItype) (u & (HIGH_WORD_COEFF - 1));
992 return (negate ? -d : d);
997 #define WORD_SIZE (sizeof (SItype) * BITS_PER_UNIT)
998 #define HIGH_HALFWORD_COEFF (((UDItype) 1) << (WORD_SIZE / 2))
999 #define HIGH_WORD_COEFF (((UDItype) 1) << WORD_SIZE)
1000 #define DI_SIZE (sizeof (DItype) * BITS_PER_UNIT)
1002 /* Define codes for all the float formats that we know of. Note
1003 that this is copied from real.h. */
1005 #define UNKNOWN_FLOAT_FORMAT 0
1006 #define IEEE_FLOAT_FORMAT 1
1007 #define VAX_FLOAT_FORMAT 2
1008 #define IBM_FLOAT_FORMAT 3
1010 /* Default to IEEE float if not specified. Nearly all machines use it. */
1011 #ifndef HOST_FLOAT_FORMAT
1012 #define HOST_FLOAT_FORMAT IEEE_FLOAT_FORMAT
1015 #if HOST_FLOAT_FORMAT == IEEE_FLOAT_FORMAT
1020 #if HOST_FLOAT_FORMAT == IBM_FLOAT_FORMAT
1025 #if HOST_FLOAT_FORMAT == VAX_FLOAT_FORMAT
1031 __floatdisf (DItype u)
1033 /* Do the calculation in DFmode
1034 so that we don't lose any of the precision of the high word
1035 while multiplying it. */
1042 /* Protect against double-rounding error.
1043 Represent any low-order bits, that might be truncated in DFmode,
1044 by a bit that won't be lost. The bit can go in anywhere below the
1045 rounding position of the SFmode. A fixed mask and bit position
1046 handles all usual configurations. It doesn't handle the case
1047 of 128-bit DImode, however. */
1048 if (DF_SIZE < DI_SIZE
1049 && DF_SIZE > (DI_SIZE - DF_SIZE + SF_SIZE))
1051 #define REP_BIT ((USItype) 1 << (DI_SIZE - DF_SIZE))
1052 if (u >= ((UDItype) 1 << DF_SIZE))
1054 if ((USItype) u & (REP_BIT - 1))
1058 f = (USItype) (u >> WORD_SIZE);
1059 f *= HIGH_HALFWORD_COEFF;
1060 f *= HIGH_HALFWORD_COEFF;
1061 f += (USItype) (u & (HIGH_WORD_COEFF - 1));
1063 return (SFtype) (negate ? -f : f);
1067 #if defined(L_fixunsxfsi) && LONG_DOUBLE_TYPE_SIZE == 96
1068 /* Reenable the normal types, in case limits.h needs them. */
1081 __fixunsxfsi (XFtype a)
1083 if (a >= - (DFtype) LONG_MIN)
1084 return (SItype) (a + LONG_MIN) - LONG_MIN;
1090 /* Reenable the normal types, in case limits.h needs them. */
1103 __fixunsdfsi (DFtype a)
1105 if (a >= - (DFtype) LONG_MIN)
1106 return (SItype) (a + LONG_MIN) - LONG_MIN;
1112 /* Reenable the normal types, in case limits.h needs them. */
1125 __fixunssfsi (SFtype a)
1127 if (a >= - (SFtype) LONG_MIN)
1128 return (SItype) (a + LONG_MIN) - LONG_MIN;
1133 /* From here on down, the routines use normal data types. */
1135 #define SItype bogus_type
1136 #define USItype bogus_type
1137 #define DItype bogus_type
1138 #define UDItype bogus_type
1139 #define SFtype bogus_type
1140 #define DFtype bogus_type
1152 /* Like bcmp except the sign is meaningful.
1153 Result is negative if S1 is less than S2,
1154 positive if S1 is greater, 0 if S1 and S2 are equal. */
1157 __gcc_bcmp (unsigned char *s1, unsigned char *s2, size_t size)
1161 unsigned char c1 = *s1++, c2 = *s2++;
1178 #if defined(__svr4__) || defined(__alliant__)
1182 /* The Alliant needs the added underscore. */
1183 asm (".globl __builtin_saveregs");
1184 asm ("__builtin_saveregs:");
1185 asm (".globl ___builtin_saveregs");
1186 asm ("___builtin_saveregs:");
1188 asm (" andnot 0x0f,%sp,%sp"); /* round down to 16-byte boundary */
1189 asm (" adds -96,%sp,%sp"); /* allocate stack space for reg save
1190 area and also for a new va_list
1192 /* Save all argument registers in the arg reg save area. The
1193 arg reg save area must have the following layout (according
1205 asm (" fst.q %f8, 0(%sp)"); /* save floating regs (f8-f15) */
1206 asm (" fst.q %f12,16(%sp)");
1208 asm (" st.l %r16,32(%sp)"); /* save integer regs (r16-r27) */
1209 asm (" st.l %r17,36(%sp)");
1210 asm (" st.l %r18,40(%sp)");
1211 asm (" st.l %r19,44(%sp)");
1212 asm (" st.l %r20,48(%sp)");
1213 asm (" st.l %r21,52(%sp)");
1214 asm (" st.l %r22,56(%sp)");
1215 asm (" st.l %r23,60(%sp)");
1216 asm (" st.l %r24,64(%sp)");
1217 asm (" st.l %r25,68(%sp)");
1218 asm (" st.l %r26,72(%sp)");
1219 asm (" st.l %r27,76(%sp)");
1221 asm (" adds 80,%sp,%r16"); /* compute the address of the new
1222 va_list structure. Put in into
1223 r16 so that it will be returned
1226 /* Initialize all fields of the new va_list structure. This
1227 structure looks like:
1230 unsigned long ireg_used;
1231 unsigned long freg_used;
1237 asm (" st.l %r0, 0(%r16)"); /* nfixed */
1238 asm (" st.l %r0, 4(%r16)"); /* nfloating */
1239 asm (" st.l %sp, 8(%r16)"); /* __va_ctl points to __va_struct. */
1240 asm (" bri %r1"); /* delayed return */
1241 asm (" st.l %r28,12(%r16)"); /* pointer to overflow args */
1243 #else /* not __svr4__ */
1244 #if defined(__PARAGON__)
1246 * we'll use SVR4-ish varargs but need SVR3.2 assembler syntax,
1247 * and we stand a better chance of hooking into libraries
1248 * compiled by PGI. [andyp@ssd.intel.com]
1252 asm (".globl __builtin_saveregs");
1253 asm ("__builtin_saveregs:");
1254 asm (".globl ___builtin_saveregs");
1255 asm ("___builtin_saveregs:");
1257 asm (" andnot 0x0f,sp,sp"); /* round down to 16-byte boundary */
1258 asm (" adds -96,sp,sp"); /* allocate stack space for reg save
1259 area and also for a new va_list
1261 /* Save all argument registers in the arg reg save area. The
1262 arg reg save area must have the following layout (according
1274 asm (" fst.q f8, 0(sp)");
1275 asm (" fst.q f12,16(sp)");
1276 asm (" st.l r16,32(sp)");
1277 asm (" st.l r17,36(sp)");
1278 asm (" st.l r18,40(sp)");
1279 asm (" st.l r19,44(sp)");
1280 asm (" st.l r20,48(sp)");
1281 asm (" st.l r21,52(sp)");
1282 asm (" st.l r22,56(sp)");
1283 asm (" st.l r23,60(sp)");
1284 asm (" st.l r24,64(sp)");
1285 asm (" st.l r25,68(sp)");
1286 asm (" st.l r26,72(sp)");
1287 asm (" st.l r27,76(sp)");
1289 asm (" adds 80,sp,r16"); /* compute the address of the new
1290 va_list structure. Put in into
1291 r16 so that it will be returned
1294 /* Initialize all fields of the new va_list structure. This
1295 structure looks like:
1298 unsigned long ireg_used;
1299 unsigned long freg_used;
1305 asm (" st.l r0, 0(r16)"); /* nfixed */
1306 asm (" st.l r0, 4(r16)"); /* nfloating */
1307 asm (" st.l sp, 8(r16)"); /* __va_ctl points to __va_struct. */
1308 asm (" bri r1"); /* delayed return */
1309 asm (" st.l r28,12(r16)"); /* pointer to overflow args */
1310 #else /* not __PARAGON__ */
1314 asm (".globl ___builtin_saveregs");
1315 asm ("___builtin_saveregs:");
1316 asm (" mov sp,r30");
1317 asm (" andnot 0x0f,sp,sp");
1318 asm (" adds -96,sp,sp"); /* allocate sufficient space on the stack */
1320 /* Fill in the __va_struct. */
1321 asm (" st.l r16, 0(sp)"); /* save integer regs (r16-r27) */
1322 asm (" st.l r17, 4(sp)"); /* int fixed[12] */
1323 asm (" st.l r18, 8(sp)");
1324 asm (" st.l r19,12(sp)");
1325 asm (" st.l r20,16(sp)");
1326 asm (" st.l r21,20(sp)");
1327 asm (" st.l r22,24(sp)");
1328 asm (" st.l r23,28(sp)");
1329 asm (" st.l r24,32(sp)");
1330 asm (" st.l r25,36(sp)");
1331 asm (" st.l r26,40(sp)");
1332 asm (" st.l r27,44(sp)");
1334 asm (" fst.q f8, 48(sp)"); /* save floating regs (f8-f15) */
1335 asm (" fst.q f12,64(sp)"); /* int floating[8] */
1337 /* Fill in the __va_ctl. */
1338 asm (" st.l sp, 80(sp)"); /* __va_ctl points to __va_struct. */
1339 asm (" st.l r28,84(sp)"); /* pointer to more args */
1340 asm (" st.l r0, 88(sp)"); /* nfixed */
1341 asm (" st.l r0, 92(sp)"); /* nfloating */
1343 asm (" adds 80,sp,r16"); /* return address of the __va_ctl. */
1345 asm (" mov r30,sp");
1346 /* recover stack and pass address to start
1348 #endif /* not __PARAGON__ */
1349 #endif /* not __svr4__ */
1350 #else /* not __i860__ */
1352 asm (".global __builtin_saveregs");
1353 asm ("__builtin_saveregs:");
1354 asm (".global ___builtin_saveregs");
1355 asm ("___builtin_saveregs:");
1356 #ifdef NEED_PROC_COMMAND
1359 asm ("st %i0,[%fp+68]");
1360 asm ("st %i1,[%fp+72]");
1361 asm ("st %i2,[%fp+76]");
1362 asm ("st %i3,[%fp+80]");
1363 asm ("st %i4,[%fp+84]");
1365 asm ("st %i5,[%fp+88]");
1366 #ifdef NEED_TYPE_COMMAND
1367 asm (".type __builtin_saveregs,#function");
1368 asm (".size __builtin_saveregs,.-__builtin_saveregs");
1370 #else /* not __sparc__ */
1371 #if defined(__MIPSEL__) | defined(__R3000__) | defined(__R2000__) | defined(__mips__)
1375 asm (" .set nomips16");
1377 asm (" .ent __builtin_saveregs");
1378 asm (" .globl __builtin_saveregs");
1379 asm ("__builtin_saveregs:");
1380 asm (" sw $4,0($30)");
1381 asm (" sw $5,4($30)");
1382 asm (" sw $6,8($30)");
1383 asm (" sw $7,12($30)");
1385 asm (" .end __builtin_saveregs");
1386 #else /* not __mips__, etc. */
1389 __builtin_saveregs ()
1394 #endif /* not __mips__ */
1395 #endif /* not __sparc__ */
1396 #endif /* not __i860__ */
1400 #ifndef inhibit_libc
1402 #undef NULL /* Avoid errors if stdio.h and our stddef.h mismatch. */
1404 /* This is used by the `assert' macro. */
1406 __eprintf (const char *string, const char *expression,
1407 int line, const char *filename)
1409 fprintf (stderr, string, expression, line, filename);
1419 /* Structure emitted by -a */
1423 const char *filename;
1427 const unsigned long *addresses;
1429 /* Older GCC's did not emit these fields. */
1431 const char **functions;
1432 const long *line_nums;
1433 const char **filenames;
1437 #ifdef BLOCK_PROFILER_CODE
1440 #ifndef inhibit_libc
1442 /* Simple minded basic block profiling output dumper for
1443 systems that don't provide tcov support. At present,
1444 it requires atexit and stdio. */
1446 #undef NULL /* Avoid errors if stdio.h and our stddef.h mismatch. */
1450 #include "gbl-ctors.h"
1451 #include "gcov-io.h"
1454 static struct bb *bb_head;
1456 /* Return the number of digits needed to print a value */
1457 /* __inline__ */ static int num_digits (long value, int base)
1459 int minus = (value < 0 && base != 16);
1460 unsigned long v = (minus) ? -value : value;
1474 __bb_exit_func (void)
1476 FILE *da_file, *file;
1483 i = strlen (bb_head->filename) - 3;
1485 if (!strcmp (bb_head->filename+i, ".da"))
1487 /* Must be -fprofile-arcs not -a.
1488 Dump data in a form that gcov expects. */
1492 for (ptr = bb_head; ptr != (struct bb *) 0; ptr = ptr->next)
1494 /* If the file exists, and the number of counts in it is the same,
1495 then merge them in. */
1497 if ((da_file = fopen (ptr->filename, "r")) != 0)
1501 if (__read_long (&n_counts, da_file, 8) != 0)
1503 fprintf (stderr, "arc profiling: Can't read output file %s.\n",
1508 if (n_counts == ptr->ncounts)
1512 for (i = 0; i < n_counts; i++)
1516 if (__read_long (&v, da_file, 8) != 0)
1518 fprintf (stderr, "arc profiling: Can't read output file %s.\n",
1522 ptr->counts[i] += v;
1526 if (fclose (da_file) == EOF)
1527 fprintf (stderr, "arc profiling: Error closing output file %s.\n",
1530 if ((da_file = fopen (ptr->filename, "w")) == 0)
1532 fprintf (stderr, "arc profiling: Can't open output file %s.\n",
1537 /* ??? Should first write a header to the file. Preferably, a 4 byte
1538 magic number, 4 bytes containing the time the program was
1539 compiled, 4 bytes containing the last modification time of the
1540 source file, and 4 bytes indicating the compiler options used.
1542 That way we can easily verify that the proper source/executable/
1543 data file combination is being used from gcov. */
1545 if (__write_long (ptr->ncounts, da_file, 8) != 0)
1548 fprintf (stderr, "arc profiling: Error writing output file %s.\n",
1554 long *count_ptr = ptr->counts;
1556 for (j = ptr->ncounts; j > 0; j--)
1558 if (__write_long (*count_ptr, da_file, 8) != 0)
1566 fprintf (stderr, "arc profiling: Error writing output file %s.\n",
1570 if (fclose (da_file) == EOF)
1571 fprintf (stderr, "arc profiling: Error closing output file %s.\n",
1578 /* Must be basic block profiling. Emit a human readable output file. */
1580 file = fopen ("bb.out", "a");
1589 /* This is somewhat type incorrect, but it avoids worrying about
1590 exactly where time.h is included from. It should be ok unless
1591 a void * differs from other pointer formats, or if sizeof (long)
1592 is < sizeof (time_t). It would be nice if we could assume the
1593 use of rationale standards here. */
1595 time ((void *) &time_value);
1596 fprintf (file, "Basic block profiling finished on %s\n", ctime ((void *) &time_value));
1598 /* We check the length field explicitly in order to allow compatibility
1599 with older GCC's which did not provide it. */
1601 for (ptr = bb_head; ptr != (struct bb *) 0; ptr = ptr->next)
1604 int func_p = (ptr->nwords >= sizeof (struct bb)
1605 && ptr->nwords <= 1000
1607 int line_p = (func_p && ptr->line_nums);
1608 int file_p = (func_p && ptr->filenames);
1609 int addr_p = (ptr->addresses != 0);
1610 long ncounts = ptr->ncounts;
1616 int blk_len = num_digits (ncounts, 10);
1621 fprintf (file, "File %s, %ld basic blocks \n\n",
1622 ptr->filename, ncounts);
1624 /* Get max values for each field. */
1625 for (i = 0; i < ncounts; i++)
1630 if (cnt_max < ptr->counts[i])
1631 cnt_max = ptr->counts[i];
1633 if (addr_p && addr_max < ptr->addresses[i])
1634 addr_max = ptr->addresses[i];
1636 if (line_p && line_max < ptr->line_nums[i])
1637 line_max = ptr->line_nums[i];
1641 p = (ptr->functions[i]) ? (ptr->functions[i]) : "<none>";
1649 p = (ptr->filenames[i]) ? (ptr->filenames[i]) : "<none>";
1656 addr_len = num_digits (addr_max, 16);
1657 cnt_len = num_digits (cnt_max, 10);
1658 line_len = num_digits (line_max, 10);
1660 /* Now print out the basic block information. */
1661 for (i = 0; i < ncounts; i++)
1664 " Block #%*d: executed %*ld time(s)",
1666 cnt_len, ptr->counts[i]);
1669 fprintf (file, " address= 0x%.*lx", addr_len,
1673 fprintf (file, " function= %-*s", func_len,
1674 (ptr->functions[i]) ? ptr->functions[i] : "<none>");
1677 fprintf (file, " line= %*ld", line_len, ptr->line_nums[i]);
1680 fprintf (file, " file= %s",
1681 (ptr->filenames[i]) ? ptr->filenames[i] : "<none>");
1683 fprintf (file, "\n");
1686 fprintf (file, "\n");
1690 fprintf (file, "\n\n");
1696 __bb_init_func (struct bb *blocks)
1698 /* User is supposed to check whether the first word is non-0,
1699 but just in case.... */
1701 if (blocks->zero_word)
1705 /* Initialize destructor. */
1707 ON_EXIT (__bb_exit_func, 0);
1710 /* Set up linked list. */
1711 blocks->zero_word = 1;
1712 blocks->next = bb_head;
1716 #ifndef MACHINE_STATE_SAVE
1717 #define MACHINE_STATE_SAVE(ID)
1719 #ifndef MACHINE_STATE_RESTORE
1720 #define MACHINE_STATE_RESTORE(ID)
1723 /* Number of buckets in hashtable of basic block addresses. */
1725 #define BB_BUCKETS 311
1727 /* Maximum length of string in file bb.in. */
1729 #define BBINBUFSIZE 500
1731 /* BBINBUFSIZE-1 with double quotes. We could use #BBINBUFSIZE or
1732 "BBINBUFSIZE" but want to avoid trouble with preprocessors. */
1734 #define BBINBUFSIZESTR "499"
1738 struct bb_edge *next;
1739 unsigned long src_addr;
1740 unsigned long dst_addr;
1741 unsigned long count;
1746 TRACE_KEEP = 0, TRACE_ON = 1, TRACE_OFF = 2
1751 struct bb_func *next;
1754 enum bb_func_mode mode;
1757 /* This is the connection to the outside world.
1758 The BLOCK_PROFILER macro must set __bb.blocks
1759 and __bb.blockno. */
1762 unsigned long blockno;
1766 /* Vars to store addrs of source and destination basic blocks
1769 static unsigned long bb_src = 0;
1770 static unsigned long bb_dst = 0;
1772 static FILE *bb_tracefile = (FILE *) 0;
1773 static struct bb_edge **bb_hashbuckets = (struct bb_edge **) 0;
1774 static struct bb_func *bb_func_head = (struct bb_func *) 0;
1775 static unsigned long bb_callcount = 0;
1776 static int bb_mode = 0;
1778 static unsigned long *bb_stack = (unsigned long *) 0;
1779 static size_t bb_stacksize = 0;
1781 static int reported = 0;
1784 Always : Print execution frequencies of basic blocks
1786 bb_mode & 1 != 0 : Dump trace of basic blocks to file bbtrace[.gz]
1787 bb_mode & 2 != 0 : Print jump frequencies to file bb.out.
1788 bb_mode & 4 != 0 : Cut call instructions from basic block flow.
1789 bb_mode & 8 != 0 : Insert return instructions in basic block flow.
1794 /*#include <sys/types.h>*/
1795 #include <sys/stat.h>
1796 /*#include <malloc.h>*/
1798 /* Commands executed by gopen. */
1800 #define GOPENDECOMPRESS "gzip -cd "
1801 #define GOPENCOMPRESS "gzip -c >"
1803 /* Like fopen but pipes through gzip. mode may only be "r" or "w".
1804 If it does not compile, simply replace gopen by fopen and delete
1805 '.gz' from any first parameter to gopen. */
1808 gopen (char *fn, char *mode)
1816 if (mode[0] != 'r' && mode[0] != 'w')
1819 p = fn + strlen (fn)-1;
1820 use_gzip = ((p[-1] == '.' && (p[0] == 'Z' || p[0] == 'z'))
1821 || (p[-2] == '.' && p[-1] == 'g' && p[0] == 'z'));
1828 char *s = (char *) malloc (sizeof (char) * strlen (fn)
1829 + sizeof (GOPENDECOMPRESS));
1830 strcpy (s, GOPENDECOMPRESS);
1831 strcpy (s + (sizeof (GOPENDECOMPRESS)-1), fn);
1832 f = popen (s, mode);
1840 char *s = (char *) malloc (sizeof (char) * strlen (fn)
1841 + sizeof (GOPENCOMPRESS));
1842 strcpy (s, GOPENCOMPRESS);
1843 strcpy (s + (sizeof (GOPENCOMPRESS)-1), fn);
1844 if (!(f = popen (s, mode)))
1845 f = fopen (s, mode);
1852 return fopen (fn, mode);
1862 if (!fstat (fileno (f), &buf) && S_ISFIFO (buf.st_mode))
1870 #endif /* HAVE_POPEN */
1872 /* Called once per program. */
1875 __bb_exit_trace_func ()
1877 FILE *file = fopen ("bb.out", "a");
1890 gclose (bb_tracefile);
1892 fclose (bb_tracefile);
1893 #endif /* HAVE_POPEN */
1896 /* Check functions in `bb.in'. */
1901 const struct bb_func *p;
1902 int printed_something = 0;
1906 /* This is somewhat type incorrect. */
1907 time ((void *) &time_value);
1909 for (p = bb_func_head; p != (struct bb_func *) 0; p = p->next)
1911 for (ptr = bb_head; ptr != (struct bb *) 0; ptr = ptr->next)
1913 if (!ptr->filename || (p->filename != (char *) 0 && strcmp (p->filename, ptr->filename)))
1915 for (blk = 0; blk < ptr->ncounts; blk++)
1917 if (!strcmp (p->funcname, ptr->functions[blk]))
1922 if (!printed_something)
1924 fprintf (file, "Functions in `bb.in' not executed during basic block profiling on %s\n", ctime ((void *) &time_value));
1925 printed_something = 1;
1928 fprintf (file, "\tFunction %s", p->funcname);
1930 fprintf (file, " of file %s", p->filename);
1931 fprintf (file, "\n" );
1936 if (printed_something)
1937 fprintf (file, "\n");
1943 if (!bb_hashbuckets)
1947 fprintf (stderr, "Profiler: out of memory\n");
1957 unsigned long addr_max = 0;
1958 unsigned long cnt_max = 0;
1962 /* This is somewhat type incorrect, but it avoids worrying about
1963 exactly where time.h is included from. It should be ok unless
1964 a void * differs from other pointer formats, or if sizeof (long)
1965 is < sizeof (time_t). It would be nice if we could assume the
1966 use of rationale standards here. */
1968 time ((void *) &time_value);
1969 fprintf (file, "Basic block jump tracing");
1971 switch (bb_mode & 12)
1974 fprintf (file, " (with call)");
1978 /* Print nothing. */
1982 fprintf (file, " (with call & ret)");
1986 fprintf (file, " (with ret)");
1990 fprintf (file, " finished on %s\n", ctime ((void *) &time_value));
1992 for (i = 0; i < BB_BUCKETS; i++)
1994 struct bb_edge *bucket = bb_hashbuckets[i];
1995 for ( ; bucket; bucket = bucket->next )
1997 if (addr_max < bucket->src_addr)
1998 addr_max = bucket->src_addr;
1999 if (addr_max < bucket->dst_addr)
2000 addr_max = bucket->dst_addr;
2001 if (cnt_max < bucket->count)
2002 cnt_max = bucket->count;
2005 addr_len = num_digits (addr_max, 16);
2006 cnt_len = num_digits (cnt_max, 10);
2008 for ( i = 0; i < BB_BUCKETS; i++)
2010 struct bb_edge *bucket = bb_hashbuckets[i];
2011 for ( ; bucket; bucket = bucket->next )
2013 fprintf (file, "Jump from block 0x%.*lx to "
2014 "block 0x%.*lx executed %*lu time(s)\n",
2015 addr_len, bucket->src_addr,
2016 addr_len, bucket->dst_addr,
2017 cnt_len, bucket->count);
2021 fprintf (file, "\n");
2029 /* Free allocated memory. */
2034 struct bb_func *old = f;
2037 if (old->funcname) free (old->funcname);
2038 if (old->filename) free (old->filename);
2049 for (i = 0; i < BB_BUCKETS; i++)
2051 struct bb_edge *old, *bucket = bb_hashbuckets[i];
2056 bucket = bucket->next;
2060 free (bb_hashbuckets);
2063 for (b = bb_head; b; b = b->next)
2064 if (b->flags) free (b->flags);
2067 /* Called once per program. */
2074 char buf[BBINBUFSIZE];
2077 enum bb_func_mode m;
2080 /* Initialize destructor. */
2081 ON_EXIT (__bb_exit_func, 0);
2084 if (!(file = fopen ("bb.in", "r")))
2087 while(fscanf (file, " %" BBINBUFSIZESTR "s ", buf) != EOF)
2099 if (!strcmp (p, "__bb_trace__"))
2101 else if (!strcmp (p, "__bb_jumps__"))
2103 else if (!strcmp (p, "__bb_hidecall__"))
2105 else if (!strcmp (p, "__bb_showret__"))
2109 struct bb_func *f = (struct bb_func *) malloc (sizeof (struct bb_func));
2113 f->next = bb_func_head;
2114 if ((pos = strchr (p, ':')))
2116 if (!(f->funcname = (char *) malloc (strlen (pos+1)+1)))
2118 strcpy (f->funcname, pos+1);
2120 if ((f->filename = (char *) malloc (l+1)))
2122 strncpy (f->filename, p, l);
2123 f->filename[l] = '\0';
2126 f->filename = (char *) 0;
2130 if (!(f->funcname = (char *) malloc (strlen (p)+1)))
2132 strcpy (f->funcname, p);
2133 f->filename = (char *) 0;
2145 bb_tracefile = gopen ("bbtrace.gz", "w");
2150 bb_tracefile = fopen ("bbtrace", "w");
2152 #endif /* HAVE_POPEN */
2156 bb_hashbuckets = (struct bb_edge **)
2157 malloc (BB_BUCKETS * sizeof (struct bb_edge *));
2159 bzero ((char *) bb_hashbuckets, BB_BUCKETS);
2165 bb_stack = (unsigned long *) malloc (bb_stacksize * sizeof (*bb_stack));
2169 /* Initialize destructor. */
2170 ON_EXIT (__bb_exit_trace_func, 0);
2175 /* Called upon entering a basic block. */
2180 struct bb_edge *bucket;
2182 MACHINE_STATE_SAVE("1")
2184 if (!bb_callcount || (__bb.blocks->flags && (__bb.blocks->flags[__bb.blockno] & TRACE_OFF)))
2187 bb_dst = __bb.blocks->addresses[__bb.blockno];
2188 __bb.blocks->counts[__bb.blockno]++;
2192 fwrite (&bb_dst, sizeof (unsigned long), 1, bb_tracefile);
2197 struct bb_edge **startbucket, **oldnext;
2199 oldnext = startbucket
2200 = & bb_hashbuckets[ (((int) bb_src*8) ^ (int) bb_dst) % BB_BUCKETS ];
2201 bucket = *startbucket;
2203 for (bucket = *startbucket; bucket;
2204 oldnext = &(bucket->next), bucket = *oldnext)
2206 if (bucket->src_addr == bb_src
2207 && bucket->dst_addr == bb_dst)
2210 *oldnext = bucket->next;
2211 bucket->next = *startbucket;
2212 *startbucket = bucket;
2217 bucket = (struct bb_edge *) malloc (sizeof (struct bb_edge));
2223 fprintf (stderr, "Profiler: out of memory\n");
2230 bucket->src_addr = bb_src;
2231 bucket->dst_addr = bb_dst;
2232 bucket->next = *startbucket;
2233 *startbucket = bucket;
2244 MACHINE_STATE_RESTORE("1")
2248 /* Called when returning from a function and `__bb_showret__' is set. */
2251 __bb_trace_func_ret ()
2253 struct bb_edge *bucket;
2255 if (!bb_callcount || (__bb.blocks->flags && (__bb.blocks->flags[__bb.blockno] & TRACE_OFF)))
2260 struct bb_edge **startbucket, **oldnext;
2262 oldnext = startbucket
2263 = & bb_hashbuckets[ (((int) bb_dst * 8) ^ (int) bb_src) % BB_BUCKETS ];
2264 bucket = *startbucket;
2266 for (bucket = *startbucket; bucket;
2267 oldnext = &(bucket->next), bucket = *oldnext)
2269 if (bucket->src_addr == bb_dst
2270 && bucket->dst_addr == bb_src)
2273 *oldnext = bucket->next;
2274 bucket->next = *startbucket;
2275 *startbucket = bucket;
2280 bucket = (struct bb_edge *) malloc (sizeof (struct bb_edge));
2286 fprintf (stderr, "Profiler: out of memory\n");
2293 bucket->src_addr = bb_dst;
2294 bucket->dst_addr = bb_src;
2295 bucket->next = *startbucket;
2296 *startbucket = bucket;
2309 /* Called upon entering the first function of a file. */
2312 __bb_init_file (struct bb *blocks)
2315 const struct bb_func *p;
2316 long blk, ncounts = blocks->ncounts;
2317 const char **functions = blocks->functions;
2319 /* Set up linked list. */
2320 blocks->zero_word = 1;
2321 blocks->next = bb_head;
2326 || !(blocks->flags = (char *) malloc (sizeof (char) * blocks->ncounts)))
2329 for (blk = 0; blk < ncounts; blk++)
2330 blocks->flags[blk] = 0;
2332 for (blk = 0; blk < ncounts; blk++)
2334 for (p = bb_func_head; p; p = p->next)
2336 if (!strcmp (p->funcname, functions[blk])
2337 && (!p->filename || !strcmp (p->filename, blocks->filename)))
2339 blocks->flags[blk] |= p->mode;
2346 /* Called when exiting from a function. */
2352 MACHINE_STATE_SAVE("2")
2356 if ((bb_mode & 12) && bb_stacksize > bb_callcount)
2358 bb_src = bb_stack[bb_callcount];
2360 __bb_trace_func_ret ();
2366 MACHINE_STATE_RESTORE("2")
2370 /* Called when entering a function. */
2373 __bb_init_trace_func (struct bb *blocks, unsigned long blockno)
2375 static int trace_init = 0;
2377 MACHINE_STATE_SAVE("3")
2379 if (!blocks->zero_word)
2386 __bb_init_file (blocks);
2396 if (bb_callcount >= bb_stacksize)
2398 size_t newsize = bb_callcount + 100;
2400 bb_stack = (unsigned long *) realloc (bb_stack, newsize);
2405 fprintf (stderr, "Profiler: out of memory\n");
2409 goto stack_overflow;
2411 bb_stacksize = newsize;
2413 bb_stack[bb_callcount] = bb_src;
2424 else if (blocks->flags && (blocks->flags[blockno] & TRACE_ON))
2430 bb_stack[bb_callcount] = bb_src;
2433 MACHINE_STATE_RESTORE("3")
2436 #endif /* not inhibit_libc */
2437 #endif /* not BLOCK_PROFILER_CODE */
2441 unsigned int __shtab[] = {
2442 0x00000001, 0x00000002, 0x00000004, 0x00000008,
2443 0x00000010, 0x00000020, 0x00000040, 0x00000080,
2444 0x00000100, 0x00000200, 0x00000400, 0x00000800,
2445 0x00001000, 0x00002000, 0x00004000, 0x00008000,
2446 0x00010000, 0x00020000, 0x00040000, 0x00080000,
2447 0x00100000, 0x00200000, 0x00400000, 0x00800000,
2448 0x01000000, 0x02000000, 0x04000000, 0x08000000,
2449 0x10000000, 0x20000000, 0x40000000, 0x80000000
2453 #ifdef L_clear_cache
2454 /* Clear part of an instruction cache. */
2456 #define INSN_CACHE_PLANE_SIZE (INSN_CACHE_SIZE / INSN_CACHE_DEPTH)
2459 __clear_cache (char *beg, char *end)
2461 #ifdef CLEAR_INSN_CACHE
2462 CLEAR_INSN_CACHE (beg, end);
2464 #ifdef INSN_CACHE_SIZE
2465 static char array[INSN_CACHE_SIZE + INSN_CACHE_PLANE_SIZE + INSN_CACHE_LINE_WIDTH];
2466 static int initialized;
2470 typedef (*function_ptr) ();
2472 #if (INSN_CACHE_SIZE / INSN_CACHE_LINE_WIDTH) < 16
2473 /* It's cheaper to clear the whole cache.
2474 Put in a series of jump instructions so that calling the beginning
2475 of the cache will clear the whole thing. */
2479 int ptr = (((int) array + INSN_CACHE_LINE_WIDTH - 1)
2480 & -INSN_CACHE_LINE_WIDTH);
2481 int end_ptr = ptr + INSN_CACHE_SIZE;
2483 while (ptr < end_ptr)
2485 *(INSTRUCTION_TYPE *)ptr
2486 = JUMP_AHEAD_INSTRUCTION + INSN_CACHE_LINE_WIDTH;
2487 ptr += INSN_CACHE_LINE_WIDTH;
2489 *(INSTRUCTION_TYPE *) (ptr - INSN_CACHE_LINE_WIDTH) = RETURN_INSTRUCTION;
2494 /* Call the beginning of the sequence. */
2495 (((function_ptr) (((int) array + INSN_CACHE_LINE_WIDTH - 1)
2496 & -INSN_CACHE_LINE_WIDTH))
2499 #else /* Cache is large. */
2503 int ptr = (((int) array + INSN_CACHE_LINE_WIDTH - 1)
2504 & -INSN_CACHE_LINE_WIDTH);
2506 while (ptr < (int) array + sizeof array)
2508 *(INSTRUCTION_TYPE *)ptr = RETURN_INSTRUCTION;
2509 ptr += INSN_CACHE_LINE_WIDTH;
2515 /* Find the location in array that occupies the same cache line as BEG. */
2517 offset = ((int) beg & -INSN_CACHE_LINE_WIDTH) & (INSN_CACHE_PLANE_SIZE - 1);
2518 start_addr = (((int) (array + INSN_CACHE_PLANE_SIZE - 1)
2519 & -INSN_CACHE_PLANE_SIZE)
2522 /* Compute the cache alignment of the place to stop clearing. */
2523 #if 0 /* This is not needed for gcc's purposes. */
2524 /* If the block to clear is bigger than a cache plane,
2525 we clear the entire cache, and OFFSET is already correct. */
2526 if (end < beg + INSN_CACHE_PLANE_SIZE)
2528 offset = (((int) (end + INSN_CACHE_LINE_WIDTH - 1)
2529 & -INSN_CACHE_LINE_WIDTH)
2530 & (INSN_CACHE_PLANE_SIZE - 1));
2532 #if INSN_CACHE_DEPTH > 1
2533 end_addr = (start_addr & -INSN_CACHE_PLANE_SIZE) + offset;
2534 if (end_addr <= start_addr)
2535 end_addr += INSN_CACHE_PLANE_SIZE;
2537 for (plane = 0; plane < INSN_CACHE_DEPTH; plane++)
2539 int addr = start_addr + plane * INSN_CACHE_PLANE_SIZE;
2540 int stop = end_addr + plane * INSN_CACHE_PLANE_SIZE;
2542 while (addr != stop)
2544 /* Call the return instruction at ADDR. */
2545 ((function_ptr) addr) ();
2547 addr += INSN_CACHE_LINE_WIDTH;
2550 #else /* just one plane */
2553 /* Call the return instruction at START_ADDR. */
2554 ((function_ptr) start_addr) ();
2556 start_addr += INSN_CACHE_LINE_WIDTH;
2558 while ((start_addr % INSN_CACHE_SIZE) != offset);
2559 #endif /* just one plane */
2560 #endif /* Cache is large */
2561 #endif /* Cache exists */
2562 #endif /* CLEAR_INSN_CACHE */
2565 #endif /* L_clear_cache */
2569 /* Jump to a trampoline, loading the static chain address. */
2571 #if defined(WINNT) && ! defined(__CYGWIN32__)
2583 extern int VirtualProtect (char *, int, int, int *) __attribute__((stdcall));
2587 mprotect (char *addr, int len, int prot)
2604 if (VirtualProtect (addr, len, np, &op))
2612 #ifdef TRANSFER_FROM_TRAMPOLINE
2613 TRANSFER_FROM_TRAMPOLINE
2616 #if defined (NeXT) && defined (__MACH__)
2618 /* Make stack executable so we can call trampolines on stack.
2619 This is called from INITIALIZE_TRAMPOLINE in next.h. */
2623 #include <mach/mach.h>
2627 __enable_execute_stack (char *addr)
2630 char *eaddr = addr + TRAMPOLINE_SIZE;
2631 vm_address_t a = (vm_address_t) addr;
2633 /* turn on execute access on stack */
2634 r = vm_protect (task_self (), a, TRAMPOLINE_SIZE, FALSE, VM_PROT_ALL);
2635 if (r != KERN_SUCCESS)
2637 mach_error("vm_protect VM_PROT_ALL", r);
2641 /* We inline the i-cache invalidation for speed */
2643 #ifdef CLEAR_INSN_CACHE
2644 CLEAR_INSN_CACHE (addr, eaddr);
2646 __clear_cache ((int) addr, (int) eaddr);
2650 #endif /* defined (NeXT) && defined (__MACH__) */
2654 /* Make stack executable so we can call trampolines on stack.
2655 This is called from INITIALIZE_TRAMPOLINE in convex.h. */
2657 #include <sys/mman.h>
2658 #include <sys/vmparam.h>
2659 #include <machine/machparam.h>
2662 __enable_execute_stack ()
2665 static unsigned lowest = USRSTACK;
2666 unsigned current = (unsigned) &fp & -NBPG;
2668 if (lowest > current)
2670 unsigned len = lowest - current;
2671 mremap (current, &len, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE);
2675 /* Clear instruction cache in case an old trampoline is in it. */
2678 #endif /* __convex__ */
2682 /* Modified from the convex -code above. */
2684 #include <sys/param.h>
2686 #include <sys/m88kbcs.h>
2689 __enable_execute_stack ()
2692 static unsigned long lowest = USRSTACK;
2693 unsigned long current = (unsigned long) &save_errno & -NBPC;
2695 /* Ignore errno being set. memctl sets errno to EINVAL whenever the
2696 address is seen as 'negative'. That is the case with the stack. */
2699 if (lowest > current)
2701 unsigned len=lowest-current;
2702 memctl(current,len,MCT_TEXT);
2706 memctl(current,NBPC,MCT_TEXT);
2710 #endif /* __sysV88__ */
2714 #include <sys/signal.h>
2717 /* Motorola forgot to put memctl.o in the libp version of libc881.a,
2718 so define it here, because we need it in __clear_insn_cache below */
2719 /* On older versions of this OS, no memctl or MCT_TEXT are defined;
2720 hence we enable this stuff only if MCT_TEXT is #define'd. */
2735 /* Clear instruction cache so we can call trampolines on stack.
2736 This is called from FINALIZE_TRAMPOLINE in mot3300.h. */
2739 __clear_insn_cache ()
2744 /* Preserve errno, because users would be surprised to have
2745 errno changing without explicitly calling any system-call. */
2748 /* Keep it simple : memctl (MCT_TEXT) always fully clears the insn cache.
2749 No need to use an address derived from _start or %sp, as 0 works also. */
2750 memctl(0, 4096, MCT_TEXT);
2755 #endif /* __sysV68__ */
2759 #undef NULL /* Avoid errors if stdio.h and our stddef.h mismatch. */
2761 #include <sys/mman.h>
2762 #include <sys/types.h>
2763 #include <sys/param.h>
2764 #include <sys/vmmac.h>
2766 /* Modified from the convex -code above.
2767 mremap promises to clear the i-cache. */
2770 __enable_execute_stack ()
2773 if (mprotect (((unsigned int)&fp/PAGSIZ)*PAGSIZ, PAGSIZ,
2774 PROT_READ|PROT_WRITE|PROT_EXEC))
2776 perror ("mprotect in __enable_execute_stack");
2781 #endif /* __pyr__ */
2783 #if defined (sony_news) && defined (SYSTYPE_BSD)
2786 #include <sys/types.h>
2787 #include <sys/param.h>
2788 #include <syscall.h>
2789 #include <machine/sysnews.h>
2791 /* cacheflush function for NEWS-OS 4.2.
2792 This function is called from trampoline-initialize code
2793 defined in config/mips/mips.h. */
2796 cacheflush (char *beg, int size, int flag)
2798 if (syscall (SYS_sysnews, NEWS_CACHEFLUSH, beg, size, FLUSH_BCACHE))
2800 perror ("cache_flush");
2806 #endif /* sony_news */
2807 #endif /* L_trampoline */
2811 #include "gbl-ctors.h"
2812 /* Some systems use __main in a way incompatible with its use in gcc, in these
2813 cases use the macros NAME__MAIN to give a quoted symbol and SYMBOL__MAIN to
2814 give the same symbol without quotes for an alternative entry point. You
2815 must define both, or neither. */
2817 #define NAME__MAIN "__main"
2818 #define SYMBOL__MAIN __main
2821 #ifdef INIT_SECTION_ASM_OP
2822 #undef HAS_INIT_SECTION
2823 #define HAS_INIT_SECTION
2826 #if !defined (HAS_INIT_SECTION) || !defined (OBJECT_FORMAT_ELF)
2827 /* Run all the global destructors on exit from the program. */
2830 __do_global_dtors ()
2832 #ifdef DO_GLOBAL_DTORS_BODY
2833 DO_GLOBAL_DTORS_BODY;
2835 static func_ptr *p = __DTOR_LIST__ + 1;
2845 #ifndef HAS_INIT_SECTION
2846 /* Run all the global constructors on entry to the program. */
2849 #define ON_EXIT(a, b)
2851 /* Make sure the exit routine is pulled in to define the globals as
2852 bss symbols, just in case the linker does not automatically pull
2853 bss definitions from the library. */
2855 extern int _exit_dummy_decl;
2856 int *_exit_dummy_ref = &_exit_dummy_decl;
2857 #endif /* ON_EXIT */
2860 __do_global_ctors ()
2862 DO_GLOBAL_CTORS_BODY;
2863 ON_EXIT (__do_global_dtors, 0);
2865 #endif /* no HAS_INIT_SECTION */
2867 #if !defined (HAS_INIT_SECTION) || defined (INVOKE__main)
2868 /* Subroutine called automatically by `main'.
2869 Compiling a global function named `main'
2870 produces an automatic call to this function at the beginning.
2872 For many systems, this routine calls __do_global_ctors.
2873 For systems which support a .init section we use the .init section
2874 to run __do_global_ctors, so we need not do anything here. */
2879 /* Support recursive calls to `main': run initializers just once. */
2880 static int initialized;
2884 __do_global_ctors ();
2887 #endif /* no HAS_INIT_SECTION or INVOKE__main */
2889 #endif /* L__main */
2893 #include "gbl-ctors.h"
2895 /* Provide default definitions for the lists of constructors and
2896 destructors, so that we don't get linker errors. These symbols are
2897 intentionally bss symbols, so that gld and/or collect will provide
2898 the right values. */
2900 /* We declare the lists here with two elements each,
2901 so that they are valid empty lists if no other definition is loaded. */
2902 #if !defined(INIT_SECTION_ASM_OP) && !defined(CTOR_LISTS_DEFINED_EXTERNALLY)
2903 #if defined(__NeXT__) || defined(_AIX)
2904 /* After 2.3, try this definition on all systems. */
2905 func_ptr __CTOR_LIST__[2] = {0, 0};
2906 func_ptr __DTOR_LIST__[2] = {0, 0};
2908 func_ptr __CTOR_LIST__[2];
2909 func_ptr __DTOR_LIST__[2];
2911 #endif /* no INIT_SECTION_ASM_OP and not CTOR_LISTS_DEFINED_EXTERNALLY */
2912 #endif /* L_ctors */
2916 #include "gbl-ctors.h"
2922 int _exit_dummy_decl = 0; /* prevent compiler & linker warnings */
2930 static func_ptr *atexit_chain = 0;
2931 static long atexit_chain_length = 0;
2932 static volatile long last_atexit_chain_slot = -1;
2934 int atexit (func_ptr func)
2936 if (++last_atexit_chain_slot == atexit_chain_length)
2938 atexit_chain_length += 32;
2940 atexit_chain = (func_ptr *) realloc (atexit_chain, atexit_chain_length
2941 * sizeof (func_ptr));
2943 atexit_chain = (func_ptr *) malloc (atexit_chain_length
2944 * sizeof (func_ptr));
2947 atexit_chain_length = 0;
2948 last_atexit_chain_slot = -1;
2953 atexit_chain[last_atexit_chain_slot] = func;
2956 #endif /* NEED_ATEXIT */
2958 /* If we have no known way of registering our own __do_global_dtors
2959 routine so that it will be invoked at program exit time, then we
2960 have to define our own exit routine which will get this to happen. */
2962 extern void __do_global_dtors ();
2963 extern void __bb_exit_func ();
2964 extern void _cleanup ();
2965 extern void _exit () __attribute__ ((noreturn));
2970 #if !defined (INIT_SECTION_ASM_OP) || !defined (OBJECT_FORMAT_ELF)
2974 for ( ; last_atexit_chain_slot-- >= 0; )
2976 (*atexit_chain[last_atexit_chain_slot + 1]) ();
2977 atexit_chain[last_atexit_chain_slot + 1] = 0;
2979 free (atexit_chain);
2982 #else /* No NEED_ATEXIT */
2983 __do_global_dtors ();
2984 #endif /* No NEED_ATEXIT */
2986 #ifndef inhibit_libc
2998 int _exit_dummy_decl = 0; /* prevent compiler & linker warnings */
3007 /* Shared exception handling support routines. */
3010 __default_terminate ()
3015 void (*__terminate_func)() = __default_terminate;
3020 (*__terminate_func)();
3024 __throw_type_match (void *catch_type, void *throw_type, void *obj)
3027 printf ("__throw_type_match (): catch_type = %s, throw_type = %s\n",
3028 catch_type, throw_type);
3030 if (strcmp ((const char *)catch_type, (const char *)throw_type) == 0)
3040 /* EH context structure. */
3044 void **dynamic_handler_chain;
3045 /* This is language dependent part of the eh context. */
3049 /* This is a safeguard for dynamic handler chain. */
3051 static void *top_elt[2];
3053 /* Allocate and return a new EH context structure. */
3055 extern void __throw ();
3060 struct eh_context *eh = (struct eh_context *) malloc (sizeof *eh);
3064 memset (eh, 0, sizeof *eh);
3066 eh->dynamic_handler_chain = top_elt;
3072 static __gthread_key_t eh_context_key;
3074 /* Destructor for struct eh_context. */
3076 eh_context_free (void *ptr)
3078 __gthread_key_dtor (eh_context_key, ptr);
3084 /* Pointer to function to return EH context. */
3086 static struct eh_context *eh_context_initialize ();
3087 static struct eh_context *eh_context_static ();
3089 static struct eh_context *eh_context_specific ();
3092 static struct eh_context *(*get_eh_context) () = &eh_context_initialize;
3094 /* Routine to get EH context.
3095 This one will simply call the function pointer. */
3100 return (void *) (*get_eh_context) ();
3103 /* Get and set the language specific info pointer. */
3108 struct eh_context *eh = (*get_eh_context) ();
3114 eh_threads_initialize ()
3116 /* Try to create the key. If it fails, revert to static method,
3117 otherwise start using thread specific EH contexts. */
3118 if (__gthread_key_create (&eh_context_key, &eh_context_free) == 0)
3119 get_eh_context = &eh_context_specific;
3121 get_eh_context = &eh_context_static;
3123 #endif /* no __GTHREADS */
3125 /* Initialize EH context.
3126 This will be called only once, since we change GET_EH_CONTEXT
3127 pointer to another routine. */
3129 static struct eh_context *
3130 eh_context_initialize ()
3134 static __gthread_once_t once = __GTHREAD_ONCE_INIT;
3135 if (__gthread_once (&once, eh_threads_initialize) == -1)
3137 /* Use static version of EH context. */
3138 get_eh_context = &eh_context_static;
3141 #else /* no __GTHREADS */
3143 /* Use static version of EH context. */
3144 get_eh_context = &eh_context_static;
3146 #endif /* no __GTHREADS */
3148 return (*get_eh_context) ();
3151 /* Return a static EH context. */
3153 static struct eh_context *
3154 eh_context_static ()
3156 static struct eh_context *eh;
3158 eh = new_eh_context ();
3163 /* Return a thread specific EH context. */
3165 static struct eh_context *
3166 eh_context_specific ()
3168 struct eh_context *eh;
3169 eh = (struct eh_context *) __gthread_getspecific (eh_context_key);
3172 eh = new_eh_context ();
3173 if (__gthread_setspecific (eh_context_key, (void *) eh) != 0)
3181 /* Support routines for setjmp/longjmp exception handling. */
3183 /* Calls to __sjthrow are generated by the compiler when an exception
3184 is raised when using the setjmp/longjmp exception handling codegen
3187 #ifdef DONT_USE_BUILTIN_SETJMP
3188 extern void longjmp (void *, int);
3191 /* Routine to get the head of the current thread's dynamic handler chain
3192 use for exception handling. */
3195 __get_dynamic_handler_chain ()
3197 struct eh_context *eh = (*get_eh_context) ();
3198 return &eh->dynamic_handler_chain;
3201 /* This is used to throw an exception when the setjmp/longjmp codegen
3202 method is used for exception handling.
3204 We call __terminate if there are no handlers left. Otherwise we run the
3205 cleanup actions off the dynamic cleanup stack, and pop the top of the
3206 dynamic handler chain, and use longjmp to transfer back to the associated
3212 struct eh_context *eh = (*get_eh_context) ();
3213 void ***dhc = &eh->dynamic_handler_chain;
3215 void (*func)(void *, int);
3219 /* The cleanup chain is one word into the buffer. Get the cleanup
3221 cleanup = (void***)&(*dhc)[1];
3223 /* If there are any cleanups in the chain, run them now. */
3227 void **buf = (void**)store;
3232 #ifdef DONT_USE_BUILTIN_SETJMP
3233 if (! setjmp (&buf[2]))
3235 if (! __builtin_setjmp (&buf[2]))
3241 func = (void(*)(void*, int))cleanup[0][1];
3242 arg = (void*)cleanup[0][2];
3244 /* Update this before running the cleanup. */
3245 cleanup[0] = (void **)cleanup[0][0];
3258 /* We must call terminate if we try and rethrow an exception, when
3259 there is no exception currently active and when there are no
3261 if (! eh->info || (*dhc) == top_elt)
3264 /* Find the jmpbuf associated with the top element of the dynamic
3265 handler chain. The jumpbuf starts two words into the buffer. */
3266 jmpbuf = &(*dhc)[2];
3268 /* Then we pop the top element off the dynamic handler chain. */
3269 *dhc = (void**)(*dhc)[0];
3271 /* And then we jump to the handler. */
3273 #ifdef DONT_USE_BUILTIN_SETJMP
3274 longjmp (jmpbuf, 1);
3276 __builtin_longjmp (jmpbuf, 1);
3280 /* Run cleanups on the dynamic cleanup stack for the current dynamic
3281 handler, then pop the handler off the dynamic handler stack, and
3282 then throw. This is used to skip the first handler, and transfer
3283 control to the next handler in the dynamic handler stack. */
3288 struct eh_context *eh = (*get_eh_context) ();
3289 void ***dhc = &eh->dynamic_handler_chain;
3291 void (*func)(void *, int);
3295 /* The cleanup chain is one word into the buffer. Get the cleanup
3297 cleanup = (void***)&(*dhc)[1];
3299 /* If there are any cleanups in the chain, run them now. */
3303 void **buf = (void**)store;
3308 #ifdef DONT_USE_BUILTIN_SETJMP
3309 if (! setjmp (&buf[2]))
3311 if (! __builtin_setjmp (&buf[2]))
3317 func = (void(*)(void*, int))cleanup[0][1];
3318 arg = (void*)cleanup[0][2];
3320 /* Update this before running the cleanup. */
3321 cleanup[0] = (void **)cleanup[0][0];
3334 /* Then we pop the top element off the dynamic handler chain. */
3335 *dhc = (void**)(*dhc)[0];
3340 /* Support code for all exception region-based exception handling. */
3342 /* This value identifies the place from which an exception is being
3345 #ifdef EH_TABLE_LOOKUP
3351 typedef struct exception_table {
3354 void *exception_handler;
3357 /* This routine takes a PC and a pointer to the exception region TABLE for
3358 its translation unit, and returns the address of the exception handler
3359 associated with the closest exception table handler entry associated
3360 with that PC, or 0 if there are no table entries the PC fits in.
3362 In the advent of a tie, we have to give the last entry, as it represents
3366 find_exception_handler (void *pc, exception_table *table)
3373 /* We can't do a binary search because the table isn't guaranteed
3374 to be sorted from function to function. */
3375 for (pos = 0; table[pos].exception_handler != (void *) -1; ++pos)
3377 if (table[pos].start <= pc && table[pos].end > pc)
3379 /* This can apply. Make sure it is at least as small as
3380 the previous best. */
3381 if (best == -1 || (table[pos].end <= table[best].end
3382 && table[pos].start >= table[best].start))
3385 /* But it is sorted by starting PC within a function. */
3386 else if (best >= 0 && table[pos].start > pc)
3390 return table[best].exception_handler;
3395 #endif /* EH_TABLE_LOOKUP */
3397 #ifdef DWARF2_UNWIND_INFO
3398 /* Support code for exception handling using static unwind information. */
3402 /* This type is used in get_reg and put_reg to deal with ABIs where a void*
3403 is smaller than a word, such as the Irix 6 n32 ABI. We cast twice to
3404 avoid a warning about casting between int and pointer of different
3407 typedef int ptr_type __attribute__ ((mode (pointer)));
3409 /* Get the value of register REG as saved in UDATA, where SUB_UDATA is a
3410 frame called by UDATA or 0. */
3413 get_reg (unsigned reg, frame_state *udata, frame_state *sub_udata)
3415 if (udata->saved[reg] == REG_SAVED_OFFSET)
3416 return (void *)(ptr_type)
3417 *(word_type *)(udata->cfa + udata->reg_or_offset[reg]);
3418 else if (udata->saved[reg] == REG_SAVED_REG && sub_udata)
3419 return get_reg (udata->reg_or_offset[reg], sub_udata, 0);
3424 /* Overwrite the saved value for register REG in frame UDATA with VAL. */
3427 put_reg (unsigned reg, void *val, frame_state *udata)
3429 if (udata->saved[reg] == REG_SAVED_OFFSET)
3430 *(word_type *)(udata->cfa + udata->reg_or_offset[reg])
3431 = (word_type)(ptr_type) val;
3436 /* Copy the saved value for register REG from frame UDATA to frame
3437 TARGET_UDATA. Unlike the previous two functions, this can handle
3438 registers that are not one word large. */
3441 copy_reg (unsigned reg, frame_state *udata, frame_state *target_udata)
3443 if (udata->saved[reg] == REG_SAVED_OFFSET
3444 && target_udata->saved[reg] == REG_SAVED_OFFSET)
3445 memcpy (target_udata->cfa + target_udata->reg_or_offset[reg],
3446 udata->cfa + udata->reg_or_offset[reg],
3447 __builtin_dwarf_reg_size (reg));
3452 /* Retrieve the return address for frame UDATA, where SUB_UDATA is a
3453 frame called by UDATA or 0. */
3455 static inline void *
3456 get_return_addr (frame_state *udata, frame_state *sub_udata)
3458 return __builtin_extract_return_addr
3459 (get_reg (udata->retaddr_column, udata, sub_udata));
3462 /* Overwrite the return address for frame UDATA with VAL. */
3465 put_return_addr (void *val, frame_state *udata)
3467 val = __builtin_frob_return_addr (val);
3468 put_reg (udata->retaddr_column, val, udata);
3471 /* Given the current frame UDATA and its return address PC, return the
3472 information about the calling frame in CALLER_UDATA. */
3475 next_stack_level (void *pc, frame_state *udata, frame_state *caller_udata)
3477 caller_udata = __frame_state_for (pc, caller_udata);
3481 /* Now go back to our caller's stack frame. If our caller's CFA register
3482 was saved in our stack frame, restore it; otherwise, assume the CFA
3483 register is SP and restore it to our CFA value. */
3484 if (udata->saved[caller_udata->cfa_reg])
3485 caller_udata->cfa = get_reg (caller_udata->cfa_reg, udata, 0);
3487 caller_udata->cfa = udata->cfa;
3488 caller_udata->cfa += caller_udata->cfa_offset;
3490 return caller_udata;
3493 #ifdef INCOMING_REGNO
3494 /* Is the saved value for register REG in frame UDATA stored in a register
3495 window in the previous frame? */
3498 in_reg_window (int reg, frame_state *udata)
3500 if (udata->saved[reg] != REG_SAVED_OFFSET)
3503 #ifdef STACK_GROWS_DOWNWARD
3504 return udata->reg_or_offset[reg] > 0;
3506 return udata->reg_or_offset[reg] < 0;
3509 #endif /* INCOMING_REGNO */
3511 /* We first search for an exception handler, and if we don't find
3512 it, we call __terminate on the current stack frame so that we may
3513 use the debugger to walk the stack and understand why no handler
3516 If we find one, then we unwind the frames down to the one that
3517 has the handler and transfer control into the handler. */
3522 struct eh_context *eh = (*get_eh_context) ();
3523 void *saved_pc, *pc, *handler, *retaddr;
3524 frame_state ustruct, ustruct2;
3525 frame_state *udata = &ustruct;
3526 frame_state *sub_udata = &ustruct2;
3527 frame_state my_ustruct, *my_udata = &my_ustruct;
3530 /* This is required for C++ semantics. We must call terminate if we
3531 try and rethrow an exception, when there is no exception currently
3536 /* Start at our stack frame. */
3538 udata = __frame_state_for (&&label, udata);
3542 /* We need to get the value from the CFA register. At this point in
3543 compiling __throw we don't know whether or not we will use the frame
3544 pointer register for the CFA, so we check our unwind info. */
3545 if (udata->cfa_reg == __builtin_dwarf_fp_regnum ())
3546 udata->cfa = __builtin_fp ();
3548 udata->cfa = __builtin_sp ();
3549 udata->cfa += udata->cfa_offset;
3551 memcpy (my_udata, udata, sizeof (*udata));
3553 /* Do any necessary initialization to access arbitrary stack frames.
3554 On the SPARC, this means flushing the register windows. */
3555 __builtin_unwind_init ();
3557 /* Now reset pc to the right throw point. */
3558 pc = __builtin_extract_return_addr (__builtin_return_address (0)) - 1;
3564 frame_state *p = udata;
3565 udata = next_stack_level (pc, udata, sub_udata);
3568 /* If we couldn't find the next frame, we lose. */
3572 handler = find_exception_handler (pc, udata->eh_ptr);
3574 /* If we found one, we can stop searching. */
3577 args_size = udata->args_size;
3581 /* Otherwise, we continue searching. We subtract 1 from PC to avoid
3582 hitting the beginning of the next region. */
3583 pc = get_return_addr (udata, sub_udata) - 1;
3586 /* If we haven't found a handler by now, this is an unhandled
3592 /* We found a handler in the throw context, no need to unwind. */
3599 /* Unwind all the frames between this one and the handler by copying
3600 their saved register values into our register save slots. */
3602 /* Remember the PC where we found the handler. */
3603 void *handler_pc = pc;
3605 /* Start from the throw context again. */
3607 memcpy (udata, my_udata, sizeof (*udata));
3609 while (pc != handler_pc)
3611 frame_state *p = udata;
3612 udata = next_stack_level (pc, udata, sub_udata);
3615 for (i = 0; i < FIRST_PSEUDO_REGISTER; ++i)
3616 if (i != udata->retaddr_column && udata->saved[i])
3618 #ifdef INCOMING_REGNO
3619 /* If you modify the saved value of the return address
3620 register on the SPARC, you modify the return address for
3621 your caller's frame. Don't do that here, as it will
3622 confuse get_return_addr. */
3623 if (in_reg_window (i, udata)
3624 && udata->saved[udata->retaddr_column] == REG_SAVED_REG
3625 && udata->reg_or_offset[udata->retaddr_column] == i)
3628 copy_reg (i, udata, my_udata);
3631 pc = get_return_addr (udata, sub_udata) - 1;
3634 #ifdef INCOMING_REGNO
3635 /* But we do need to update the saved return address register from
3636 the last frame we unwind, or the handler frame will have the wrong
3638 if (udata->saved[udata->retaddr_column] == REG_SAVED_REG)
3640 i = udata->reg_or_offset[udata->retaddr_column];
3641 if (in_reg_window (i, udata))
3642 copy_reg (i, udata, my_udata);
3646 /* udata now refers to the frame called by the handler frame. */
3648 /* Emit the stub to adjust sp and jump to the handler. */
3649 retaddr = __builtin_eh_stub ();
3651 /* And then set our return address to point to the stub. */
3652 if (my_udata->saved[my_udata->retaddr_column] == REG_SAVED_OFFSET)
3653 put_return_addr (retaddr, my_udata);
3655 __builtin_set_return_addr_reg (retaddr);
3657 /* Set up the registers we use to communicate with the stub.
3658 We check STACK_GROWS_DOWNWARD so the stub can use adjust_stack. */
3659 __builtin_set_eh_regs (handler,
3660 #ifdef STACK_GROWS_DOWNWARD
3661 udata->cfa - my_udata->cfa
3663 my_udata->cfa - udata->cfa
3668 /* Epilogue: restore the handler frame's register values and return
3671 #endif /* DWARF2_UNWIND_INFO */
3677 #ifndef inhibit_libc
3678 /* This gets us __GNU_LIBRARY__. */
3679 #undef NULL /* Avoid errors if stdio.h and our stddef.h mismatch. */
3682 #ifdef __GNU_LIBRARY__
3683 /* Avoid forcing the library's meaning of `write' on the user program
3684 by using the "internal" name (for use within the library) */
3685 #define write(fd, buf, n) __write((fd), (buf), (n))
3687 #endif /* inhibit_libc */
3689 #define MESSAGE "pure virtual method called\n"
3694 #ifndef inhibit_libc
3695 write (2, MESSAGE, sizeof (MESSAGE) - 1);