1 /* More subroutines needed by GCC output code on some machines. */
2 /* Compile this one with gcc. */
3 /* Copyright (C) 1989, 1992, 1993, 1994, 1995 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)
49 /* Permit the tm.h file to select the endianness to use just for this
50 file. This is used when the endianness is determined when the
53 #ifndef LIBGCC2_WORDS_BIG_ENDIAN
54 #define LIBGCC2_WORDS_BIG_ENDIAN WORDS_BIG_ENDIAN
57 /* In the first part of this file, we are interfacing to calls generated
58 by the compiler itself. These calls pass values into these routines
59 which have very specific modes (rather than very specific types), and
60 these compiler-generated calls also expect any return values to have
61 very specific modes (rather than very specific types). Thus, we need
62 to avoid using regular C language type names in this part of the file
63 because the sizes for those types can be configured to be anything.
64 Instead we use the following special type names. */
66 typedef unsigned int UQItype
__attribute__ ((mode (QI
)));
67 typedef int SItype
__attribute__ ((mode (SI
)));
68 typedef unsigned int USItype
__attribute__ ((mode (SI
)));
69 typedef int DItype
__attribute__ ((mode (DI
)));
70 typedef unsigned int UDItype
__attribute__ ((mode (DI
)));
72 typedef float SFtype
__attribute__ ((mode (SF
)));
73 typedef float DFtype
__attribute__ ((mode (DF
)));
75 #if LONG_DOUBLE_TYPE_SIZE == 96
76 typedef float XFtype
__attribute__ ((mode (XF
)));
78 #if LONG_DOUBLE_TYPE_SIZE == 128
79 typedef float TFtype
__attribute__ ((mode (TF
)));
82 typedef int word_type
__attribute__ ((mode (__word__
)));
84 /* Make sure that we don't accidentally use any normal C language built-in
85 type names in the first part of this file. Instead we want to use *only*
86 the type names defined above. The following macro definitions insure
87 that if we *do* accidentally use some normal C language built-in type name,
88 we will get a syntax error. */
90 #define char bogus_type
91 #define short bogus_type
92 #define int bogus_type
93 #define long bogus_type
94 #define unsigned bogus_type
95 #define float bogus_type
96 #define double bogus_type
98 #define SI_TYPE_SIZE (sizeof (SItype) * BITS_PER_UNIT)
100 /* DIstructs are pairs of SItype values in the order determined by
101 LIBGCC2_WORDS_BIG_ENDIAN. */
103 #if LIBGCC2_WORDS_BIG_ENDIAN
104 struct DIstruct
{SItype high
, low
;};
106 struct DIstruct
{SItype low
, high
;};
109 /* We need this union to unpack/pack DImode values, since we don't have
110 any arithmetic yet. Incoming DImode parameters are stored into the
111 `ll' field, and the unpacked result is read from the struct `s'. */
119 #if (defined (L_udivmoddi4) || defined (L_muldi3) || defined (L_udiv_w_sdiv)\
120 || defined (L_divdi3) || defined (L_udivdi3) \
121 || defined (L_moddi3) || defined (L_umoddi3))
123 #include "longlong.h"
125 #endif /* udiv or mul */
127 extern DItype
__fixunssfdi (SFtype a
);
128 extern DItype
__fixunsdfdi (DFtype a
);
129 #if LONG_DOUBLE_TYPE_SIZE == 96
130 extern DItype
__fixunsxfdi (XFtype a
);
132 #if LONG_DOUBLE_TYPE_SIZE == 128
133 extern DItype
__fixunstfdi (TFtype a
);
136 #if defined (L_negdi2) || defined (L_divdi3) || defined (L_moddi3)
137 #if defined (L_divdi3) || defined (L_moddi3)
150 w
.s
.high
= -uu
.s
.high
- ((USItype
) w
.s
.low
> 0);
171 bm
= (sizeof (SItype
) * BITS_PER_UNIT
) - b
;
175 w
.s
.low
= (USItype
)uu
.s
.high
>> -bm
;
179 USItype carries
= (USItype
)uu
.s
.high
<< bm
;
180 w
.s
.high
= (USItype
)uu
.s
.high
>> b
;
181 w
.s
.low
= ((USItype
)uu
.s
.low
>> b
) | carries
;
203 bm
= (sizeof (SItype
) * BITS_PER_UNIT
) - b
;
207 w
.s
.high
= (USItype
)uu
.s
.low
<< -bm
;
211 USItype carries
= (USItype
)uu
.s
.low
>> bm
;
212 w
.s
.low
= (USItype
)uu
.s
.low
<< b
;
213 w
.s
.high
= ((USItype
)uu
.s
.high
<< b
) | carries
;
235 bm
= (sizeof (SItype
) * BITS_PER_UNIT
) - b
;
238 /* w.s.high = 1..1 or 0..0 */
239 w
.s
.high
= uu
.s
.high
>> (sizeof (SItype
) * BITS_PER_UNIT
- 1);
240 w
.s
.low
= uu
.s
.high
>> -bm
;
244 USItype carries
= (USItype
)uu
.s
.high
<< bm
;
245 w
.s
.high
= uu
.s
.high
>> b
;
246 w
.s
.low
= ((USItype
)uu
.s
.low
>> b
) | carries
;
261 w
.s
.low
= ffs (uu
.s
.low
);
264 w
.s
.low
= ffs (uu
.s
.high
);
267 w
.s
.low
+= BITS_PER_UNIT
* sizeof (SItype
);
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 (rp
, a1
, a0
, d
)
297 USItype
*rp
, a1
, a0
, d
;
304 if (a1
< d
- a1
- (a0
>> (SI_TYPE_SIZE
- 1)))
306 /* dividend, divisor, and quotient are nonnegative */
307 sdiv_qrnnd (q
, r
, a1
, a0
, d
);
311 /* Compute c1*2^32 + c0 = a1*2^32 + a0 - 2^31*d */
312 sub_ddmmss (c1
, c0
, a1
, a0
, d
>> 1, d
<< (SI_TYPE_SIZE
- 1));
313 /* Divide (c1*2^32 + c0) by d */
314 sdiv_qrnnd (q
, r
, c1
, c0
, d
);
315 /* Add 2^31 to quotient */
316 q
+= (USItype
) 1 << (SI_TYPE_SIZE
- 1);
321 b1
= d
>> 1; /* d/2, between 2^30 and 2^31 - 1 */
322 c1
= a1
>> 1; /* A/2 */
323 c0
= (a1
<< (SI_TYPE_SIZE
- 1)) + (a0
>> 1);
325 if (a1
< b1
) /* A < 2^32*b1, so A/2 < 2^31*b1 */
327 sdiv_qrnnd (q
, r
, c1
, c0
, b1
); /* (A/2) / (d/2) */
329 r
= 2*r
+ (a0
& 1); /* Remainder from A/(2*b1) */
346 else if (c1
< b1
) /* So 2^31 <= (A/2)/b1 < 2^32 */
349 c0
= ~c0
; /* logical NOT */
351 sdiv_qrnnd (q
, r
, c1
, c0
, b1
); /* (A/2) / (d/2) */
353 q
= ~q
; /* (A/2)/b1 */
356 r
= 2*r
+ (a0
& 1); /* A/(2*b1) */
374 else /* Implies c1 = b1 */
375 { /* Hence a1 = d - 1 = 2*b1 - 1 */
393 /* If sdiv_qrnnd doesn't exist, define dummy __udiv_w_sdiv. */
395 __udiv_w_sdiv (rp
, a1
, a0
, d
)
396 USItype
*rp
, a1
, a0
, d
;
401 #if (defined (L_udivdi3) || defined (L_divdi3) || \
402 defined (L_umoddi3) || defined (L_moddi3))
407 static const UQItype __clz_tab
[] =
409 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,
410 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,
411 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,
412 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,
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,
415 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,
416 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,
419 #if (defined (L_udivdi3) || defined (L_divdi3) || \
420 defined (L_umoddi3) || defined (L_moddi3))
424 __udivmoddi4 (n
, d
, rp
)
431 USItype d0
, d1
, n0
, n1
, n2
;
443 #if !UDIV_NEEDS_NORMALIZATION
450 udiv_qrnnd (q0
, n0
, n1
, n0
, d0
);
453 /* Remainder in n0. */
460 d0
= 1 / d0
; /* Divide intentionally by zero. */
462 udiv_qrnnd (q1
, n1
, 0, n1
, d0
);
463 udiv_qrnnd (q0
, n0
, n1
, n0
, d0
);
465 /* Remainder in n0. */
476 #else /* UDIV_NEEDS_NORMALIZATION */
484 count_leading_zeros (bm
, d0
);
488 /* Normalize, i.e. make the most significant bit of the
492 n1
= (n1
<< bm
) | (n0
>> (SI_TYPE_SIZE
- bm
));
496 udiv_qrnnd (q0
, n0
, n1
, n0
, d0
);
499 /* Remainder in n0 >> bm. */
506 d0
= 1 / d0
; /* Divide intentionally by zero. */
508 count_leading_zeros (bm
, d0
);
512 /* From (n1 >= d0) /\ (the most significant bit of d0 is set),
513 conclude (the most significant bit of n1 is set) /\ (the
514 leading quotient digit q1 = 1).
516 This special case is necessary, not an optimization.
517 (Shifts counts of SI_TYPE_SIZE are undefined.) */
526 b
= SI_TYPE_SIZE
- bm
;
530 n1
= (n1
<< bm
) | (n0
>> b
);
533 udiv_qrnnd (q1
, n1
, n2
, n1
, d0
);
538 udiv_qrnnd (q0
, n0
, n1
, n0
, d0
);
540 /* Remainder in n0 >> bm. */
550 #endif /* UDIV_NEEDS_NORMALIZATION */
561 /* Remainder in n1n0. */
573 count_leading_zeros (bm
, d1
);
576 /* From (n1 >= d1) /\ (the most significant bit of d1 is set),
577 conclude (the most significant bit of n1 is set) /\ (the
578 quotient digit q0 = 0 or 1).
580 This special case is necessary, not an optimization. */
582 /* The condition on the next line takes advantage of that
583 n1 >= d1 (true due to program flow). */
584 if (n1
> d1
|| n0
>= d0
)
587 sub_ddmmss (n1
, n0
, n1
, n0
, d1
, d0
);
606 b
= SI_TYPE_SIZE
- bm
;
608 d1
= (d1
<< bm
) | (d0
>> b
);
611 n1
= (n1
<< bm
) | (n0
>> b
);
614 udiv_qrnnd (q0
, n1
, n2
, n1
, d1
);
615 umul_ppmm (m1
, m0
, q0
, d0
);
617 if (m1
> n1
|| (m1
== n1
&& m0
> n0
))
620 sub_ddmmss (m1
, m0
, m1
, m0
, d1
, d0
);
625 /* Remainder in (n1n0 - m1m0) >> bm. */
628 sub_ddmmss (n1
, n0
, n1
, n0
, m1
, m0
);
629 rr
.s
.low
= (n1
<< b
) | (n0
>> bm
);
630 rr
.s
.high
= n1
>> bm
;
644 UDItype
__udivmoddi4 ();
659 uu
.ll
= __negdi2 (uu
.ll
);
662 vv
.ll
= __negdi2 (vv
.ll
);
664 w
= __udivmoddi4 (uu
.ll
, vv
.ll
, (UDItype
*) 0);
673 UDItype
__udivmoddi4 ();
687 uu
.ll
= __negdi2 (uu
.ll
);
689 vv
.ll
= __negdi2 (vv
.ll
);
691 (void) __udivmoddi4 (uu
.ll
, vv
.ll
, &w
);
700 UDItype
__udivmoddi4 ();
707 (void) __udivmoddi4 (u
, v
, &w
);
714 UDItype
__udivmoddi4 ();
719 return __udivmoddi4 (n
, d
, (UDItype
*) 0);
730 au
.ll
= a
, bu
.ll
= b
;
732 if (au
.s
.high
< bu
.s
.high
)
734 else if (au
.s
.high
> bu
.s
.high
)
736 if ((USItype
) au
.s
.low
< (USItype
) bu
.s
.low
)
738 else if ((USItype
) au
.s
.low
> (USItype
) bu
.s
.low
)
751 au
.ll
= a
, bu
.ll
= b
;
753 if ((USItype
) au
.s
.high
< (USItype
) bu
.s
.high
)
755 else if ((USItype
) au
.s
.high
> (USItype
) bu
.s
.high
)
757 if ((USItype
) au
.s
.low
< (USItype
) bu
.s
.low
)
759 else if ((USItype
) au
.s
.low
> (USItype
) bu
.s
.low
)
765 #if defined(L_fixunstfdi) && (LONG_DOUBLE_TYPE_SIZE == 128)
766 #define WORD_SIZE (sizeof (SItype) * BITS_PER_UNIT)
767 #define HIGH_WORD_COEFF (((UDItype) 1) << WORD_SIZE)
779 /* Compute high word of result, as a flonum. */
780 b
= (a
/ HIGH_WORD_COEFF
);
781 /* Convert that to fixed (but not to DItype!),
782 and shift it into the high word. */
785 /* Remove high part from the TFtype, leaving the low part as flonum. */
787 /* Convert that to fixed (but not to DItype!) and add it in.
788 Sometimes A comes out negative. This is significant, since
789 A has more bits than a long int does. */
791 v
-= (USItype
) (- a
);
798 #if defined(L_fixtfdi) && (LONG_DOUBLE_TYPE_SIZE == 128)
804 return - __fixunstfdi (-a
);
805 return __fixunstfdi (a
);
809 #if defined(L_fixunsxfdi) && (LONG_DOUBLE_TYPE_SIZE == 96)
810 #define WORD_SIZE (sizeof (SItype) * BITS_PER_UNIT)
811 #define HIGH_WORD_COEFF (((UDItype) 1) << WORD_SIZE)
823 /* Compute high word of result, as a flonum. */
824 b
= (a
/ HIGH_WORD_COEFF
);
825 /* Convert that to fixed (but not to DItype!),
826 and shift it into the high word. */
829 /* Remove high part from the XFtype, leaving the low part as flonum. */
831 /* Convert that to fixed (but not to DItype!) and add it in.
832 Sometimes A comes out negative. This is significant, since
833 A has more bits than a long int does. */
835 v
-= (USItype
) (- a
);
842 #if defined(L_fixxfdi) && (LONG_DOUBLE_TYPE_SIZE == 96)
848 return - __fixunsxfdi (-a
);
849 return __fixunsxfdi (a
);
854 #define WORD_SIZE (sizeof (SItype) * BITS_PER_UNIT)
855 #define HIGH_WORD_COEFF (((UDItype) 1) << WORD_SIZE)
867 /* Compute high word of result, as a flonum. */
868 b
= (a
/ HIGH_WORD_COEFF
);
869 /* Convert that to fixed (but not to DItype!),
870 and shift it into the high word. */
873 /* Remove high part from the DFtype, leaving the low part as flonum. */
875 /* Convert that to fixed (but not to DItype!) and add it in.
876 Sometimes A comes out negative. This is significant, since
877 A has more bits than a long int does. */
879 v
-= (USItype
) (- a
);
892 return - __fixunsdfdi (-a
);
893 return __fixunsdfdi (a
);
898 #define WORD_SIZE (sizeof (SItype) * BITS_PER_UNIT)
899 #define HIGH_WORD_COEFF (((UDItype) 1) << WORD_SIZE)
902 __fixunssfdi (SFtype original_a
)
904 /* Convert the SFtype to a DFtype, because that is surely not going
905 to lose any bits. Some day someone else can write a faster version
906 that avoids converting to DFtype, and verify it really works right. */
907 DFtype a
= original_a
;
914 /* Compute high word of result, as a flonum. */
915 b
= (a
/ HIGH_WORD_COEFF
);
916 /* Convert that to fixed (but not to DItype!),
917 and shift it into the high word. */
920 /* Remove high part from the DFtype, leaving the low part as flonum. */
922 /* Convert that to fixed (but not to DItype!) and add it in.
923 Sometimes A comes out negative. This is significant, since
924 A has more bits than a long int does. */
926 v
-= (USItype
) (- a
);
938 return - __fixunssfdi (-a
);
939 return __fixunssfdi (a
);
943 #if defined(L_floatdixf) && (LONG_DOUBLE_TYPE_SIZE == 96)
944 #define WORD_SIZE (sizeof (SItype) * BITS_PER_UNIT)
945 #define HIGH_HALFWORD_COEFF (((UDItype) 1) << (WORD_SIZE / 2))
946 #define HIGH_WORD_COEFF (((UDItype) 1) << WORD_SIZE)
958 d
= (USItype
) (u
>> WORD_SIZE
);
959 d
*= HIGH_HALFWORD_COEFF
;
960 d
*= HIGH_HALFWORD_COEFF
;
961 d
+= (USItype
) (u
& (HIGH_WORD_COEFF
- 1));
963 return (negate
? -d
: d
);
967 #if defined(L_floatditf) && (LONG_DOUBLE_TYPE_SIZE == 128)
968 #define WORD_SIZE (sizeof (SItype) * BITS_PER_UNIT)
969 #define HIGH_HALFWORD_COEFF (((UDItype) 1) << (WORD_SIZE / 2))
970 #define HIGH_WORD_COEFF (((UDItype) 1) << WORD_SIZE)
982 d
= (USItype
) (u
>> WORD_SIZE
);
983 d
*= HIGH_HALFWORD_COEFF
;
984 d
*= HIGH_HALFWORD_COEFF
;
985 d
+= (USItype
) (u
& (HIGH_WORD_COEFF
- 1));
987 return (negate
? -d
: d
);
992 #define WORD_SIZE (sizeof (SItype) * BITS_PER_UNIT)
993 #define HIGH_HALFWORD_COEFF (((UDItype) 1) << (WORD_SIZE / 2))
994 #define HIGH_WORD_COEFF (((UDItype) 1) << WORD_SIZE)
1006 d
= (USItype
) (u
>> WORD_SIZE
);
1007 d
*= HIGH_HALFWORD_COEFF
;
1008 d
*= HIGH_HALFWORD_COEFF
;
1009 d
+= (USItype
) (u
& (HIGH_WORD_COEFF
- 1));
1011 return (negate
? -d
: d
);
1016 #define WORD_SIZE (sizeof (SItype) * BITS_PER_UNIT)
1017 #define HIGH_HALFWORD_COEFF (((UDItype) 1) << (WORD_SIZE / 2))
1018 #define HIGH_WORD_COEFF (((UDItype) 1) << WORD_SIZE)
1019 #define DI_SIZE (sizeof (DItype) * BITS_PER_UNIT)
1021 /* Define codes for all the float formats that we know of. Note
1022 that this is copied from real.h. */
1024 #define UNKNOWN_FLOAT_FORMAT 0
1025 #define IEEE_FLOAT_FORMAT 1
1026 #define VAX_FLOAT_FORMAT 2
1027 #define IBM_FLOAT_FORMAT 3
1029 /* Default to IEEE float if not specified. Nearly all machines use it. */
1030 #ifndef HOST_FLOAT_FORMAT
1031 #define HOST_FLOAT_FORMAT IEEE_FLOAT_FORMAT
1034 #if HOST_FLOAT_FORMAT == IEEE_FLOAT_FORMAT
1039 #if HOST_FLOAT_FORMAT == IBM_FLOAT_FORMAT
1044 #if HOST_FLOAT_FORMAT == VAX_FLOAT_FORMAT
1053 /* Do the calculation in DFmode
1054 so that we don't lose any of the precision of the high word
1055 while multiplying it. */
1062 /* Protect against double-rounding error.
1063 Represent any low-order bits, that might be truncated in DFmode,
1064 by a bit that won't be lost. The bit can go in anywhere below the
1065 rounding position of the SFmode. A fixed mask and bit position
1066 handles all usual configurations. It doesn't handle the case
1067 of 128-bit DImode, however. */
1068 if (DF_SIZE
< DI_SIZE
1069 && DF_SIZE
> (DI_SIZE
- DF_SIZE
+ SF_SIZE
))
1071 #define REP_BIT ((USItype) 1 << (DI_SIZE - DF_SIZE))
1072 if (u
>= ((UDItype
) 1 << DF_SIZE
))
1074 if ((USItype
) u
& (REP_BIT
- 1))
1078 f
= (USItype
) (u
>> WORD_SIZE
);
1079 f
*= HIGH_HALFWORD_COEFF
;
1080 f
*= HIGH_HALFWORD_COEFF
;
1081 f
+= (USItype
) (u
& (HIGH_WORD_COEFF
- 1));
1083 return (SFtype
) (negate
? -f
: f
);
1087 #if defined(L_fixunsxfsi) && LONG_DOUBLE_TYPE_SIZE == 96
1088 /* Reenable the normal types, in case limits.h needs them. */
1104 if (a
>= - (DFtype
) LONG_MIN
)
1105 return (SItype
) (a
+ LONG_MIN
) - LONG_MIN
;
1111 /* Reenable the normal types, in case limits.h needs them. */
1127 if (a
>= - (DFtype
) LONG_MIN
)
1128 return (SItype
) (a
+ LONG_MIN
) - LONG_MIN
;
1134 /* Reenable the normal types, in case limits.h needs them. */
1147 __fixunssfsi (SFtype a
)
1149 if (a
>= - (SFtype
) LONG_MIN
)
1150 return (SItype
) (a
+ LONG_MIN
) - LONG_MIN
;
1155 /* From here on down, the routines use normal data types. */
1157 #define SItype bogus_type
1158 #define USItype bogus_type
1159 #define DItype bogus_type
1160 #define UDItype bogus_type
1161 #define SFtype bogus_type
1162 #define DFtype bogus_type
1174 /* Like bcmp except the sign is meaningful.
1175 Result is negative if S1 is less than S2,
1176 positive if S1 is greater, 0 if S1 and S2 are equal. */
1179 __gcc_bcmp (s1
, s2
, size
)
1180 unsigned char *s1
, *s2
;
1185 unsigned char c1
= *s1
++, c2
= *s2
++;
1197 #if defined(__svr4__) || defined(__alliant__)
1201 /* The Alliant needs the added underscore. */
1202 asm (".globl __builtin_saveregs");
1203 asm ("__builtin_saveregs:");
1204 asm (".globl ___builtin_saveregs");
1205 asm ("___builtin_saveregs:");
1207 asm (" andnot 0x0f,%sp,%sp"); /* round down to 16-byte boundary */
1208 asm (" adds -96,%sp,%sp"); /* allocate stack space for reg save
1209 area and also for a new va_list
1211 /* Save all argument registers in the arg reg save area. The
1212 arg reg save area must have the following layout (according
1224 asm (" fst.q %f8, 0(%sp)"); /* save floating regs (f8-f15) */
1225 asm (" fst.q %f12,16(%sp)");
1227 asm (" st.l %r16,32(%sp)"); /* save integer regs (r16-r27) */
1228 asm (" st.l %r17,36(%sp)");
1229 asm (" st.l %r18,40(%sp)");
1230 asm (" st.l %r19,44(%sp)");
1231 asm (" st.l %r20,48(%sp)");
1232 asm (" st.l %r21,52(%sp)");
1233 asm (" st.l %r22,56(%sp)");
1234 asm (" st.l %r23,60(%sp)");
1235 asm (" st.l %r24,64(%sp)");
1236 asm (" st.l %r25,68(%sp)");
1237 asm (" st.l %r26,72(%sp)");
1238 asm (" st.l %r27,76(%sp)");
1240 asm (" adds 80,%sp,%r16"); /* compute the address of the new
1241 va_list structure. Put in into
1242 r16 so that it will be returned
1245 /* Initialize all fields of the new va_list structure. This
1246 structure looks like:
1249 unsigned long ireg_used;
1250 unsigned long freg_used;
1256 asm (" st.l %r0, 0(%r16)"); /* nfixed */
1257 asm (" st.l %r0, 4(%r16)"); /* nfloating */
1258 asm (" st.l %sp, 8(%r16)"); /* __va_ctl points to __va_struct. */
1259 asm (" bri %r1"); /* delayed return */
1260 asm (" st.l %r28,12(%r16)"); /* pointer to overflow args */
1262 #else /* not __svr4__ */
1263 #if defined(__PARAGON__)
1265 * we'll use SVR4-ish varargs but need SVR3.2 assembler syntax,
1266 * and we stand a better chance of hooking into libraries
1267 * compiled by PGI. [andyp@ssd.intel.com]
1271 asm (".globl __builtin_saveregs");
1272 asm ("__builtin_saveregs:");
1273 asm (".globl ___builtin_saveregs");
1274 asm ("___builtin_saveregs:");
1276 asm (" andnot 0x0f,sp,sp"); /* round down to 16-byte boundary */
1277 asm (" adds -96,sp,sp"); /* allocate stack space for reg save
1278 area and also for a new va_list
1280 /* Save all argument registers in the arg reg save area. The
1281 arg reg save area must have the following layout (according
1293 asm (" fst.q f8, 0(sp)");
1294 asm (" fst.q f12,16(sp)");
1295 asm (" st.l r16,32(sp)");
1296 asm (" st.l r17,36(sp)");
1297 asm (" st.l r18,40(sp)");
1298 asm (" st.l r19,44(sp)");
1299 asm (" st.l r20,48(sp)");
1300 asm (" st.l r21,52(sp)");
1301 asm (" st.l r22,56(sp)");
1302 asm (" st.l r23,60(sp)");
1303 asm (" st.l r24,64(sp)");
1304 asm (" st.l r25,68(sp)");
1305 asm (" st.l r26,72(sp)");
1306 asm (" st.l r27,76(sp)");
1308 asm (" adds 80,sp,r16"); /* compute the address of the new
1309 va_list structure. Put in into
1310 r16 so that it will be returned
1313 /* Initialize all fields of the new va_list structure. This
1314 structure looks like:
1317 unsigned long ireg_used;
1318 unsigned long freg_used;
1324 asm (" st.l r0, 0(r16)"); /* nfixed */
1325 asm (" st.l r0, 4(r16)"); /* nfloating */
1326 asm (" st.l sp, 8(r16)"); /* __va_ctl points to __va_struct. */
1327 asm (" bri r1"); /* delayed return */
1328 asm (" st.l r28,12(r16)"); /* pointer to overflow args */
1329 #else /* not __PARAGON__ */
1333 asm (".globl ___builtin_saveregs");
1334 asm ("___builtin_saveregs:");
1335 asm (" mov sp,r30");
1336 asm (" andnot 0x0f,sp,sp");
1337 asm (" adds -96,sp,sp"); /* allocate sufficient space on the stack */
1339 /* Fill in the __va_struct. */
1340 asm (" st.l r16, 0(sp)"); /* save integer regs (r16-r27) */
1341 asm (" st.l r17, 4(sp)"); /* int fixed[12] */
1342 asm (" st.l r18, 8(sp)");
1343 asm (" st.l r19,12(sp)");
1344 asm (" st.l r20,16(sp)");
1345 asm (" st.l r21,20(sp)");
1346 asm (" st.l r22,24(sp)");
1347 asm (" st.l r23,28(sp)");
1348 asm (" st.l r24,32(sp)");
1349 asm (" st.l r25,36(sp)");
1350 asm (" st.l r26,40(sp)");
1351 asm (" st.l r27,44(sp)");
1353 asm (" fst.q f8, 48(sp)"); /* save floating regs (f8-f15) */
1354 asm (" fst.q f12,64(sp)"); /* int floating[8] */
1356 /* Fill in the __va_ctl. */
1357 asm (" st.l sp, 80(sp)"); /* __va_ctl points to __va_struct. */
1358 asm (" st.l r28,84(sp)"); /* pointer to more args */
1359 asm (" st.l r0, 88(sp)"); /* nfixed */
1360 asm (" st.l r0, 92(sp)"); /* nfloating */
1362 asm (" adds 80,sp,r16"); /* return address of the __va_ctl. */
1364 asm (" mov r30,sp");
1365 /* recover stack and pass address to start
1367 #endif /* not __PARAGON__ */
1368 #endif /* not __svr4__ */
1369 #else /* not __i860__ */
1371 asm (".global __builtin_saveregs");
1372 asm ("__builtin_saveregs:");
1373 asm (".global ___builtin_saveregs");
1374 asm ("___builtin_saveregs:");
1375 #ifdef NEED_PROC_COMMAND
1378 asm ("st %i0,[%fp+68]");
1379 asm ("st %i1,[%fp+72]");
1380 asm ("st %i2,[%fp+76]");
1381 asm ("st %i3,[%fp+80]");
1382 asm ("st %i4,[%fp+84]");
1384 asm ("st %i5,[%fp+88]");
1385 #ifdef NEED_TYPE_COMMAND
1386 asm (".type __builtin_saveregs,#function");
1387 asm (".size __builtin_saveregs,.-__builtin_saveregs");
1389 #else /* not __sparc__ */
1390 #if defined(__MIPSEL__) | defined(__R3000__) | defined(__R2000__) | defined(__mips__)
1393 asm (" .ent __builtin_saveregs");
1394 asm (" .globl __builtin_saveregs");
1395 asm ("__builtin_saveregs:");
1396 asm (" sw $4,0($30)");
1397 asm (" sw $5,4($30)");
1398 asm (" sw $6,8($30)");
1399 asm (" sw $7,12($30)");
1401 asm (" .end __builtin_saveregs");
1402 #else /* not __mips__, etc. */
1405 __builtin_saveregs ()
1410 #endif /* not __mips__ */
1411 #endif /* not __sparc__ */
1412 #endif /* not __i860__ */
1416 #ifndef inhibit_libc
1418 #undef NULL /* Avoid errors if stdio.h and our stddef.h mismatch. */
1420 /* This is used by the `assert' macro. */
1422 __eprintf (string
, expression
, line
, filename
)
1424 const char *expression
;
1426 const char *filename
;
1428 fprintf (stderr
, string
, expression
, line
, filename
);
1438 /* Structure emitted by -a */
1442 const char *filename
;
1446 const unsigned long *addresses
;
1448 /* Older GCC's did not emit these fields. */
1450 const char **functions
;
1451 const long *line_nums
;
1452 const char **filenames
;
1456 #ifdef BLOCK_PROFILER_CODE
1459 #ifndef inhibit_libc
1461 /* Simple minded basic block profiling output dumper for
1462 systems that don't provide tcov support. At present,
1463 it requires atexit and stdio. */
1465 #undef NULL /* Avoid errors if stdio.h and our stddef.h mismatch. */
1471 extern int atexit (void (*) (void));
1473 extern void atexit (void (*) (void));
1475 #define ON_EXIT(FUNC,ARG) atexit ((FUNC))
1478 extern void on_exit (void*, void*);
1479 #define ON_EXIT(FUNC,ARG) on_exit ((FUNC), (ARG))
1483 static struct bb
*bb_head
;
1485 /* Return the number of digits needed to print a value */
1486 /* __inline__ */ static int num_digits (long value
, int base
)
1488 int minus
= (value
< 0 && base
!= 16);
1489 unsigned long v
= (minus
) ? -value
: value
;
1503 __bb_exit_func (void)
1505 FILE *file
= fopen ("bb.out", "a");
1515 /* This is somewhat type incorrect, but it avoids worrying about
1516 exactly where time.h is included from. It should be ok unless
1517 a void * differs from other pointer formats, or if sizeof (long)
1518 is < sizeof (time_t). It would be nice if we could assume the
1519 use of rationale standards here. */
1521 time ((void *) &time_value
);
1522 fprintf (file
, "Basic block profiling finished on %s\n", ctime ((void *) &time_value
));
1524 /* We check the length field explicitly in order to allow compatibility
1525 with older GCC's which did not provide it. */
1527 for (ptr
= bb_head
; ptr
!= (struct bb
*)0; ptr
= ptr
->next
)
1530 int func_p
= (ptr
->nwords
>= sizeof (struct bb
) && ptr
->nwords
<= 1000);
1531 int line_p
= (func_p
&& ptr
->line_nums
);
1532 int file_p
= (func_p
&& ptr
->filenames
);
1533 long ncounts
= ptr
->ncounts
;
1539 int blk_len
= num_digits (ncounts
, 10);
1544 fprintf (file
, "File %s, %ld basic blocks \n\n",
1545 ptr
->filename
, ncounts
);
1547 /* Get max values for each field. */
1548 for (i
= 0; i
< ncounts
; i
++)
1553 if (cnt_max
< ptr
->counts
[i
])
1554 cnt_max
= ptr
->counts
[i
];
1556 if (addr_max
< ptr
->addresses
[i
])
1557 addr_max
= ptr
->addresses
[i
];
1559 if (line_p
&& line_max
< ptr
->line_nums
[i
])
1560 line_max
= ptr
->line_nums
[i
];
1564 p
= (ptr
->functions
[i
]) ? (ptr
->functions
[i
]) : "<none>";
1572 p
= (ptr
->filenames
[i
]) ? (ptr
->filenames
[i
]) : "<none>";
1579 addr_len
= num_digits (addr_max
, 16);
1580 cnt_len
= num_digits (cnt_max
, 10);
1581 line_len
= num_digits (line_max
, 10);
1583 /* Now print out the basic block information. */
1584 for (i
= 0; i
< ncounts
; i
++)
1587 " Block #%*d: executed %*ld time(s) address= 0x%.*lx",
1589 cnt_len
, ptr
->counts
[i
],
1590 addr_len
, ptr
->addresses
[i
]);
1593 fprintf (file
, " function= %-*s", func_len
,
1594 (ptr
->functions
[i
]) ? ptr
->functions
[i
] : "<none>");
1597 fprintf (file
, " line= %*ld", line_len
, ptr
->line_nums
[i
]);
1600 fprintf (file
, " file= %s",
1601 (ptr
->filenames
[i
]) ? ptr
->filenames
[i
] : "<none>");
1603 fprintf (file
, "\n");
1606 fprintf (file
, "\n");
1610 fprintf (file
, "\n\n");
1616 __bb_init_func (struct bb
*blocks
)
1618 /* User is supposed to check whether the first word is non-0,
1619 but just in case.... */
1621 if (blocks
->zero_word
)
1625 /* Initialize destructor. */
1627 ON_EXIT (__bb_exit_func
, 0);
1630 /* Set up linked list. */
1631 blocks
->zero_word
= 1;
1632 blocks
->next
= bb_head
;
1636 #ifndef MACHINE_STATE_SAVE
1637 #define MACHINE_STATE_SAVE(ID)
1639 #ifndef MACHINE_STATE_RESTORE
1640 #define MACHINE_STATE_RESTORE(ID)
1645 /* Number of buckets in hashtable of basic block addresses. */
1647 #define BB_BUCKETS 311
1649 /* Maximum length of string in file bb.in. */
1651 #define BBINBUFSIZE 500
1653 /* BBINBUFSIZE-1 with double quotes. We could use #BBINBUFSIZE or
1654 "BBINBUFSIZE" but want to avoid trouble with preprocessors. */
1656 #define BBINBUFSIZESTR "499"
1660 struct bb_edge
*next
;
1661 unsigned long src_addr
;
1662 unsigned long dst_addr
;
1663 unsigned long count
;
1668 TRACE_KEEP
= 0, TRACE_ON
= 1, TRACE_OFF
= 2
1673 struct bb_func
*next
;
1676 enum bb_func_mode mode
;
1679 /* This is the connection to the outside world.
1680 The BLOCK_PROFILER macro must set __bb.blocks
1681 and __bb.blockno. */
1684 unsigned long blockno
;
1688 /* Vars to store addrs of source and destination basic blocks
1691 static unsigned long bb_src
= 0;
1692 static unsigned long bb_dst
= 0;
1694 static FILE *bb_tracefile
= (FILE*)0;
1695 static struct bb_edge
**bb_hashbuckets
= (struct bb_edge
**)0;
1696 static struct bb_func
*bb_func_head
= (struct bb_func
*)0;
1697 static unsigned long bb_callcount
= 0;
1698 static int bb_mode
= 0;
1700 static unsigned long *bb_stack
= (unsigned long *)0;
1701 static size_t bb_stacksize
= 0;
1703 static int reported
= 0;
1706 Always : Print execution frequencies of basic blocks
1708 bb_mode & 1 != 0 : Dump trace of basic blocks to file bbtrace[.gz]
1709 bb_mode & 2 != 0 : Print jump frequencies to file bb.out.
1710 bb_mode & 4 != 0 : Cut call instructions from basic block flow.
1711 bb_mode & 8 != 0 : Insert return instructions in basic block flow.
1716 /*#include <sys/types.h>*/
1717 #include <sys/stat.h>
1718 /*#include <malloc.h>*/
1720 /* Commands executed by gopen. */
1722 #define GOPENDECOMPRESS "gzip -cd "
1723 #define GOPENCOMPRESS "gzip -c >"
1725 /* Like fopen but pipes through gzip. mode may only be "r" or "w".
1726 If it does not compile, simply replace gopen by fopen and delete
1727 '.gz' from any first parameter to gopen. */
1740 if (mode
[0] != 'r' && mode
[0] != 'w')
1743 p
= fn
+ strlen (fn
)-1;
1744 use_gzip
= ((p
[-1] == '.' && (p
[0] == 'Z' || p
[0] == 'z')) ||
1745 (p
[-2] == '.' && p
[-1] == 'g' && p
[0] == 'z'));
1752 char *s
= (char*) malloc (sizeof (char) * strlen (fn
)
1753 + sizeof (GOPENDECOMPRESS
));
1754 strcpy (s
, GOPENDECOMPRESS
);
1755 strcpy (s
+ (sizeof (GOPENDECOMPRESS
)-1), fn
);
1756 f
= popen (s
, mode
);
1764 char *s
= (char*) malloc (sizeof (char) * strlen (fn
)
1765 + sizeof (GOPENCOMPRESS
));
1766 strcpy (s
, GOPENCOMPRESS
);
1767 strcpy (s
+ (sizeof (GOPENCOMPRESS
)-1), fn
);
1768 if (!(f
= popen (s
, mode
)))
1769 f
= fopen (s
, mode
);
1776 return fopen (fn
, mode
);
1787 if (!fstat (fileno (f
), &buf
) && S_ISFIFO (buf
.st_mode
))
1795 #endif /* HAVE_POPEN */
1797 /* Called once per program. */
1800 __bb_exit_trace_func ()
1802 FILE *file
= fopen ("bb.out", "a");
1816 gclose (bb_tracefile
);
1818 fclose (bb_tracefile
);
1819 #endif /* HAVE_POPEN */
1822 /* Check functions in `bb.in'. */
1827 const struct bb_func
*p
;
1828 int printed_something
= 0;
1832 /* This is somewhat type incorrect. */
1833 time ((void *) &time_value
);
1835 for (p
= bb_func_head
; p
!= (struct bb_func
*)0; p
= p
->next
)
1837 for (ptr
= bb_head
; ptr
!= (struct bb
*)0; ptr
= ptr
->next
)
1839 if (!ptr
->filename
|| p
->filename
!= (char *)0 && strcmp (p
->filename
, ptr
->filename
))
1841 for (blk
= 0; blk
< ptr
->ncounts
; blk
++)
1843 if (!strcmp (p
->funcname
, ptr
->functions
[blk
]))
1848 if (!printed_something
)
1850 fprintf (file
, "Functions in `bb.in' not executed during basic block profiling on %s\n", ctime ((void *) &time_value
));
1851 printed_something
= 1;
1854 fprintf (file
, "\tFunction %s", p
->funcname
);
1856 fprintf (file
, " of file %s", p
->filename
);
1857 fprintf (file
, "\n" );
1862 if (printed_something
)
1863 fprintf (file
, "\n");
1869 if (!bb_hashbuckets
)
1873 fprintf (stderr
, "Profiler: out of memory\n");
1883 unsigned long addr_max
= 0;
1884 unsigned long cnt_max
= 0;
1888 /* This is somewhat type incorrect, but it avoids worrying about
1889 exactly where time.h is included from. It should be ok unless
1890 a void * differs from other pointer formats, or if sizeof (long)
1891 is < sizeof (time_t). It would be nice if we could assume the
1892 use of rationale standards here. */
1894 time ((void *) &time_value
);
1895 fprintf (file
, "Basic block jump tracing");
1897 switch (bb_mode
& 12)
1900 fprintf (file
, " (with call)");
1904 /* Print nothing. */
1908 fprintf (file
, " (with call & ret)");
1912 fprintf (file
, " (with ret)");
1916 fprintf (file
, " finished on %s\n", ctime ((void *) &time_value
));
1918 for (i
= 0; i
< BB_BUCKETS
; i
++)
1920 struct bb_edge
*bucket
= bb_hashbuckets
[i
];
1921 for ( ; bucket
; bucket
= bucket
->next
)
1923 if (addr_max
< bucket
->src_addr
)
1924 addr_max
= bucket
->src_addr
;
1925 if (addr_max
< bucket
->dst_addr
)
1926 addr_max
= bucket
->dst_addr
;
1927 if (cnt_max
< bucket
->count
)
1928 cnt_max
= bucket
->count
;
1931 addr_len
= num_digits (addr_max
, 16);
1932 cnt_len
= num_digits (cnt_max
, 10);
1934 for ( i
= 0; i
< BB_BUCKETS
; i
++)
1936 struct bb_edge
*bucket
= bb_hashbuckets
[i
];
1937 for ( ; bucket
; bucket
= bucket
->next
)
1939 fprintf (file
, "Jump from block 0x%.*lx to "
1940 "block 0x%.*lx executed %*d time(s)\n",
1941 addr_len
, bucket
->src_addr
,
1942 addr_len
, bucket
->dst_addr
,
1943 cnt_len
, bucket
->count
);
1947 fprintf (file
, "\n");
1955 /* Free allocated memory. */
1960 struct bb_func
*old
= f
;
1963 if (old
->funcname
) free (old
->funcname
);
1964 if (old
->filename
) free (old
->filename
);
1975 for (i
= 0; i
< BB_BUCKETS
; i
++)
1977 struct bb_edge
*old
, *bucket
= bb_hashbuckets
[i
];
1982 bucket
= bucket
->next
;
1986 free (bb_hashbuckets
);
1989 for (b
= bb_head
; b
; b
= b
->next
)
1990 if (b
->flags
) free (b
->flags
);
1993 /* Called once per program. */
2000 char buf
[BBINBUFSIZE
];
2003 enum bb_func_mode m
;
2006 /* Initialize destructor. */
2007 ON_EXIT (__bb_exit_func
, 0);
2010 if (!(file
= fopen ("bb.in", "r")))
2013 while(fscanf (file
, " %" BBINBUFSIZESTR
"s ", buf
) != EOF
)
2025 if (!strcmp (p
, "__bb_trace__"))
2027 else if (!strcmp (p
, "__bb_jumps__"))
2029 else if (!strcmp (p
, "__bb_hidecall__"))
2031 else if (!strcmp (p
, "__bb_showret__"))
2035 struct bb_func
*f
= (struct bb_func
*) malloc (sizeof (struct bb_func
));
2039 f
->next
= bb_func_head
;
2040 if (pos
= strchr (p
, ':'))
2042 if (!(f
->funcname
= (char*) malloc (strlen (pos
+1)+1)))
2044 strcpy (f
->funcname
, pos
+1);
2046 if ((f
->filename
= (char*) malloc (l
+1)))
2048 strncpy (f
->filename
, p
, l
);
2049 f
->filename
[l
] = '\0';
2052 f
->filename
= (char*)0;
2056 if (!(f
->funcname
= (char*) malloc (strlen (p
)+1)))
2058 strcpy (f
->funcname
, p
);
2059 f
->filename
= (char*)0;
2071 bb_tracefile
= gopen ("bbtrace.gz", "w");
2076 bb_tracefile
= fopen ("bbtrace", "w");
2078 #endif /* HAVE_POPEN */
2082 bb_hashbuckets
= (struct bb_edge
**)
2083 malloc (BB_BUCKETS
* sizeof (struct bb_edge
*));
2085 bzero ((char *) bb_hashbuckets
, BB_BUCKETS
);
2091 bb_stack
= (unsigned long *) malloc (bb_stacksize
* sizeof (*bb_stack
));
2095 /* Initialize destructor. */
2096 ON_EXIT (__bb_exit_trace_func
, 0);
2101 /* Called upon entering a basic block. */
2106 struct bb_edge
*bucket
;
2108 MACHINE_STATE_SAVE("1")
2110 if (!bb_callcount
|| (__bb
.blocks
->flags
&& (__bb
.blocks
->flags
[__bb
.blockno
] & TRACE_OFF
)))
2113 bb_dst
= __bb
.blocks
->addresses
[__bb
.blockno
];
2114 __bb
.blocks
->counts
[__bb
.blockno
]++;
2118 fwrite (&bb_dst
, sizeof (unsigned long), 1, bb_tracefile
);
2123 struct bb_edge
**startbucket
, **oldnext
;
2125 oldnext
= startbucket
=
2126 & bb_hashbuckets
[ (((int)bb_src
*8)^(int)bb_dst
) % BB_BUCKETS
];
2127 bucket
= *startbucket
;
2129 for (bucket
= *startbucket
; bucket
;
2130 oldnext
= &(bucket
->next
), bucket
= *oldnext
)
2132 if ( bucket
->src_addr
== bb_src
&&
2133 bucket
->dst_addr
== bb_dst
)
2136 *oldnext
= bucket
->next
;
2137 bucket
->next
= *startbucket
;
2138 *startbucket
= bucket
;
2143 bucket
= (struct bb_edge
*) malloc (sizeof (struct bb_edge
));
2149 fprintf (stderr
, "Profiler: out of memory\n");
2156 bucket
->src_addr
= bb_src
;
2157 bucket
->dst_addr
= bb_dst
;
2158 bucket
->next
= *startbucket
;
2159 *startbucket
= bucket
;
2170 MACHINE_STATE_RESTORE("1")
2174 /* Called when returning from a function and `__bb_showret__' is set. */
2177 __bb_trace_func_ret ()
2179 struct bb_edge
*bucket
;
2181 if (!bb_callcount
|| (__bb
.blocks
->flags
&& (__bb
.blocks
->flags
[__bb
.blockno
] & TRACE_OFF
)))
2186 struct bb_edge
**startbucket
, **oldnext
;
2188 oldnext
= startbucket
=
2189 & bb_hashbuckets
[ (((int)bb_dst
*8)^(int)bb_src
) % BB_BUCKETS
];
2190 bucket
= *startbucket
;
2192 for (bucket
= *startbucket
; bucket
;
2193 oldnext
= &(bucket
->next
), bucket
= *oldnext
)
2195 if ( bucket
->src_addr
== bb_dst
&&
2196 bucket
->dst_addr
== bb_src
)
2199 *oldnext
= bucket
->next
;
2200 bucket
->next
= *startbucket
;
2201 *startbucket
= bucket
;
2206 bucket
= (struct bb_edge
*) malloc (sizeof (struct bb_edge
));
2212 fprintf (stderr
, "Profiler: out of memory\n");
2219 bucket
->src_addr
= bb_dst
;
2220 bucket
->dst_addr
= bb_src
;
2221 bucket
->next
= *startbucket
;
2222 *startbucket
= bucket
;
2235 /* Called upon entering the first function of a file. */
2238 __bb_init_file (blocks
)
2242 const struct bb_func
*p
;
2243 long blk
, ncounts
= blocks
->ncounts
;
2244 const char **functions
= blocks
->functions
;
2246 /* Set up linked list. */
2247 blocks
->zero_word
= 1;
2248 blocks
->next
= bb_head
;
2252 if (!bb_func_head
||
2253 !(blocks
->flags
= (char*) malloc (sizeof (char) * blocks
->ncounts
)))
2256 for (blk
= 0; blk
< ncounts
; blk
++)
2257 blocks
->flags
[blk
] = 0;
2259 for (blk
= 0; blk
< ncounts
; blk
++)
2261 for (p
= bb_func_head
; p
; p
= p
->next
)
2263 if (!strcmp (p
->funcname
, functions
[blk
]) &&
2264 (!p
->filename
|| !strcmp (p
->filename
, blocks
->filename
)))
2266 blocks
->flags
[blk
] |= p
->mode
;
2273 /* Called when exiting from a function. */
2279 MACHINE_STATE_SAVE("2")
2283 if ((bb_mode
& 12) && bb_stacksize
> bb_callcount
)
2285 bb_src
= bb_stack
[bb_callcount
];
2287 __bb_trace_func_ret ();
2293 MACHINE_STATE_RESTORE("2")
2297 /* Called when entering a function. */
2300 __bb_init_trace_func (blocks
, blockno
)
2302 unsigned long blockno
;
2304 static int trace_init
= 0;
2306 MACHINE_STATE_SAVE("3")
2308 if (!blocks
->zero_word
)
2315 __bb_init_file (blocks
);
2325 if (bb_callcount
>= bb_stacksize
)
2327 size_t newsize
= bb_callcount
+ 100;
2329 bb_stack
= (unsigned long *) realloc (bb_stack
, newsize
);
2334 fprintf (stderr
, "Profiler: out of memory\n");
2338 goto stack_overflow
;
2340 bb_stacksize
= newsize
;
2342 bb_stack
[bb_callcount
] = bb_src
;
2353 else if (blocks
->flags
&& (blocks
->flags
[blockno
] & TRACE_ON
))
2359 bb_stack
[bb_callcount
] = bb_src
;
2362 MACHINE_STATE_RESTORE("3")
2365 #endif /* not inhibit_libc */
2366 #endif /* not BLOCK_PROFILER_CODE */
2369 /* Default free-store management functions for C++, per sections 12.5 and
2370 17.3.3 of the Working Paper. */
2373 /* operator new (size_t), described in 17.3.3.5. This function is used by
2374 C++ programs to allocate a block of memory to hold a single object. */
2376 typedef void (*vfp
)(void);
2377 extern vfp __new_handler
;
2378 extern void __default_new_handler (void);
2381 void * __builtin_new (size_t sz
)
2382 __attribute__ ((weak
, alias ("___builtin_new")));
2384 ___builtin_new (size_t sz
)
2387 __builtin_new (size_t sz
)
2391 vfp handler
= (__new_handler
) ? __new_handler
: __default_new_handler
;
2393 /* malloc (0) is unpredictable; avoid it. */
2396 p
= (void *) malloc (sz
);
2400 p
= (void *) malloc (sz
);
2405 #endif /* L_op_new */
2408 /* void * operator new [] (size_t), described in 17.3.3.6. This function
2409 is used by C++ programs to allocate a block of memory for an array. */
2411 extern void * __builtin_new (size_t);
2414 void * __builtin_vec_new (size_t sz
)
2415 __attribute__ ((weak
, alias ("___builtin_vec_new")));
2417 ___builtin_vec_new (size_t sz
)
2420 __builtin_vec_new (size_t sz
)
2423 return __builtin_new (sz
);
2425 #endif /* L_op_vnew */
2427 #ifdef L_new_handler
2428 /* set_new_handler (fvoid_t *) and the default new handler, described in
2429 17.3.3.2 and 17.3.3.5. These functions define the result of a failure
2430 to allocate the amount of memory requested from operator new or new []. */
2432 #ifndef inhibit_libc
2433 /* This gets us __GNU_LIBRARY__. */
2434 #undef NULL /* Avoid errors if stdio.h and our stddef.h mismatch. */
2437 #ifdef __GNU_LIBRARY__
2438 /* Avoid forcing the library's meaning of `write' on the user program
2439 by using the "internal" name (for use within the library) */
2440 #define write(fd, buf, n) __write((fd), (buf), (n))
2442 #endif /* inhibit_libc */
2444 typedef void (*vfp
)(void);
2445 void __default_new_handler (void);
2447 vfp __new_handler
= (vfp
)0;
2450 set_new_handler (vfp handler
)
2454 prev_handler
= __new_handler
;
2455 if (handler
== 0) handler
= __default_new_handler
;
2456 __new_handler
= handler
;
2457 return prev_handler
;
2460 #define MESSAGE "Virtual memory exceeded in `new'\n"
2463 __default_new_handler ()
2465 #ifndef inhibit_libc
2466 /* don't use fprintf (stderr, ...) because it may need to call malloc. */
2467 /* This should really print the name of the program, but that is hard to
2468 do. We need a standard, clean way to get at the name. */
2469 write (2, MESSAGE
, sizeof (MESSAGE
));
2471 /* don't call exit () because that may call global destructors which
2472 may cause a loop. */
2478 /* operator delete (void *), described in 17.3.3.3. This function is used
2479 by C++ programs to return to the free store a block of memory allocated
2480 as a single object. */
2483 void __builtin_delete (void *ptr
)
2484 __attribute__ ((weak
, alias ("___builtin_delete")));
2486 ___builtin_delete (void *ptr
)
2489 __builtin_delete (void *ptr
)
2498 /* operator delete [] (void *), described in 17.3.3.4. This function is
2499 used by C++ programs to return to the free store a block of memory
2500 allocated as an array. */
2502 extern void __builtin_delete (void *);
2505 void __builtin_vec_delete (void *ptr
)
2506 __attribute__ ((weak
, alias ("___builtin_vec_delete")));
2508 ___builtin_vec_delete (void *ptr
)
2511 __builtin_vec_delete (void *ptr
)
2514 __builtin_delete (ptr
);
2518 /* End of C++ free-store management functions */
2521 unsigned int __shtab
[] = {
2522 0x00000001, 0x00000002, 0x00000004, 0x00000008,
2523 0x00000010, 0x00000020, 0x00000040, 0x00000080,
2524 0x00000100, 0x00000200, 0x00000400, 0x00000800,
2525 0x00001000, 0x00002000, 0x00004000, 0x00008000,
2526 0x00010000, 0x00020000, 0x00040000, 0x00080000,
2527 0x00100000, 0x00200000, 0x00400000, 0x00800000,
2528 0x01000000, 0x02000000, 0x04000000, 0x08000000,
2529 0x10000000, 0x20000000, 0x40000000, 0x80000000
2533 #ifdef L_clear_cache
2534 /* Clear part of an instruction cache. */
2536 #define INSN_CACHE_PLANE_SIZE (INSN_CACHE_SIZE / INSN_CACHE_DEPTH)
2539 __clear_cache (beg
, end
)
2542 #ifdef CLEAR_INSN_CACHE
2543 CLEAR_INSN_CACHE (beg
, end
);
2545 #ifdef INSN_CACHE_SIZE
2546 static char array
[INSN_CACHE_SIZE
+ INSN_CACHE_PLANE_SIZE
+ INSN_CACHE_LINE_WIDTH
];
2547 static int initialized
;
2551 typedef (*function_ptr
) ();
2553 #if (INSN_CACHE_SIZE / INSN_CACHE_LINE_WIDTH) < 16
2554 /* It's cheaper to clear the whole cache.
2555 Put in a series of jump instructions so that calling the beginning
2556 of the cache will clear the whole thing. */
2560 int ptr
= (((int) array
+ INSN_CACHE_LINE_WIDTH
- 1)
2561 & -INSN_CACHE_LINE_WIDTH
);
2562 int end_ptr
= ptr
+ INSN_CACHE_SIZE
;
2564 while (ptr
< end_ptr
)
2566 *(INSTRUCTION_TYPE
*)ptr
2567 = JUMP_AHEAD_INSTRUCTION
+ INSN_CACHE_LINE_WIDTH
;
2568 ptr
+= INSN_CACHE_LINE_WIDTH
;
2570 *(INSTRUCTION_TYPE
*)(ptr
- INSN_CACHE_LINE_WIDTH
) = RETURN_INSTRUCTION
;
2575 /* Call the beginning of the sequence. */
2576 (((function_ptr
) (((int) array
+ INSN_CACHE_LINE_WIDTH
- 1)
2577 & -INSN_CACHE_LINE_WIDTH
))
2580 #else /* Cache is large. */
2584 int ptr
= (((int) array
+ INSN_CACHE_LINE_WIDTH
- 1)
2585 & -INSN_CACHE_LINE_WIDTH
);
2587 while (ptr
< (int) array
+ sizeof array
)
2589 *(INSTRUCTION_TYPE
*)ptr
= RETURN_INSTRUCTION
;
2590 ptr
+= INSN_CACHE_LINE_WIDTH
;
2596 /* Find the location in array that occupies the same cache line as BEG. */
2598 offset
= ((int) beg
& -INSN_CACHE_LINE_WIDTH
) & (INSN_CACHE_PLANE_SIZE
- 1);
2599 start_addr
= (((int) (array
+ INSN_CACHE_PLANE_SIZE
- 1)
2600 & -INSN_CACHE_PLANE_SIZE
)
2603 /* Compute the cache alignment of the place to stop clearing. */
2604 #if 0 /* This is not needed for gcc's purposes. */
2605 /* If the block to clear is bigger than a cache plane,
2606 we clear the entire cache, and OFFSET is already correct. */
2607 if (end
< beg
+ INSN_CACHE_PLANE_SIZE
)
2609 offset
= (((int) (end
+ INSN_CACHE_LINE_WIDTH
- 1)
2610 & -INSN_CACHE_LINE_WIDTH
)
2611 & (INSN_CACHE_PLANE_SIZE
- 1));
2613 #if INSN_CACHE_DEPTH > 1
2614 end_addr
= (start_addr
& -INSN_CACHE_PLANE_SIZE
) + offset
;
2615 if (end_addr
<= start_addr
)
2616 end_addr
+= INSN_CACHE_PLANE_SIZE
;
2618 for (plane
= 0; plane
< INSN_CACHE_DEPTH
; plane
++)
2620 int addr
= start_addr
+ plane
* INSN_CACHE_PLANE_SIZE
;
2621 int stop
= end_addr
+ plane
* INSN_CACHE_PLANE_SIZE
;
2623 while (addr
!= stop
)
2625 /* Call the return instruction at ADDR. */
2626 ((function_ptr
) addr
) ();
2628 addr
+= INSN_CACHE_LINE_WIDTH
;
2631 #else /* just one plane */
2634 /* Call the return instruction at START_ADDR. */
2635 ((function_ptr
) start_addr
) ();
2637 start_addr
+= INSN_CACHE_LINE_WIDTH
;
2639 while ((start_addr
% INSN_CACHE_SIZE
) != offset
);
2640 #endif /* just one plane */
2641 #endif /* Cache is large */
2642 #endif /* Cache exists */
2643 #endif /* CLEAR_INSN_CACHE */
2646 #endif /* L_clear_cache */
2650 /* Jump to a trampoline, loading the static chain address. */
2663 int mprotect(addr
, len
, prot
)
2669 if (prot
== 7) np
= 0x40;
2670 else if (prot
== 5) np
= 0x20;
2671 else if (prot
== 4) np
= 0x10;
2672 else if (prot
== 3) np
= 0x04;
2673 else if (prot
== 1) np
= 0x02;
2674 else if (prot
== 0) np
= 0x01;
2676 if (VirtualProtect (addr
, len
, np
, &op
))
2685 #ifdef TRANSFER_FROM_TRAMPOLINE
2686 TRANSFER_FROM_TRAMPOLINE
2689 #if defined (NeXT) && defined (__MACH__)
2691 /* Make stack executable so we can call trampolines on stack.
2692 This is called from INITIALIZE_TRAMPOLINE in next.h. */
2696 #include <mach/mach.h>
2700 __enable_execute_stack (addr
)
2704 char *eaddr
= addr
+ TRAMPOLINE_SIZE
;
2705 vm_address_t a
= (vm_address_t
) addr
;
2707 /* turn on execute access on stack */
2708 r
= vm_protect (task_self (), a
, TRAMPOLINE_SIZE
, FALSE
, VM_PROT_ALL
);
2709 if (r
!= KERN_SUCCESS
)
2711 mach_error("vm_protect VM_PROT_ALL", r
);
2715 /* We inline the i-cache invalidation for speed */
2717 #ifdef CLEAR_INSN_CACHE
2718 CLEAR_INSN_CACHE (addr
, eaddr
);
2720 __clear_cache ((int) addr
, (int) eaddr
);
2724 #endif /* defined (NeXT) && defined (__MACH__) */
2728 /* Make stack executable so we can call trampolines on stack.
2729 This is called from INITIALIZE_TRAMPOLINE in convex.h. */
2731 #include <sys/mman.h>
2732 #include <sys/vmparam.h>
2733 #include <machine/machparam.h>
2736 __enable_execute_stack ()
2739 static unsigned lowest
= USRSTACK
;
2740 unsigned current
= (unsigned) &fp
& -NBPG
;
2742 if (lowest
> current
)
2744 unsigned len
= lowest
- current
;
2745 mremap (current
, &len
, PROT_READ
| PROT_WRITE
| PROT_EXEC
, MAP_PRIVATE
);
2749 /* Clear instruction cache in case an old trampoline is in it. */
2752 #endif /* __convex__ */
2756 /* Modified from the convex -code above. */
2758 #include <sys/param.h>
2760 #include <sys/m88kbcs.h>
2763 __enable_execute_stack ()
2766 static unsigned long lowest
= USRSTACK
;
2767 unsigned long current
= (unsigned long) &save_errno
& -NBPC
;
2769 /* Ignore errno being set. memctl sets errno to EINVAL whenever the
2770 address is seen as 'negative'. That is the case with the stack. */
2773 if (lowest
> current
)
2775 unsigned len
=lowest
-current
;
2776 memctl(current
,len
,MCT_TEXT
);
2780 memctl(current
,NBPC
,MCT_TEXT
);
2784 #endif /* __DOLPHIN__ */
2788 #undef NULL /* Avoid errors if stdio.h and our stddef.h mismatch. */
2790 #include <sys/mman.h>
2791 #include <sys/types.h>
2792 #include <sys/param.h>
2793 #include <sys/vmmac.h>
2795 /* Modified from the convex -code above.
2796 mremap promises to clear the i-cache. */
2799 __enable_execute_stack ()
2802 if (mprotect (((unsigned int)&fp
/PAGSIZ
)*PAGSIZ
, PAGSIZ
,
2803 PROT_READ
|PROT_WRITE
|PROT_EXEC
))
2805 perror ("mprotect in __enable_execute_stack");
2810 #endif /* __pyr__ */
2811 #endif /* L_trampoline */
2815 #include "gbl-ctors.h"
2816 /* Some systems use __main in a way incompatible with its use in gcc, in these
2817 cases use the macros NAME__MAIN to give a quoted symbol and SYMBOL__MAIN to
2818 give the same symbol without quotes for an alternative entry point. You
2819 must define both, or neither. */
2821 #define NAME__MAIN "__main"
2822 #define SYMBOL__MAIN __main
2825 #if !defined (INIT_SECTION_ASM_OP) || !defined (OBJECT_FORMAT_ELF)
2826 /* Run all the global destructors on exit from the program. */
2829 __do_global_dtors ()
2831 #ifdef DO_GLOBAL_DTORS_BODY
2832 DO_GLOBAL_DTORS_BODY
;
2835 for (p
= __DTOR_LIST__
+ 1; *p
; )
2841 #ifndef INIT_SECTION_ASM_OP
2842 /* Run all the global constructors on entry to the program. */
2845 #define ON_EXIT(a, b)
2847 /* Make sure the exit routine is pulled in to define the globals as
2848 bss symbols, just in case the linker does not automatically pull
2849 bss definitions from the library. */
2851 extern int _exit_dummy_decl
;
2852 int *_exit_dummy_ref
= &_exit_dummy_decl
;
2853 #endif /* ON_EXIT */
2856 __do_global_ctors ()
2858 DO_GLOBAL_CTORS_BODY
;
2859 ON_EXIT (__do_global_dtors
, 0);
2861 #endif /* no INIT_SECTION_ASM_OP */
2863 #if !defined (INIT_SECTION_ASM_OP) || defined (INVOKE__main)
2864 /* Subroutine called automatically by `main'.
2865 Compiling a global function named `main'
2866 produces an automatic call to this function at the beginning.
2868 For many systems, this routine calls __do_global_ctors.
2869 For systems which support a .init section we use the .init section
2870 to run __do_global_ctors, so we need not do anything here. */
2875 /* Support recursive calls to `main': run initializers just once. */
2876 static int initialized
;
2880 __do_global_ctors ();
2883 #endif /* no INIT_SECTION_ASM_OP or INVOKE__main */
2885 #endif /* L__main */
2889 #include "gbl-ctors.h"
2891 /* Provide default definitions for the lists of constructors and
2892 destructors, so that we don't get linker errors. These symbols are
2893 intentionally bss symbols, so that gld and/or collect will provide
2894 the right values. */
2896 /* We declare the lists here with two elements each,
2897 so that they are valid empty lists if no other definition is loaded. */
2898 #if !defined(INIT_SECTION_ASM_OP) && !defined(CTOR_LISTS_DEFINED_EXTERNALLY)
2899 #if defined(__NeXT__) || defined(_AIX)
2900 /* After 2.3, try this definition on all systems. */
2901 func_ptr __CTOR_LIST__
[2] = {0, 0};
2902 func_ptr __DTOR_LIST__
[2] = {0, 0};
2904 func_ptr __CTOR_LIST__
[2];
2905 func_ptr __DTOR_LIST__
[2];
2907 #endif /* no INIT_SECTION_ASM_OP and not CTOR_LISTS_DEFINED_EXTERNALLY */
2908 #endif /* L_ctors */
2912 #include "gbl-ctors.h"
2916 /* If we have no known way of registering our own __do_global_dtors
2917 routine so that it will be invoked at program exit time, then we
2918 have to define our own exit routine which will get this to happen. */
2920 extern void __do_global_dtors ();
2921 extern void _cleanup ();
2922 extern void _exit () __attribute__ ((noreturn
));
2928 #if !defined (INIT_SECTION_ASM_OP) || !defined (OBJECT_FORMAT_ELF)
2929 __do_global_dtors ();
2940 int _exit_dummy_decl
= 0; /* prevent compiler & linker warnings */
2949 void *exception_handler
;
2952 struct exception_table_node
{
2953 exception_table
*table
;
2956 struct exception_table_node
*next
;
2959 static int except_table_pos
;
2960 static void *except_pc
;
2961 static struct exception_table_node
*exception_table_list
;
2963 static exception_table
*
2964 find_exception_table (pc
)
2967 register struct exception_table_node
*table
= exception_table_list
;
2968 for ( ; table
!= 0; table
= table
->next
)
2970 if (table
->start
<= pc
&& table
->end
> pc
)
2971 return table
->table
;
2976 /* this routine takes a pc, and the address of the exception handler associated
2977 with the closest exception table handler entry associated with that PC,
2978 or 0 if there are no table entries the PC fits in. The algorithm works
2979 something like this:
2981 while(current_entry exists) {
2982 if(current_entry.start < pc )
2983 current_entry = next_entry;
2985 if(prev_entry.start <= pc && prev_entry.end > pc) {
2986 save pointer to prev_entry;
2987 return prev_entry.exception_handler;
2994 Assuming a correctly sorted table (ascending order) this routine should
2995 return the tightest match...
2997 In the advent of a tie, we have to give the last entry, as it represents
3003 __find_first_exception_table_match(pc
)
3006 exception_table
*table
= find_exception_table (pc
);
3012 printf("find_first_exception_table_match(): pc = %x!\n",pc
);
3018 /* We can't do this yet, as we don't know that the table is sorted. */
3021 if (table
[pos
].start
> except_pc
)
3022 /* found the first table[pos].start > except_pc, so the previous
3023 entry better be the one we want! */
3025 } while(table
[pos
].exception_handler
!= (void*)-1);
3028 if (table
[pos
].start
<= except_pc
&& table
[pos
].end
> except_pc
)
3030 except_table_pos
= pos
;
3032 printf("find_first_eh_table_match(): found match: %x\n",table
[pos
].exception_handler
);
3034 return table
[pos
].exception_handler
;
3037 while (table
[++pos
].exception_handler
!= (void*)-1) {
3038 if (table
[pos
].start
<= except_pc
&& table
[pos
].end
> except_pc
)
3040 /* This can apply. Make sure it is better or as good as the previous
3042 /* The best one ends first. */
3043 if (best
== 0 || (table
[pos
].end
<= table
[best
].end
3044 /* The best one starts last. */
3045 && table
[pos
].start
>= table
[best
].start
))
3050 return table
[best
].exception_handler
;
3054 printf("find_first_eh_table_match(): else: returning NULL!\n");
3060 __throw_type_match (void *catch_type
, void *throw_type
, void* obj
)
3063 printf("__throw_type_match (): catch_type = %s, throw_type = %s\n",
3064 catch_type
, throw_type
);
3066 if (strcmp ((const char *)catch_type
, (const char *)throw_type
) == 0)
3072 __register_exceptions (exception_table
*table
)
3074 struct exception_table_node
*node
;
3075 exception_table
*range
= table
+ 1;
3077 if (range
->start
== (void*)-1)
3080 node
= (struct exception_table_node
*)
3081 malloc (sizeof (struct exception_table_node
));
3082 node
->table
= table
;
3084 /* This look can be optimized away either if the table
3085 is sorted, or if we pass in extra parameters. */
3086 node
->start
= range
->start
;
3087 node
->end
= range
->end
;
3088 for (range
++ ; range
->start
!= (void*)(-1); range
++)
3090 if (range
->start
< node
->start
)
3091 node
->start
= range
->start
;
3092 if (range
->end
> node
->end
)
3093 node
->end
= range
->end
;
3096 node
->next
= exception_table_list
;
3097 exception_table_list
= node
;
3107 __unwind_function(void *ptr
)
3109 asm("movl 8(%esp),%ecx");
3110 /* Undo current frame */
3111 asm("movl %ebp,%esp");
3113 /* like ret, but stay here */
3114 asm("addl $4,%esp");
3116 /* Now, undo previous frame. */
3117 /* This is a test routine, as we have to dynamically probe to find out
3118 what to pop for certain, this is just a guess. */
3119 asm("leal -16(%ebp),%esp");
3123 asm("movl %ebp,%esp");
3126 asm("movl %ecx,0(%esp)");
3129 #elif #machine(rs6000) && !defined _ARCH_PPC
3130 __unwind_function(void *ptr
)
3139 /* use 31 as a scratch register to restore the link register. */
3140 asm("l 31, 8(1);mtlr 31 # l lr,8(1)");
3143 asm("mtctr 3;bctr # b 3");
3145 #elif (#machine(rs6000) || #machine(powerpc)) && defined _ARCH_PPC
3146 __unwind_function(void *ptr
)
3150 asm("lwz 31,-4(1)");
3155 /* use 31 as a scratch register to restore the link register. */
3156 asm("lwz 31, 8(1);mtlr 31 # l lr,8(1)");
3157 asm("lwz 31,-4(1)");
3159 asm("mtctr 3;bctr # b 3");
3162 __unwind_function(void *ptr
)
3164 __label__ return_again
;
3166 /* Replace our frame's return address with the label below.
3167 During execution, we will first return here instead of to
3168 caller, then second return takes caller's frame off the stack.
3169 Two returns matches two actual calls, so is less likely to
3170 confuse debuggers. `16' corresponds to RETURN_ADDRESS_OFFSET. */
3171 __asm ("movl %0,16(fp)" : : "p" (&& return_again
));
3178 __unwind_function(void *ptr
)
3182 #endif /* powerpc */
3186 #ifndef inhibit_libc
3187 /* This gets us __GNU_LIBRARY__. */
3188 #undef NULL /* Avoid errors if stdio.h and our stddef.h mismatch. */
3191 #ifdef __GNU_LIBRARY__
3192 /* Avoid forcing the library's meaning of `write' on the user program
3193 by using the "internal" name (for use within the library) */
3194 #define write(fd, buf, n) __write((fd), (buf), (n))
3196 #endif /* inhibit_libc */
3198 #define MESSAGE "pure virtual method called\n"
3203 #ifndef inhibit_libc
3204 write (2, MESSAGE
, sizeof (MESSAGE
) - 1);