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
34 /* It is incorrect to include config.h here, because this file is being
35 compiled for the target, and hence definitions concerning only the host
43 /* Don't use `fancy_abort' here even if config.h says to use it. */
50 #if defined (L_negdi2) || defined (L_divdi3) || defined (L_moddi3)
51 #if defined (L_divdi3) || defined (L_moddi3)
63 w.s.high = -uu.s.high - ((UWtype) w.s.low > 0);
71 __addvsi3 (Wtype a, Wtype b)
77 if (b >= 0 ? w < a : w > a)
86 __addvdi3 (DWtype a, DWtype b)
92 if (b >= 0 ? w < a : w > a)
101 __subvsi3 (Wtype a, Wtype b)
104 return __addvsi3 (a, (-b));
110 if (b >= 0 ? w > a : w < a)
120 __subvdi3 (DWtype a, DWtype b)
129 if (b >= 0 ? w > a : w < a)
139 __mulvsi3 (Wtype a, Wtype b)
145 if (((a >= 0) == (b >= 0)) ? w < 0 : w > 0)
160 if (a >= 0 ? w > 0 : w < 0)
175 if (a >= 0 ? w > 0 : w < 0)
224 __mulvdi3 (DWtype u, DWtype v)
230 if (((u >= 0) == (v >= 0)) ? w < 0 : w > 0)
238 /* Unless shift functions are defined whith full ANSI prototypes,
239 parameter b will be promoted to int if word_type is smaller than an int. */
242 __lshrdi3 (DWtype u, word_type b)
253 bm = (sizeof (Wtype) * BITS_PER_UNIT) - b;
257 w.s.low = (UWtype) uu.s.high >> -bm;
261 UWtype carries = (UWtype) uu.s.high << bm;
263 w.s.high = (UWtype) uu.s.high >> b;
264 w.s.low = ((UWtype) uu.s.low >> b) | carries;
273 __ashldi3 (DWtype u, word_type b)
284 bm = (sizeof (Wtype) * BITS_PER_UNIT) - b;
288 w.s.high = (UWtype) uu.s.low << -bm;
292 UWtype carries = (UWtype) uu.s.low >> bm;
294 w.s.low = (UWtype) uu.s.low << b;
295 w.s.high = ((UWtype) uu.s.high << b) | carries;
304 __ashrdi3 (DWtype u, word_type b)
315 bm = (sizeof (Wtype) * BITS_PER_UNIT) - b;
318 /* w.s.high = 1..1 or 0..0 */
319 w.s.high = uu.s.high >> (sizeof (Wtype) * BITS_PER_UNIT - 1);
320 w.s.low = uu.s.high >> -bm;
324 UWtype carries = (UWtype) uu.s.high << bm;
326 w.s.high = uu.s.high >> b;
327 w.s.low = ((UWtype) uu.s.low >> b) | carries;
339 UWtype word, count, add;
343 word = uu.s.low, add = 0;
344 else if (uu.s.high != 0)
345 word = uu.s.high, add = BITS_PER_UNIT * sizeof (Wtype);
349 count_trailing_zeros (count, word);
350 return count + add + 1;
356 __muldi3 (DWtype u, DWtype v)
364 w.ll = __umulsidi3 (uu.s.low, vv.s.low);
365 w.s.high += ((UWtype) uu.s.low * (UWtype) vv.s.high
366 + (UWtype) uu.s.high * (UWtype) vv.s.low);
373 #if defined (sdiv_qrnnd)
375 __udiv_w_sdiv (UWtype *rp, UWtype a1, UWtype a0, UWtype d)
382 if (a1 < d - a1 - (a0 >> (W_TYPE_SIZE - 1)))
384 /* dividend, divisor, and quotient are nonnegative */
385 sdiv_qrnnd (q, r, a1, a0, d);
389 /* Compute c1*2^32 + c0 = a1*2^32 + a0 - 2^31*d */
390 sub_ddmmss (c1, c0, a1, a0, d >> 1, d << (W_TYPE_SIZE - 1));
391 /* Divide (c1*2^32 + c0) by d */
392 sdiv_qrnnd (q, r, c1, c0, d);
393 /* Add 2^31 to quotient */
394 q += (UWtype) 1 << (W_TYPE_SIZE - 1);
399 b1 = d >> 1; /* d/2, between 2^30 and 2^31 - 1 */
400 c1 = a1 >> 1; /* A/2 */
401 c0 = (a1 << (W_TYPE_SIZE - 1)) + (a0 >> 1);
403 if (a1 < b1) /* A < 2^32*b1, so A/2 < 2^31*b1 */
405 sdiv_qrnnd (q, r, c1, c0, b1); /* (A/2) / (d/2) */
407 r = 2*r + (a0 & 1); /* Remainder from A/(2*b1) */
424 else if (c1 < b1) /* So 2^31 <= (A/2)/b1 < 2^32 */
427 c0 = ~c0; /* logical NOT */
429 sdiv_qrnnd (q, r, c1, c0, b1); /* (A/2) / (d/2) */
431 q = ~q; /* (A/2)/b1 */
434 r = 2*r + (a0 & 1); /* A/(2*b1) */
452 else /* Implies c1 = b1 */
453 { /* Hence a1 = d - 1 = 2*b1 - 1 */
471 /* If sdiv_qrnnd doesn't exist, define dummy __udiv_w_sdiv. */
473 __udiv_w_sdiv (UWtype *rp __attribute__ ((__unused__)),
474 UWtype a1 __attribute__ ((__unused__)),
475 UWtype a0 __attribute__ ((__unused__)),
476 UWtype d __attribute__ ((__unused__)))
483 #if (defined (L_udivdi3) || defined (L_divdi3) || \
484 defined (L_umoddi3) || defined (L_moddi3))
489 const UQItype __clz_tab[] =
491 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,
492 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,
493 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,
494 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,
495 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,
496 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,
497 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,
498 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,
504 #if (defined (L_udivdi3) || defined (L_divdi3) || \
505 defined (L_umoddi3) || defined (L_moddi3))
509 __udivmoddi4 (UDWtype n, UDWtype d, UDWtype *rp)
514 UWtype d0, d1, n0, n1, n2;
526 #if !UDIV_NEEDS_NORMALIZATION
533 udiv_qrnnd (q0, n0, n1, n0, d0);
536 /* Remainder in n0. */
543 d0 = 1 / d0; /* Divide intentionally by zero. */
545 udiv_qrnnd (q1, n1, 0, n1, d0);
546 udiv_qrnnd (q0, n0, n1, n0, d0);
548 /* Remainder in n0. */
559 #else /* UDIV_NEEDS_NORMALIZATION */
567 count_leading_zeros (bm, d0);
571 /* Normalize, i.e. make the most significant bit of the
575 n1 = (n1 << bm) | (n0 >> (W_TYPE_SIZE - bm));
579 udiv_qrnnd (q0, n0, n1, n0, d0);
582 /* Remainder in n0 >> bm. */
589 d0 = 1 / d0; /* Divide intentionally by zero. */
591 count_leading_zeros (bm, d0);
595 /* From (n1 >= d0) /\ (the most significant bit of d0 is set),
596 conclude (the most significant bit of n1 is set) /\ (the
597 leading quotient digit q1 = 1).
599 This special case is necessary, not an optimization.
600 (Shifts counts of W_TYPE_SIZE are undefined.) */
609 b = W_TYPE_SIZE - bm;
613 n1 = (n1 << bm) | (n0 >> b);
616 udiv_qrnnd (q1, n1, n2, n1, d0);
621 udiv_qrnnd (q0, n0, n1, n0, d0);
623 /* Remainder in n0 >> bm. */
633 #endif /* UDIV_NEEDS_NORMALIZATION */
644 /* Remainder in n1n0. */
656 count_leading_zeros (bm, d1);
659 /* From (n1 >= d1) /\ (the most significant bit of d1 is set),
660 conclude (the most significant bit of n1 is set) /\ (the
661 quotient digit q0 = 0 or 1).
663 This special case is necessary, not an optimization. */
665 /* The condition on the next line takes advantage of that
666 n1 >= d1 (true due to program flow). */
667 if (n1 > d1 || n0 >= d0)
670 sub_ddmmss (n1, n0, n1, n0, d1, d0);
689 b = W_TYPE_SIZE - bm;
691 d1 = (d1 << bm) | (d0 >> b);
694 n1 = (n1 << bm) | (n0 >> b);
697 udiv_qrnnd (q0, n1, n2, n1, d1);
698 umul_ppmm (m1, m0, q0, d0);
700 if (m1 > n1 || (m1 == n1 && m0 > n0))
703 sub_ddmmss (m1, m0, m1, m0, d1, d0);
708 /* Remainder in (n1n0 - m1m0) >> bm. */
711 sub_ddmmss (n1, n0, n1, n0, m1, m0);
712 rr.s.low = (n1 << b) | (n0 >> bm);
713 rr.s.high = n1 >> bm;
728 __divdi3 (DWtype u, DWtype v)
739 uu.ll = __negdi2 (uu.ll);
742 vv.ll = __negdi2 (vv.ll);
744 w = __udivmoddi4 (uu.ll, vv.ll, (UDWtype *) 0);
754 __moddi3 (DWtype u, DWtype v)
765 uu.ll = __negdi2 (uu.ll);
767 vv.ll = __negdi2 (vv.ll);
769 (void) __udivmoddi4 (uu.ll, vv.ll, &w);
779 __umoddi3 (UDWtype u, UDWtype v)
783 (void) __udivmoddi4 (u, v, &w);
791 __udivdi3 (UDWtype n, UDWtype d)
793 return __udivmoddi4 (n, d, (UDWtype *) 0);
799 __cmpdi2 (DWtype a, DWtype b)
803 au.ll = a, bu.ll = b;
805 if (au.s.high < bu.s.high)
807 else if (au.s.high > bu.s.high)
809 if ((UWtype) au.s.low < (UWtype) bu.s.low)
811 else if ((UWtype) au.s.low > (UWtype) bu.s.low)
819 __ucmpdi2 (DWtype a, DWtype b)
823 au.ll = a, bu.ll = b;
825 if ((UWtype) au.s.high < (UWtype) bu.s.high)
827 else if ((UWtype) au.s.high > (UWtype) bu.s.high)
829 if ((UWtype) au.s.low < (UWtype) bu.s.low)
831 else if ((UWtype) au.s.low > (UWtype) bu.s.low)
837 #if defined(L_fixunstfdi) && (LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 128)
838 #define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
839 #define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
842 __fixunstfDI (TFtype a)
850 /* Compute high word of result, as a flonum. */
851 b = (a / HIGH_WORD_COEFF);
852 /* Convert that to fixed (but not to DWtype!),
853 and shift it into the high word. */
856 /* Remove high part from the TFtype, leaving the low part as flonum. */
858 /* Convert that to fixed (but not to DWtype!) and add it in.
859 Sometimes A comes out negative. This is significant, since
860 A has more bits than a long int does. */
869 #if defined(L_fixtfdi) && (LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 128)
874 return - __fixunstfDI (-a);
875 return __fixunstfDI (a);
879 #if defined(L_fixunsxfdi) && (LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 96)
880 #define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
881 #define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
884 __fixunsxfDI (XFtype a)
892 /* Compute high word of result, as a flonum. */
893 b = (a / HIGH_WORD_COEFF);
894 /* Convert that to fixed (but not to DWtype!),
895 and shift it into the high word. */
898 /* Remove high part from the XFtype, leaving the low part as flonum. */
900 /* Convert that to fixed (but not to DWtype!) and add it in.
901 Sometimes A comes out negative. This is significant, since
902 A has more bits than a long int does. */
911 #if defined(L_fixxfdi) && (LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 96)
916 return - __fixunsxfDI (-a);
917 return __fixunsxfDI (a);
922 #define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
923 #define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
926 __fixunsdfDI (DFtype a)
934 /* Compute high word of result, as a flonum. */
935 b = (a / HIGH_WORD_COEFF);
936 /* Convert that to fixed (but not to DWtype!),
937 and shift it into the high word. */
940 /* Remove high part from the DFtype, leaving the low part as flonum. */
942 /* Convert that to fixed (but not to DWtype!) and add it in.
943 Sometimes A comes out negative. This is significant, since
944 A has more bits than a long int does. */
958 return - __fixunsdfDI (-a);
959 return __fixunsdfDI (a);
964 #define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
965 #define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
968 __fixunssfDI (SFtype original_a)
970 /* Convert the SFtype to a DFtype, because that is surely not going
971 to lose any bits. Some day someone else can write a faster version
972 that avoids converting to DFtype, and verify it really works right. */
973 DFtype a = original_a;
980 /* Compute high word of result, as a flonum. */
981 b = (a / HIGH_WORD_COEFF);
982 /* Convert that to fixed (but not to DWtype!),
983 and shift it into the high word. */
986 /* Remove high part from the DFtype, leaving the low part as flonum. */
988 /* Convert that to fixed (but not to DWtype!) and add it in.
989 Sometimes A comes out negative. This is significant, since
990 A has more bits than a long int does. */
1001 __fixsfdi (SFtype a)
1004 return - __fixunssfDI (-a);
1005 return __fixunssfDI (a);
1009 #if defined(L_floatdixf) && (LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 96)
1010 #define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
1011 #define HIGH_HALFWORD_COEFF (((UDWtype) 1) << (WORD_SIZE / 2))
1012 #define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
1015 __floatdixf (DWtype u)
1019 d = (Wtype) (u >> WORD_SIZE);
1020 d *= HIGH_HALFWORD_COEFF;
1021 d *= HIGH_HALFWORD_COEFF;
1022 d += (UWtype) (u & (HIGH_WORD_COEFF - 1));
1028 #if defined(L_floatditf) && (LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 128)
1029 #define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
1030 #define HIGH_HALFWORD_COEFF (((UDWtype) 1) << (WORD_SIZE / 2))
1031 #define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
1034 __floatditf (DWtype u)
1038 d = (Wtype) (u >> WORD_SIZE);
1039 d *= HIGH_HALFWORD_COEFF;
1040 d *= HIGH_HALFWORD_COEFF;
1041 d += (UWtype) (u & (HIGH_WORD_COEFF - 1));
1048 #define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
1049 #define HIGH_HALFWORD_COEFF (((UDWtype) 1) << (WORD_SIZE / 2))
1050 #define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
1053 __floatdidf (DWtype u)
1057 d = (Wtype) (u >> WORD_SIZE);
1058 d *= HIGH_HALFWORD_COEFF;
1059 d *= HIGH_HALFWORD_COEFF;
1060 d += (UWtype) (u & (HIGH_WORD_COEFF - 1));
1067 #define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
1068 #define HIGH_HALFWORD_COEFF (((UDWtype) 1) << (WORD_SIZE / 2))
1069 #define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
1070 #define DI_SIZE (sizeof (DWtype) * BITS_PER_UNIT)
1072 /* Define codes for all the float formats that we know of. Note
1073 that this is copied from real.h. */
1075 #define UNKNOWN_FLOAT_FORMAT 0
1076 #define IEEE_FLOAT_FORMAT 1
1077 #define VAX_FLOAT_FORMAT 2
1078 #define IBM_FLOAT_FORMAT 3
1080 /* Default to IEEE float if not specified. Nearly all machines use it. */
1081 #ifndef HOST_FLOAT_FORMAT
1082 #define HOST_FLOAT_FORMAT IEEE_FLOAT_FORMAT
1085 #if HOST_FLOAT_FORMAT == IEEE_FLOAT_FORMAT
1090 #if HOST_FLOAT_FORMAT == IBM_FLOAT_FORMAT
1095 #if HOST_FLOAT_FORMAT == VAX_FLOAT_FORMAT
1101 __floatdisf (DWtype u)
1103 /* Do the calculation in DFmode
1104 so that we don't lose any of the precision of the high word
1105 while multiplying it. */
1108 /* Protect against double-rounding error.
1109 Represent any low-order bits, that might be truncated in DFmode,
1110 by a bit that won't be lost. The bit can go in anywhere below the
1111 rounding position of the SFmode. A fixed mask and bit position
1112 handles all usual configurations. It doesn't handle the case
1113 of 128-bit DImode, however. */
1114 if (DF_SIZE < DI_SIZE
1115 && DF_SIZE > (DI_SIZE - DF_SIZE + SF_SIZE))
1117 #define REP_BIT ((UDWtype) 1 << (DI_SIZE - DF_SIZE))
1118 if (! (- ((DWtype) 1 << DF_SIZE) < u
1119 && u < ((DWtype) 1 << DF_SIZE)))
1121 if ((UDWtype) u & (REP_BIT - 1))
1125 f = (Wtype) (u >> WORD_SIZE);
1126 f *= HIGH_HALFWORD_COEFF;
1127 f *= HIGH_HALFWORD_COEFF;
1128 f += (UWtype) (u & (HIGH_WORD_COEFF - 1));
1134 #if defined(L_fixunsxfsi) && LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 96
1135 /* Reenable the normal types, in case limits.h needs them. */
1148 __fixunsxfSI (XFtype a)
1150 if (a >= - (DFtype) Wtype_MIN)
1151 return (Wtype) (a + Wtype_MIN) - Wtype_MIN;
1157 /* Reenable the normal types, in case limits.h needs them. */
1170 __fixunsdfSI (DFtype a)
1172 if (a >= - (DFtype) Wtype_MIN)
1173 return (Wtype) (a + Wtype_MIN) - Wtype_MIN;
1179 /* Reenable the normal types, in case limits.h needs them. */
1192 __fixunssfSI (SFtype a)
1194 if (a >= - (SFtype) Wtype_MIN)
1195 return (Wtype) (a + Wtype_MIN) - Wtype_MIN;
1200 /* From here on down, the routines use normal data types. */
1202 #define SItype bogus_type
1203 #define USItype bogus_type
1204 #define DItype bogus_type
1205 #define UDItype bogus_type
1206 #define SFtype bogus_type
1207 #define DFtype bogus_type
1225 /* Like bcmp except the sign is meaningful.
1226 Result is negative if S1 is less than S2,
1227 positive if S1 is greater, 0 if S1 and S2 are equal. */
1230 __gcc_bcmp (const unsigned char *s1, const unsigned char *s2, size_t size)
1234 unsigned char c1 = *s1++, c2 = *s2++;
1244 /* __eprintf used to be used by GCC's private version of <assert.h>.
1245 We no longer provide that header, but this routine remains in libgcc.a
1246 for binary backward compatibility. Note that it is not included in
1247 the shared version of libgcc. */
1249 #ifndef inhibit_libc
1251 #undef NULL /* Avoid errors if stdio.h and our stddef.h mismatch. */
1255 __eprintf (const char *string, const char *expression,
1256 unsigned int line, const char *filename)
1258 fprintf (stderr, string, expression, line, filename);
1268 #if LONG_TYPE_SIZE == GCOV_TYPE_SIZE
1269 typedef long gcov_type;
1271 typedef long long gcov_type;
1275 /* Structure emitted by -a */
1279 const char *filename;
1283 const unsigned long *addresses;
1285 /* Older GCC's did not emit these fields. */
1287 const char **functions;
1288 const long *line_nums;
1289 const char **filenames;
1293 #ifndef inhibit_libc
1295 /* Simple minded basic block profiling output dumper for
1296 systems that don't provide tcov support. At present,
1297 it requires atexit and stdio. */
1299 #undef NULL /* Avoid errors if stdio.h and our stddef.h mismatch. */
1302 #include "gbl-ctors.h"
1303 #include "gcov-io.h"
1305 #ifdef TARGET_HAS_F_SETLKW
1310 static struct bb *bb_head;
1313 __bb_exit_func (void)
1322 i = strlen (bb_head->filename) - 3;
1325 for (ptr = bb_head; ptr != (struct bb *) 0; ptr = ptr->next)
1329 /* Make sure the output file exists -
1330 but don't clobber exiting data. */
1331 if ((da_file = fopen (ptr->filename, "a")) != 0)
1334 /* Need to re-open in order to be able to write from the start. */
1335 da_file = fopen (ptr->filename, "r+b");
1336 /* Some old systems might not allow the 'b' mode modifier.
1337 Therefore, try to open without it. This can lead to a race
1338 condition so that when you delete and re-create the file, the
1339 file might be opened in text mode, but then, you shouldn't
1340 delete the file in the first place. */
1342 da_file = fopen (ptr->filename, "r+");
1345 fprintf (stderr, "arc profiling: Can't open output file %s.\n",
1350 /* After a fork, another process might try to read and/or write
1351 the same file simultanously. So if we can, lock the file to
1352 avoid race conditions. */
1353 #if defined (TARGET_HAS_F_SETLKW)
1355 struct flock s_flock;
1357 s_flock.l_type = F_WRLCK;
1358 s_flock.l_whence = SEEK_SET;
1359 s_flock.l_start = 0;
1361 s_flock.l_pid = getpid ();
1363 while (fcntl (fileno (da_file), F_SETLKW, &s_flock)
1368 /* If the file is not empty, and the number of counts in it is the
1369 same, then merge them in. */
1370 firstchar = fgetc (da_file);
1371 if (firstchar == EOF)
1373 if (ferror (da_file))
1375 fprintf (stderr, "arc profiling: Can't read output file ");
1376 perror (ptr->filename);
1383 if (ungetc (firstchar, da_file) == EOF)
1385 if (__read_long (&n_counts, da_file, 8) != 0)
1387 fprintf (stderr, "arc profiling: Can't read output file %s.\n",
1392 if (n_counts == ptr->ncounts)
1396 for (i = 0; i < n_counts; i++)
1400 if (__read_gcov_type (&v, da_file, 8) != 0)
1403 "arc profiling: Can't read output file %s.\n",
1407 ptr->counts[i] += v;
1415 /* ??? Should first write a header to the file. Preferably, a 4 byte
1416 magic number, 4 bytes containing the time the program was
1417 compiled, 4 bytes containing the last modification time of the
1418 source file, and 4 bytes indicating the compiler options used.
1420 That way we can easily verify that the proper source/executable/
1421 data file combination is being used from gcov. */
1423 if (__write_gcov_type (ptr->ncounts, da_file, 8) != 0)
1426 fprintf (stderr, "arc profiling: Error writing output file %s.\n",
1432 gcov_type *count_ptr = ptr->counts;
1434 for (j = ptr->ncounts; j > 0; j--)
1436 if (__write_gcov_type (*count_ptr, da_file, 8) != 0)
1444 fprintf (stderr, "arc profiling: Error writing output file %s.\n",
1448 if (fclose (da_file) == EOF)
1449 fprintf (stderr, "arc profiling: Error closing output file %s.\n",
1457 __bb_init_func (struct bb *blocks)
1459 /* User is supposed to check whether the first word is non-0,
1460 but just in case.... */
1462 if (blocks->zero_word)
1465 /* Initialize destructor. */
1467 atexit (__bb_exit_func);
1469 /* Set up linked list. */
1470 blocks->zero_word = 1;
1471 blocks->next = bb_head;
1475 /* Called before fork or exec - write out profile information gathered so
1476 far and reset it to zero. This avoids duplication or loss of the
1477 profile information gathered so far. */
1479 __bb_fork_func (void)
1484 for (ptr = bb_head; ptr != (struct bb *) 0; ptr = ptr->next)
1487 for (i = ptr->ncounts - 1; i >= 0; i--)
1492 #endif /* not inhibit_libc */
1495 #ifdef L_clear_cache
1496 /* Clear part of an instruction cache. */
1498 #define INSN_CACHE_PLANE_SIZE (INSN_CACHE_SIZE / INSN_CACHE_DEPTH)
1501 __clear_cache (char *beg __attribute__((__unused__)),
1502 char *end __attribute__((__unused__)))
1504 #ifdef CLEAR_INSN_CACHE
1505 CLEAR_INSN_CACHE (beg, end);
1507 #ifdef INSN_CACHE_SIZE
1508 static char array[INSN_CACHE_SIZE + INSN_CACHE_PLANE_SIZE + INSN_CACHE_LINE_WIDTH];
1509 static int initialized;
1513 typedef (*function_ptr) (void);
1515 #if (INSN_CACHE_SIZE / INSN_CACHE_LINE_WIDTH) < 16
1516 /* It's cheaper to clear the whole cache.
1517 Put in a series of jump instructions so that calling the beginning
1518 of the cache will clear the whole thing. */
1522 int ptr = (((int) array + INSN_CACHE_LINE_WIDTH - 1)
1523 & -INSN_CACHE_LINE_WIDTH);
1524 int end_ptr = ptr + INSN_CACHE_SIZE;
1526 while (ptr < end_ptr)
1528 *(INSTRUCTION_TYPE *)ptr
1529 = JUMP_AHEAD_INSTRUCTION + INSN_CACHE_LINE_WIDTH;
1530 ptr += INSN_CACHE_LINE_WIDTH;
1532 *(INSTRUCTION_TYPE *) (ptr - INSN_CACHE_LINE_WIDTH) = RETURN_INSTRUCTION;
1537 /* Call the beginning of the sequence. */
1538 (((function_ptr) (((int) array + INSN_CACHE_LINE_WIDTH - 1)
1539 & -INSN_CACHE_LINE_WIDTH))
1542 #else /* Cache is large. */
1546 int ptr = (((int) array + INSN_CACHE_LINE_WIDTH - 1)
1547 & -INSN_CACHE_LINE_WIDTH);
1549 while (ptr < (int) array + sizeof array)
1551 *(INSTRUCTION_TYPE *)ptr = RETURN_INSTRUCTION;
1552 ptr += INSN_CACHE_LINE_WIDTH;
1558 /* Find the location in array that occupies the same cache line as BEG. */
1560 offset = ((int) beg & -INSN_CACHE_LINE_WIDTH) & (INSN_CACHE_PLANE_SIZE - 1);
1561 start_addr = (((int) (array + INSN_CACHE_PLANE_SIZE - 1)
1562 & -INSN_CACHE_PLANE_SIZE)
1565 /* Compute the cache alignment of the place to stop clearing. */
1566 #if 0 /* This is not needed for gcc's purposes. */
1567 /* If the block to clear is bigger than a cache plane,
1568 we clear the entire cache, and OFFSET is already correct. */
1569 if (end < beg + INSN_CACHE_PLANE_SIZE)
1571 offset = (((int) (end + INSN_CACHE_LINE_WIDTH - 1)
1572 & -INSN_CACHE_LINE_WIDTH)
1573 & (INSN_CACHE_PLANE_SIZE - 1));
1575 #if INSN_CACHE_DEPTH > 1
1576 end_addr = (start_addr & -INSN_CACHE_PLANE_SIZE) + offset;
1577 if (end_addr <= start_addr)
1578 end_addr += INSN_CACHE_PLANE_SIZE;
1580 for (plane = 0; plane < INSN_CACHE_DEPTH; plane++)
1582 int addr = start_addr + plane * INSN_CACHE_PLANE_SIZE;
1583 int stop = end_addr + plane * INSN_CACHE_PLANE_SIZE;
1585 while (addr != stop)
1587 /* Call the return instruction at ADDR. */
1588 ((function_ptr) addr) ();
1590 addr += INSN_CACHE_LINE_WIDTH;
1593 #else /* just one plane */
1596 /* Call the return instruction at START_ADDR. */
1597 ((function_ptr) start_addr) ();
1599 start_addr += INSN_CACHE_LINE_WIDTH;
1601 while ((start_addr % INSN_CACHE_SIZE) != offset);
1602 #endif /* just one plane */
1603 #endif /* Cache is large */
1604 #endif /* Cache exists */
1605 #endif /* CLEAR_INSN_CACHE */
1608 #endif /* L_clear_cache */
1612 /* Jump to a trampoline, loading the static chain address. */
1614 #if defined(WINNT) && ! defined(__CYGWIN__) && ! defined (_UWIN)
1627 extern int VirtualProtect (char *, int, int, int *) __attribute__((stdcall));
1631 mprotect (char *addr, int len, int prot)
1648 if (VirtualProtect (addr, len, np, &op))
1654 #endif /* WINNT && ! __CYGWIN__ && ! _UWIN */
1656 #ifdef TRANSFER_FROM_TRAMPOLINE
1657 TRANSFER_FROM_TRAMPOLINE
1660 #if defined (NeXT) && defined (__MACH__)
1662 /* Make stack executable so we can call trampolines on stack.
1663 This is called from INITIALIZE_TRAMPOLINE in next.h. */
1667 #include <mach/mach.h>
1671 __enable_execute_stack (char *addr)
1674 char *eaddr = addr + TRAMPOLINE_SIZE;
1675 vm_address_t a = (vm_address_t) addr;
1677 /* turn on execute access on stack */
1678 r = vm_protect (task_self (), a, TRAMPOLINE_SIZE, FALSE, VM_PROT_ALL);
1679 if (r != KERN_SUCCESS)
1681 mach_error("vm_protect VM_PROT_ALL", r);
1685 /* We inline the i-cache invalidation for speed */
1687 #ifdef CLEAR_INSN_CACHE
1688 CLEAR_INSN_CACHE (addr, eaddr);
1690 __clear_cache ((int) addr, (int) eaddr);
1694 #endif /* defined (NeXT) && defined (__MACH__) */
1698 /* Make stack executable so we can call trampolines on stack.
1699 This is called from INITIALIZE_TRAMPOLINE in convex.h. */
1701 #include <sys/mman.h>
1702 #include <sys/vmparam.h>
1703 #include <machine/machparam.h>
1706 __enable_execute_stack (void)
1709 static unsigned lowest = USRSTACK;
1710 unsigned current = (unsigned) &fp & -NBPG;
1712 if (lowest > current)
1714 unsigned len = lowest - current;
1715 mremap (current, &len, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE);
1719 /* Clear instruction cache in case an old trampoline is in it. */
1722 #endif /* __convex__ */
1726 /* Modified from the convex -code above. */
1728 #include <sys/param.h>
1730 #include <sys/m88kbcs.h>
1733 __enable_execute_stack (void)
1736 static unsigned long lowest = USRSTACK;
1737 unsigned long current = (unsigned long) &save_errno & -NBPC;
1739 /* Ignore errno being set. memctl sets errno to EINVAL whenever the
1740 address is seen as 'negative'. That is the case with the stack. */
1743 if (lowest > current)
1745 unsigned len=lowest-current;
1746 memctl(current,len,MCT_TEXT);
1750 memctl(current,NBPC,MCT_TEXT);
1754 #endif /* __sysV88__ */
1758 #include <sys/signal.h>
1761 /* Motorola forgot to put memctl.o in the libp version of libc881.a,
1762 so define it here, because we need it in __clear_insn_cache below */
1763 /* On older versions of this OS, no memctl or MCT_TEXT are defined;
1764 hence we enable this stuff only if MCT_TEXT is #define'd. */
1779 /* Clear instruction cache so we can call trampolines on stack.
1780 This is called from FINALIZE_TRAMPOLINE in mot3300.h. */
1783 __clear_insn_cache (void)
1788 /* Preserve errno, because users would be surprised to have
1789 errno changing without explicitly calling any system-call. */
1792 /* Keep it simple : memctl (MCT_TEXT) always fully clears the insn cache.
1793 No need to use an address derived from _start or %sp, as 0 works also. */
1794 memctl(0, 4096, MCT_TEXT);
1799 #endif /* __sysV68__ */
1803 #undef NULL /* Avoid errors if stdio.h and our stddef.h mismatch. */
1805 #include <sys/mman.h>
1806 #include <sys/types.h>
1807 #include <sys/param.h>
1808 #include <sys/vmmac.h>
1810 /* Modified from the convex -code above.
1811 mremap promises to clear the i-cache. */
1814 __enable_execute_stack (void)
1817 if (mprotect (((unsigned int)&fp/PAGSIZ)*PAGSIZ, PAGSIZ,
1818 PROT_READ|PROT_WRITE|PROT_EXEC))
1820 perror ("mprotect in __enable_execute_stack");
1825 #endif /* __pyr__ */
1827 #if defined (sony_news) && defined (SYSTYPE_BSD)
1830 #include <sys/types.h>
1831 #include <sys/param.h>
1832 #include <syscall.h>
1833 #include <machine/sysnews.h>
1835 /* cacheflush function for NEWS-OS 4.2.
1836 This function is called from trampoline-initialize code
1837 defined in config/mips/mips.h. */
1840 cacheflush (char *beg, int size, int flag)
1842 if (syscall (SYS_sysnews, NEWS_CACHEFLUSH, beg, size, FLUSH_BCACHE))
1844 perror ("cache_flush");
1850 #endif /* sony_news */
1851 #endif /* L_trampoline */
1856 #include "gbl-ctors.h"
1857 /* Some systems use __main in a way incompatible with its use in gcc, in these
1858 cases use the macros NAME__MAIN to give a quoted symbol and SYMBOL__MAIN to
1859 give the same symbol without quotes for an alternative entry point. You
1860 must define both, or neither. */
1862 #define NAME__MAIN "__main"
1863 #define SYMBOL__MAIN __main
1866 #ifdef INIT_SECTION_ASM_OP
1867 #undef HAS_INIT_SECTION
1868 #define HAS_INIT_SECTION
1871 #if !defined (HAS_INIT_SECTION) || !defined (OBJECT_FORMAT_ELF)
1873 /* Some ELF crosses use crtstuff.c to provide __CTOR_LIST__, but use this
1874 code to run constructors. In that case, we need to handle EH here, too. */
1876 #ifdef EH_FRAME_SECTION_NAME
1877 #include "unwind-dw2-fde.h"
1878 extern unsigned char __EH_FRAME_BEGIN__[];
1881 /* Run all the global destructors on exit from the program. */
1884 __do_global_dtors (void)
1886 #ifdef DO_GLOBAL_DTORS_BODY
1887 DO_GLOBAL_DTORS_BODY;
1889 static func_ptr *p = __DTOR_LIST__ + 1;
1896 #if defined (EH_FRAME_SECTION_NAME) && !defined (HAS_INIT_SECTION)
1898 static int completed = 0;
1902 __deregister_frame_info (__EH_FRAME_BEGIN__);
1909 #ifndef HAS_INIT_SECTION
1910 /* Run all the global constructors on entry to the program. */
1913 __do_global_ctors (void)
1915 #ifdef EH_FRAME_SECTION_NAME
1917 static struct object object;
1918 __register_frame_info (__EH_FRAME_BEGIN__, &object);
1921 DO_GLOBAL_CTORS_BODY;
1922 atexit (__do_global_dtors);
1924 #endif /* no HAS_INIT_SECTION */
1926 #if !defined (HAS_INIT_SECTION) || defined (INVOKE__main)
1927 /* Subroutine called automatically by `main'.
1928 Compiling a global function named `main'
1929 produces an automatic call to this function at the beginning.
1931 For many systems, this routine calls __do_global_ctors.
1932 For systems which support a .init section we use the .init section
1933 to run __do_global_ctors, so we need not do anything here. */
1938 /* Support recursive calls to `main': run initializers just once. */
1939 static int initialized;
1943 __do_global_ctors ();
1946 #endif /* no HAS_INIT_SECTION or INVOKE__main */
1948 #endif /* L__main */
1949 #endif /* __CYGWIN__ */
1953 #include "gbl-ctors.h"
1955 /* Provide default definitions for the lists of constructors and
1956 destructors, so that we don't get linker errors. These symbols are
1957 intentionally bss symbols, so that gld and/or collect will provide
1958 the right values. */
1960 /* We declare the lists here with two elements each,
1961 so that they are valid empty lists if no other definition is loaded.
1963 If we are using the old "set" extensions to have the gnu linker
1964 collect ctors and dtors, then we __CTOR_LIST__ and __DTOR_LIST__
1965 must be in the bss/common section.
1967 Long term no port should use those extensions. But many still do. */
1968 #if !defined(INIT_SECTION_ASM_OP) && !defined(CTOR_LISTS_DEFINED_EXTERNALLY)
1969 #if defined (TARGET_ASM_CONSTRUCTOR) || defined (USE_COLLECT2)
1970 func_ptr __CTOR_LIST__[2] = {0, 0};
1971 func_ptr __DTOR_LIST__[2] = {0, 0};
1973 func_ptr __CTOR_LIST__[2];
1974 func_ptr __DTOR_LIST__[2];
1976 #endif /* no INIT_SECTION_ASM_OP and not CTOR_LISTS_DEFINED_EXTERNALLY */
1977 #endif /* L_ctors */
1981 #include "gbl-ctors.h"
1989 static func_ptr *atexit_chain = 0;
1990 static long atexit_chain_length = 0;
1991 static volatile long last_atexit_chain_slot = -1;
1994 atexit (func_ptr func)
1996 if (++last_atexit_chain_slot == atexit_chain_length)
1998 atexit_chain_length += 32;
2000 atexit_chain = (func_ptr *) realloc (atexit_chain, atexit_chain_length
2001 * sizeof (func_ptr));
2003 atexit_chain = (func_ptr *) malloc (atexit_chain_length
2004 * sizeof (func_ptr));
2007 atexit_chain_length = 0;
2008 last_atexit_chain_slot = -1;
2013 atexit_chain[last_atexit_chain_slot] = func;
2017 extern void _cleanup (void);
2018 extern void _exit (int) __attribute__ ((__noreturn__));
2025 for ( ; last_atexit_chain_slot-- >= 0; )
2027 (*atexit_chain[last_atexit_chain_slot + 1]) ();
2028 atexit_chain[last_atexit_chain_slot + 1] = 0;
2030 free (atexit_chain);
2043 /* Simple; we just need a wrapper for ON_EXIT. */
2045 atexit (func_ptr func)
2047 return ON_EXIT (func);
2050 #endif /* ON_EXIT */
2051 #endif /* NEED_ATEXIT */