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, 1996, 1997, 1998, 1999,
4 2000, 2001 Free Software Foundation, Inc.
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 2, or (at your option) any later
13 In addition to the permissions in the GNU General Public License, the
14 Free Software Foundation gives you unlimited permission to link the
15 compiled version of this file into combinations with other programs,
16 and to distribute those combinations without any restriction coming
17 from the use of this file. (The General Public License restrictions
18 do apply in other respects; for example, they cover modification of
19 the file, and distribution when not linked into a combine
22 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
23 WARRANTY; without even the implied warranty of MERCHANTABILITY or
24 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
27 You should have received a copy of the GNU General Public License
28 along with GCC; see the file COPYING. If not, write to the Free
29 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
32 /* It is incorrect to include config.h here, because this file is being
33 compiled for the target, and hence definitions concerning only the host
39 /* Don't use `fancy_abort' here even if config.h says to use it. */
46 #if defined (L_negdi2) || defined (L_divdi3) || defined (L_moddi3)
47 #if defined (L_divdi3) || defined (L_moddi3)
59 w
.s
.high
= -uu
.s
.high
- ((UWtype
) w
.s
.low
> 0);
67 __addvsi3 (Wtype a
, Wtype b
)
73 if (b
>= 0 ? w
< a
: w
> a
)
82 __addvdi3 (DWtype a
, DWtype b
)
88 if (b
>= 0 ? w
< a
: w
> a
)
97 __subvsi3 (Wtype a
, Wtype b
)
100 return __addvsi3 (a
, (-b
));
106 if (b
>= 0 ? w
> a
: w
< a
)
116 __subvdi3 (DWtype a
, DWtype b
)
125 if (b
>= 0 ? w
> a
: w
< a
)
135 __mulvsi3 (Wtype a
, Wtype b
)
141 if (((a
>= 0) == (b
>= 0)) ? w
< 0 : w
> 0)
156 if (a
>= 0 ? w
> 0 : w
< 0)
171 if (a
>= 0 ? w
> 0 : w
< 0)
220 __mulvdi3 (DWtype u
, DWtype v
)
226 if (((u
>= 0) == (v
>= 0)) ? w
< 0 : w
> 0)
234 /* Unless shift functions are defined whith full ANSI prototypes,
235 parameter b will be promoted to int if word_type is smaller than an int. */
238 __lshrdi3 (DWtype u
, word_type b
)
249 bm
= (sizeof (Wtype
) * BITS_PER_UNIT
) - b
;
253 w
.s
.low
= (UWtype
) uu
.s
.high
>> -bm
;
257 UWtype carries
= (UWtype
) uu
.s
.high
<< bm
;
259 w
.s
.high
= (UWtype
) uu
.s
.high
>> b
;
260 w
.s
.low
= ((UWtype
) uu
.s
.low
>> b
) | carries
;
269 __ashldi3 (DWtype u
, word_type b
)
280 bm
= (sizeof (Wtype
) * BITS_PER_UNIT
) - b
;
284 w
.s
.high
= (UWtype
) uu
.s
.low
<< -bm
;
288 UWtype carries
= (UWtype
) uu
.s
.low
>> bm
;
290 w
.s
.low
= (UWtype
) uu
.s
.low
<< b
;
291 w
.s
.high
= ((UWtype
) uu
.s
.high
<< b
) | carries
;
300 __ashrdi3 (DWtype u
, word_type b
)
311 bm
= (sizeof (Wtype
) * BITS_PER_UNIT
) - b
;
314 /* w.s.high = 1..1 or 0..0 */
315 w
.s
.high
= uu
.s
.high
>> (sizeof (Wtype
) * BITS_PER_UNIT
- 1);
316 w
.s
.low
= uu
.s
.high
>> -bm
;
320 UWtype carries
= (UWtype
) uu
.s
.high
<< bm
;
322 w
.s
.high
= uu
.s
.high
>> b
;
323 w
.s
.low
= ((UWtype
) uu
.s
.low
>> b
) | carries
;
335 UWtype word
, count
, add
;
339 word
= uu
.s
.low
, add
= 0;
340 else if (uu
.s
.high
!= 0)
341 word
= uu
.s
.high
, add
= BITS_PER_UNIT
* sizeof (Wtype
);
345 count_trailing_zeros (count
, word
);
346 return count
+ add
+ 1;
352 __muldi3 (DWtype u
, DWtype v
)
360 w
.ll
= __umulsidi3 (uu
.s
.low
, vv
.s
.low
);
361 w
.s
.high
+= ((UWtype
) uu
.s
.low
* (UWtype
) vv
.s
.high
362 + (UWtype
) uu
.s
.high
* (UWtype
) vv
.s
.low
);
369 #if defined (sdiv_qrnnd)
371 __udiv_w_sdiv (UWtype
*rp
, UWtype a1
, UWtype a0
, UWtype d
)
378 if (a1
< d
- a1
- (a0
>> (W_TYPE_SIZE
- 1)))
380 /* dividend, divisor, and quotient are nonnegative */
381 sdiv_qrnnd (q
, r
, a1
, a0
, d
);
385 /* Compute c1*2^32 + c0 = a1*2^32 + a0 - 2^31*d */
386 sub_ddmmss (c1
, c0
, a1
, a0
, d
>> 1, d
<< (W_TYPE_SIZE
- 1));
387 /* Divide (c1*2^32 + c0) by d */
388 sdiv_qrnnd (q
, r
, c1
, c0
, d
);
389 /* Add 2^31 to quotient */
390 q
+= (UWtype
) 1 << (W_TYPE_SIZE
- 1);
395 b1
= d
>> 1; /* d/2, between 2^30 and 2^31 - 1 */
396 c1
= a1
>> 1; /* A/2 */
397 c0
= (a1
<< (W_TYPE_SIZE
- 1)) + (a0
>> 1);
399 if (a1
< b1
) /* A < 2^32*b1, so A/2 < 2^31*b1 */
401 sdiv_qrnnd (q
, r
, c1
, c0
, b1
); /* (A/2) / (d/2) */
403 r
= 2*r
+ (a0
& 1); /* Remainder from A/(2*b1) */
420 else if (c1
< b1
) /* So 2^31 <= (A/2)/b1 < 2^32 */
423 c0
= ~c0
; /* logical NOT */
425 sdiv_qrnnd (q
, r
, c1
, c0
, b1
); /* (A/2) / (d/2) */
427 q
= ~q
; /* (A/2)/b1 */
430 r
= 2*r
+ (a0
& 1); /* A/(2*b1) */
448 else /* Implies c1 = b1 */
449 { /* Hence a1 = d - 1 = 2*b1 - 1 */
467 /* If sdiv_qrnnd doesn't exist, define dummy __udiv_w_sdiv. */
469 __udiv_w_sdiv (UWtype
*rp
__attribute__ ((__unused__
)),
470 UWtype a1
__attribute__ ((__unused__
)),
471 UWtype a0
__attribute__ ((__unused__
)),
472 UWtype d
__attribute__ ((__unused__
)))
479 #if (defined (L_udivdi3) || defined (L_divdi3) || \
480 defined (L_umoddi3) || defined (L_moddi3))
485 const UQItype __clz_tab
[] =
487 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,
488 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,
489 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,
490 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,
491 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,
492 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,
493 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,
494 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,
500 #if (defined (L_udivdi3) || defined (L_divdi3) || \
501 defined (L_umoddi3) || defined (L_moddi3))
505 __udivmoddi4 (UDWtype n
, UDWtype d
, UDWtype
*rp
)
510 UWtype d0
, d1
, n0
, n1
, n2
;
522 #if !UDIV_NEEDS_NORMALIZATION
529 udiv_qrnnd (q0
, n0
, n1
, n0
, d0
);
532 /* Remainder in n0. */
539 d0
= 1 / d0
; /* Divide intentionally by zero. */
541 udiv_qrnnd (q1
, n1
, 0, n1
, d0
);
542 udiv_qrnnd (q0
, n0
, n1
, n0
, d0
);
544 /* Remainder in n0. */
555 #else /* UDIV_NEEDS_NORMALIZATION */
563 count_leading_zeros (bm
, d0
);
567 /* Normalize, i.e. make the most significant bit of the
571 n1
= (n1
<< bm
) | (n0
>> (W_TYPE_SIZE
- bm
));
575 udiv_qrnnd (q0
, n0
, n1
, n0
, d0
);
578 /* Remainder in n0 >> bm. */
585 d0
= 1 / d0
; /* Divide intentionally by zero. */
587 count_leading_zeros (bm
, d0
);
591 /* From (n1 >= d0) /\ (the most significant bit of d0 is set),
592 conclude (the most significant bit of n1 is set) /\ (the
593 leading quotient digit q1 = 1).
595 This special case is necessary, not an optimization.
596 (Shifts counts of W_TYPE_SIZE are undefined.) */
605 b
= W_TYPE_SIZE
- bm
;
609 n1
= (n1
<< bm
) | (n0
>> b
);
612 udiv_qrnnd (q1
, n1
, n2
, n1
, d0
);
617 udiv_qrnnd (q0
, n0
, n1
, n0
, d0
);
619 /* Remainder in n0 >> bm. */
629 #endif /* UDIV_NEEDS_NORMALIZATION */
640 /* Remainder in n1n0. */
652 count_leading_zeros (bm
, d1
);
655 /* From (n1 >= d1) /\ (the most significant bit of d1 is set),
656 conclude (the most significant bit of n1 is set) /\ (the
657 quotient digit q0 = 0 or 1).
659 This special case is necessary, not an optimization. */
661 /* The condition on the next line takes advantage of that
662 n1 >= d1 (true due to program flow). */
663 if (n1
> d1
|| n0
>= d0
)
666 sub_ddmmss (n1
, n0
, n1
, n0
, d1
, d0
);
685 b
= W_TYPE_SIZE
- bm
;
687 d1
= (d1
<< bm
) | (d0
>> b
);
690 n1
= (n1
<< bm
) | (n0
>> b
);
693 udiv_qrnnd (q0
, n1
, n2
, n1
, d1
);
694 umul_ppmm (m1
, m0
, q0
, d0
);
696 if (m1
> n1
|| (m1
== n1
&& m0
> n0
))
699 sub_ddmmss (m1
, m0
, m1
, m0
, d1
, d0
);
704 /* Remainder in (n1n0 - m1m0) >> bm. */
707 sub_ddmmss (n1
, n0
, n1
, n0
, m1
, m0
);
708 rr
.s
.low
= (n1
<< b
) | (n0
>> bm
);
709 rr
.s
.high
= n1
>> bm
;
724 __divdi3 (DWtype u
, DWtype v
)
735 uu
.ll
= __negdi2 (uu
.ll
);
738 vv
.ll
= __negdi2 (vv
.ll
);
740 w
= __udivmoddi4 (uu
.ll
, vv
.ll
, (UDWtype
*) 0);
750 __moddi3 (DWtype u
, DWtype v
)
761 uu
.ll
= __negdi2 (uu
.ll
);
763 vv
.ll
= __negdi2 (vv
.ll
);
765 (void) __udivmoddi4 (uu
.ll
, vv
.ll
, &w
);
775 __umoddi3 (UDWtype u
, UDWtype v
)
779 (void) __udivmoddi4 (u
, v
, &w
);
787 __udivdi3 (UDWtype n
, UDWtype d
)
789 return __udivmoddi4 (n
, d
, (UDWtype
*) 0);
795 __cmpdi2 (DWtype a
, DWtype b
)
799 au
.ll
= a
, bu
.ll
= b
;
801 if (au
.s
.high
< bu
.s
.high
)
803 else if (au
.s
.high
> bu
.s
.high
)
805 if ((UWtype
) au
.s
.low
< (UWtype
) bu
.s
.low
)
807 else if ((UWtype
) au
.s
.low
> (UWtype
) bu
.s
.low
)
815 __ucmpdi2 (DWtype a
, DWtype b
)
819 au
.ll
= a
, bu
.ll
= b
;
821 if ((UWtype
) au
.s
.high
< (UWtype
) bu
.s
.high
)
823 else if ((UWtype
) au
.s
.high
> (UWtype
) bu
.s
.high
)
825 if ((UWtype
) au
.s
.low
< (UWtype
) bu
.s
.low
)
827 else if ((UWtype
) au
.s
.low
> (UWtype
) bu
.s
.low
)
833 #if defined(L_fixunstfdi) && (LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 128)
834 #define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
835 #define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
838 __fixunstfDI (TFtype a
)
846 /* Compute high word of result, as a flonum. */
847 b
= (a
/ HIGH_WORD_COEFF
);
848 /* Convert that to fixed (but not to DWtype!),
849 and shift it into the high word. */
852 /* Remove high part from the TFtype, leaving the low part as flonum. */
854 /* Convert that to fixed (but not to DWtype!) and add it in.
855 Sometimes A comes out negative. This is significant, since
856 A has more bits than a long int does. */
865 #if defined(L_fixtfdi) && (LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 128)
870 return - __fixunstfDI (-a
);
871 return __fixunstfDI (a
);
875 #if defined(L_fixunsxfdi) && (LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 96)
876 #define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
877 #define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
880 __fixunsxfDI (XFtype a
)
888 /* Compute high word of result, as a flonum. */
889 b
= (a
/ HIGH_WORD_COEFF
);
890 /* Convert that to fixed (but not to DWtype!),
891 and shift it into the high word. */
894 /* Remove high part from the XFtype, leaving the low part as flonum. */
896 /* Convert that to fixed (but not to DWtype!) and add it in.
897 Sometimes A comes out negative. This is significant, since
898 A has more bits than a long int does. */
907 #if defined(L_fixxfdi) && (LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 96)
912 return - __fixunsxfDI (-a
);
913 return __fixunsxfDI (a
);
918 #define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
919 #define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
922 __fixunsdfDI (DFtype a
)
930 /* Compute high word of result, as a flonum. */
931 b
= (a
/ HIGH_WORD_COEFF
);
932 /* Convert that to fixed (but not to DWtype!),
933 and shift it into the high word. */
936 /* Remove high part from the DFtype, leaving the low part as flonum. */
938 /* Convert that to fixed (but not to DWtype!) and add it in.
939 Sometimes A comes out negative. This is significant, since
940 A has more bits than a long int does. */
954 return - __fixunsdfDI (-a
);
955 return __fixunsdfDI (a
);
960 #define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
961 #define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
964 __fixunssfDI (SFtype original_a
)
966 /* Convert the SFtype to a DFtype, because that is surely not going
967 to lose any bits. Some day someone else can write a faster version
968 that avoids converting to DFtype, and verify it really works right. */
969 DFtype a
= original_a
;
976 /* Compute high word of result, as a flonum. */
977 b
= (a
/ HIGH_WORD_COEFF
);
978 /* Convert that to fixed (but not to DWtype!),
979 and shift it into the high word. */
982 /* Remove high part from the DFtype, leaving the low part as flonum. */
984 /* Convert that to fixed (but not to DWtype!) and add it in.
985 Sometimes A comes out negative. This is significant, since
986 A has more bits than a long int does. */
1000 return - __fixunssfDI (-a
);
1001 return __fixunssfDI (a
);
1005 #if defined(L_floatdixf) && (LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 96)
1006 #define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
1007 #define HIGH_HALFWORD_COEFF (((UDWtype) 1) << (WORD_SIZE / 2))
1008 #define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
1011 __floatdixf (DWtype u
)
1015 d
= (Wtype
) (u
>> WORD_SIZE
);
1016 d
*= HIGH_HALFWORD_COEFF
;
1017 d
*= HIGH_HALFWORD_COEFF
;
1018 d
+= (UWtype
) (u
& (HIGH_WORD_COEFF
- 1));
1024 #if defined(L_floatditf) && (LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 128)
1025 #define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
1026 #define HIGH_HALFWORD_COEFF (((UDWtype) 1) << (WORD_SIZE / 2))
1027 #define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
1030 __floatditf (DWtype u
)
1034 d
= (Wtype
) (u
>> WORD_SIZE
);
1035 d
*= HIGH_HALFWORD_COEFF
;
1036 d
*= HIGH_HALFWORD_COEFF
;
1037 d
+= (UWtype
) (u
& (HIGH_WORD_COEFF
- 1));
1044 #define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
1045 #define HIGH_HALFWORD_COEFF (((UDWtype) 1) << (WORD_SIZE / 2))
1046 #define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
1049 __floatdidf (DWtype u
)
1053 d
= (Wtype
) (u
>> WORD_SIZE
);
1054 d
*= HIGH_HALFWORD_COEFF
;
1055 d
*= HIGH_HALFWORD_COEFF
;
1056 d
+= (UWtype
) (u
& (HIGH_WORD_COEFF
- 1));
1063 #define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
1064 #define HIGH_HALFWORD_COEFF (((UDWtype) 1) << (WORD_SIZE / 2))
1065 #define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
1067 #define DI_SIZE (sizeof (DWtype) * BITS_PER_UNIT)
1068 #define DF_SIZE DBL_MANT_DIG
1069 #define SF_SIZE FLT_MANT_DIG
1072 __floatdisf (DWtype u
)
1074 /* Do the calculation in DFmode
1075 so that we don't lose any of the precision of the high word
1076 while multiplying it. */
1079 /* Protect against double-rounding error.
1080 Represent any low-order bits, that might be truncated in DFmode,
1081 by a bit that won't be lost. The bit can go in anywhere below the
1082 rounding position of the SFmode. A fixed mask and bit position
1083 handles all usual configurations. It doesn't handle the case
1084 of 128-bit DImode, however. */
1085 if (DF_SIZE
< DI_SIZE
1086 && DF_SIZE
> (DI_SIZE
- DF_SIZE
+ SF_SIZE
))
1088 #define REP_BIT ((UDWtype) 1 << (DI_SIZE - DF_SIZE))
1089 if (! (- ((DWtype
) 1 << DF_SIZE
) < u
1090 && u
< ((DWtype
) 1 << DF_SIZE
)))
1092 if ((UDWtype
) u
& (REP_BIT
- 1))
1096 f
= (Wtype
) (u
>> WORD_SIZE
);
1097 f
*= HIGH_HALFWORD_COEFF
;
1098 f
*= HIGH_HALFWORD_COEFF
;
1099 f
+= (UWtype
) (u
& (HIGH_WORD_COEFF
- 1));
1105 #if defined(L_fixunsxfsi) && LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 96
1106 /* Reenable the normal types, in case limits.h needs them. */
1119 __fixunsxfSI (XFtype a
)
1121 if (a
>= - (DFtype
) Wtype_MIN
)
1122 return (Wtype
) (a
+ Wtype_MIN
) - Wtype_MIN
;
1128 /* Reenable the normal types, in case limits.h needs them. */
1141 __fixunsdfSI (DFtype a
)
1143 if (a
>= - (DFtype
) Wtype_MIN
)
1144 return (Wtype
) (a
+ Wtype_MIN
) - Wtype_MIN
;
1150 /* Reenable the normal types, in case limits.h needs them. */
1163 __fixunssfSI (SFtype a
)
1165 if (a
>= - (SFtype
) Wtype_MIN
)
1166 return (Wtype
) (a
+ Wtype_MIN
) - Wtype_MIN
;
1171 /* From here on down, the routines use normal data types. */
1173 #define SItype bogus_type
1174 #define USItype bogus_type
1175 #define DItype bogus_type
1176 #define UDItype bogus_type
1177 #define SFtype bogus_type
1178 #define DFtype bogus_type
1196 /* Like bcmp except the sign is meaningful.
1197 Result is negative if S1 is less than S2,
1198 positive if S1 is greater, 0 if S1 and S2 are equal. */
1201 __gcc_bcmp (const unsigned char *s1
, const unsigned char *s2
, size_t size
)
1205 unsigned char c1
= *s1
++, c2
= *s2
++;
1215 /* __eprintf used to be used by GCC's private version of <assert.h>.
1216 We no longer provide that header, but this routine remains in libgcc.a
1217 for binary backward compatibility. Note that it is not included in
1218 the shared version of libgcc. */
1220 #ifndef inhibit_libc
1222 #undef NULL /* Avoid errors if stdio.h and our stddef.h mismatch. */
1226 __eprintf (const char *string
, const char *expression
,
1227 unsigned int line
, const char *filename
)
1229 fprintf (stderr
, string
, expression
, line
, filename
);
1239 struct bb_function_info
{
1245 /* Structure emitted by -a */
1249 const char *filename
;
1254 /* Older GCC's did not emit these fields. */
1256 struct bb_function_info
*function_infos
;
1259 #ifndef inhibit_libc
1261 /* Simple minded basic block profiling output dumper for
1262 systems that don't provide tcov support. At present,
1263 it requires atexit and stdio. */
1265 #undef NULL /* Avoid errors if stdio.h and our stddef.h mismatch. */
1268 #include "gbl-ctors.h"
1269 #include "gcov-io.h"
1271 #ifdef TARGET_HAS_F_SETLKW
1278 static struct bb
*bb_head
;
1280 int __global_counters
= 0, __gthreads_active
= 0;
1283 __bb_exit_func (void)
1287 long n_counters_p
= 0;
1288 gcov_type max_counter_p
= 0;
1289 gcov_type sum_counters_p
= 0;
1294 /* Calculate overall "statistics". */
1296 for (ptr
= bb_head
; ptr
!= (struct bb
*) 0; ptr
= ptr
->next
)
1300 n_counters_p
+= ptr
->ncounts
;
1302 for (i
= 0; i
< ptr
->ncounts
; i
++)
1304 sum_counters_p
+= ptr
->counts
[i
];
1306 if (ptr
->counts
[i
] > max_counter_p
)
1307 max_counter_p
= ptr
->counts
[i
];
1311 for (ptr
= bb_head
; ptr
!= (struct bb
*) 0; ptr
= ptr
->next
)
1313 gcov_type max_counter_o
= 0;
1314 gcov_type sum_counters_o
= 0;
1317 /* Calculate the per-object statistics. */
1319 for (i
= 0; i
< ptr
->ncounts
; i
++)
1321 sum_counters_o
+= ptr
->counts
[i
];
1323 if (ptr
->counts
[i
] > max_counter_o
)
1324 max_counter_o
= ptr
->counts
[i
];
1327 /* open the file for appending, creating it if necessary. */
1328 da_file
= fopen (ptr
->filename
, "ab");
1329 /* Some old systems might not allow the 'b' mode modifier.
1330 Therefore, try to open without it. This can lead to a race
1331 condition so that when you delete and re-create the file, the
1332 file might be opened in text mode, but then, you shouldn't
1333 delete the file in the first place. */
1335 da_file
= fopen (ptr
->filename
, "a");
1338 fprintf (stderr
, "arc profiling: Can't open output file %s.\n",
1343 /* After a fork, another process might try to read and/or write
1344 the same file simultanously. So if we can, lock the file to
1345 avoid race conditions. */
1346 #if defined (TARGET_HAS_F_SETLKW)
1348 struct flock s_flock
;
1350 s_flock
.l_type
= F_WRLCK
;
1351 s_flock
.l_whence
= SEEK_SET
;
1352 s_flock
.l_start
= 0;
1354 s_flock
.l_pid
= getpid ();
1356 while (fcntl (fileno (da_file
), F_SETLKW
, &s_flock
)
1361 if (__write_long (-123, da_file
, 4) != 0) /* magic */
1363 fprintf (stderr
, "arc profiling: Error writing output file %s.\n",
1369 struct bb_function_info
*fn_info
;
1370 gcov_type
*count_ptr
= ptr
->counts
;
1372 int count_functions
= 0;
1374 for (fn_info
= ptr
->function_infos
; fn_info
->arc_count
!= -1;
1378 /* number of functions in this block. */
1379 __write_long (count_functions
, da_file
, 4);
1381 /* length of extra data in bytes. */
1382 __write_long ((4 + 8 + 8) + (4 + 8 + 8), da_file
, 4);
1384 /* overall statistics. */
1385 /* number of counters. */
1386 __write_long (n_counters_p
, da_file
, 4);
1387 /* sum of counters. */
1388 __write_gcov_type (sum_counters_p
, da_file
, 8);
1389 /* maximal counter. */
1390 __write_gcov_type (max_counter_p
, da_file
, 8);
1392 /* per-object statistics. */
1393 /* number of counters. */
1394 __write_long (ptr
->ncounts
, da_file
, 4);
1395 /* sum of counters. */
1396 __write_gcov_type (sum_counters_o
, da_file
, 8);
1397 /* maximal counter. */
1398 __write_gcov_type (max_counter_o
, da_file
, 8);
1400 /* write execution counts for each function. */
1402 for (fn_info
= ptr
->function_infos
; fn_info
->arc_count
!= -1;
1406 if (__write_gcov_string
1407 (fn_info
->name
, strlen (fn_info
->name
), da_file
, -1) != 0)
1410 "arc profiling: Error writing output file %s.\n",
1415 if (__write_long (fn_info
->checksum
, da_file
, 4) != 0)
1418 "arc profiling: Error writing output file %s.\n",
1423 if (__write_long (fn_info
->arc_count
, da_file
, 4) != 0)
1426 "arc profiling: Error writing output file %s.\n",
1431 for (i
= fn_info
->arc_count
; i
> 0; i
--, count_ptr
++)
1433 if (__write_gcov_type (*count_ptr
, da_file
, 8) != 0)
1437 if (i
) /* there was an error */
1440 "arc profiling: Error writing output file %s.\n",
1447 if (fclose (da_file
) != 0)
1448 fprintf (stderr
, "arc profiling: Error closing output file %s.\n",
1454 __bb_init_func (struct bb
*blocks
)
1456 /* User is supposed to check whether the first word is non-0,
1457 but just in case.... */
1459 if (blocks
->zero_word
)
1462 /* Initialize destructor and per-thread data. */
1464 atexit (__bb_exit_func
);
1466 /* Set up linked list. */
1467 blocks
->zero_word
= 1;
1468 blocks
->next
= bb_head
;
1472 /* Called before fork or exec - write out profile information gathered so
1473 far and reset it to zero. This avoids duplication or loss of the
1474 profile information gathered so far. */
1476 __bb_fork_func (void)
1481 for (ptr
= bb_head
; ptr
!= (struct bb
*) 0; ptr
= ptr
->next
)
1484 for (i
= ptr
->ncounts
- 1; i
>= 0; i
--)
1489 #endif /* not inhibit_libc */
1492 #ifdef L_clear_cache
1493 /* Clear part of an instruction cache. */
1495 #define INSN_CACHE_PLANE_SIZE (INSN_CACHE_SIZE / INSN_CACHE_DEPTH)
1498 __clear_cache (char *beg
__attribute__((__unused__
)),
1499 char *end
__attribute__((__unused__
)))
1501 #ifdef CLEAR_INSN_CACHE
1502 CLEAR_INSN_CACHE (beg
, end
);
1504 #ifdef INSN_CACHE_SIZE
1505 static char array
[INSN_CACHE_SIZE
+ INSN_CACHE_PLANE_SIZE
+ INSN_CACHE_LINE_WIDTH
];
1506 static int initialized
;
1510 typedef (*function_ptr
) (void);
1512 #if (INSN_CACHE_SIZE / INSN_CACHE_LINE_WIDTH) < 16
1513 /* It's cheaper to clear the whole cache.
1514 Put in a series of jump instructions so that calling the beginning
1515 of the cache will clear the whole thing. */
1519 int ptr
= (((int) array
+ INSN_CACHE_LINE_WIDTH
- 1)
1520 & -INSN_CACHE_LINE_WIDTH
);
1521 int end_ptr
= ptr
+ INSN_CACHE_SIZE
;
1523 while (ptr
< end_ptr
)
1525 *(INSTRUCTION_TYPE
*)ptr
1526 = JUMP_AHEAD_INSTRUCTION
+ INSN_CACHE_LINE_WIDTH
;
1527 ptr
+= INSN_CACHE_LINE_WIDTH
;
1529 *(INSTRUCTION_TYPE
*) (ptr
- INSN_CACHE_LINE_WIDTH
) = RETURN_INSTRUCTION
;
1534 /* Call the beginning of the sequence. */
1535 (((function_ptr
) (((int) array
+ INSN_CACHE_LINE_WIDTH
- 1)
1536 & -INSN_CACHE_LINE_WIDTH
))
1539 #else /* Cache is large. */
1543 int ptr
= (((int) array
+ INSN_CACHE_LINE_WIDTH
- 1)
1544 & -INSN_CACHE_LINE_WIDTH
);
1546 while (ptr
< (int) array
+ sizeof array
)
1548 *(INSTRUCTION_TYPE
*)ptr
= RETURN_INSTRUCTION
;
1549 ptr
+= INSN_CACHE_LINE_WIDTH
;
1555 /* Find the location in array that occupies the same cache line as BEG. */
1557 offset
= ((int) beg
& -INSN_CACHE_LINE_WIDTH
) & (INSN_CACHE_PLANE_SIZE
- 1);
1558 start_addr
= (((int) (array
+ INSN_CACHE_PLANE_SIZE
- 1)
1559 & -INSN_CACHE_PLANE_SIZE
)
1562 /* Compute the cache alignment of the place to stop clearing. */
1563 #if 0 /* This is not needed for gcc's purposes. */
1564 /* If the block to clear is bigger than a cache plane,
1565 we clear the entire cache, and OFFSET is already correct. */
1566 if (end
< beg
+ INSN_CACHE_PLANE_SIZE
)
1568 offset
= (((int) (end
+ INSN_CACHE_LINE_WIDTH
- 1)
1569 & -INSN_CACHE_LINE_WIDTH
)
1570 & (INSN_CACHE_PLANE_SIZE
- 1));
1572 #if INSN_CACHE_DEPTH > 1
1573 end_addr
= (start_addr
& -INSN_CACHE_PLANE_SIZE
) + offset
;
1574 if (end_addr
<= start_addr
)
1575 end_addr
+= INSN_CACHE_PLANE_SIZE
;
1577 for (plane
= 0; plane
< INSN_CACHE_DEPTH
; plane
++)
1579 int addr
= start_addr
+ plane
* INSN_CACHE_PLANE_SIZE
;
1580 int stop
= end_addr
+ plane
* INSN_CACHE_PLANE_SIZE
;
1582 while (addr
!= stop
)
1584 /* Call the return instruction at ADDR. */
1585 ((function_ptr
) addr
) ();
1587 addr
+= INSN_CACHE_LINE_WIDTH
;
1590 #else /* just one plane */
1593 /* Call the return instruction at START_ADDR. */
1594 ((function_ptr
) start_addr
) ();
1596 start_addr
+= INSN_CACHE_LINE_WIDTH
;
1598 while ((start_addr
% INSN_CACHE_SIZE
) != offset
);
1599 #endif /* just one plane */
1600 #endif /* Cache is large */
1601 #endif /* Cache exists */
1602 #endif /* CLEAR_INSN_CACHE */
1605 #endif /* L_clear_cache */
1609 /* Jump to a trampoline, loading the static chain address. */
1611 #if defined(WINNT) && ! defined(__CYGWIN__) && ! defined (_UWIN)
1624 extern int VirtualProtect (char *, int, int, int *) __attribute__((stdcall));
1628 mprotect (char *addr
, int len
, int prot
)
1645 if (VirtualProtect (addr
, len
, np
, &op
))
1651 #endif /* WINNT && ! __CYGWIN__ && ! _UWIN */
1653 #ifdef TRANSFER_FROM_TRAMPOLINE
1654 TRANSFER_FROM_TRAMPOLINE
1657 #if defined (NeXT) && defined (__MACH__)
1659 /* Make stack executable so we can call trampolines on stack.
1660 This is called from INITIALIZE_TRAMPOLINE in next.h. */
1664 #include <mach/mach.h>
1668 __enable_execute_stack (char *addr
)
1671 char *eaddr
= addr
+ TRAMPOLINE_SIZE
;
1672 vm_address_t a
= (vm_address_t
) addr
;
1674 /* turn on execute access on stack */
1675 r
= vm_protect (task_self (), a
, TRAMPOLINE_SIZE
, FALSE
, VM_PROT_ALL
);
1676 if (r
!= KERN_SUCCESS
)
1678 mach_error("vm_protect VM_PROT_ALL", r
);
1682 /* We inline the i-cache invalidation for speed */
1684 #ifdef CLEAR_INSN_CACHE
1685 CLEAR_INSN_CACHE (addr
, eaddr
);
1687 __clear_cache ((int) addr
, (int) eaddr
);
1691 #endif /* defined (NeXT) && defined (__MACH__) */
1695 /* Make stack executable so we can call trampolines on stack.
1696 This is called from INITIALIZE_TRAMPOLINE in convex.h. */
1698 #include <sys/mman.h>
1699 #include <sys/vmparam.h>
1700 #include <machine/machparam.h>
1703 __enable_execute_stack (void)
1706 static unsigned lowest
= USRSTACK
;
1707 unsigned current
= (unsigned) &fp
& -NBPG
;
1709 if (lowest
> current
)
1711 unsigned len
= lowest
- current
;
1712 mremap (current
, &len
, PROT_READ
| PROT_WRITE
| PROT_EXEC
, MAP_PRIVATE
);
1716 /* Clear instruction cache in case an old trampoline is in it. */
1719 #endif /* __convex__ */
1723 /* Modified from the convex -code above. */
1725 #include <sys/param.h>
1727 #include <sys/m88kbcs.h>
1730 __enable_execute_stack (void)
1733 static unsigned long lowest
= USRSTACK
;
1734 unsigned long current
= (unsigned long) &save_errno
& -NBPC
;
1736 /* Ignore errno being set. memctl sets errno to EINVAL whenever the
1737 address is seen as 'negative'. That is the case with the stack. */
1740 if (lowest
> current
)
1742 unsigned len
=lowest
-current
;
1743 memctl(current
,len
,MCT_TEXT
);
1747 memctl(current
,NBPC
,MCT_TEXT
);
1751 #endif /* __sysV88__ */
1755 #include <sys/signal.h>
1758 /* Motorola forgot to put memctl.o in the libp version of libc881.a,
1759 so define it here, because we need it in __clear_insn_cache below */
1760 /* On older versions of this OS, no memctl or MCT_TEXT are defined;
1761 hence we enable this stuff only if MCT_TEXT is #define'd. */
1776 /* Clear instruction cache so we can call trampolines on stack.
1777 This is called from FINALIZE_TRAMPOLINE in mot3300.h. */
1780 __clear_insn_cache (void)
1785 /* Preserve errno, because users would be surprised to have
1786 errno changing without explicitly calling any system-call. */
1789 /* Keep it simple : memctl (MCT_TEXT) always fully clears the insn cache.
1790 No need to use an address derived from _start or %sp, as 0 works also. */
1791 memctl(0, 4096, MCT_TEXT
);
1796 #endif /* __sysV68__ */
1800 #undef NULL /* Avoid errors if stdio.h and our stddef.h mismatch. */
1802 #include <sys/mman.h>
1803 #include <sys/types.h>
1804 #include <sys/param.h>
1805 #include <sys/vmmac.h>
1807 /* Modified from the convex -code above.
1808 mremap promises to clear the i-cache. */
1811 __enable_execute_stack (void)
1814 if (mprotect (((unsigned int)&fp
/PAGSIZ
)*PAGSIZ
, PAGSIZ
,
1815 PROT_READ
|PROT_WRITE
|PROT_EXEC
))
1817 perror ("mprotect in __enable_execute_stack");
1822 #endif /* __pyr__ */
1824 #if defined (sony_news) && defined (SYSTYPE_BSD)
1827 #include <sys/types.h>
1828 #include <sys/param.h>
1829 #include <syscall.h>
1830 #include <machine/sysnews.h>
1832 /* cacheflush function for NEWS-OS 4.2.
1833 This function is called from trampoline-initialize code
1834 defined in config/mips/mips.h. */
1837 cacheflush (char *beg
, int size
, int flag
)
1839 if (syscall (SYS_sysnews
, NEWS_CACHEFLUSH
, beg
, size
, FLUSH_BCACHE
))
1841 perror ("cache_flush");
1847 #endif /* sony_news */
1848 #endif /* L_trampoline */
1853 #include "gbl-ctors.h"
1854 /* Some systems use __main in a way incompatible with its use in gcc, in these
1855 cases use the macros NAME__MAIN to give a quoted symbol and SYMBOL__MAIN to
1856 give the same symbol without quotes for an alternative entry point. You
1857 must define both, or neither. */
1859 #define NAME__MAIN "__main"
1860 #define SYMBOL__MAIN __main
1863 #ifdef INIT_SECTION_ASM_OP
1864 #undef HAS_INIT_SECTION
1865 #define HAS_INIT_SECTION
1868 #if !defined (HAS_INIT_SECTION) || !defined (OBJECT_FORMAT_ELF)
1870 /* Some ELF crosses use crtstuff.c to provide __CTOR_LIST__, but use this
1871 code to run constructors. In that case, we need to handle EH here, too. */
1873 #ifdef EH_FRAME_SECTION_NAME
1874 #include "unwind-dw2-fde.h"
1875 extern unsigned char __EH_FRAME_BEGIN__
[];
1878 /* Run all the global destructors on exit from the program. */
1881 __do_global_dtors (void)
1883 #ifdef DO_GLOBAL_DTORS_BODY
1884 DO_GLOBAL_DTORS_BODY
;
1886 static func_ptr
*p
= __DTOR_LIST__
+ 1;
1893 #if defined (EH_FRAME_SECTION_NAME) && !defined (HAS_INIT_SECTION)
1895 static int completed
= 0;
1899 __deregister_frame_info (__EH_FRAME_BEGIN__
);
1906 #ifndef HAS_INIT_SECTION
1907 /* Run all the global constructors on entry to the program. */
1910 __do_global_ctors (void)
1912 #ifdef EH_FRAME_SECTION_NAME
1914 static struct object object
;
1915 __register_frame_info (__EH_FRAME_BEGIN__
, &object
);
1918 DO_GLOBAL_CTORS_BODY
;
1919 atexit (__do_global_dtors
);
1921 #endif /* no HAS_INIT_SECTION */
1923 #if !defined (HAS_INIT_SECTION) || defined (INVOKE__main)
1924 /* Subroutine called automatically by `main'.
1925 Compiling a global function named `main'
1926 produces an automatic call to this function at the beginning.
1928 For many systems, this routine calls __do_global_ctors.
1929 For systems which support a .init section we use the .init section
1930 to run __do_global_ctors, so we need not do anything here. */
1935 /* Support recursive calls to `main': run initializers just once. */
1936 static int initialized
;
1940 __do_global_ctors ();
1943 #endif /* no HAS_INIT_SECTION or INVOKE__main */
1945 #endif /* L__main */
1946 #endif /* __CYGWIN__ */
1950 #include "gbl-ctors.h"
1952 /* Provide default definitions for the lists of constructors and
1953 destructors, so that we don't get linker errors. These symbols are
1954 intentionally bss symbols, so that gld and/or collect will provide
1955 the right values. */
1957 /* We declare the lists here with two elements each,
1958 so that they are valid empty lists if no other definition is loaded.
1960 If we are using the old "set" extensions to have the gnu linker
1961 collect ctors and dtors, then we __CTOR_LIST__ and __DTOR_LIST__
1962 must be in the bss/common section.
1964 Long term no port should use those extensions. But many still do. */
1965 #if !defined(INIT_SECTION_ASM_OP) && !defined(CTOR_LISTS_DEFINED_EXTERNALLY)
1966 #if defined (TARGET_ASM_CONSTRUCTOR) || defined (USE_COLLECT2)
1967 func_ptr __CTOR_LIST__
[2] = {0, 0};
1968 func_ptr __DTOR_LIST__
[2] = {0, 0};
1970 func_ptr __CTOR_LIST__
[2];
1971 func_ptr __DTOR_LIST__
[2];
1973 #endif /* no INIT_SECTION_ASM_OP and not CTOR_LISTS_DEFINED_EXTERNALLY */
1974 #endif /* L_ctors */
1978 #include "gbl-ctors.h"
1986 static func_ptr
*atexit_chain
= 0;
1987 static long atexit_chain_length
= 0;
1988 static volatile long last_atexit_chain_slot
= -1;
1991 atexit (func_ptr func
)
1993 if (++last_atexit_chain_slot
== atexit_chain_length
)
1995 atexit_chain_length
+= 32;
1997 atexit_chain
= (func_ptr
*) realloc (atexit_chain
, atexit_chain_length
1998 * sizeof (func_ptr
));
2000 atexit_chain
= (func_ptr
*) malloc (atexit_chain_length
2001 * sizeof (func_ptr
));
2004 atexit_chain_length
= 0;
2005 last_atexit_chain_slot
= -1;
2010 atexit_chain
[last_atexit_chain_slot
] = func
;
2014 extern void _cleanup (void);
2015 extern void _exit (int) __attribute__ ((__noreturn__
));
2022 for ( ; last_atexit_chain_slot
-- >= 0; )
2024 (*atexit_chain
[last_atexit_chain_slot
+ 1]) ();
2025 atexit_chain
[last_atexit_chain_slot
+ 1] = 0;
2027 free (atexit_chain
);
2040 /* Simple; we just need a wrapper for ON_EXIT. */
2042 atexit (func_ptr func
)
2044 return ON_EXIT (func
);
2047 #endif /* ON_EXIT */
2048 #endif /* NEED_ATEXIT */