gcov.c (output_data): Use HOST_WIDEST_INT_PRINT_DEC to output variables of type HOST_WIDEST_INT.
* gcov.c (output_data): Use HOST_WIDEST_INT_PRINT_DEC to output variables of type HOST_WIDEST_INT. * libgcc2.c (__bb_exit_func): Handle gcov_type as long long. (__bb_exit_func): Correct type of count_max to avoid overflow. (num_digits): Handle long long argument. * combine.c (gen_lowpart_for_combine): Remove unused variable. From-SVN: r44033
This commit is contained in:
parent
cc385017aa
commit
23190837c6
|
@ -1,3 +1,14 @@
|
|||
2001-07-16 Andreas Jaeger <aj@suse.de>
|
||||
|
||||
* gcov.c (output_data): Use HOST_WIDEST_INT_PRINT_DEC to output
|
||||
variables of type HOST_WIDEST_INT.
|
||||
|
||||
* libgcc2.c (__bb_exit_func): Handle gcov_type as long long.
|
||||
(__bb_exit_func): Correct type of count_max to avoid overflow.
|
||||
(num_digits): Handle long long argument.
|
||||
|
||||
* combine.c (gen_lowpart_for_combine): Remove unused variable.
|
||||
|
||||
2001-07-16 Neil Booth <neil@cat.daikokuya.demon.co.uk>
|
||||
|
||||
* output.h (sdb_begin_function_line): Restore as an extern
|
||||
|
@ -271,16 +282,16 @@ Fri Jul 13 23:04:00 2001 Denis Chertykov <denisc@overta.ru>
|
|||
|
||||
2001-07-13 Hartmut Penner <hpenner@de.ibm.com>
|
||||
|
||||
* config.gcc: Add configuration for s/390.
|
||||
* config/s390/s390.c: New. Subroutines for code generation.
|
||||
* config.gcc: Add configuration for s/390.
|
||||
* config/s390/s390.c: New. Subroutines for code generation.
|
||||
* config/s390/s390.h: New. Definitions for s/390.
|
||||
* config/s390/s390-protos.h: New. Prototypes.
|
||||
* config/s390/linux.h: New. Definitions for linux for s/390.
|
||||
* config/s390/linux64.h: New. Definitions for linux for zSeries.
|
||||
* config/s390/t-linux: New. Makefile fragment.
|
||||
* config/s390/s390.md: New. Machine description for s/390 and zSeries.
|
||||
* config/s390/t-linux: New. Makefile fragment.
|
||||
* config/s390/s390.md: New. Machine description for s/390 and zSeries.
|
||||
* config/s390/fixdfdi.h: New. Fix L_fix*di.
|
||||
|
||||
|
||||
Fri Jul 13 14:46:21 CEST 2001 Jan Hubicka <jh@suse.cz>
|
||||
|
||||
* emit-rtl.c (try_split): Update mark_jump_label call.
|
||||
|
@ -475,7 +486,7 @@ Wed Jul 11 21:27:25 CEST 2001 Jan Hubicka <jh@suse.cz>
|
|||
* jump.c (rtx_renumbered_equal_p): Handle 't' fields.
|
||||
* output.h (cleanup_cfg): Update prototype.
|
||||
* reg-stack.c (reg_to_stack): Use cleanup_cfg instead of jump_optimize
|
||||
* sibcall.c (optimize_sibling_and_tail_recursive_call): Update
|
||||
* sibcall.c (optimize_sibling_and_tail_recursive_call): Update
|
||||
cleanup_cfg call; kill missleading comment.
|
||||
* toplev.c (rest_of_compilation): Update all cleanup_cfg calls.
|
||||
* flow.c (merge_blocks, try_optimize_cfg, cleanup_cfg): Accept mode
|
||||
|
@ -506,7 +517,7 @@ Wed Jul 11 21:27:25 CEST 2001 Jan Hubicka <jh@suse.cz>
|
|||
|
||||
2001-07-11 Mark Mitchell <mark@codesourcery.com>
|
||||
|
||||
* stmt.c (parse_output_constraint): New function, split out
|
||||
* stmt.c (parse_output_constraint): New function, split out
|
||||
from ...
|
||||
(expand_asm_operands): ... here. Use parse_output_constraint.
|
||||
* tree.h (parse_output_constraint): Declare it.
|
||||
|
@ -573,7 +584,7 @@ Tue Jul 10 07:27:53 2001 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
|
|||
* recog.c (offsettable_address_p): Handle LO_SUM case.
|
||||
* config/mips/mips.c (double_memory_operand): Use adjust_address_nv
|
||||
instead of plus_constant.
|
||||
|
||||
|
||||
2001-07-10 Stephane Carrez <Stephane.Carrez@worldnet.fr>
|
||||
|
||||
* reload1.c (merge_assigned_reloads): After a RELOAD_OTHER merge,
|
||||
|
@ -640,7 +651,7 @@ Tue Jul 10 09:04:45 2001 Jeffrey A Law (law@cygnus.com)
|
|||
.loc support.
|
||||
|
||||
* collect2.c (main): Set COLLECT_NO_DEMANGLE for subprocesses.
|
||||
(dump_file): Only pad the demangled name with spaces if the
|
||||
(dump_file): Only pad the demangled name with spaces if the
|
||||
mangled name was padded with spaces.
|
||||
|
||||
2001-07-10 Bernd Schmidt <bernds@redhat.com>
|
||||
|
|
|
@ -1133,7 +1133,7 @@ can_combine_p (insn, i3, pred, succ, pdest, psrc)
|
|||
|
||||
for (p = NEXT_INSN (insn); p != i3; p = NEXT_INSN (p))
|
||||
if (INSN_P (p) && p != succ && volatile_refs_p (PATTERN (p)))
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* If INSN is an asm, and DEST is a hard register, reject, since it has
|
||||
|
@ -1245,7 +1245,7 @@ sets_function_arg_p (pat)
|
|||
This is NOT equivalent to:
|
||||
|
||||
(parallel [(set (subreg:SI (reg:DI 100) 0) <foo>)
|
||||
(set (reg:DI 101) (reg:DI 100))])
|
||||
(set (reg:DI 101) (reg:DI 100))])
|
||||
|
||||
Not only does this modify 100 (in which case it might still be valid
|
||||
if 100 were dead in I2), it sets 101 to the ORIGINAL value of 100.
|
||||
|
@ -1421,7 +1421,7 @@ cant_combine_insn_p (insn)
|
|||
{
|
||||
rtx set;
|
||||
rtx src, dest;
|
||||
|
||||
|
||||
/* If this isn't really an insn, we can't do anything.
|
||||
This can occur when flow deletes an insn that it has merged into an
|
||||
auto-increment address. */
|
||||
|
@ -1771,7 +1771,7 @@ try_combine (i3, i2, i1, new_direct_jump_p)
|
|||
/* If I3 has an inc, then give up if I1 or I2 uses the reg that is inc'd.
|
||||
We used to do this EXCEPT in one case: I3 has a post-inc in an
|
||||
output operand. However, that exception can give rise to insns like
|
||||
mov r3,(r3)+
|
||||
mov r3,(r3)+
|
||||
which is a famous insn on the PDP-11 where the value of r3 used as the
|
||||
source was model-dependent. Avoid this sort of thing. */
|
||||
|
||||
|
@ -2136,7 +2136,7 @@ try_combine (i3, i2, i1, new_direct_jump_p)
|
|||
insn_code_number = recog_for_combine (&m_split, i3, &new_i3_notes);
|
||||
if (insn_code_number >= 0)
|
||||
newpat = m_split;
|
||||
}
|
||||
}
|
||||
else if (m_split && GET_CODE (m_split) == SEQUENCE
|
||||
&& XVECLEN (m_split, 0) == 2
|
||||
&& (next_real_insn (i2) == i3
|
||||
|
@ -3786,7 +3786,7 @@ combine_simplify_rtx (x, op0_mode, last, in_dest)
|
|||
{
|
||||
rtx temp;
|
||||
temp = simplify_subreg (mode, SUBREG_REG (x), op0_mode,
|
||||
SUBREG_BYTE (x));
|
||||
SUBREG_BYTE (x));
|
||||
if (temp)
|
||||
return temp;
|
||||
}
|
||||
|
@ -3861,12 +3861,12 @@ combine_simplify_rtx (x, op0_mode, last, in_dest)
|
|||
return gen_rtx_GE (mode, XEXP (XEXP (x, 0), 0), const0_rtx);
|
||||
|
||||
/* Apply De Morgan's laws to reduce number of patterns for machines
|
||||
with negating logical insns (and-not, nand, etc.). If result has
|
||||
only one NOT, put it first, since that is how the patterns are
|
||||
coded. */
|
||||
with negating logical insns (and-not, nand, etc.). If result has
|
||||
only one NOT, put it first, since that is how the patterns are
|
||||
coded. */
|
||||
|
||||
if (GET_CODE (XEXP (x, 0)) == IOR || GET_CODE (XEXP (x, 0)) == AND)
|
||||
{
|
||||
{
|
||||
rtx in1 = XEXP (XEXP (x, 0), 0), in2 = XEXP (XEXP (x, 0), 1);
|
||||
enum machine_mode op_mode;
|
||||
|
||||
|
@ -3931,7 +3931,7 @@ combine_simplify_rtx (x, op0_mode, last, in_dest)
|
|||
temp = expand_compound_operation (XEXP (x, 0));
|
||||
|
||||
/* For C equal to the width of MODE minus 1, (neg (ashiftrt X C)) can be
|
||||
replaced by (lshiftrt X C). This will convert
|
||||
replaced by (lshiftrt X C). This will convert
|
||||
(neg (sign_extract X 1 Y)) to (zero_extract X 1 Y). */
|
||||
|
||||
if (GET_CODE (temp) == ASHIFTRT
|
||||
|
@ -4015,7 +4015,7 @@ combine_simplify_rtx (x, op0_mode, last, in_dest)
|
|||
&& num_sign_bit_copies (XEXP (x, 0), GET_MODE (XEXP (x, 0)))
|
||||
>= GET_MODE_BITSIZE (mode) + 1
|
||||
&& ! (GET_CODE (XEXP (x, 0)) == LSHIFTRT
|
||||
&& GET_CODE (XEXP (XEXP (x, 0), 0)) == MULT))
|
||||
&& GET_CODE (XEXP (XEXP (x, 0), 0)) == MULT))
|
||||
return gen_lowpart_for_combine (mode, XEXP (x, 0));
|
||||
|
||||
/* A truncate of a comparison can be replaced with a subreg if
|
||||
|
@ -4250,8 +4250,8 @@ combine_simplify_rtx (x, op0_mode, last, in_dest)
|
|||
case GT: case GTU: case GE: case GEU:
|
||||
case LT: case LTU: case LE: case LEU:
|
||||
case UNEQ: case LTGT:
|
||||
case UNGT: case UNGE:
|
||||
case UNLT: case UNLE:
|
||||
case UNGT: case UNGE:
|
||||
case UNLT: case UNLE:
|
||||
case UNORDERED: case ORDERED:
|
||||
/* If the first operand is a condition code, we can't do anything
|
||||
with it. */
|
||||
|
@ -4527,7 +4527,7 @@ combine_simplify_rtx (x, op0_mode, last, in_dest)
|
|||
}
|
||||
|
||||
break;
|
||||
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -5579,7 +5579,7 @@ expand_compound_operation (x)
|
|||
&& GET_RTX_CLASS (GET_CODE (XEXP (XEXP (x, 0), 0))) == '<'
|
||||
&& (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))
|
||||
<= HOST_BITS_PER_WIDE_INT)
|
||||
&& ((HOST_WIDE_INT) STORE_FLAG_VALUE
|
||||
&& ((HOST_WIDE_INT) STORE_FLAG_VALUE
|
||||
& ~GET_MODE_MASK (GET_MODE (XEXP (x, 0)))) == 0)
|
||||
return XEXP (XEXP (x, 0), 0);
|
||||
|
||||
|
@ -5922,9 +5922,9 @@ make_extraction (mode, inner, pos, pos_rtx, len,
|
|||
|
||||
new = gen_rtx_SUBREG (tmode, inner, final_word);
|
||||
}
|
||||
else
|
||||
new = inner;
|
||||
}
|
||||
else
|
||||
new = inner;
|
||||
}
|
||||
else
|
||||
new = force_to_mode (inner, tmode,
|
||||
len >= HOST_BITS_PER_WIDE_INT
|
||||
|
@ -7418,7 +7418,7 @@ known_cond (x, cond, reg, val)
|
|||
/* Do not reverse the condition when it is NE or EQ.
|
||||
This is because we cannot conclude anything about
|
||||
the value of 'SMAX (x, y)' when x is not equal to y,
|
||||
but we can when x equals y. */
|
||||
but we can when x equals y. */
|
||||
if ((code == SMAX || code == UMAX)
|
||||
&& ! (cond == EQ || cond == NE))
|
||||
cond = reverse_condition (cond);
|
||||
|
@ -9717,7 +9717,6 @@ gen_lowpart_for_combine (mode, x)
|
|||
if (GET_CODE (x) == MEM)
|
||||
{
|
||||
register int offset = 0;
|
||||
rtx new;
|
||||
|
||||
/* Refuse to work on a volatile memory ref or one with a mode-dependent
|
||||
address. */
|
||||
|
@ -10530,7 +10529,7 @@ simplify_comparison (code, pop0, pop1)
|
|||
new_code = GET_CODE (op0);
|
||||
else
|
||||
new_code = combine_reversed_comparison_code (op0);
|
||||
|
||||
|
||||
if (new_code != UNKNOWN)
|
||||
{
|
||||
code = new_code;
|
||||
|
|
36
gcc/gcov.c
36
gcc/gcov.c
|
@ -1,7 +1,7 @@
|
|||
/* Gcov.c: prepend line execution counts and branch probabilities to a
|
||||
source file.
|
||||
Copyright (C) 1990, 1991, 1992, 1993, 1994, 1996, 1997, 1998,
|
||||
1999, 2000 Free Software Foundation, Inc.
|
||||
1999, 2000, 2001 Free Software Foundation, Inc.
|
||||
Contributed by James E. Wilson of Cygnus Support.
|
||||
Mangled by Bob Manson of Cygnus Support.
|
||||
|
||||
|
@ -218,7 +218,7 @@ static char *object_directory = 0;
|
|||
|
||||
/* Output the number of times a branch was taken as opposed to the percentage
|
||||
of times it was taken. Turned on by the -c option */
|
||||
|
||||
|
||||
static int output_branch_counts = 0;
|
||||
|
||||
/* Forward declarations. */
|
||||
|
@ -438,7 +438,7 @@ open_files ()
|
|||
fnotice (stderr, "Could not open data file %s.\n", da_file_name);
|
||||
fnotice (stderr, "Assuming that all execution counts are zero.\n");
|
||||
}
|
||||
|
||||
|
||||
bbg_file = fopen (bbg_file_name, "rb");
|
||||
if (bbg_file == NULL)
|
||||
{
|
||||
|
@ -590,7 +590,7 @@ create_program_flow_graph (bptr)
|
|||
bb_graph[arcptr->target].pred_count--;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
solve_program_flow_graph (bptr)
|
||||
struct bb_info_list *bptr;
|
||||
|
@ -707,7 +707,7 @@ solve_program_flow_graph (bptr)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* If the graph has been correctly solved, every block will have a
|
||||
succ and pred count of zero. */
|
||||
for (i = 0; i < num_blocks; i++)
|
||||
|
@ -772,7 +772,7 @@ read_files ()
|
|||
|
||||
bb_data = (char *) xmalloc ((unsigned) buf.st_size);
|
||||
fread (bb_data, sizeof (char), buf.st_size, bb_file);
|
||||
|
||||
|
||||
fclose (bb_file);
|
||||
if (da_file)
|
||||
fclose (da_file);
|
||||
|
@ -890,7 +890,7 @@ calculate_branch_probs (current_graph, block_num, branch_probs, last_line_num)
|
|||
|
||||
if (arcptr->fall_through)
|
||||
continue;
|
||||
|
||||
|
||||
a_ptr = (struct arcdata *) xmalloc (sizeof (struct arcdata));
|
||||
a_ptr->total = total;
|
||||
if (total == 0)
|
||||
|
@ -1042,7 +1042,7 @@ output_data ()
|
|||
if (output_branch_probs)
|
||||
branch_probs = (struct arcdata **)
|
||||
xcalloc (sizeof (struct arcdata *), s_ptr->maxlineno);
|
||||
|
||||
|
||||
/* There will be a zero at the beginning of the bb info, before the
|
||||
first list of line numbers, so must initialize block_num to 0. */
|
||||
block_num = 0;
|
||||
|
@ -1066,7 +1066,7 @@ output_data ()
|
|||
this_file = 0;
|
||||
else
|
||||
this_file = 1;
|
||||
|
||||
|
||||
/* Scan past the file name. */
|
||||
do {
|
||||
count++;
|
||||
|
@ -1139,7 +1139,7 @@ output_data ()
|
|||
function_name);
|
||||
abort ();
|
||||
}
|
||||
|
||||
|
||||
if (output_branch_probs && this_file)
|
||||
calculate_branch_probs (current_graph, block_num,
|
||||
branch_probs, last_line_num);
|
||||
|
@ -1246,7 +1246,7 @@ output_data ()
|
|||
/* Now the statistics are ready. Read in the source file one line
|
||||
at a time, and output that line to the gcov file preceded by
|
||||
its execution count if non zero. */
|
||||
|
||||
|
||||
source_file = fopen (source_file_name, "r");
|
||||
if (source_file == NULL)
|
||||
{
|
||||
|
@ -1266,7 +1266,7 @@ output_data ()
|
|||
if (output_long_names && strcmp (cptr, input_file_name))
|
||||
{
|
||||
gcov_file_name = xmalloc (count + 7 + strlen (input_file_name));
|
||||
|
||||
|
||||
cptr = strrchr (input_file_name, '/');
|
||||
if (cptr)
|
||||
strcpy (gcov_file_name, cptr + 1);
|
||||
|
@ -1361,11 +1361,13 @@ output_data ()
|
|||
{
|
||||
if (output_branch_counts)
|
||||
fnotice (gcov_file,
|
||||
"call %d returns = %d\n",
|
||||
"call %d returns = "
|
||||
HOST_WIDEST_INT_PRINT_DEC "\n",
|
||||
i, a_ptr->total - a_ptr->hits);
|
||||
else
|
||||
fnotice (gcov_file,
|
||||
"call %d returns = %d%%\n",
|
||||
"call %d returns = "
|
||||
HOST_WIDEST_INT_PRINT_DEC "%%\n",
|
||||
i, 100 - ((a_ptr->hits * 100) +
|
||||
(a_ptr->total >> 1))/a_ptr->total);
|
||||
}
|
||||
|
@ -1379,11 +1381,13 @@ output_data ()
|
|||
{
|
||||
if (output_branch_counts)
|
||||
fnotice (gcov_file,
|
||||
"branch %d taken = %d\n",
|
||||
"branch %d taken = "
|
||||
HOST_WIDEST_INT_PRINT_DEC "\n",
|
||||
i, a_ptr->hits);
|
||||
else
|
||||
fnotice (gcov_file,
|
||||
"branch %d taken = %d%%\n", i,
|
||||
"branch %d taken = "
|
||||
HOST_WIDEST_INT_PRINT_DEC "%%\n", i,
|
||||
((a_ptr->hits * 100) +
|
||||
(a_ptr->total >> 1))/
|
||||
a_ptr->total);
|
||||
|
|
103
gcc/libgcc2.c
103
gcc/libgcc2.c
|
@ -76,7 +76,7 @@ __addvsi3 (Wtype a, Wtype b)
|
|||
abort ();
|
||||
|
||||
return w;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef L_addvdi3
|
||||
|
@ -1069,7 +1069,7 @@ __floatdidf (DWtype u)
|
|||
|
||||
/* Define codes for all the float formats that we know of. Note
|
||||
that this is copied from real.h. */
|
||||
|
||||
|
||||
#define UNKNOWN_FLOAT_FORMAT 0
|
||||
#define IEEE_FLOAT_FORMAT 1
|
||||
#define VAX_FLOAT_FORMAT 2
|
||||
|
@ -1311,13 +1311,13 @@ char *ctime PARAMS ((const time_t *));
|
|||
|
||||
static struct bb *bb_head;
|
||||
|
||||
static int num_digits (long value, int base) __attribute__ ((const));
|
||||
static int num_digits (long long value, int base) __attribute__ ((const));
|
||||
|
||||
/* Return the number of digits needed to print a value */
|
||||
/* __inline__ */ static int num_digits (long value, int base)
|
||||
/* __inline__ */ static int num_digits (long long value, int base)
|
||||
{
|
||||
int minus = (value < 0 && base != 16);
|
||||
unsigned long v = (minus) ? -value : value;
|
||||
unsigned long long v = (minus) ? -value : value;
|
||||
int ret = minus;
|
||||
|
||||
do
|
||||
|
@ -1406,7 +1406,7 @@ __bb_exit_func (void)
|
|||
else
|
||||
{
|
||||
long n_counts = 0;
|
||||
|
||||
|
||||
if (ungetc (firstchar, da_file) == EOF)
|
||||
rewind (da_file);
|
||||
if (__read_long (&n_counts, da_file, 8) != 0)
|
||||
|
@ -1448,7 +1448,7 @@ __bb_exit_func (void)
|
|||
|
||||
if (__write_gcov_type (ptr->ncounts, da_file, 8) != 0)
|
||||
{
|
||||
|
||||
|
||||
fprintf (stderr, "arc profiling: Error writing output file %s.\n",
|
||||
ptr->filename);
|
||||
}
|
||||
|
@ -1470,7 +1470,7 @@ __bb_exit_func (void)
|
|||
fprintf (stderr, "arc profiling: Error writing output file %s.\n",
|
||||
ptr->filename);
|
||||
}
|
||||
|
||||
|
||||
if (fclose (da_file) == EOF)
|
||||
fprintf (stderr, "arc profiling: Error closing output file %s.\n",
|
||||
ptr->filename);
|
||||
|
@ -1512,7 +1512,7 @@ __bb_exit_func (void)
|
|||
int file_p = (func_p && ptr->filenames);
|
||||
int addr_p = (ptr->addresses != 0);
|
||||
long ncounts = ptr->ncounts;
|
||||
long cnt_max = 0;
|
||||
gcov_type cnt_max = 0;
|
||||
long line_max = 0;
|
||||
long addr_max = 0;
|
||||
int file_len = 0;
|
||||
|
@ -1564,10 +1564,17 @@ __bb_exit_func (void)
|
|||
/* Now print out the basic block information. */
|
||||
for (i = 0; i < ncounts; i++)
|
||||
{
|
||||
#if LONG_TYPE_SIZE == GCOV_TYPE_SIZE
|
||||
fprintf (file,
|
||||
" Block #%*d: executed %*ld time(s)",
|
||||
blk_len, i+1,
|
||||
cnt_len, ptr->counts[i]);
|
||||
#else
|
||||
fprintf (file,
|
||||
" Block #%*d: executed %*lld time(s)",
|
||||
blk_len, i+1,
|
||||
cnt_len, ptr->counts[i]);
|
||||
#endif
|
||||
|
||||
if (addr_p)
|
||||
fprintf (file, " address= 0x%.*lx", addr_len,
|
||||
|
@ -1677,7 +1684,7 @@ struct {
|
|||
struct bb *blocks;
|
||||
} __bb;
|
||||
|
||||
/* Vars to store addrs of source and destination basic blocks
|
||||
/* Vars to store addrs of source and destination basic blocks
|
||||
of a jump. */
|
||||
|
||||
static unsigned long bb_src = 0;
|
||||
|
@ -1727,7 +1734,7 @@ gopen (char *fn, char *mode)
|
|||
if (mode[1])
|
||||
return (FILE *) 0;
|
||||
|
||||
if (mode[0] != 'r' && mode[0] != 'w')
|
||||
if (mode[0] != 'r' && mode[0] != 'w')
|
||||
return (FILE *) 0;
|
||||
|
||||
p = fn + strlen (fn)-1;
|
||||
|
@ -1791,7 +1798,7 @@ __bb_exit_trace_func (void)
|
|||
FILE *file = fopen ("bb.out", "a");
|
||||
struct bb_func *f;
|
||||
struct bb *b;
|
||||
|
||||
|
||||
if (!file)
|
||||
perror ("bb.out");
|
||||
|
||||
|
@ -1832,7 +1839,7 @@ __bb_exit_trace_func (void)
|
|||
goto found;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (!printed_something)
|
||||
{
|
||||
fprintf (file, "Functions in `bb.in' not executed during basic block profiling on %s\n", ctime ((void *) &time_value));
|
||||
|
@ -1843,7 +1850,7 @@ __bb_exit_trace_func (void)
|
|||
if (p->filename)
|
||||
fprintf (file, " of file %s", p->filename);
|
||||
fprintf (file, "\n" );
|
||||
|
||||
|
||||
found: ;
|
||||
}
|
||||
|
||||
|
@ -1863,7 +1870,7 @@ found: ;
|
|||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
else if (file)
|
||||
{
|
||||
long time_value;
|
||||
|
@ -1872,13 +1879,13 @@ found: ;
|
|||
unsigned long cnt_max = 0;
|
||||
int cnt_len;
|
||||
int addr_len;
|
||||
|
||||
|
||||
/* This is somewhat type incorrect, but it avoids worrying about
|
||||
exactly where time.h is included from. It should be ok unless
|
||||
a void * differs from other pointer formats, or if sizeof (long)
|
||||
is < sizeof (time_t). It would be nice if we could assume the
|
||||
use of rationale standards here. */
|
||||
|
||||
|
||||
time ((void *) &time_value);
|
||||
fprintf (file, "Basic block jump tracing");
|
||||
|
||||
|
@ -1902,36 +1909,36 @@ found: ;
|
|||
}
|
||||
|
||||
fprintf (file, " finished on %s\n", ctime ((void *) &time_value));
|
||||
|
||||
|
||||
for (i = 0; i < BB_BUCKETS; i++)
|
||||
{
|
||||
struct bb_edge *bucket = bb_hashbuckets[i];
|
||||
for ( ; bucket; bucket = bucket->next )
|
||||
{
|
||||
if (addr_max < bucket->src_addr)
|
||||
if (addr_max < bucket->src_addr)
|
||||
addr_max = bucket->src_addr;
|
||||
if (addr_max < bucket->dst_addr)
|
||||
if (addr_max < bucket->dst_addr)
|
||||
addr_max = bucket->dst_addr;
|
||||
if (cnt_max < bucket->count)
|
||||
if (cnt_max < bucket->count)
|
||||
cnt_max = bucket->count;
|
||||
}
|
||||
}
|
||||
addr_len = num_digits (addr_max, 16);
|
||||
cnt_len = num_digits (cnt_max, 10);
|
||||
|
||||
|
||||
for ( i = 0; i < BB_BUCKETS; i++)
|
||||
{
|
||||
struct bb_edge *bucket = bb_hashbuckets[i];
|
||||
for ( ; bucket; bucket = bucket->next )
|
||||
{
|
||||
fprintf (file,
|
||||
"Jump from block 0x%.*lx to block 0x%.*lx executed %*lu time(s)\n",
|
||||
addr_len, bucket->src_addr,
|
||||
addr_len, bucket->dst_addr,
|
||||
"Jump from block 0x%.*lx to block 0x%.*lx executed %*lu time(s)\n",
|
||||
addr_len, bucket->src_addr,
|
||||
addr_len, bucket->dst_addr,
|
||||
cnt_len, bucket->count);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
fprintf (file, "\n");
|
||||
|
||||
}
|
||||
|
@ -2003,14 +2010,14 @@ __bb_init_prg (void)
|
|||
buf[i--] = '\0';
|
||||
|
||||
p = buf;
|
||||
if (*p == '-')
|
||||
{
|
||||
m = TRACE_OFF;
|
||||
p++;
|
||||
if (*p == '-')
|
||||
{
|
||||
m = TRACE_OFF;
|
||||
p++;
|
||||
}
|
||||
else
|
||||
{
|
||||
m = TRACE_ON;
|
||||
else
|
||||
{
|
||||
m = TRACE_ON;
|
||||
}
|
||||
if (!strcmp (p, "__bb_trace__"))
|
||||
bb_mode |= 1;
|
||||
|
@ -2020,7 +2027,7 @@ __bb_init_prg (void)
|
|||
bb_mode |= 4;
|
||||
else if (!strcmp (p, "__bb_showret__"))
|
||||
bb_mode |= 8;
|
||||
else
|
||||
else
|
||||
{
|
||||
struct bb_func *f = (struct bb_func *) malloc (sizeof (struct bb_func));
|
||||
if (f)
|
||||
|
@ -2055,7 +2062,7 @@ __bb_init_prg (void)
|
|||
}
|
||||
fclose (file);
|
||||
|
||||
#ifdef HAVE_POPEN
|
||||
#ifdef HAVE_POPEN
|
||||
|
||||
if (bb_mode & 1)
|
||||
bb_tracefile = gopen ("bbtrace.gz", "w");
|
||||
|
@ -2069,7 +2076,7 @@ __bb_init_prg (void)
|
|||
|
||||
if (bb_mode & 2)
|
||||
{
|
||||
bb_hashbuckets = (struct bb_edge **)
|
||||
bb_hashbuckets = (struct bb_edge **)
|
||||
malloc (BB_BUCKETS * sizeof (struct bb_edge *));
|
||||
if (bb_hashbuckets)
|
||||
/* Use a loop here rather than calling bzero to avoid having to
|
||||
|
@ -2116,7 +2123,7 @@ __bb_trace_func (void)
|
|||
= & bb_hashbuckets[ (((int) bb_src*8) ^ (int) bb_dst) % BB_BUCKETS ];
|
||||
bucket = *startbucket;
|
||||
|
||||
for (bucket = *startbucket; bucket;
|
||||
for (bucket = *startbucket; bucket;
|
||||
oldnext = &(bucket->next), bucket = *oldnext)
|
||||
{
|
||||
if (bucket->src_addr == bb_src
|
||||
|
@ -2179,7 +2186,7 @@ __bb_trace_func_ret (void)
|
|||
= & bb_hashbuckets[ (((int) bb_dst * 8) ^ (int) bb_src) % BB_BUCKETS ];
|
||||
bucket = *startbucket;
|
||||
|
||||
for (bucket = *startbucket; bucket;
|
||||
for (bucket = *startbucket; bucket;
|
||||
oldnext = &(bucket->next), bucket = *oldnext)
|
||||
{
|
||||
if (bucket->src_addr == bb_dst
|
||||
|
@ -2293,9 +2300,9 @@ __bb_init_trace_func (struct bb *blocks, unsigned long blockno)
|
|||
MACHINE_STATE_SAVE("3")
|
||||
|
||||
if (!blocks->zero_word)
|
||||
{
|
||||
{
|
||||
if (!trace_init)
|
||||
{
|
||||
{
|
||||
trace_init = 1;
|
||||
__bb_init_prg ();
|
||||
}
|
||||
|
@ -2362,7 +2369,7 @@ void
|
|||
__clear_cache (char *beg __attribute__((__unused__)),
|
||||
char *end __attribute__((__unused__)))
|
||||
{
|
||||
#ifdef CLEAR_INSN_CACHE
|
||||
#ifdef CLEAR_INSN_CACHE
|
||||
CLEAR_INSN_CACHE (beg, end);
|
||||
#else
|
||||
#ifdef INSN_CACHE_SIZE
|
||||
|
@ -2426,7 +2433,7 @@ __clear_cache (char *beg __attribute__((__unused__)),
|
|||
/* Compute the cache alignment of the place to stop clearing. */
|
||||
#if 0 /* This is not needed for gcc's purposes. */
|
||||
/* If the block to clear is bigger than a cache plane,
|
||||
we clear the entire cache, and OFFSET is already correct. */
|
||||
we clear the entire cache, and OFFSET is already correct. */
|
||||
if (end < beg + INSN_CACHE_PLANE_SIZE)
|
||||
#endif
|
||||
offset = (((int) (end + INSN_CACHE_LINE_WIDTH - 1)
|
||||
|
@ -2514,8 +2521,8 @@ mprotect (char *addr, int len, int prot)
|
|||
|
||||
#endif /* WINNT && ! __CYGWIN__ && ! _UWIN */
|
||||
|
||||
#ifdef TRANSFER_FROM_TRAMPOLINE
|
||||
TRANSFER_FROM_TRAMPOLINE
|
||||
#ifdef TRANSFER_FROM_TRAMPOLINE
|
||||
TRANSFER_FROM_TRAMPOLINE
|
||||
#endif
|
||||
|
||||
#if defined (NeXT) && defined (__MACH__)
|
||||
|
@ -2550,7 +2557,7 @@ __enable_execute_stack (char *addr)
|
|||
#else
|
||||
__clear_cache ((int) addr, (int) eaddr);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* defined (NeXT) && defined (__MACH__) */
|
||||
|
||||
|
@ -2596,7 +2603,7 @@ __enable_execute_stack (void)
|
|||
int save_errno;
|
||||
static unsigned long lowest = USRSTACK;
|
||||
unsigned long current = (unsigned long) &save_errno & -NBPC;
|
||||
|
||||
|
||||
/* Ignore errno being set. memctl sets errno to EINVAL whenever the
|
||||
address is seen as 'negative'. That is the case with the stack. */
|
||||
|
||||
|
@ -2650,7 +2657,7 @@ __clear_insn_cache (void)
|
|||
errno changing without explicitly calling any system-call. */
|
||||
save_errno = errno;
|
||||
|
||||
/* Keep it simple : memctl (MCT_TEXT) always fully clears the insn cache.
|
||||
/* Keep it simple : memctl (MCT_TEXT) always fully clears the insn cache.
|
||||
No need to use an address derived from _start or %sp, as 0 works also. */
|
||||
memctl(0, 4096, MCT_TEXT);
|
||||
errno = save_errno;
|
||||
|
@ -2878,7 +2885,7 @@ atexit (func_ptr func)
|
|||
extern void _cleanup (void);
|
||||
extern void _exit (int) __attribute__ ((__noreturn__));
|
||||
|
||||
void
|
||||
void
|
||||
exit (int status)
|
||||
{
|
||||
if (atexit_chain)
|
||||
|
|
Loading…
Reference in New Issue