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
41 /* Don't use `fancy_abort' here even if config.h says to use it. */
48 #if defined (L_negdi2) || defined (L_divdi3) || defined (L_moddi3)
49 #if defined (L_divdi3) || defined (L_moddi3)
61 w.s.high = -uu.s.high - ((UWtype) w.s.low > 0);
69 __addvsi3 (Wtype a, Wtype b)
75 if (b >= 0 ? w < a : w > a)
84 __addvdi3 (DWtype a, DWtype b)
90 if (b >= 0 ? w < a : w > a)
99 __subvsi3 (Wtype a, Wtype b)
102 return __addvsi3 (a, (-b));
108 if (b >= 0 ? w > a : w < a)
118 __subvdi3 (DWtype a, DWtype b)
127 if (b >= 0 ? w > a : w < a)
137 __mulvsi3 (Wtype a, Wtype b)
143 if (((a >= 0) == (b >= 0)) ? w < 0 : w > 0)
158 if (a >= 0 ? w > 0 : w < 0)
173 if (a >= 0 ? w > 0 : w < 0)
222 __mulvdi3 (DWtype u, DWtype v)
228 if (((u >= 0) == (v >= 0)) ? w < 0 : w > 0)
236 /* Unless shift functions are defined whith full ANSI prototypes,
237 parameter b will be promoted to int if word_type is smaller than an int. */
240 __lshrdi3 (DWtype u, word_type b)
251 bm = (sizeof (Wtype) * BITS_PER_UNIT) - b;
255 w.s.low = (UWtype) uu.s.high >> -bm;
259 UWtype carries = (UWtype) uu.s.high << bm;
261 w.s.high = (UWtype) uu.s.high >> b;
262 w.s.low = ((UWtype) uu.s.low >> b) | carries;
271 __ashldi3 (DWtype u, word_type b)
282 bm = (sizeof (Wtype) * BITS_PER_UNIT) - b;
286 w.s.high = (UWtype) uu.s.low << -bm;
290 UWtype carries = (UWtype) uu.s.low >> bm;
292 w.s.low = (UWtype) uu.s.low << b;
293 w.s.high = ((UWtype) uu.s.high << b) | carries;
302 __ashrdi3 (DWtype u, word_type b)
313 bm = (sizeof (Wtype) * BITS_PER_UNIT) - b;
316 /* w.s.high = 1..1 or 0..0 */
317 w.s.high = uu.s.high >> (sizeof (Wtype) * BITS_PER_UNIT - 1);
318 w.s.low = uu.s.high >> -bm;
322 UWtype carries = (UWtype) uu.s.high << bm;
324 w.s.high = uu.s.high >> b;
325 w.s.low = ((UWtype) uu.s.low >> b) | carries;
337 UWtype word, count, add;
341 word = uu.s.low, add = 0;
342 else if (uu.s.high != 0)
343 word = uu.s.high, add = BITS_PER_UNIT * sizeof (Wtype);
347 count_trailing_zeros (count, word);
348 return count + add + 1;
354 __muldi3 (DWtype u, DWtype v)
362 w.ll = __umulsidi3 (uu.s.low, vv.s.low);
363 w.s.high += ((UWtype) uu.s.low * (UWtype) vv.s.high
364 + (UWtype) uu.s.high * (UWtype) vv.s.low);
371 #if defined (sdiv_qrnnd)
373 __udiv_w_sdiv (UWtype *rp, UWtype a1, UWtype a0, UWtype d)
380 if (a1 < d - a1 - (a0 >> (W_TYPE_SIZE - 1)))
382 /* dividend, divisor, and quotient are nonnegative */
383 sdiv_qrnnd (q, r, a1, a0, d);
387 /* Compute c1*2^32 + c0 = a1*2^32 + a0 - 2^31*d */
388 sub_ddmmss (c1, c0, a1, a0, d >> 1, d << (W_TYPE_SIZE - 1));
389 /* Divide (c1*2^32 + c0) by d */
390 sdiv_qrnnd (q, r, c1, c0, d);
391 /* Add 2^31 to quotient */
392 q += (UWtype) 1 << (W_TYPE_SIZE - 1);
397 b1 = d >> 1; /* d/2, between 2^30 and 2^31 - 1 */
398 c1 = a1 >> 1; /* A/2 */
399 c0 = (a1 << (W_TYPE_SIZE - 1)) + (a0 >> 1);
401 if (a1 < b1) /* A < 2^32*b1, so A/2 < 2^31*b1 */
403 sdiv_qrnnd (q, r, c1, c0, b1); /* (A/2) / (d/2) */
405 r = 2*r + (a0 & 1); /* Remainder from A/(2*b1) */
422 else if (c1 < b1) /* So 2^31 <= (A/2)/b1 < 2^32 */
425 c0 = ~c0; /* logical NOT */
427 sdiv_qrnnd (q, r, c1, c0, b1); /* (A/2) / (d/2) */
429 q = ~q; /* (A/2)/b1 */
432 r = 2*r + (a0 & 1); /* A/(2*b1) */
450 else /* Implies c1 = b1 */
451 { /* Hence a1 = d - 1 = 2*b1 - 1 */
469 /* If sdiv_qrnnd doesn't exist, define dummy __udiv_w_sdiv. */
471 __udiv_w_sdiv (UWtype *rp __attribute__ ((__unused__)),
472 UWtype a1 __attribute__ ((__unused__)),
473 UWtype a0 __attribute__ ((__unused__)),
474 UWtype d __attribute__ ((__unused__)))
481 #if (defined (L_udivdi3) || defined (L_divdi3) || \
482 defined (L_umoddi3) || defined (L_moddi3))
487 const UQItype __clz_tab[] =
489 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,
490 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,
491 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,
492 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,
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,
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,
502 #if (defined (L_udivdi3) || defined (L_divdi3) || \
503 defined (L_umoddi3) || defined (L_moddi3))
507 __udivmoddi4 (UDWtype n, UDWtype d, UDWtype *rp)
512 UWtype d0, d1, n0, n1, n2;
524 #if !UDIV_NEEDS_NORMALIZATION
531 udiv_qrnnd (q0, n0, n1, n0, d0);
534 /* Remainder in n0. */
541 d0 = 1 / d0; /* Divide intentionally by zero. */
543 udiv_qrnnd (q1, n1, 0, n1, d0);
544 udiv_qrnnd (q0, n0, n1, n0, d0);
546 /* Remainder in n0. */
557 #else /* UDIV_NEEDS_NORMALIZATION */
565 count_leading_zeros (bm, d0);
569 /* Normalize, i.e. make the most significant bit of the
573 n1 = (n1 << bm) | (n0 >> (W_TYPE_SIZE - bm));
577 udiv_qrnnd (q0, n0, n1, n0, d0);
580 /* Remainder in n0 >> bm. */
587 d0 = 1 / d0; /* Divide intentionally by zero. */
589 count_leading_zeros (bm, d0);
593 /* From (n1 >= d0) /\ (the most significant bit of d0 is set),
594 conclude (the most significant bit of n1 is set) /\ (the
595 leading quotient digit q1 = 1).
597 This special case is necessary, not an optimization.
598 (Shifts counts of W_TYPE_SIZE are undefined.) */
607 b = W_TYPE_SIZE - bm;
611 n1 = (n1 << bm) | (n0 >> b);
614 udiv_qrnnd (q1, n1, n2, n1, d0);
619 udiv_qrnnd (q0, n0, n1, n0, d0);
621 /* Remainder in n0 >> bm. */
631 #endif /* UDIV_NEEDS_NORMALIZATION */
642 /* Remainder in n1n0. */
654 count_leading_zeros (bm, d1);
657 /* From (n1 >= d1) /\ (the most significant bit of d1 is set),
658 conclude (the most significant bit of n1 is set) /\ (the
659 quotient digit q0 = 0 or 1).
661 This special case is necessary, not an optimization. */
663 /* The condition on the next line takes advantage of that
664 n1 >= d1 (true due to program flow). */
665 if (n1 > d1 || n0 >= d0)
668 sub_ddmmss (n1, n0, n1, n0, d1, d0);
687 b = W_TYPE_SIZE - bm;
689 d1 = (d1 << bm) | (d0 >> b);
692 n1 = (n1 << bm) | (n0 >> b);
695 udiv_qrnnd (q0, n1, n2, n1, d1);
696 umul_ppmm (m1, m0, q0, d0);
698 if (m1 > n1 || (m1 == n1 && m0 > n0))
701 sub_ddmmss (m1, m0, m1, m0, d1, d0);
706 /* Remainder in (n1n0 - m1m0) >> bm. */
709 sub_ddmmss (n1, n0, n1, n0, m1, m0);
710 rr.s.low = (n1 << b) | (n0 >> bm);
711 rr.s.high = n1 >> bm;
726 __divdi3 (DWtype u, DWtype v)
737 uu.ll = __negdi2 (uu.ll);
740 vv.ll = __negdi2 (vv.ll);
742 w = __udivmoddi4 (uu.ll, vv.ll, (UDWtype *) 0);
752 __moddi3 (DWtype u, DWtype v)
763 uu.ll = __negdi2 (uu.ll);
765 vv.ll = __negdi2 (vv.ll);
767 (void) __udivmoddi4 (uu.ll, vv.ll, &w);
777 __umoddi3 (UDWtype u, UDWtype v)
781 (void) __udivmoddi4 (u, v, &w);
789 __udivdi3 (UDWtype n, UDWtype d)
791 return __udivmoddi4 (n, d, (UDWtype *) 0);
797 __cmpdi2 (DWtype a, DWtype b)
801 au.ll = a, bu.ll = b;
803 if (au.s.high < bu.s.high)
805 else if (au.s.high > bu.s.high)
807 if ((UWtype) au.s.low < (UWtype) bu.s.low)
809 else if ((UWtype) au.s.low > (UWtype) bu.s.low)
817 __ucmpdi2 (DWtype a, DWtype b)
821 au.ll = a, bu.ll = b;
823 if ((UWtype) au.s.high < (UWtype) bu.s.high)
825 else if ((UWtype) au.s.high > (UWtype) bu.s.high)
827 if ((UWtype) au.s.low < (UWtype) bu.s.low)
829 else if ((UWtype) au.s.low > (UWtype) bu.s.low)
835 #if defined(L_fixunstfdi) && (LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 128)
836 #define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
837 #define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
840 __fixunstfDI (TFtype a)
848 /* Compute high word of result, as a flonum. */
849 b = (a / HIGH_WORD_COEFF);
850 /* Convert that to fixed (but not to DWtype!),
851 and shift it into the high word. */
854 /* Remove high part from the TFtype, leaving the low part as flonum. */
856 /* Convert that to fixed (but not to DWtype!) and add it in.
857 Sometimes A comes out negative. This is significant, since
858 A has more bits than a long int does. */
867 #if defined(L_fixtfdi) && (LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 128)
872 return - __fixunstfDI (-a);
873 return __fixunstfDI (a);
877 #if defined(L_fixunsxfdi) && (LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 96)
878 #define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
879 #define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
882 __fixunsxfDI (XFtype a)
890 /* Compute high word of result, as a flonum. */
891 b = (a / HIGH_WORD_COEFF);
892 /* Convert that to fixed (but not to DWtype!),
893 and shift it into the high word. */
896 /* Remove high part from the XFtype, leaving the low part as flonum. */
898 /* Convert that to fixed (but not to DWtype!) and add it in.
899 Sometimes A comes out negative. This is significant, since
900 A has more bits than a long int does. */
909 #if defined(L_fixxfdi) && (LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 96)
914 return - __fixunsxfDI (-a);
915 return __fixunsxfDI (a);
920 #define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
921 #define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
924 __fixunsdfDI (DFtype a)
932 /* Compute high word of result, as a flonum. */
933 b = (a / HIGH_WORD_COEFF);
934 /* Convert that to fixed (but not to DWtype!),
935 and shift it into the high word. */
938 /* Remove high part from the DFtype, leaving the low part as flonum. */
940 /* Convert that to fixed (but not to DWtype!) and add it in.
941 Sometimes A comes out negative. This is significant, since
942 A has more bits than a long int does. */
956 return - __fixunsdfDI (-a);
957 return __fixunsdfDI (a);
962 #define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
963 #define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
966 __fixunssfDI (SFtype original_a)
968 /* Convert the SFtype to a DFtype, because that is surely not going
969 to lose any bits. Some day someone else can write a faster version
970 that avoids converting to DFtype, and verify it really works right. */
971 DFtype a = original_a;
978 /* Compute high word of result, as a flonum. */
979 b = (a / HIGH_WORD_COEFF);
980 /* Convert that to fixed (but not to DWtype!),
981 and shift it into the high word. */
984 /* Remove high part from the DFtype, leaving the low part as flonum. */
986 /* Convert that to fixed (but not to DWtype!) and add it in.
987 Sometimes A comes out negative. This is significant, since
988 A has more bits than a long int does. */
1002 return - __fixunssfDI (-a);
1003 return __fixunssfDI (a);
1007 #if defined(L_floatdixf) && (LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 96)
1008 #define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
1009 #define HIGH_HALFWORD_COEFF (((UDWtype) 1) << (WORD_SIZE / 2))
1010 #define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
1013 __floatdixf (DWtype u)
1017 d = (Wtype) (u >> WORD_SIZE);
1018 d *= HIGH_HALFWORD_COEFF;
1019 d *= HIGH_HALFWORD_COEFF;
1020 d += (UWtype) (u & (HIGH_WORD_COEFF - 1));
1026 #if defined(L_floatditf) && (LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 128)
1027 #define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
1028 #define HIGH_HALFWORD_COEFF (((UDWtype) 1) << (WORD_SIZE / 2))
1029 #define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
1032 __floatditf (DWtype u)
1036 d = (Wtype) (u >> WORD_SIZE);
1037 d *= HIGH_HALFWORD_COEFF;
1038 d *= HIGH_HALFWORD_COEFF;
1039 d += (UWtype) (u & (HIGH_WORD_COEFF - 1));
1046 #define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
1047 #define HIGH_HALFWORD_COEFF (((UDWtype) 1) << (WORD_SIZE / 2))
1048 #define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
1051 __floatdidf (DWtype u)
1055 d = (Wtype) (u >> WORD_SIZE);
1056 d *= HIGH_HALFWORD_COEFF;
1057 d *= HIGH_HALFWORD_COEFF;
1058 d += (UWtype) (u & (HIGH_WORD_COEFF - 1));
1065 #define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
1066 #define HIGH_HALFWORD_COEFF (((UDWtype) 1) << (WORD_SIZE / 2))
1067 #define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
1068 #define DI_SIZE (sizeof (DWtype) * BITS_PER_UNIT)
1070 /* GCC guarantees this header exists at this point. */
1073 #define DF_SIZE DBL_MANT_DIG
1074 #define SF_SIZE FLT_MANT_DIG
1077 __floatdisf (DWtype u)
1079 /* Do the calculation in DFmode
1080 so that we don't lose any of the precision of the high word
1081 while multiplying it. */
1084 /* Protect against double-rounding error.
1085 Represent any low-order bits, that might be truncated in DFmode,
1086 by a bit that won't be lost. The bit can go in anywhere below the
1087 rounding position of the SFmode. A fixed mask and bit position
1088 handles all usual configurations. It doesn't handle the case
1089 of 128-bit DImode, however. */
1090 if (DF_SIZE < DI_SIZE
1091 && DF_SIZE > (DI_SIZE - DF_SIZE + SF_SIZE))
1093 #define REP_BIT ((UDWtype) 1 << (DI_SIZE - DF_SIZE))
1094 if (! (- ((DWtype) 1 << DF_SIZE) < u
1095 && u < ((DWtype) 1 << DF_SIZE)))
1097 if ((UDWtype) u & (REP_BIT - 1))
1101 f = (Wtype) (u >> WORD_SIZE);
1102 f *= HIGH_HALFWORD_COEFF;
1103 f *= HIGH_HALFWORD_COEFF;
1104 f += (UWtype) (u & (HIGH_WORD_COEFF - 1));
1110 #if defined(L_fixunsxfsi) && LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 96
1111 /* Reenable the normal types, in case limits.h needs them. */
1124 __fixunsxfSI (XFtype a)
1126 if (a >= - (DFtype) Wtype_MIN)
1127 return (Wtype) (a + Wtype_MIN) - Wtype_MIN;
1133 /* Reenable the normal types, in case limits.h needs them. */
1146 __fixunsdfSI (DFtype a)
1148 if (a >= - (DFtype) Wtype_MIN)
1149 return (Wtype) (a + Wtype_MIN) - Wtype_MIN;
1155 /* Reenable the normal types, in case limits.h needs them. */
1168 __fixunssfSI (SFtype a)
1170 if (a >= - (SFtype) Wtype_MIN)
1171 return (Wtype) (a + Wtype_MIN) - Wtype_MIN;
1176 /* From here on down, the routines use normal data types. */
1178 #define SItype bogus_type
1179 #define USItype bogus_type
1180 #define DItype bogus_type
1181 #define UDItype bogus_type
1182 #define SFtype bogus_type
1183 #define DFtype bogus_type
1201 /* Like bcmp except the sign is meaningful.
1202 Result is negative if S1 is less than S2,
1203 positive if S1 is greater, 0 if S1 and S2 are equal. */
1206 __gcc_bcmp (const unsigned char *s1, const unsigned char *s2, size_t size)
1210 unsigned char c1 = *s1++, c2 = *s2++;
1220 /* __eprintf used to be used by GCC's private version of <assert.h>.
1221 We no longer provide that header, but this routine remains in libgcc.a
1222 for binary backward compatibility. Note that it is not included in
1223 the shared version of libgcc. */
1225 #ifndef inhibit_libc
1227 #undef NULL /* Avoid errors if stdio.h and our stddef.h mismatch. */
1231 __eprintf (const char *string, const char *expression,
1232 unsigned int line, const char *filename)
1234 fprintf (stderr, string, expression, line, filename);
1244 #if LONG_TYPE_SIZE == GCOV_TYPE_SIZE
1245 typedef long gcov_type;
1247 typedef long long gcov_type;
1251 /* Structure emitted by -a */
1255 const char *filename;
1259 const unsigned long *addresses;
1261 /* Older GCC's did not emit these fields. */
1263 const char **functions;
1264 const long *line_nums;
1265 const char **filenames;
1269 #ifdef BLOCK_PROFILER_CODE
1272 #ifndef inhibit_libc
1274 /* Simple minded basic block profiling output dumper for
1275 systems that don't provide tcov support. At present,
1276 it requires atexit and stdio. */
1278 #undef NULL /* Avoid errors if stdio.h and our stddef.h mismatch. */
1281 #include "gbl-ctors.h"
1282 #include "gcov-io.h"
1284 #ifdef TARGET_HAS_F_SETLKW
1289 static struct bb *bb_head;
1292 __bb_exit_func (void)
1301 i = strlen (bb_head->filename) - 3;
1304 for (ptr = bb_head; ptr != (struct bb *) 0; ptr = ptr->next)
1308 /* Make sure the output file exists -
1309 but don't clobber exiting data. */
1310 if ((da_file = fopen (ptr->filename, "a")) != 0)
1313 /* Need to re-open in order to be able to write from the start. */
1314 da_file = fopen (ptr->filename, "r+b");
1315 /* Some old systems might not allow the 'b' mode modifier.
1316 Therefore, try to open without it. This can lead to a race
1317 condition so that when you delete and re-create the file, the
1318 file might be opened in text mode, but then, you shouldn't
1319 delete the file in the first place. */
1321 da_file = fopen (ptr->filename, "r+");
1324 fprintf (stderr, "arc profiling: Can't open output file %s.\n",
1329 /* After a fork, another process might try to read and/or write
1330 the same file simultanously. So if we can, lock the file to
1331 avoid race conditions. */
1332 #if defined (TARGET_HAS_F_SETLKW)
1334 struct flock s_flock;
1336 s_flock.l_type = F_WRLCK;
1337 s_flock.l_whence = SEEK_SET;
1338 s_flock.l_start = 0;
1340 s_flock.l_pid = getpid ();
1342 while (fcntl (fileno (da_file), F_SETLKW, &s_flock)
1347 /* If the file is not empty, and the number of counts in it is the
1348 same, then merge them in. */
1349 firstchar = fgetc (da_file);
1350 if (firstchar == EOF)
1352 if (ferror (da_file))
1354 fprintf (stderr, "arc profiling: Can't read output file ");
1355 perror (ptr->filename);
1362 if (ungetc (firstchar, da_file) == EOF)
1364 if (__read_long (&n_counts, da_file, 8) != 0)
1366 fprintf (stderr, "arc profiling: Can't read output file %s.\n",
1371 if (n_counts == ptr->ncounts)
1375 for (i = 0; i < n_counts; i++)
1379 if (__read_gcov_type (&v, da_file, 8) != 0)
1382 "arc profiling: Can't read output file %s.\n",
1386 ptr->counts[i] += v;
1394 /* ??? Should first write a header to the file. Preferably, a 4 byte
1395 magic number, 4 bytes containing the time the program was
1396 compiled, 4 bytes containing the last modification time of the
1397 source file, and 4 bytes indicating the compiler options used.
1399 That way we can easily verify that the proper source/executable/
1400 data file combination is being used from gcov. */
1402 if (__write_gcov_type (ptr->ncounts, da_file, 8) != 0)
1405 fprintf (stderr, "arc profiling: Error writing output file %s.\n",
1411 gcov_type *count_ptr = ptr->counts;
1413 for (j = ptr->ncounts; j > 0; j--)
1415 if (__write_gcov_type (*count_ptr, da_file, 8) != 0)
1423 fprintf (stderr, "arc profiling: Error writing output file %s.\n",
1427 if (fclose (da_file) == EOF)
1428 fprintf (stderr, "arc profiling: Error closing output file %s.\n",
1436 __bb_init_func (struct bb *blocks)
1438 /* User is supposed to check whether the first word is non-0,
1439 but just in case.... */
1441 if (blocks->zero_word)
1444 /* Initialize destructor. */
1446 atexit (__bb_exit_func);
1448 /* Set up linked list. */
1449 blocks->zero_word = 1;
1450 blocks->next = bb_head;
1454 /* Called before fork or exec - write out profile information gathered so
1455 far and reset it to zero. This avoids duplication or loss of the
1456 profile information gathered so far. */
1458 __bb_fork_func (void)
1463 for (ptr = bb_head; ptr != (struct bb *) 0; ptr = ptr->next)
1466 for (i = ptr->ncounts - 1; i >= 0; i--)
1471 #endif /* not inhibit_libc */
1472 #endif /* not BLOCK_PROFILER_CODE */
1475 #ifdef L_clear_cache
1476 /* Clear part of an instruction cache. */
1478 #define INSN_CACHE_PLANE_SIZE (INSN_CACHE_SIZE / INSN_CACHE_DEPTH)
1481 __clear_cache (char *beg __attribute__((__unused__)),
1482 char *end __attribute__((__unused__)))
1484 #ifdef CLEAR_INSN_CACHE
1485 CLEAR_INSN_CACHE (beg, end);
1487 #ifdef INSN_CACHE_SIZE
1488 static char array[INSN_CACHE_SIZE + INSN_CACHE_PLANE_SIZE + INSN_CACHE_LINE_WIDTH];
1489 static int initialized;
1493 typedef (*function_ptr) (void);
1495 #if (INSN_CACHE_SIZE / INSN_CACHE_LINE_WIDTH) < 16
1496 /* It's cheaper to clear the whole cache.
1497 Put in a series of jump instructions so that calling the beginning
1498 of the cache will clear the whole thing. */
1502 int ptr = (((int) array + INSN_CACHE_LINE_WIDTH - 1)
1503 & -INSN_CACHE_LINE_WIDTH);
1504 int end_ptr = ptr + INSN_CACHE_SIZE;
1506 while (ptr < end_ptr)
1508 *(INSTRUCTION_TYPE *)ptr
1509 = JUMP_AHEAD_INSTRUCTION + INSN_CACHE_LINE_WIDTH;
1510 ptr += INSN_CACHE_LINE_WIDTH;
1512 *(INSTRUCTION_TYPE *) (ptr - INSN_CACHE_LINE_WIDTH) = RETURN_INSTRUCTION;
1517 /* Call the beginning of the sequence. */
1518 (((function_ptr) (((int) array + INSN_CACHE_LINE_WIDTH - 1)
1519 & -INSN_CACHE_LINE_WIDTH))
1522 #else /* Cache is large. */
1526 int ptr = (((int) array + INSN_CACHE_LINE_WIDTH - 1)
1527 & -INSN_CACHE_LINE_WIDTH);
1529 while (ptr < (int) array + sizeof array)
1531 *(INSTRUCTION_TYPE *)ptr = RETURN_INSTRUCTION;
1532 ptr += INSN_CACHE_LINE_WIDTH;
1538 /* Find the location in array that occupies the same cache line as BEG. */
1540 offset = ((int) beg & -INSN_CACHE_LINE_WIDTH) & (INSN_CACHE_PLANE_SIZE - 1);
1541 start_addr = (((int) (array + INSN_CACHE_PLANE_SIZE - 1)
1542 & -INSN_CACHE_PLANE_SIZE)
1545 /* Compute the cache alignment of the place to stop clearing. */
1546 #if 0 /* This is not needed for gcc's purposes. */
1547 /* If the block to clear is bigger than a cache plane,
1548 we clear the entire cache, and OFFSET is already correct. */
1549 if (end < beg + INSN_CACHE_PLANE_SIZE)
1551 offset = (((int) (end + INSN_CACHE_LINE_WIDTH - 1)
1552 & -INSN_CACHE_LINE_WIDTH)
1553 & (INSN_CACHE_PLANE_SIZE - 1));
1555 #if INSN_CACHE_DEPTH > 1
1556 end_addr = (start_addr & -INSN_CACHE_PLANE_SIZE) + offset;
1557 if (end_addr <= start_addr)
1558 end_addr += INSN_CACHE_PLANE_SIZE;
1560 for (plane = 0; plane < INSN_CACHE_DEPTH; plane++)
1562 int addr = start_addr + plane * INSN_CACHE_PLANE_SIZE;
1563 int stop = end_addr + plane * INSN_CACHE_PLANE_SIZE;
1565 while (addr != stop)
1567 /* Call the return instruction at ADDR. */
1568 ((function_ptr) addr) ();
1570 addr += INSN_CACHE_LINE_WIDTH;
1573 #else /* just one plane */
1576 /* Call the return instruction at START_ADDR. */
1577 ((function_ptr) start_addr) ();
1579 start_addr += INSN_CACHE_LINE_WIDTH;
1581 while ((start_addr % INSN_CACHE_SIZE) != offset);
1582 #endif /* just one plane */
1583 #endif /* Cache is large */
1584 #endif /* Cache exists */
1585 #endif /* CLEAR_INSN_CACHE */
1588 #endif /* L_clear_cache */
1592 /* Jump to a trampoline, loading the static chain address. */
1594 #if defined(WINNT) && ! defined(__CYGWIN__) && ! defined (_UWIN)
1607 extern int VirtualProtect (char *, int, int, int *) __attribute__((stdcall));
1611 mprotect (char *addr, int len, int prot)
1628 if (VirtualProtect (addr, len, np, &op))
1634 #endif /* WINNT && ! __CYGWIN__ && ! _UWIN */
1636 #ifdef TRANSFER_FROM_TRAMPOLINE
1637 TRANSFER_FROM_TRAMPOLINE
1640 #if defined (NeXT) && defined (__MACH__)
1642 /* Make stack executable so we can call trampolines on stack.
1643 This is called from INITIALIZE_TRAMPOLINE in next.h. */
1647 #include <mach/mach.h>
1651 __enable_execute_stack (char *addr)
1654 char *eaddr = addr + TRAMPOLINE_SIZE;
1655 vm_address_t a = (vm_address_t) addr;
1657 /* turn on execute access on stack */
1658 r = vm_protect (task_self (), a, TRAMPOLINE_SIZE, FALSE, VM_PROT_ALL);
1659 if (r != KERN_SUCCESS)
1661 mach_error("vm_protect VM_PROT_ALL", r);
1665 /* We inline the i-cache invalidation for speed */
1667 #ifdef CLEAR_INSN_CACHE
1668 CLEAR_INSN_CACHE (addr, eaddr);
1670 __clear_cache ((int) addr, (int) eaddr);
1674 #endif /* defined (NeXT) && defined (__MACH__) */
1678 /* Make stack executable so we can call trampolines on stack.
1679 This is called from INITIALIZE_TRAMPOLINE in convex.h. */
1681 #include <sys/mman.h>
1682 #include <sys/vmparam.h>
1683 #include <machine/machparam.h>
1686 __enable_execute_stack (void)
1689 static unsigned lowest = USRSTACK;
1690 unsigned current = (unsigned) &fp & -NBPG;
1692 if (lowest > current)
1694 unsigned len = lowest - current;
1695 mremap (current, &len, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE);
1699 /* Clear instruction cache in case an old trampoline is in it. */
1702 #endif /* __convex__ */
1706 /* Modified from the convex -code above. */
1708 #include <sys/param.h>
1710 #include <sys/m88kbcs.h>
1713 __enable_execute_stack (void)
1716 static unsigned long lowest = USRSTACK;
1717 unsigned long current = (unsigned long) &save_errno & -NBPC;
1719 /* Ignore errno being set. memctl sets errno to EINVAL whenever the
1720 address is seen as 'negative'. That is the case with the stack. */
1723 if (lowest > current)
1725 unsigned len=lowest-current;
1726 memctl(current,len,MCT_TEXT);
1730 memctl(current,NBPC,MCT_TEXT);
1734 #endif /* __sysV88__ */
1738 #include <sys/signal.h>
1741 /* Motorola forgot to put memctl.o in the libp version of libc881.a,
1742 so define it here, because we need it in __clear_insn_cache below */
1743 /* On older versions of this OS, no memctl or MCT_TEXT are defined;
1744 hence we enable this stuff only if MCT_TEXT is #define'd. */
1759 /* Clear instruction cache so we can call trampolines on stack.
1760 This is called from FINALIZE_TRAMPOLINE in mot3300.h. */
1763 __clear_insn_cache (void)
1768 /* Preserve errno, because users would be surprised to have
1769 errno changing without explicitly calling any system-call. */
1772 /* Keep it simple : memctl (MCT_TEXT) always fully clears the insn cache.
1773 No need to use an address derived from _start or %sp, as 0 works also. */
1774 memctl(0, 4096, MCT_TEXT);
1779 #endif /* __sysV68__ */
1783 #undef NULL /* Avoid errors if stdio.h and our stddef.h mismatch. */
1785 #include <sys/mman.h>
1786 #include <sys/types.h>
1787 #include <sys/param.h>
1788 #include <sys/vmmac.h>
1790 /* Modified from the convex -code above.
1791 mremap promises to clear the i-cache. */
1794 __enable_execute_stack (void)
1797 if (mprotect (((unsigned int)&fp/PAGSIZ)*PAGSIZ, PAGSIZ,
1798 PROT_READ|PROT_WRITE|PROT_EXEC))
1800 perror ("mprotect in __enable_execute_stack");
1805 #endif /* __pyr__ */
1807 #if defined (sony_news) && defined (SYSTYPE_BSD)
1810 #include <sys/types.h>
1811 #include <sys/param.h>
1812 #include <syscall.h>
1813 #include <machine/sysnews.h>
1815 /* cacheflush function for NEWS-OS 4.2.
1816 This function is called from trampoline-initialize code
1817 defined in config/mips/mips.h. */
1820 cacheflush (char *beg, int size, int flag)
1822 if (syscall (SYS_sysnews, NEWS_CACHEFLUSH, beg, size, FLUSH_BCACHE))
1824 perror ("cache_flush");
1830 #endif /* sony_news */
1831 #endif /* L_trampoline */
1836 #include "gbl-ctors.h"
1837 /* Some systems use __main in a way incompatible with its use in gcc, in these
1838 cases use the macros NAME__MAIN to give a quoted symbol and SYMBOL__MAIN to
1839 give the same symbol without quotes for an alternative entry point. You
1840 must define both, or neither. */
1842 #define NAME__MAIN "__main"
1843 #define SYMBOL__MAIN __main
1846 #ifdef INIT_SECTION_ASM_OP
1847 #undef HAS_INIT_SECTION
1848 #define HAS_INIT_SECTION
1851 #if !defined (HAS_INIT_SECTION) || !defined (OBJECT_FORMAT_ELF)
1853 /* Some ELF crosses use crtstuff.c to provide __CTOR_LIST__, but use this
1854 code to run constructors. In that case, we need to handle EH here, too. */
1856 #ifdef EH_FRAME_SECTION_NAME
1857 #include "unwind-dw2-fde.h"
1858 extern unsigned char __EH_FRAME_BEGIN__[];
1861 /* Run all the global destructors on exit from the program. */
1864 __do_global_dtors (void)
1866 #ifdef DO_GLOBAL_DTORS_BODY
1867 DO_GLOBAL_DTORS_BODY;
1869 static func_ptr *p = __DTOR_LIST__ + 1;
1876 #if defined (EH_FRAME_SECTION_NAME) && !defined (HAS_INIT_SECTION)
1878 static int completed = 0;
1882 __deregister_frame_info (__EH_FRAME_BEGIN__);
1889 #ifndef HAS_INIT_SECTION
1890 /* Run all the global constructors on entry to the program. */
1893 __do_global_ctors (void)
1895 #ifdef EH_FRAME_SECTION_NAME
1897 static struct object object;
1898 __register_frame_info (__EH_FRAME_BEGIN__, &object);
1901 DO_GLOBAL_CTORS_BODY;
1902 atexit (__do_global_dtors);
1904 #endif /* no HAS_INIT_SECTION */
1906 #if !defined (HAS_INIT_SECTION) || defined (INVOKE__main)
1907 /* Subroutine called automatically by `main'.
1908 Compiling a global function named `main'
1909 produces an automatic call to this function at the beginning.
1911 For many systems, this routine calls __do_global_ctors.
1912 For systems which support a .init section we use the .init section
1913 to run __do_global_ctors, so we need not do anything here. */
1918 /* Support recursive calls to `main': run initializers just once. */
1919 static int initialized;
1923 __do_global_ctors ();
1926 #endif /* no HAS_INIT_SECTION or INVOKE__main */
1928 #endif /* L__main */
1929 #endif /* __CYGWIN__ */
1933 #include "gbl-ctors.h"
1935 /* Provide default definitions for the lists of constructors and
1936 destructors, so that we don't get linker errors. These symbols are
1937 intentionally bss symbols, so that gld and/or collect will provide
1938 the right values. */
1940 /* We declare the lists here with two elements each,
1941 so that they are valid empty lists if no other definition is loaded.
1943 If we are using the old "set" extensions to have the gnu linker
1944 collect ctors and dtors, then we __CTOR_LIST__ and __DTOR_LIST__
1945 must be in the bss/common section.
1947 Long term no port should use those extensions. But many still do. */
1948 #if !defined(INIT_SECTION_ASM_OP) && !defined(CTOR_LISTS_DEFINED_EXTERNALLY)
1949 #if defined (TARGET_ASM_CONSTRUCTOR) || defined (USE_COLLECT2)
1950 func_ptr __CTOR_LIST__[2] = {0, 0};
1951 func_ptr __DTOR_LIST__[2] = {0, 0};
1953 func_ptr __CTOR_LIST__[2];
1954 func_ptr __DTOR_LIST__[2];
1956 #endif /* no INIT_SECTION_ASM_OP and not CTOR_LISTS_DEFINED_EXTERNALLY */
1957 #endif /* L_ctors */
1961 #include "gbl-ctors.h"
1969 static func_ptr *atexit_chain = 0;
1970 static long atexit_chain_length = 0;
1971 static volatile long last_atexit_chain_slot = -1;
1974 atexit (func_ptr func)
1976 if (++last_atexit_chain_slot == atexit_chain_length)
1978 atexit_chain_length += 32;
1980 atexit_chain = (func_ptr *) realloc (atexit_chain, atexit_chain_length
1981 * sizeof (func_ptr));
1983 atexit_chain = (func_ptr *) malloc (atexit_chain_length
1984 * sizeof (func_ptr));
1987 atexit_chain_length = 0;
1988 last_atexit_chain_slot = -1;
1993 atexit_chain[last_atexit_chain_slot] = func;
1997 extern void _cleanup (void);
1998 extern void _exit (int) __attribute__ ((__noreturn__));
2005 for ( ; last_atexit_chain_slot-- >= 0; )
2007 (*atexit_chain[last_atexit_chain_slot + 1]) ();
2008 atexit_chain[last_atexit_chain_slot + 1] = 0;
2010 free (atexit_chain);
2023 /* Simple; we just need a wrapper for ON_EXIT. */
2025 atexit (func_ptr func)
2027 return ON_EXIT (func);
2030 #endif /* ON_EXIT */
2031 #endif /* NEED_ATEXIT */