GCC 4.2.1 release.
This commit is contained in:
parent
888346df5f
commit
23baddbde1
@ -1 +1 @@
|
|||||||
4.2.0
|
4.2.1
|
||||||
|
@ -1,3 +1,441 @@
|
|||||||
|
2007-07-19 Release Manager
|
||||||
|
|
||||||
|
* GCC 4.2.1 released.
|
||||||
|
|
||||||
|
2007-07-18 Paolo Bonzini <bonzini@gnu.org>
|
||||||
|
|
||||||
|
Revert:
|
||||||
|
|
||||||
|
2007-07-09 Paolo Bonzini <bonzini@gnu.org>
|
||||||
|
|
||||||
|
PR middle-end/32004
|
||||||
|
* function.c (rest_of_match_asm_constraints): Pass PROP_REG_INFO.
|
||||||
|
|
||||||
|
2007-07-06 Paolo Bonzini <bonzini@gnu.org>
|
||||||
|
|
||||||
|
PR middle-end/32004
|
||||||
|
* function.c (match_asm_constraints_1, rest_of_match_asm_constraints,
|
||||||
|
pass_match_asm_constraints): New.
|
||||||
|
* passes.c (init_optimization_passes): Add new pass.
|
||||||
|
* stmt.c (expand_asm_operands): Set cfun->has_asm_statement.
|
||||||
|
* function.h (struct function): Add has_asm_statement bit.
|
||||||
|
(current_function_has_asm_statement): New.
|
||||||
|
* tree-pass.h (pass_match_asm_constraints): New.
|
||||||
|
|
||||||
|
2007-07-16 Paul Brook <paul@codesourcery.com>
|
||||||
|
|
||||||
|
PR target/32753
|
||||||
|
gcc/
|
||||||
|
* config/arm/cirrus.md (cirrus_arm_movsi_insn): Remove dead insn.
|
||||||
|
|
||||||
|
2007-07-10 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
|
||||||
|
|
||||||
|
PR target/32538
|
||||||
|
* config/mips/iris6.h (LIBGCC_SPEC): Add libm.
|
||||||
|
|
||||||
|
2007-07-09 Paolo Bonzini <bonzini@gnu.org>
|
||||||
|
|
||||||
|
PR middle-end/32004
|
||||||
|
* function.c (rest_of_match_asm_constraints): Pass PROP_REG_INFO.
|
||||||
|
|
||||||
|
2007-07-09 Uros Bizjak <ubizjak@gmail.com>
|
||||||
|
|
||||||
|
PR tree-optimization/32681
|
||||||
|
* tree-if-conv.c (find_phi_replacement_condition): Use the condition
|
||||||
|
saved in second_edge->aux when first_bb is a loop header.
|
||||||
|
|
||||||
|
2007-07-07 Anatoly Sokolov <aesok@post.ru>
|
||||||
|
|
||||||
|
PR target/31331
|
||||||
|
* config/avr/avr.c (avr_naked_function_p): Handle receiving a type
|
||||||
|
rather than a decl.
|
||||||
|
(avr_attribute_table): Make "naked" attribute apply to function types
|
||||||
|
rather than to decls.
|
||||||
|
(avr_handle_fntype_attribute): New function.
|
||||||
|
|
||||||
|
2007-07-06 Paolo Bonzini <bonzini@gnu.org>
|
||||||
|
|
||||||
|
PR middle-end/32004
|
||||||
|
* function.c (match_asm_constraints_1, rest_of_match_asm_constraints,
|
||||||
|
pass_match_asm_constraints): New.
|
||||||
|
* passes.c (init_optimization_passes): Add new pass.
|
||||||
|
* stmt.c (expand_asm_operands): Set cfun->has_asm_statement.
|
||||||
|
* function.h (struct function): Add has_asm_statement bit.
|
||||||
|
(current_function_has_asm_statement): New.
|
||||||
|
* tree-pass.h (pass_match_asm_constraints): New.
|
||||||
|
|
||||||
|
2007-07-06 Uros Bizjak <ubizjak@gmail.com>
|
||||||
|
|
||||||
|
PR rtl-optimization/32450
|
||||||
|
* function.c (thread_prologue_and_epilogue_insns): Emit blockage insn
|
||||||
|
to ensure that instructions are not moved into the prologue when
|
||||||
|
profiling is on.
|
||||||
|
|
||||||
|
2007-07-04 Richard Guenther <rguenther@suse.de>
|
||||||
|
|
||||||
|
PR tree-optimization/32500
|
||||||
|
* tree-ssa-loop-niter.c (infer_loop_bounds_from_undefined):
|
||||||
|
Only use basic blocks that are always executed to infer loop bounds.
|
||||||
|
|
||||||
|
2007-07-04 Uros Bizjak <ubizjak@gmail.com>
|
||||||
|
|
||||||
|
PR tree-optimization/31966
|
||||||
|
PR tree-optimization/32533
|
||||||
|
* tree-if-conv.c (add_to_dst_predicate_list): Use "edge", not
|
||||||
|
"basic_block" description as its third argument. Update function
|
||||||
|
calls to get destination bb from "edge" argument. Save "cond" into
|
||||||
|
aux field of the edge. Update prototype for changed arguments.
|
||||||
|
(if_convertible_loop_p): Clear aux field of incoming edges if bb
|
||||||
|
contains phi node.
|
||||||
|
(find_phi_replacement_condition): Operate on incoming edges, not
|
||||||
|
on predecessor blocks. If there is a condition saved in the
|
||||||
|
incoming edge aux field, AND it with incoming bb predicate.
|
||||||
|
Return source bb of the first edge.
|
||||||
|
(clean_predicate_lists): Clean aux field of outgoing node edges.
|
||||||
|
(tree_if_conversion): Do not initialize cond variable. Move
|
||||||
|
variable declaration into the loop.
|
||||||
|
(replace_phi_with_cond_gimple_modify_stmt): Remove unneded
|
||||||
|
initializations of new_stmt, arg0 and arg1 variables.
|
||||||
|
|
||||||
|
2007-07-04 Kaz Kojima <kkojima@gcc.gnu.org>
|
||||||
|
|
||||||
|
PR target/32506
|
||||||
|
Backport from mainline.
|
||||||
|
* config/sh/sh.md (udivsi3_i1_media): Use target_reg_operand
|
||||||
|
predicate instead of target_operand.
|
||||||
|
(divsi3_i1_media, divsi3_media_2): Likewise.
|
||||||
|
|
||||||
|
2007-07-03 Richard Guenther <rguenther@suse.de>
|
||||||
|
|
||||||
|
Backport from mainline:
|
||||||
|
2006-12-11 Zdenek Dvorak <dvorakz@suse.cz>
|
||||||
|
|
||||||
|
PR rtl-optimization/30113
|
||||||
|
* loop-iv.c (implies_p): Require the mode of the operands to be
|
||||||
|
scalar.
|
||||||
|
|
||||||
|
2007-07-03 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
|
||||||
|
|
||||||
|
PR target/28307
|
||||||
|
* gthr-posix.h [SUPPORTS_WEAK && GTHREAD_USE_WEAK]
|
||||||
|
(__gthrw_pragma): Provide default definition.
|
||||||
|
(__gthrw2): Use it.
|
||||||
|
* gthr-posix.c (__gthrw_pragma): Define.
|
||||||
|
|
||||||
|
2007-07-02 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
PR libgomp/32468
|
||||||
|
* omp-low.c (check_combined_parallel): New function.
|
||||||
|
(lower_omp_parallel): Call it via walk_stmts, set
|
||||||
|
OMP_PARALLEL_COMBINED if appropriate.
|
||||||
|
(determine_parallel_type): If OMP_FOR resp. OMP_SECTIONS
|
||||||
|
isn't the only statement in WS_ENTRY_BB or OMP_RETURN
|
||||||
|
the only one in PAR_EXIT_BB and not OMP_PARALLEL_COMBINED,
|
||||||
|
don't consider it as combined parallel.
|
||||||
|
|
||||||
|
2007-06-30 Alexandre Oliva <aoliva@redhat.com>
|
||||||
|
|
||||||
|
* dwarf2out.c (dwarf2out_finish): Accept namespaces as context of
|
||||||
|
limbo die nodes.
|
||||||
|
|
||||||
|
2007-06-28 Seongbae Park <seongbae.park@gmail.com>
|
||||||
|
|
||||||
|
* config/arm/arm.c (arm_get_frame_offsets): Set
|
||||||
|
offsets->locals_base to avoid negative stack size.
|
||||||
|
(thumb_expand_prologue): Assert on negative stack size.
|
||||||
|
|
||||||
|
2007-06-28 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
* config/rs6000/rs6000.c (rs6000_function_ok_for_sibcall): Ensure
|
||||||
|
decl is non-external for AIX ABI.
|
||||||
|
|
||||||
|
2007-06-28 David Edelsohn <edelsohn@gnu.org>
|
||||||
|
|
||||||
|
* config/rs6000/predicates.md (current_file_function_operand):
|
||||||
|
Ensure the symbol is non-external for AIX ABI.
|
||||||
|
|
||||||
|
2007-06-21 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
|
* config/i386/i386.c (ix86_builtins): Add IX86_BUILTIN_VEC_EXT_V16QI.
|
||||||
|
(ix86_init_mmx_sse_builtins): Add __builtin_ia32_vec_ext_v16qi.
|
||||||
|
(ix86_expand_builtin): Handle IX86_BUILTIN_VEC_EXT_V16QI.
|
||||||
|
|
||||||
|
2007-06-21 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
PR middle-end/32362
|
||||||
|
* omp-low.c (lookup_decl_in_outer_ctx): Don't ICE if t is NULL,
|
||||||
|
but decl is a global var, instead return decl.
|
||||||
|
* gimplify.c (gimplify_adjust_omp_clauses_1): Add shared clauses
|
||||||
|
even for is_global_var decls, if they are private in some outer
|
||||||
|
context.
|
||||||
|
|
||||||
|
2007-06-21 Uros Bizjak <ubizjak@gmail.com>
|
||||||
|
|
||||||
|
PR target/32389
|
||||||
|
* config/i386/i386.h (enum ix86_stack_slot): Add SLOT_VIRTUAL.
|
||||||
|
* config/i386/i386.c (assign_386_stack_local): Assert that
|
||||||
|
SLOT_VIRTUAL is valid only before virtual regs are instantiated.
|
||||||
|
(ix86_expand_builtin) [IX86_BUILTIN_LDMXCSR, IX86_BUILTIN_STMXCSR]:
|
||||||
|
Use SLOT_VIRTUAL stack slot instead of SLOT_TEMP.
|
||||||
|
* config/i386/i386.md (truncdfsf2, truncxfsf2, truncxfdf2): Ditto.
|
||||||
|
|
||||||
|
2007-06-20 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
PR inline-asm/32109
|
||||||
|
* gimplify.c (gimplify_asm_expr): Issue error if type is addressable
|
||||||
|
and !allows_mem.
|
||||||
|
|
||||||
|
PR middle-end/32285
|
||||||
|
* calls.c (precompute_arguments): Also precompute CALL_EXPR arguments
|
||||||
|
if ACCUMULATE_OUTGOING_ARGS.
|
||||||
|
|
||||||
|
2007-06-20 Kaz Kojima <kkojima@gcc.gnu.org>
|
||||||
|
|
||||||
|
PR rtl-optimization/28011
|
||||||
|
Backport from mainline.
|
||||||
|
* reload.c (push_reload): Set dont_share if IN appears in OUT
|
||||||
|
also when IN is a PLUS rtx.
|
||||||
|
(reg_overlap_mentioned_for_reload_p): Return true if X and IN
|
||||||
|
are same PLUS rtx.
|
||||||
|
|
||||||
|
2007-06-19 Richard Guenther <rguenther@suse.de>
|
||||||
|
Michael Matz <matz@suse.de>
|
||||||
|
|
||||||
|
PR tree-optimization/30252
|
||||||
|
* tree-ssa-structalias.c (solution_set_add): Make sure to
|
||||||
|
preserve all relevant vars.
|
||||||
|
(handle_ptr_arith): Make sure to only handle positive
|
||||||
|
offsets.
|
||||||
|
(push_fields_onto_fieldstack): Create fields for empty
|
||||||
|
bases.
|
||||||
|
|
||||||
|
2007-06-19 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
PR tree-optimization/32353
|
||||||
|
* tree-ssa-structalias.c (set_uids_in_ptset): Also handle RESULT_DECL.
|
||||||
|
|
||||||
|
2007-06-17 Eric Botcazou <ebotcazou@libertysurf.fr>
|
||||||
|
|
||||||
|
* config/sparc/sparc.c (sparc_vis_init_builtins): Retrieve the
|
||||||
|
return mode from the builtin itself.
|
||||||
|
(sparc_fold_builtin): Fix cast of zero constant.
|
||||||
|
|
||||||
|
2007-06-15 Diego Novillo <dnovillo@google.com>
|
||||||
|
|
||||||
|
PR 32327
|
||||||
|
* tree-ssa-operands.c (build_ssa_operands): Initially assume
|
||||||
|
that the statement does not take any addresses.
|
||||||
|
|
||||||
|
2007-06-13 Eric Botcazou <ebotcazou@libertysurf.fr>
|
||||||
|
|
||||||
|
* config/sparc/sparc.c (sparc_override_options): Initialize
|
||||||
|
fpu mask correctly.
|
||||||
|
|
||||||
|
2007-06-09 Ian Lance Taylor <iant@google.com>
|
||||||
|
|
||||||
|
PR tree-optimization/32169
|
||||||
|
* tree-vrp.c (extract_range_from_unary_expr): For NOP_EXPR and
|
||||||
|
CONVERT_EXPR, check whether min and max both converted to an
|
||||||
|
overflow infinity representation.
|
||||||
|
|
||||||
|
2007-06-08 Kaz Kojima <kkojima@gcc.gnu.org>
|
||||||
|
|
||||||
|
PR target/32163
|
||||||
|
Backport from mainline.
|
||||||
|
* config/sh/sh.md (symGOT_load): Don't schedule insns when
|
||||||
|
the symbol is generated with the stack protector.
|
||||||
|
|
||||||
|
2007-06-06 Ian Lance Taylor <iant@google.com>
|
||||||
|
|
||||||
|
* fold-const.c (merge_ranges): If range_successor or
|
||||||
|
range_predecessor fail, just return 0.
|
||||||
|
|
||||||
|
2007-06-05 Ian Lance Taylor <iant@google.com>
|
||||||
|
|
||||||
|
* tree-vrp.c (compare_values_warnv): Check TREE_NO_WARNING on a
|
||||||
|
PLUS_EXPR or MINUS_EXPR node before setting *strict_overflow_p.
|
||||||
|
(extract_range_from_assert): Set TREE_NO_WARNING when creating an
|
||||||
|
expression.
|
||||||
|
(test_for_singularity): Likewise.
|
||||||
|
|
||||||
|
2007-06-04 Ian Lance Taylor <iant@google.com>
|
||||||
|
|
||||||
|
* tree-vrp.c (adjust_range_with_scev): When loop is not expected
|
||||||
|
to overflow, reduce overflow infinity to regular infinity.
|
||||||
|
(vrp_var_may_overflow): New static function.
|
||||||
|
(vrp_visit_phi_node): Check vrp_var_may_overflow.
|
||||||
|
|
||||||
|
2007-05-31 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
|
Backport from mainline:
|
||||||
|
2007-05-25 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
|
* config/i386/i386.c (__builtin_ia32_vec_ext_v2df): Mark it
|
||||||
|
with MASK_SSE2.
|
||||||
|
(__builtin_ia32_vec_ext_v2di): Likewise.
|
||||||
|
(__builtin_ia32_vec_ext_v4si): Likewise.
|
||||||
|
(__builtin_ia32_vec_ext_v8hi): Likewise.
|
||||||
|
(__builtin_ia32_vec_set_v8hi): Likewise.
|
||||||
|
|
||||||
|
2007-05-31 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
|
||||||
|
|
||||||
|
Backport from mainline:
|
||||||
|
2007-05-05 Aurelien Jarno <aurelien@aurel32.net>
|
||||||
|
|
||||||
|
* config/pa/pa.md: Split tgd_load, tld_load and tie_load
|
||||||
|
into pic and non-pic versions. Mark r19 as used for
|
||||||
|
tgd_load_pic, tld_load_pic and tie_load_pic. Mark r27 as used
|
||||||
|
for tgd_load, tld_load and tie_load .
|
||||||
|
* config/pa/pa.c (legitimize_tls_address): Emit pic or non-pic
|
||||||
|
version of tgd_load, tld_load and tie_load depending on the
|
||||||
|
value of flag_pic.
|
||||||
|
|
||||||
|
2007-05-27 Daniel Berlin <dberlin@dberlin.org>
|
||||||
|
|
||||||
|
Fix PR/30052
|
||||||
|
Backport PTA solver from mainline
|
||||||
|
|
||||||
|
* pointer-set.c: Copy from mainline
|
||||||
|
* pointer-set.h: Ditto.
|
||||||
|
* tree-ssa-structalias.c: Copy solver portions from mainline.
|
||||||
|
* Makefile.in (tree-ssa-structalias.o): Update dependencies
|
||||||
|
|
||||||
|
2007-05-30 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
|
||||||
|
|
||||||
|
* tree-vrp.c (compare_names): Initialize sop.
|
||||||
|
|
||||||
|
2007-05-30 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
PR tree-optimization/31769
|
||||||
|
* except.c (duplicate_eh_regions): Clear prev_try if
|
||||||
|
ERT_MUST_NOT_THROW region is inside of ERT_TRY region.
|
||||||
|
|
||||||
|
2007-05-28 Andrew Pinski <andrew_pinski@playstation.sony.com>
|
||||||
|
|
||||||
|
PR tree-opt/32100
|
||||||
|
* fold-const.c (tree_expr_nonnegative_warnv_p): Don't
|
||||||
|
return true when truth_value_p is true and the type
|
||||||
|
is of signed:1.
|
||||||
|
|
||||||
|
2007-05-27 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
|
Backport from mainline:
|
||||||
|
2007-05-25 Uros Bizjak <ubizjak@gmail.com>
|
||||||
|
|
||||||
|
* config/i386/sse.md (*vec_extractv2di_1_sse2): Do not calculate
|
||||||
|
"memory" attribute for "sseishft" type insn without operands[2].
|
||||||
|
|
||||||
|
2007-05-25 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
|
* config/i386/sse.md (*vec_extractv2di_1_sse2): Correct shift.
|
||||||
|
|
||||||
|
2007-05-22 Ian Lance Taylor <iant@google.com>
|
||||||
|
|
||||||
|
* tree-vrp.c (avoid_overflow_infinity): New static function,
|
||||||
|
broken out of set_value_range_to_value.
|
||||||
|
(set_value_range_to_value): Call avoid_overflow_infinity.
|
||||||
|
(extract_range_from_assert): Likewise.
|
||||||
|
|
||||||
|
2007-05-23 Chen Liqin <liqin@sunnorth.com.cn>
|
||||||
|
|
||||||
|
PR target/30987
|
||||||
|
* config/score/misc.md (bitclr_c, bitset_c, bittgl_c): remove.
|
||||||
|
* config/score/predicate.md (const_pow2, const_npow2): remove.
|
||||||
|
* config/score/score.h (ASM_OUTPUT_EXTERNAL): add ASM_OUTPUT_EXTERNAL undef.
|
||||||
|
PR target/30474
|
||||||
|
* config/score/score.c (score_print_operand): makes sure that only lower
|
||||||
|
bits are used.
|
||||||
|
|
||||||
|
2007-05-21 Uros Bizjak <ubizjak@gmail.com>
|
||||||
|
|
||||||
|
PR target/31167
|
||||||
|
Backport from mainline.
|
||||||
|
* config/i386/i386.md (*addti3_1, *addti3_1 splitter): Use
|
||||||
|
x86_64_general_operand as operand[2] predicate. Remove "iF"
|
||||||
|
from operand constraints and use "e" constraint instead.
|
||||||
|
(*subti3_1, *subti3_1 splitter): Ditto.
|
||||||
|
(*negti2_1, *negti2_1 splitter): Use nonimmediate_operand as
|
||||||
|
operand[1] predicate.
|
||||||
|
|
||||||
|
2007-05-21 Uros Bizjak <ubizjak@gmail.com>
|
||||||
|
|
||||||
|
PR target/30041
|
||||||
|
Backport from mainline.
|
||||||
|
* config/i386/sse.md ("*sse3_movddup"): Use operands[0] and
|
||||||
|
operands[1] in insn constraint. Correct type attribute to sselog1.
|
||||||
|
|
||||||
|
2007-05-20 Kaz Kojima <kkojima@gcc.gnu.org>
|
||||||
|
|
||||||
|
PR target/31701
|
||||||
|
Backport from mainline.
|
||||||
|
* config/sh/sh.c (output_stack_adjust): Avoid using the frame
|
||||||
|
register itself to hold the offset constant. Tell flow the use
|
||||||
|
of r4 and r5 when they are used.
|
||||||
|
|
||||||
|
2007-05-20 Kaz Kojima <kkojima@gcc.gnu.org>
|
||||||
|
|
||||||
|
PR target/31480
|
||||||
|
Backport from mainline.
|
||||||
|
* config/sh/sh.md (length): Check if prev_nonnote_insn (insn)
|
||||||
|
is null.
|
||||||
|
|
||||||
|
2007-05-20 Kaz Kojima <kkojima@gcc.gnu.org>
|
||||||
|
|
||||||
|
PR target/31022
|
||||||
|
Backport from mainline.
|
||||||
|
* config/sh/sh.c (sh_adjust_cost): Use the result of single_set
|
||||||
|
instead of PATTERN.
|
||||||
|
|
||||||
|
2007-05-20 Kaz Kojima <kkojima@gcc.gnu.org>
|
||||||
|
|
||||||
|
PR target/27405
|
||||||
|
Backport from mainline.
|
||||||
|
* config/sh/sh.md (cmp{eq,gt,gtu}{si,di}_media): Remove.
|
||||||
|
(cmpsi{eq,gt,gtu}{si,di}_media): Rename to
|
||||||
|
cmp{eq,gt,gtu}{si,di}_media.
|
||||||
|
(*cmpne0si_media): Remove.
|
||||||
|
(*movsicc_umin): Adjust gen_cmp*_media call.
|
||||||
|
(unordered): Change the mode of unordered and operands[1] to
|
||||||
|
SImode.
|
||||||
|
(seq): Adjust gen_cmp*_media calls. Make the mode of
|
||||||
|
a temporary result of compare SImode if needed. If the mode
|
||||||
|
of operands[0] is DImode, extend the temporary result to DImode.
|
||||||
|
(slt, sle, sgt, sge, sgtu, sltu, sleu, sgue, sne): Likewise.
|
||||||
|
(sunorderd): Change the mode of match_operand and unorderd to
|
||||||
|
SImode.
|
||||||
|
(cmpeq{sf,df}_media): Remove.
|
||||||
|
(cmpsieq{sf,df}_media): Rename to cmpeq{sf,df}_media.
|
||||||
|
(cmp{gt,ge,un}{sf,df}_media): Change the mode of match_operand
|
||||||
|
and compare operation to SImode.
|
||||||
|
|
||||||
|
2007-05-18 Joseph Myers <joseph@codesourcery.com>
|
||||||
|
|
||||||
|
* config/soft-fp/double.h, config/soft-fp/extended.h,
|
||||||
|
config/soft-fp/floatundidf.c, config/soft-fp/floatundisf.c,
|
||||||
|
config/soft-fp/floatunsidf.c, config/soft-fp/floatunsisf.c,
|
||||||
|
config/soft-fp/op-2.h, config/soft-fp/op-4.h,
|
||||||
|
config/soft-fp/op-common.h, config/soft-fp/quad.h: Update from
|
||||||
|
glibc CVS.
|
||||||
|
|
||||||
|
2007-05-17 Ian Lance Taylor <iant@google.com>
|
||||||
|
|
||||||
|
PR tree-optimization/31953
|
||||||
|
* tree-vrp.c (set_value_range_to_value): Add equiv parameter.
|
||||||
|
Change all callers.
|
||||||
|
(set_value_range_to_null): Call set_value_range_to_value.
|
||||||
|
(extract_range_from_comparison): Likewise.
|
||||||
|
|
||||||
|
2007-05-17 Eric Botcazou <ebotcazou@libertysurf.fr>
|
||||||
|
|
||||||
|
PR rtl-optimization/31691
|
||||||
|
* combine.c (simplify_set): Build a new src pattern instead of
|
||||||
|
substituting its operands in the COMPARE case.
|
||||||
|
|
||||||
|
2007-05-14 Mark Mitchell <mark@codesourcery.com>
|
||||||
|
|
||||||
|
* BASE-VER: Set to 4.2.1.
|
||||||
|
* DEV-PHASE: Set to prerelease.
|
||||||
|
|
||||||
2007-05-13 Release Manager
|
2007-05-13 Release Manager
|
||||||
|
|
||||||
* GCC 4.2.0 released.
|
* GCC 4.2.0 released.
|
||||||
@ -307,7 +745,8 @@
|
|||||||
2007-04-03 Stuart Hastings <stuart@apple.com>
|
2007-04-03 Stuart Hastings <stuart@apple.com>
|
||||||
|
|
||||||
PR 31281
|
PR 31281
|
||||||
* objc/objc-act.c (next_sjlj_build_catch_list): Delete volatile from rethrow decl.
|
* objc/objc-act.c (next_sjlj_build_catch_list): Delete volatile
|
||||||
|
from rethrow decl.
|
||||||
* cse.c (record_jump_equiv): Bail out on CCmode comparisons.
|
* cse.c (record_jump_equiv): Bail out on CCmode comparisons.
|
||||||
|
|
||||||
2007-04-03 Jakub Jelinek <jakub@redhat.com>
|
2007-04-03 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
@ -1 +1 @@
|
|||||||
20070514
|
20070719
|
||||||
|
@ -1839,7 +1839,7 @@ stor-layout.o : stor-layout.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
|
|||||||
tree-ssa-structalias.o: tree-ssa-structalias.c tree-ssa-structalias.h \
|
tree-ssa-structalias.o: tree-ssa-structalias.c tree-ssa-structalias.h \
|
||||||
$(SYSTEM_H) $(CONFIG_H) $(GGC_H) $(TREE_H) $(TREE_FLOW_H) \
|
$(SYSTEM_H) $(CONFIG_H) $(GGC_H) $(TREE_H) $(TREE_FLOW_H) \
|
||||||
$(TM_H) coretypes.h $(CGRAPH_H) tree-pass.h $(TIMEVAR_H) \
|
$(TM_H) coretypes.h $(CGRAPH_H) tree-pass.h $(TIMEVAR_H) \
|
||||||
gt-tree-ssa-structalias.h $(PARAMS_H)
|
gt-tree-ssa-structalias.h $(PARAMS_H) pointer-set.h
|
||||||
tree-ssa.o : tree-ssa.c $(TREE_FLOW_H) $(CONFIG_H) $(SYSTEM_H) \
|
tree-ssa.o : tree-ssa.c $(TREE_FLOW_H) $(CONFIG_H) $(SYSTEM_H) \
|
||||||
$(RTL_H) $(TREE_H) $(TM_P_H) $(EXPR_H) output.h $(DIAGNOSTIC_H) \
|
$(RTL_H) $(TREE_H) $(TM_P_H) $(EXPR_H) output.h $(DIAGNOSTIC_H) \
|
||||||
toplev.h $(FUNCTION_H) $(TIMEVAR_H) $(TM_H) coretypes.h \
|
toplev.h $(FUNCTION_H) $(TIMEVAR_H) $(TM_H) coretypes.h \
|
||||||
|
@ -1238,13 +1238,25 @@ precompute_arguments (int flags, int num_actuals, struct arg_data *args)
|
|||||||
|
|
||||||
/* If this is a libcall, then precompute all arguments so that we do not
|
/* If this is a libcall, then precompute all arguments so that we do not
|
||||||
get extraneous instructions emitted as part of the libcall sequence. */
|
get extraneous instructions emitted as part of the libcall sequence. */
|
||||||
if ((flags & ECF_LIBCALL_BLOCK) == 0)
|
|
||||||
|
/* If we preallocated the stack space, and some arguments must be passed
|
||||||
|
on the stack, then we must precompute any parameter which contains a
|
||||||
|
function call which will store arguments on the stack.
|
||||||
|
Otherwise, evaluating the parameter may clobber previous parameters
|
||||||
|
which have already been stored into the stack. (we have code to avoid
|
||||||
|
such case by saving the outgoing stack arguments, but it results in
|
||||||
|
worse code) */
|
||||||
|
if ((flags & ECF_LIBCALL_BLOCK) == 0 && !ACCUMULATE_OUTGOING_ARGS)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for (i = 0; i < num_actuals; i++)
|
for (i = 0; i < num_actuals; i++)
|
||||||
{
|
{
|
||||||
enum machine_mode mode;
|
enum machine_mode mode;
|
||||||
|
|
||||||
|
if ((flags & ECF_LIBCALL_BLOCK) == 0
|
||||||
|
&& TREE_CODE (args[i].tree_value) != CALL_EXPR)
|
||||||
|
continue;
|
||||||
|
|
||||||
/* If this is an addressable type, we cannot pre-evaluate it. */
|
/* If this is an addressable type, we cannot pre-evaluate it. */
|
||||||
gcc_assert (!TREE_ADDRESSABLE (TREE_TYPE (args[i].tree_value)));
|
gcc_assert (!TREE_ADDRESSABLE (TREE_TYPE (args[i].tree_value)));
|
||||||
|
|
||||||
|
@ -5341,14 +5341,14 @@ simplify_set (rtx x)
|
|||||||
}
|
}
|
||||||
else if (GET_MODE (op0) == compare_mode && op1 == const0_rtx)
|
else if (GET_MODE (op0) == compare_mode && op1 == const0_rtx)
|
||||||
{
|
{
|
||||||
SUBST(SET_SRC (x), op0);
|
SUBST (SET_SRC (x), op0);
|
||||||
src = SET_SRC (x);
|
src = SET_SRC (x);
|
||||||
}
|
}
|
||||||
else
|
/* Otherwise, update the COMPARE if needed. */
|
||||||
|
else if (XEXP (src, 0) != op0 || XEXP (src, 1) != op1)
|
||||||
{
|
{
|
||||||
/* Otherwise, update the COMPARE if needed. */
|
SUBST (SET_SRC (x), gen_rtx_COMPARE (compare_mode, op0, op1));
|
||||||
SUBST (XEXP (src, 0), op0);
|
src = SET_SRC (x);
|
||||||
SUBST (XEXP (src, 1), op1);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -10555,6 +10555,7 @@ arm_get_frame_offsets (void)
|
|||||||
if (leaf && frame_size == 0)
|
if (leaf && frame_size == 0)
|
||||||
{
|
{
|
||||||
offsets->outgoing_args = offsets->soft_frame;
|
offsets->outgoing_args = offsets->soft_frame;
|
||||||
|
offsets->locals_base = offsets->soft_frame;
|
||||||
return offsets;
|
return offsets;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -13874,6 +13875,7 @@ thumb_expand_epilogue (void)
|
|||||||
amount = offsets->locals_base - offsets->saved_regs;
|
amount = offsets->locals_base - offsets->saved_regs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gcc_assert (amount >= 0);
|
||||||
if (amount)
|
if (amount)
|
||||||
{
|
{
|
||||||
if (amount < 512)
|
if (amount < 512)
|
||||||
|
@ -404,28 +404,6 @@
|
|||||||
;; Cirrus SI values have been outlawed. Look in arm.h for the comment
|
;; Cirrus SI values have been outlawed. Look in arm.h for the comment
|
||||||
;; on HARD_REGNO_MODE_OK.
|
;; on HARD_REGNO_MODE_OK.
|
||||||
|
|
||||||
(define_insn "*cirrus_arm_movsi_insn"
|
|
||||||
[(set (match_operand:SI 0 "general_operand" "=r,r,r,m,*v,r,*v,T,*v")
|
|
||||||
(match_operand:SI 1 "general_operand" "rI,K,mi,r,r,*v,T,*v,*v"))]
|
|
||||||
"TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0
|
|
||||||
&& (register_operand (operands[0], SImode)
|
|
||||||
|| register_operand (operands[1], SImode))"
|
|
||||||
"@
|
|
||||||
mov%?\\t%0, %1
|
|
||||||
mvn%?\\t%0, #%B1
|
|
||||||
ldr%?\\t%0, %1
|
|
||||||
str%?\\t%1, %0
|
|
||||||
cfmv64lr%?\\t%Z0, %1
|
|
||||||
cfmvr64l%?\\t%0, %Z1
|
|
||||||
cfldr32%?\\t%V0, %1
|
|
||||||
cfstr32%?\\t%V1, %0
|
|
||||||
cfsh32%?\\t%V0, %V1, #0"
|
|
||||||
[(set_attr "type" "*, *, load1,store1, *, *, load1,store1, *")
|
|
||||||
(set_attr "pool_range" "*, *, 4096, *, *, *, 1024, *, *")
|
|
||||||
(set_attr "neg_pool_range" "*, *, 4084, *, *, *, 1012, *, *")
|
|
||||||
(set_attr "cirrus" "not,not, not, not,move,normal,normal,normal,normal")]
|
|
||||||
)
|
|
||||||
|
|
||||||
(define_insn "*cirrus_movsf_hard_insn"
|
(define_insn "*cirrus_movsf_hard_insn"
|
||||||
[(set (match_operand:SF 0 "nonimmediate_operand" "=v,v,v,r,m,r,r,m")
|
[(set (match_operand:SF 0 "nonimmediate_operand" "=v,v,v,r,m,r,r,m")
|
||||||
(match_operand:SF 1 "general_operand" "v,mE,r,v,v,r,mE,r"))]
|
(match_operand:SF 1 "general_operand" "v,mE,r,v,v,r,mE,r"))]
|
||||||
|
@ -13478,6 +13478,9 @@ assign_386_stack_local (enum machine_mode mode, enum ix86_stack_slot n)
|
|||||||
|
|
||||||
gcc_assert (n < MAX_386_STACK_LOCALS);
|
gcc_assert (n < MAX_386_STACK_LOCALS);
|
||||||
|
|
||||||
|
/* Virtual slot is valid only before vregs are instantiated. */
|
||||||
|
gcc_assert ((n == SLOT_VIRTUAL) == !virtuals_instantiated);
|
||||||
|
|
||||||
for (s = ix86_stack_locals; s; s = s->next)
|
for (s = ix86_stack_locals; s; s = s->next)
|
||||||
if (s->mode == mode && s->n == n)
|
if (s->mode == mode && s->n == n)
|
||||||
return s->rtl;
|
return s->rtl;
|
||||||
@ -14567,6 +14570,7 @@ enum ix86_builtins
|
|||||||
IX86_BUILTIN_VEC_EXT_V4SF,
|
IX86_BUILTIN_VEC_EXT_V4SF,
|
||||||
IX86_BUILTIN_VEC_EXT_V4SI,
|
IX86_BUILTIN_VEC_EXT_V4SI,
|
||||||
IX86_BUILTIN_VEC_EXT_V8HI,
|
IX86_BUILTIN_VEC_EXT_V8HI,
|
||||||
|
IX86_BUILTIN_VEC_EXT_V16QI,
|
||||||
IX86_BUILTIN_VEC_EXT_V2SI,
|
IX86_BUILTIN_VEC_EXT_V2SI,
|
||||||
IX86_BUILTIN_VEC_EXT_V4HI,
|
IX86_BUILTIN_VEC_EXT_V4HI,
|
||||||
IX86_BUILTIN_VEC_SET_V8HI,
|
IX86_BUILTIN_VEC_SET_V8HI,
|
||||||
@ -15539,13 +15543,13 @@ ix86_init_mmx_sse_builtins (void)
|
|||||||
/* Access to the vec_extract patterns. */
|
/* Access to the vec_extract patterns. */
|
||||||
ftype = build_function_type_list (double_type_node, V2DF_type_node,
|
ftype = build_function_type_list (double_type_node, V2DF_type_node,
|
||||||
integer_type_node, NULL_TREE);
|
integer_type_node, NULL_TREE);
|
||||||
def_builtin (MASK_SSE, "__builtin_ia32_vec_ext_v2df",
|
def_builtin (MASK_SSE2, "__builtin_ia32_vec_ext_v2df",
|
||||||
ftype, IX86_BUILTIN_VEC_EXT_V2DF);
|
ftype, IX86_BUILTIN_VEC_EXT_V2DF);
|
||||||
|
|
||||||
ftype = build_function_type_list (long_long_integer_type_node,
|
ftype = build_function_type_list (long_long_integer_type_node,
|
||||||
V2DI_type_node, integer_type_node,
|
V2DI_type_node, integer_type_node,
|
||||||
NULL_TREE);
|
NULL_TREE);
|
||||||
def_builtin (MASK_SSE, "__builtin_ia32_vec_ext_v2di",
|
def_builtin (MASK_SSE2, "__builtin_ia32_vec_ext_v2di",
|
||||||
ftype, IX86_BUILTIN_VEC_EXT_V2DI);
|
ftype, IX86_BUILTIN_VEC_EXT_V2DI);
|
||||||
|
|
||||||
ftype = build_function_type_list (float_type_node, V4SF_type_node,
|
ftype = build_function_type_list (float_type_node, V4SF_type_node,
|
||||||
@ -15555,12 +15559,12 @@ ix86_init_mmx_sse_builtins (void)
|
|||||||
|
|
||||||
ftype = build_function_type_list (intSI_type_node, V4SI_type_node,
|
ftype = build_function_type_list (intSI_type_node, V4SI_type_node,
|
||||||
integer_type_node, NULL_TREE);
|
integer_type_node, NULL_TREE);
|
||||||
def_builtin (MASK_SSE, "__builtin_ia32_vec_ext_v4si",
|
def_builtin (MASK_SSE2, "__builtin_ia32_vec_ext_v4si",
|
||||||
ftype, IX86_BUILTIN_VEC_EXT_V4SI);
|
ftype, IX86_BUILTIN_VEC_EXT_V4SI);
|
||||||
|
|
||||||
ftype = build_function_type_list (intHI_type_node, V8HI_type_node,
|
ftype = build_function_type_list (intHI_type_node, V8HI_type_node,
|
||||||
integer_type_node, NULL_TREE);
|
integer_type_node, NULL_TREE);
|
||||||
def_builtin (MASK_SSE, "__builtin_ia32_vec_ext_v8hi",
|
def_builtin (MASK_SSE2, "__builtin_ia32_vec_ext_v8hi",
|
||||||
ftype, IX86_BUILTIN_VEC_EXT_V8HI);
|
ftype, IX86_BUILTIN_VEC_EXT_V8HI);
|
||||||
|
|
||||||
ftype = build_function_type_list (intHI_type_node, V4HI_type_node,
|
ftype = build_function_type_list (intHI_type_node, V4HI_type_node,
|
||||||
@ -15573,11 +15577,15 @@ ix86_init_mmx_sse_builtins (void)
|
|||||||
def_builtin (MASK_MMX, "__builtin_ia32_vec_ext_v2si",
|
def_builtin (MASK_MMX, "__builtin_ia32_vec_ext_v2si",
|
||||||
ftype, IX86_BUILTIN_VEC_EXT_V2SI);
|
ftype, IX86_BUILTIN_VEC_EXT_V2SI);
|
||||||
|
|
||||||
|
ftype = build_function_type_list (intQI_type_node, V16QI_type_node,
|
||||||
|
integer_type_node, NULL_TREE);
|
||||||
|
def_builtin (MASK_SSE2, "__builtin_ia32_vec_ext_v16qi", ftype, IX86_BUILTIN_VEC_EXT_V16QI);
|
||||||
|
|
||||||
/* Access to the vec_set patterns. */
|
/* Access to the vec_set patterns. */
|
||||||
ftype = build_function_type_list (V8HI_type_node, V8HI_type_node,
|
ftype = build_function_type_list (V8HI_type_node, V8HI_type_node,
|
||||||
intHI_type_node,
|
intHI_type_node,
|
||||||
integer_type_node, NULL_TREE);
|
integer_type_node, NULL_TREE);
|
||||||
def_builtin (MASK_SSE, "__builtin_ia32_vec_set_v8hi",
|
def_builtin (MASK_SSE2, "__builtin_ia32_vec_set_v8hi",
|
||||||
ftype, IX86_BUILTIN_VEC_SET_V8HI);
|
ftype, IX86_BUILTIN_VEC_SET_V8HI);
|
||||||
|
|
||||||
ftype = build_function_type_list (V4HI_type_node, V4HI_type_node,
|
ftype = build_function_type_list (V4HI_type_node, V4HI_type_node,
|
||||||
@ -16121,13 +16129,13 @@ ix86_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
|
|||||||
|
|
||||||
case IX86_BUILTIN_LDMXCSR:
|
case IX86_BUILTIN_LDMXCSR:
|
||||||
op0 = expand_normal (TREE_VALUE (arglist));
|
op0 = expand_normal (TREE_VALUE (arglist));
|
||||||
target = assign_386_stack_local (SImode, SLOT_TEMP);
|
target = assign_386_stack_local (SImode, SLOT_VIRTUAL);
|
||||||
emit_move_insn (target, op0);
|
emit_move_insn (target, op0);
|
||||||
emit_insn (gen_sse_ldmxcsr (target));
|
emit_insn (gen_sse_ldmxcsr (target));
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
case IX86_BUILTIN_STMXCSR:
|
case IX86_BUILTIN_STMXCSR:
|
||||||
target = assign_386_stack_local (SImode, SLOT_TEMP);
|
target = assign_386_stack_local (SImode, SLOT_VIRTUAL);
|
||||||
emit_insn (gen_sse_stmxcsr (target));
|
emit_insn (gen_sse_stmxcsr (target));
|
||||||
return copy_to_mode_reg (SImode, target);
|
return copy_to_mode_reg (SImode, target);
|
||||||
|
|
||||||
@ -16489,6 +16497,7 @@ ix86_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
|
|||||||
case IX86_BUILTIN_VEC_EXT_V4SF:
|
case IX86_BUILTIN_VEC_EXT_V4SF:
|
||||||
case IX86_BUILTIN_VEC_EXT_V4SI:
|
case IX86_BUILTIN_VEC_EXT_V4SI:
|
||||||
case IX86_BUILTIN_VEC_EXT_V8HI:
|
case IX86_BUILTIN_VEC_EXT_V8HI:
|
||||||
|
case IX86_BUILTIN_VEC_EXT_V16QI:
|
||||||
case IX86_BUILTIN_VEC_EXT_V2SI:
|
case IX86_BUILTIN_VEC_EXT_V2SI:
|
||||||
case IX86_BUILTIN_VEC_EXT_V4HI:
|
case IX86_BUILTIN_VEC_EXT_V4HI:
|
||||||
return ix86_expand_vec_ext_builtin (arglist, target);
|
return ix86_expand_vec_ext_builtin (arglist, target);
|
||||||
|
@ -2164,7 +2164,8 @@ enum ix86_entity
|
|||||||
|
|
||||||
enum ix86_stack_slot
|
enum ix86_stack_slot
|
||||||
{
|
{
|
||||||
SLOT_TEMP = 0,
|
SLOT_VIRTUAL = 0,
|
||||||
|
SLOT_TEMP,
|
||||||
SLOT_CW_STORED,
|
SLOT_CW_STORED,
|
||||||
SLOT_CW_TRUNC,
|
SLOT_CW_TRUNC,
|
||||||
SLOT_CW_FLOOR,
|
SLOT_CW_FLOOR,
|
||||||
|
@ -3716,7 +3716,7 @@
|
|||||||
;
|
;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
rtx temp = assign_386_stack_local (SFmode, SLOT_TEMP);
|
rtx temp = assign_386_stack_local (SFmode, SLOT_VIRTUAL);
|
||||||
emit_insn (gen_truncdfsf2_with_temp (operands[0], operands[1], temp));
|
emit_insn (gen_truncdfsf2_with_temp (operands[0], operands[1], temp));
|
||||||
DONE;
|
DONE;
|
||||||
}
|
}
|
||||||
@ -3868,7 +3868,7 @@
|
|||||||
DONE;
|
DONE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
operands[2] = assign_386_stack_local (SFmode, SLOT_TEMP);
|
operands[2] = assign_386_stack_local (SFmode, SLOT_VIRTUAL);
|
||||||
})
|
})
|
||||||
|
|
||||||
(define_insn "*truncxfsf2_mixed"
|
(define_insn "*truncxfsf2_mixed"
|
||||||
@ -3966,7 +3966,7 @@
|
|||||||
DONE;
|
DONE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
operands[2] = assign_386_stack_local (DFmode, SLOT_TEMP);
|
operands[2] = assign_386_stack_local (DFmode, SLOT_VIRTUAL);
|
||||||
})
|
})
|
||||||
|
|
||||||
(define_insn "*truncxfdf2_mixed"
|
(define_insn "*truncxfdf2_mixed"
|
||||||
@ -4749,7 +4749,7 @@
|
|||||||
(define_insn "*addti3_1"
|
(define_insn "*addti3_1"
|
||||||
[(set (match_operand:TI 0 "nonimmediate_operand" "=r,o")
|
[(set (match_operand:TI 0 "nonimmediate_operand" "=r,o")
|
||||||
(plus:TI (match_operand:TI 1 "nonimmediate_operand" "%0,0")
|
(plus:TI (match_operand:TI 1 "nonimmediate_operand" "%0,0")
|
||||||
(match_operand:TI 2 "general_operand" "roiF,riF")))
|
(match_operand:TI 2 "x86_64_general_operand" "roe,re")))
|
||||||
(clobber (reg:CC FLAGS_REG))]
|
(clobber (reg:CC FLAGS_REG))]
|
||||||
"TARGET_64BIT && ix86_binary_operator_ok (PLUS, TImode, operands)"
|
"TARGET_64BIT && ix86_binary_operator_ok (PLUS, TImode, operands)"
|
||||||
"#")
|
"#")
|
||||||
@ -4757,7 +4757,7 @@
|
|||||||
(define_split
|
(define_split
|
||||||
[(set (match_operand:TI 0 "nonimmediate_operand" "")
|
[(set (match_operand:TI 0 "nonimmediate_operand" "")
|
||||||
(plus:TI (match_operand:TI 1 "nonimmediate_operand" "")
|
(plus:TI (match_operand:TI 1 "nonimmediate_operand" "")
|
||||||
(match_operand:TI 2 "general_operand" "")))
|
(match_operand:TI 2 "x86_64_general_operand" "")))
|
||||||
(clobber (reg:CC FLAGS_REG))]
|
(clobber (reg:CC FLAGS_REG))]
|
||||||
"TARGET_64BIT && reload_completed"
|
"TARGET_64BIT && reload_completed"
|
||||||
[(parallel [(set (reg:CC FLAGS_REG) (unspec:CC [(match_dup 1) (match_dup 2)]
|
[(parallel [(set (reg:CC FLAGS_REG) (unspec:CC [(match_dup 1) (match_dup 2)]
|
||||||
@ -6483,7 +6483,7 @@
|
|||||||
(define_insn "*subti3_1"
|
(define_insn "*subti3_1"
|
||||||
[(set (match_operand:TI 0 "nonimmediate_operand" "=r,o")
|
[(set (match_operand:TI 0 "nonimmediate_operand" "=r,o")
|
||||||
(minus:TI (match_operand:TI 1 "nonimmediate_operand" "0,0")
|
(minus:TI (match_operand:TI 1 "nonimmediate_operand" "0,0")
|
||||||
(match_operand:TI 2 "general_operand" "roiF,riF")))
|
(match_operand:TI 2 "x86_64_general_operand" "roe,re")))
|
||||||
(clobber (reg:CC FLAGS_REG))]
|
(clobber (reg:CC FLAGS_REG))]
|
||||||
"TARGET_64BIT && ix86_binary_operator_ok (MINUS, TImode, operands)"
|
"TARGET_64BIT && ix86_binary_operator_ok (MINUS, TImode, operands)"
|
||||||
"#")
|
"#")
|
||||||
@ -6491,7 +6491,7 @@
|
|||||||
(define_split
|
(define_split
|
||||||
[(set (match_operand:TI 0 "nonimmediate_operand" "")
|
[(set (match_operand:TI 0 "nonimmediate_operand" "")
|
||||||
(minus:TI (match_operand:TI 1 "nonimmediate_operand" "")
|
(minus:TI (match_operand:TI 1 "nonimmediate_operand" "")
|
||||||
(match_operand:TI 2 "general_operand" "")))
|
(match_operand:TI 2 "x86_64_general_operand" "")))
|
||||||
(clobber (reg:CC FLAGS_REG))]
|
(clobber (reg:CC FLAGS_REG))]
|
||||||
"TARGET_64BIT && reload_completed"
|
"TARGET_64BIT && reload_completed"
|
||||||
[(parallel [(set (reg:CC FLAGS_REG) (compare:CC (match_dup 1) (match_dup 2)))
|
[(parallel [(set (reg:CC FLAGS_REG) (compare:CC (match_dup 1) (match_dup 2)))
|
||||||
@ -9326,7 +9326,7 @@
|
|||||||
|
|
||||||
(define_insn "*negti2_1"
|
(define_insn "*negti2_1"
|
||||||
[(set (match_operand:TI 0 "nonimmediate_operand" "=ro")
|
[(set (match_operand:TI 0 "nonimmediate_operand" "=ro")
|
||||||
(neg:TI (match_operand:TI 1 "general_operand" "0")))
|
(neg:TI (match_operand:TI 1 "nonimmediate_operand" "0")))
|
||||||
(clobber (reg:CC FLAGS_REG))]
|
(clobber (reg:CC FLAGS_REG))]
|
||||||
"TARGET_64BIT
|
"TARGET_64BIT
|
||||||
&& ix86_unary_operator_ok (NEG, TImode, operands)"
|
&& ix86_unary_operator_ok (NEG, TImode, operands)"
|
||||||
@ -9334,7 +9334,7 @@
|
|||||||
|
|
||||||
(define_split
|
(define_split
|
||||||
[(set (match_operand:TI 0 "nonimmediate_operand" "")
|
[(set (match_operand:TI 0 "nonimmediate_operand" "")
|
||||||
(neg:TI (match_operand:TI 1 "general_operand" "")))
|
(neg:TI (match_operand:TI 1 "nonimmediate_operand" "")))
|
||||||
(clobber (reg:CC FLAGS_REG))]
|
(clobber (reg:CC FLAGS_REG))]
|
||||||
"TARGET_64BIT && reload_completed"
|
"TARGET_64BIT && reload_completed"
|
||||||
[(parallel
|
[(parallel
|
||||||
|
@ -2055,11 +2055,11 @@
|
|||||||
(match_dup 1))
|
(match_dup 1))
|
||||||
(parallel [(const_int 0)
|
(parallel [(const_int 0)
|
||||||
(const_int 2)])))]
|
(const_int 2)])))]
|
||||||
"TARGET_SSE3 && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
|
"TARGET_SSE3 && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
|
||||||
"@
|
"@
|
||||||
movddup\t{%1, %0|%0, %1}
|
movddup\t{%1, %0|%0, %1}
|
||||||
#"
|
#"
|
||||||
[(set_attr "type" "sselog,ssemov")
|
[(set_attr "type" "sselog1,ssemov")
|
||||||
(set_attr "mode" "V2DF")])
|
(set_attr "mode" "V2DF")])
|
||||||
|
|
||||||
(define_split
|
(define_split
|
||||||
@ -3494,9 +3494,10 @@
|
|||||||
"TARGET_SSE2 && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
|
"TARGET_SSE2 && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
|
||||||
"@
|
"@
|
||||||
movhps\t{%1, %0|%0, %1}
|
movhps\t{%1, %0|%0, %1}
|
||||||
psrldq\t{$4, %0|%0, 4}
|
psrldq\t{$8, %0|%0, 8}
|
||||||
movq\t{%H1, %0|%0, %H1}"
|
movq\t{%H1, %0|%0, %H1}"
|
||||||
[(set_attr "type" "ssemov,sseishft,ssemov")
|
[(set_attr "type" "ssemov,sseishft,ssemov")
|
||||||
|
(set_attr "memory" "*,none,*")
|
||||||
(set_attr "mode" "V2SF,TI,TI")])
|
(set_attr "mode" "V2SF,TI,TI")])
|
||||||
|
|
||||||
;; Not sure this is ever used, but it doesn't hurt to have it. -aoliva
|
;; Not sure this is ever used, but it doesn't hurt to have it. -aoliva
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* Definitions of target machine for GNU compiler. IRIX version 6.
|
/* Definitions of target machine for GNU compiler. IRIX version 6.
|
||||||
Copyright (C) 1994, 1995, 1996, 1997, 1998, 2000, 2001, 2002, 2003, 2004,
|
Copyright (C) 1994, 1995, 1996, 1997, 1998, 2000, 2001, 2002, 2003, 2004,
|
||||||
2005, 2006
|
2005, 2006, 2007
|
||||||
Free Software Foundation, Inc.
|
Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GCC.
|
This file is part of GCC.
|
||||||
@ -96,10 +96,11 @@ Boston, MA 02110-1301, USA. */
|
|||||||
" %{pthread:-lpthread} %{p:libprof1.a%s}%{pg:libprof1.a%s} -lc " \
|
" %{pthread:-lpthread} %{p:libprof1.a%s}%{pg:libprof1.a%s} -lc " \
|
||||||
SUBTARGET_WARN_UNUSED_SPEC "}"
|
SUBTARGET_WARN_UNUSED_SPEC "}"
|
||||||
|
|
||||||
/* Avoid getting two warnings for libgcc.a everytime we link. */
|
/* Avoid getting two warnings for libgcc.a everytime we link. libgcc.a
|
||||||
|
contains references to copysignl, so link with libm to resolve them. */
|
||||||
#undef LIBGCC_SPEC
|
#undef LIBGCC_SPEC
|
||||||
#define LIBGCC_SPEC \
|
#define LIBGCC_SPEC \
|
||||||
SUBTARGET_DONT_WARN_UNUSED_SPEC " -lgcc " SUBTARGET_WARN_UNUSED_SPEC
|
SUBTARGET_DONT_WARN_UNUSED_SPEC " -lgcc -lm " SUBTARGET_WARN_UNUSED_SPEC
|
||||||
|
|
||||||
#undef ENDFILE_SPEC
|
#undef ENDFILE_SPEC
|
||||||
#define ENDFILE_SPEC \
|
#define ENDFILE_SPEC \
|
||||||
|
@ -694,7 +694,9 @@
|
|||||||
(define_predicate "current_file_function_operand"
|
(define_predicate "current_file_function_operand"
|
||||||
(and (match_code "symbol_ref")
|
(and (match_code "symbol_ref")
|
||||||
(match_test "(DEFAULT_ABI != ABI_AIX || SYMBOL_REF_FUNCTION_P (op))
|
(match_test "(DEFAULT_ABI != ABI_AIX || SYMBOL_REF_FUNCTION_P (op))
|
||||||
&& (SYMBOL_REF_LOCAL_P (op)
|
&& ((SYMBOL_REF_LOCAL_P (op)
|
||||||
|
&& (DEFAULT_ABI != ABI_AIX
|
||||||
|
|| !SYMBOL_REF_EXTERNAL_P (op)))
|
||||||
|| (op == XEXP (DECL_RTL (current_function_decl),
|
|| (op == XEXP (DECL_RTL (current_function_decl),
|
||||||
0)))")))
|
0)))")))
|
||||||
|
|
||||||
|
@ -13515,7 +13515,8 @@ rs6000_function_ok_for_sibcall (tree decl, tree exp ATTRIBUTE_UNUSED)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (DEFAULT_ABI == ABI_DARWIN
|
if (DEFAULT_ABI == ABI_DARWIN
|
||||||
|| (*targetm.binds_local_p) (decl))
|
|| ((*targetm.binds_local_p) (decl)
|
||||||
|
&& (DEFAULT_ABI != ABI_AIX || !DECL_EXTERNAL (decl))))
|
||||||
{
|
{
|
||||||
tree attr_list = TYPE_ATTRIBUTES (TREE_TYPE (decl));
|
tree attr_list = TYPE_ATTRIBUTES (TREE_TYPE (decl));
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* Software floating-point emulation.
|
/* Software floating-point emulation.
|
||||||
Definitions for IEEE Double Precision
|
Definitions for IEEE Double Precision
|
||||||
Copyright (C) 1997,1998,1999,2006 Free Software Foundation, Inc.
|
Copyright (C) 1997,1998,1999,2006,2007 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Richard Henderson (rth@cygnus.com),
|
Contributed by Richard Henderson (rth@cygnus.com),
|
||||||
Jakub Jelinek (jj@ultra.linux.cz),
|
Jakub Jelinek (jj@ultra.linux.cz),
|
||||||
@ -168,13 +168,13 @@ union _FP_UNION_D
|
|||||||
DFtype flt;
|
DFtype flt;
|
||||||
struct {
|
struct {
|
||||||
#if __BYTE_ORDER == __BIG_ENDIAN
|
#if __BYTE_ORDER == __BIG_ENDIAN
|
||||||
unsigned sign : 1;
|
unsigned sign : 1;
|
||||||
unsigned exp : _FP_EXPBITS_D;
|
unsigned exp : _FP_EXPBITS_D;
|
||||||
unsigned long frac : _FP_FRACBITS_D - (_FP_IMPLBIT_D != 0);
|
_FP_W_TYPE frac : _FP_FRACBITS_D - (_FP_IMPLBIT_D != 0);
|
||||||
#else
|
#else
|
||||||
unsigned long frac : _FP_FRACBITS_D - (_FP_IMPLBIT_D != 0);
|
_FP_W_TYPE frac : _FP_FRACBITS_D - (_FP_IMPLBIT_D != 0);
|
||||||
unsigned exp : _FP_EXPBITS_D;
|
unsigned exp : _FP_EXPBITS_D;
|
||||||
unsigned sign : 1;
|
unsigned sign : 1;
|
||||||
#endif
|
#endif
|
||||||
} bits __attribute__((packed));
|
} bits __attribute__((packed));
|
||||||
};
|
};
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* Software floating-point emulation.
|
/* Software floating-point emulation.
|
||||||
Definitions for IEEE Extended Precision.
|
Definitions for IEEE Extended Precision.
|
||||||
Copyright (C) 1999,2006 Free Software Foundation, Inc.
|
Copyright (C) 1999,2006,2007 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Jakub Jelinek (jj@ultra.linux.cz).
|
Contributed by Jakub Jelinek (jj@ultra.linux.cz).
|
||||||
|
|
||||||
@ -94,12 +94,6 @@ union _FP_UNION_E
|
|||||||
X##_f[1] = _flo.bits.frac1; \
|
X##_f[1] = _flo.bits.frac1; \
|
||||||
X##_e = _flo.bits.exp; \
|
X##_e = _flo.bits.exp; \
|
||||||
X##_s = _flo.bits.sign; \
|
X##_s = _flo.bits.sign; \
|
||||||
if (!X##_e && (X##_f[1] || X##_f[0]) \
|
|
||||||
&& !(X##_f[1] & _FP_IMPLBIT_E)) \
|
|
||||||
{ \
|
|
||||||
X##_e++; \
|
|
||||||
FP_SET_EXCEPTION(FP_EX_DENORM); \
|
|
||||||
} \
|
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define FP_UNPACK_RAW_EP(X, val) \
|
#define FP_UNPACK_RAW_EP(X, val) \
|
||||||
@ -112,12 +106,6 @@ union _FP_UNION_E
|
|||||||
X##_f[1] = _flo->bits.frac1; \
|
X##_f[1] = _flo->bits.frac1; \
|
||||||
X##_e = _flo->bits.exp; \
|
X##_e = _flo->bits.exp; \
|
||||||
X##_s = _flo->bits.sign; \
|
X##_s = _flo->bits.sign; \
|
||||||
if (!X##_e && (X##_f[1] || X##_f[0]) \
|
|
||||||
&& !(X##_f[1] & _FP_IMPLBIT_E)) \
|
|
||||||
{ \
|
|
||||||
X##_e++; \
|
|
||||||
FP_SET_EXCEPTION(FP_EX_DENORM); \
|
|
||||||
} \
|
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define FP_PACK_RAW_E(val, X) \
|
#define FP_PACK_RAW_E(val, X) \
|
||||||
@ -164,13 +152,13 @@ union _FP_UNION_E
|
|||||||
|
|
||||||
#define FP_UNPACK_SEMIRAW_E(X,val) \
|
#define FP_UNPACK_SEMIRAW_E(X,val) \
|
||||||
do { \
|
do { \
|
||||||
_FP_UNPACK_RAW_E(X,val); \
|
FP_UNPACK_RAW_E(X,val); \
|
||||||
_FP_UNPACK_SEMIRAW(E,4,X); \
|
_FP_UNPACK_SEMIRAW(E,4,X); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define FP_UNPACK_SEMIRAW_EP(X,val) \
|
#define FP_UNPACK_SEMIRAW_EP(X,val) \
|
||||||
do { \
|
do { \
|
||||||
_FP_UNPACK_RAW_EP(X,val); \
|
FP_UNPACK_RAW_EP(X,val); \
|
||||||
_FP_UNPACK_SEMIRAW(E,4,X); \
|
_FP_UNPACK_SEMIRAW(E,4,X); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
@ -189,13 +177,13 @@ union _FP_UNION_E
|
|||||||
#define FP_PACK_SEMIRAW_E(val,X) \
|
#define FP_PACK_SEMIRAW_E(val,X) \
|
||||||
do { \
|
do { \
|
||||||
_FP_PACK_SEMIRAW(E,4,X); \
|
_FP_PACK_SEMIRAW(E,4,X); \
|
||||||
_FP_PACK_RAW_E(val,X); \
|
FP_PACK_RAW_E(val,X); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define FP_PACK_SEMIRAW_EP(val,X) \
|
#define FP_PACK_SEMIRAW_EP(val,X) \
|
||||||
do { \
|
do { \
|
||||||
_FP_PACK_SEMIRAW(E,4,X); \
|
_FP_PACK_SEMIRAW(E,4,X); \
|
||||||
_FP_PACK_RAW_EP(val,X); \
|
FP_PACK_RAW_EP(val,X); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define FP_ISSIGNAN_E(X) _FP_ISSIGNAN(E,4,X)
|
#define FP_ISSIGNAN_E(X) _FP_ISSIGNAN(E,4,X)
|
||||||
@ -277,14 +265,14 @@ union _FP_UNION_E
|
|||||||
XFtype flt;
|
XFtype flt;
|
||||||
struct {
|
struct {
|
||||||
#if __BYTE_ORDER == __BIG_ENDIAN
|
#if __BYTE_ORDER == __BIG_ENDIAN
|
||||||
unsigned long pad : (_FP_W_TYPE_SIZE - 1 - _FP_EXPBITS_E);
|
_FP_W_TYPE pad : (_FP_W_TYPE_SIZE - 1 - _FP_EXPBITS_E);
|
||||||
unsigned sign : 1;
|
unsigned sign : 1;
|
||||||
unsigned exp : _FP_EXPBITS_E;
|
unsigned exp : _FP_EXPBITS_E;
|
||||||
unsigned long frac : _FP_W_TYPE_SIZE;
|
_FP_W_TYPE frac : _FP_W_TYPE_SIZE;
|
||||||
#else
|
#else
|
||||||
unsigned long frac : _FP_W_TYPE_SIZE;
|
_FP_W_TYPE frac : _FP_W_TYPE_SIZE;
|
||||||
unsigned exp : _FP_EXPBITS_E;
|
unsigned exp : _FP_EXPBITS_E;
|
||||||
unsigned sign : 1;
|
unsigned sign : 1;
|
||||||
#endif
|
#endif
|
||||||
} bits;
|
} bits;
|
||||||
};
|
};
|
||||||
@ -299,11 +287,6 @@ union _FP_UNION_E
|
|||||||
X##_f1 = 0; \
|
X##_f1 = 0; \
|
||||||
X##_e = _flo.bits.exp; \
|
X##_e = _flo.bits.exp; \
|
||||||
X##_s = _flo.bits.sign; \
|
X##_s = _flo.bits.sign; \
|
||||||
if (!X##_e && X##_f0 && !(X##_f0 & _FP_IMPLBIT_E)) \
|
|
||||||
{ \
|
|
||||||
X##_e++; \
|
|
||||||
FP_SET_EXCEPTION(FP_EX_DENORM); \
|
|
||||||
} \
|
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define FP_UNPACK_RAW_EP(X, val) \
|
#define FP_UNPACK_RAW_EP(X, val) \
|
||||||
@ -315,11 +298,6 @@ union _FP_UNION_E
|
|||||||
X##_f1 = 0; \
|
X##_f1 = 0; \
|
||||||
X##_e = _flo->bits.exp; \
|
X##_e = _flo->bits.exp; \
|
||||||
X##_s = _flo->bits.sign; \
|
X##_s = _flo->bits.sign; \
|
||||||
if (!X##_e && X##_f0 && !(X##_f0 & _FP_IMPLBIT_E)) \
|
|
||||||
{ \
|
|
||||||
X##_e++; \
|
|
||||||
FP_SET_EXCEPTION(FP_EX_DENORM); \
|
|
||||||
} \
|
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define FP_PACK_RAW_E(val, X) \
|
#define FP_PACK_RAW_E(val, X) \
|
||||||
@ -365,13 +343,13 @@ union _FP_UNION_E
|
|||||||
|
|
||||||
#define FP_UNPACK_SEMIRAW_E(X,val) \
|
#define FP_UNPACK_SEMIRAW_E(X,val) \
|
||||||
do { \
|
do { \
|
||||||
_FP_UNPACK_RAW_E(X,val); \
|
FP_UNPACK_RAW_E(X,val); \
|
||||||
_FP_UNPACK_SEMIRAW(E,2,X); \
|
_FP_UNPACK_SEMIRAW(E,2,X); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define FP_UNPACK_SEMIRAW_EP(X,val) \
|
#define FP_UNPACK_SEMIRAW_EP(X,val) \
|
||||||
do { \
|
do { \
|
||||||
_FP_UNPACK_RAW_EP(X,val); \
|
FP_UNPACK_RAW_EP(X,val); \
|
||||||
_FP_UNPACK_SEMIRAW(E,2,X); \
|
_FP_UNPACK_SEMIRAW(E,2,X); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
@ -390,13 +368,13 @@ union _FP_UNION_E
|
|||||||
#define FP_PACK_SEMIRAW_E(val,X) \
|
#define FP_PACK_SEMIRAW_E(val,X) \
|
||||||
do { \
|
do { \
|
||||||
_FP_PACK_SEMIRAW(E,2,X); \
|
_FP_PACK_SEMIRAW(E,2,X); \
|
||||||
_FP_PACK_RAW_E(val,X); \
|
FP_PACK_RAW_E(val,X); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define FP_PACK_SEMIRAW_EP(val,X) \
|
#define FP_PACK_SEMIRAW_EP(val,X) \
|
||||||
do { \
|
do { \
|
||||||
_FP_PACK_SEMIRAW(E,2,X); \
|
_FP_PACK_SEMIRAW(E,2,X); \
|
||||||
_FP_PACK_RAW_EP(val,X); \
|
FP_PACK_RAW_EP(val,X); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define FP_ISSIGNAN_E(X) _FP_ISSIGNAN(E,2,X)
|
#define FP_ISSIGNAN_E(X) _FP_ISSIGNAN(E,2,X)
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* Software floating-point emulation.
|
/* Software floating-point emulation.
|
||||||
Convert a 64bit unsigned integer to IEEE double
|
Convert a 64bit unsigned integer to IEEE double
|
||||||
Copyright (C) 1997,1999, 2006 Free Software Foundation, Inc.
|
Copyright (C) 1997, 1999, 2006, 2007 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Richard Henderson (rth@cygnus.com) and
|
Contributed by Richard Henderson (rth@cygnus.com) and
|
||||||
Jakub Jelinek (jj@ultra.linux.cz).
|
Jakub Jelinek (jj@ultra.linux.cz).
|
||||||
@ -32,8 +32,7 @@
|
|||||||
#include "soft-fp.h"
|
#include "soft-fp.h"
|
||||||
#include "double.h"
|
#include "double.h"
|
||||||
|
|
||||||
double
|
DFtype __floatundidf(UDItype i)
|
||||||
__floatundidf(UDItype i)
|
|
||||||
{
|
{
|
||||||
FP_DECL_EX;
|
FP_DECL_EX;
|
||||||
FP_DECL_D(A);
|
FP_DECL_D(A);
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* Software floating-point emulation.
|
/* Software floating-point emulation.
|
||||||
Convert a 64bit unsigned integer to IEEE single
|
Convert a 64bit unsigned integer to IEEE single
|
||||||
Copyright (C) 1997,1999, 2006 Free Software Foundation, Inc.
|
Copyright (C) 1997, 1999, 2006, 2007 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Richard Henderson (rth@cygnus.com) and
|
Contributed by Richard Henderson (rth@cygnus.com) and
|
||||||
Jakub Jelinek (jj@ultra.linux.cz).
|
Jakub Jelinek (jj@ultra.linux.cz).
|
||||||
@ -32,8 +32,7 @@
|
|||||||
#include "soft-fp.h"
|
#include "soft-fp.h"
|
||||||
#include "single.h"
|
#include "single.h"
|
||||||
|
|
||||||
float
|
SFtype __floatundisf(UDItype i)
|
||||||
__floatundisf(UDItype i)
|
|
||||||
{
|
{
|
||||||
FP_DECL_EX;
|
FP_DECL_EX;
|
||||||
FP_DECL_S(A);
|
FP_DECL_S(A);
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* Software floating-point emulation.
|
/* Software floating-point emulation.
|
||||||
Convert a 32bit unsigned integer to IEEE double
|
Convert a 32bit unsigned integer to IEEE double
|
||||||
Copyright (C) 1997,1999, 2006 Free Software Foundation, Inc.
|
Copyright (C) 1997, 1999, 2006, 2007 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Richard Henderson (rth@cygnus.com) and
|
Contributed by Richard Henderson (rth@cygnus.com) and
|
||||||
Jakub Jelinek (jj@ultra.linux.cz).
|
Jakub Jelinek (jj@ultra.linux.cz).
|
||||||
@ -32,8 +32,7 @@
|
|||||||
#include "soft-fp.h"
|
#include "soft-fp.h"
|
||||||
#include "double.h"
|
#include "double.h"
|
||||||
|
|
||||||
double
|
DFtype __floatunsidf(USItype i)
|
||||||
__floatunsidf(USItype i)
|
|
||||||
{
|
{
|
||||||
FP_DECL_EX;
|
FP_DECL_EX;
|
||||||
FP_DECL_D(A);
|
FP_DECL_D(A);
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* Software floating-point emulation.
|
/* Software floating-point emulation.
|
||||||
Convert a 32bit unsigned integer to IEEE single
|
Convert a 32bit unsigned integer to IEEE single
|
||||||
Copyright (C) 1997,1999, 2006 Free Software Foundation, Inc.
|
Copyright (C) 1997, 1999, 2006, 2007 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Richard Henderson (rth@cygnus.com) and
|
Contributed by Richard Henderson (rth@cygnus.com) and
|
||||||
Jakub Jelinek (jj@ultra.linux.cz).
|
Jakub Jelinek (jj@ultra.linux.cz).
|
||||||
@ -32,8 +32,7 @@
|
|||||||
#include "soft-fp.h"
|
#include "soft-fp.h"
|
||||||
#include "single.h"
|
#include "single.h"
|
||||||
|
|
||||||
float
|
SFtype __floatunsisf(USItype i)
|
||||||
__floatunsisf(USItype i)
|
|
||||||
{
|
{
|
||||||
FP_DECL_EX;
|
FP_DECL_EX;
|
||||||
FP_DECL_S(A);
|
FP_DECL_S(A);
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* Software floating-point emulation.
|
/* Software floating-point emulation.
|
||||||
Basic two-word fraction declaration and manipulation.
|
Basic two-word fraction declaration and manipulation.
|
||||||
Copyright (C) 1997,1998,1999,2006 Free Software Foundation, Inc.
|
Copyright (C) 1997,1998,1999,2006,2007 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Richard Henderson (rth@cygnus.com),
|
Contributed by Richard Henderson (rth@cygnus.com),
|
||||||
Jakub Jelinek (jj@ultra.linux.cz),
|
Jakub Jelinek (jj@ultra.linux.cz),
|
||||||
@ -613,3 +613,5 @@
|
|||||||
#define _FP_FRAC_COPY_1_2(D, S) (D##_f = S##_f0)
|
#define _FP_FRAC_COPY_1_2(D, S) (D##_f = S##_f0)
|
||||||
|
|
||||||
#define _FP_FRAC_COPY_2_1(D, S) ((D##_f0 = S##_f), (D##_f1 = 0))
|
#define _FP_FRAC_COPY_2_1(D, S) ((D##_f0 = S##_f), (D##_f1 = 0))
|
||||||
|
|
||||||
|
#define _FP_FRAC_COPY_2_2(D,S) _FP_FRAC_COPY_2(D,S)
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* Software floating-point emulation.
|
/* Software floating-point emulation.
|
||||||
Basic four-word fraction declaration and manipulation.
|
Basic four-word fraction declaration and manipulation.
|
||||||
Copyright (C) 1997,1998,1999,2006 Free Software Foundation, Inc.
|
Copyright (C) 1997,1998,1999,2006,2007 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Richard Henderson (rth@cygnus.com),
|
Contributed by Richard Henderson (rth@cygnus.com),
|
||||||
Jakub Jelinek (jj@ultra.linux.cz),
|
Jakub Jelinek (jj@ultra.linux.cz),
|
||||||
@ -684,3 +684,5 @@ do { \
|
|||||||
D##_f[1] = S##_f1; \
|
D##_f[1] = S##_f1; \
|
||||||
D##_f[2] = D##_f[3] = 0; \
|
D##_f[2] = D##_f[3] = 0; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
#define _FP_FRAC_COPY_4_4(D,S) _FP_FRAC_COPY_4(D,S)
|
||||||
|
@ -1153,7 +1153,8 @@ do { \
|
|||||||
if (_FP_FRACBITS_##dfs < _FP_FRACBITS_##sfs \
|
if (_FP_FRACBITS_##dfs < _FP_FRACBITS_##sfs \
|
||||||
|| (_FP_EXPMAX_##dfs - _FP_EXPBIAS_##dfs \
|
|| (_FP_EXPMAX_##dfs - _FP_EXPBIAS_##dfs \
|
||||||
< _FP_EXPMAX_##sfs - _FP_EXPBIAS_##sfs) \
|
< _FP_EXPMAX_##sfs - _FP_EXPBIAS_##sfs) \
|
||||||
|| _FP_EXPBIAS_##dfs < _FP_EXPBIAS_##sfs + _FP_FRACBITS_##sfs - 1) \
|
|| (_FP_EXPBIAS_##dfs < _FP_EXPBIAS_##sfs + _FP_FRACBITS_##sfs - 1 \
|
||||||
|
&& _FP_EXPBIAS_##dfs != _FP_EXPBIAS_##sfs)) \
|
||||||
abort(); \
|
abort(); \
|
||||||
D##_s = S##_s; \
|
D##_s = S##_s; \
|
||||||
_FP_FRAC_COPY_##dwc##_##swc(D, S); \
|
_FP_FRAC_COPY_##dwc##_##swc(D, S); \
|
||||||
@ -1168,6 +1169,14 @@ do { \
|
|||||||
{ \
|
{ \
|
||||||
if (_FP_FRAC_ZEROP_##swc(S)) \
|
if (_FP_FRAC_ZEROP_##swc(S)) \
|
||||||
D##_e = 0; \
|
D##_e = 0; \
|
||||||
|
else if (_FP_EXPBIAS_##dfs \
|
||||||
|
< _FP_EXPBIAS_##sfs + _FP_FRACBITS_##sfs - 1) \
|
||||||
|
{ \
|
||||||
|
FP_SET_EXCEPTION(FP_EX_DENORM); \
|
||||||
|
_FP_FRAC_SLL_##dwc(D, (_FP_FRACBITS_##dfs \
|
||||||
|
- _FP_FRACBITS_##sfs)); \
|
||||||
|
D##_e = 0; \
|
||||||
|
} \
|
||||||
else \
|
else \
|
||||||
{ \
|
{ \
|
||||||
int _lz; \
|
int _lz; \
|
||||||
@ -1199,7 +1208,8 @@ do { \
|
|||||||
#define FP_TRUNC(dfs,sfs,dwc,swc,D,S) \
|
#define FP_TRUNC(dfs,sfs,dwc,swc,D,S) \
|
||||||
do { \
|
do { \
|
||||||
if (_FP_FRACBITS_##sfs < _FP_FRACBITS_##dfs \
|
if (_FP_FRACBITS_##sfs < _FP_FRACBITS_##dfs \
|
||||||
|| _FP_EXPBIAS_##sfs < _FP_EXPBIAS_##dfs + _FP_FRACBITS_##dfs - 1) \
|
|| (_FP_EXPBIAS_##sfs < _FP_EXPBIAS_##dfs + _FP_FRACBITS_##dfs - 1 \
|
||||||
|
&& _FP_EXPBIAS_##sfs != _FP_EXPBIAS_##dfs)) \
|
||||||
abort(); \
|
abort(); \
|
||||||
D##_s = S##_s; \
|
D##_s = S##_s; \
|
||||||
if (_FP_EXP_NORMAL(sfs, swc, S)) \
|
if (_FP_EXP_NORMAL(sfs, swc, S)) \
|
||||||
@ -1211,8 +1221,11 @@ do { \
|
|||||||
{ \
|
{ \
|
||||||
if (D##_e <= 0) \
|
if (D##_e <= 0) \
|
||||||
{ \
|
{ \
|
||||||
if (D##_e <= 1 - _FP_FRACBITS_##dfs) \
|
if (D##_e < 1 - _FP_FRACBITS_##dfs) \
|
||||||
_FP_FRAC_SET_##swc(S, _FP_ZEROFRAC_##swc); \
|
{ \
|
||||||
|
_FP_FRAC_SET_##swc(S, _FP_ZEROFRAC_##swc); \
|
||||||
|
_FP_FRAC_LOW_##swc(S) |= 1; \
|
||||||
|
} \
|
||||||
else \
|
else \
|
||||||
{ \
|
{ \
|
||||||
_FP_FRAC_HIGH_##sfs(S) |= _FP_IMPLBIT_SH_##sfs; \
|
_FP_FRAC_HIGH_##sfs(S) |= _FP_IMPLBIT_SH_##sfs; \
|
||||||
@ -1234,11 +1247,24 @@ do { \
|
|||||||
if (S##_e == 0) \
|
if (S##_e == 0) \
|
||||||
{ \
|
{ \
|
||||||
D##_e = 0; \
|
D##_e = 0; \
|
||||||
_FP_FRAC_SET_##dwc(D, _FP_ZEROFRAC_##dwc); \
|
if (_FP_FRAC_ZEROP_##swc(S)) \
|
||||||
if (!_FP_FRAC_ZEROP_##swc(S)) \
|
_FP_FRAC_SET_##dwc(D, _FP_ZEROFRAC_##dwc); \
|
||||||
|
else \
|
||||||
{ \
|
{ \
|
||||||
FP_SET_EXCEPTION(FP_EX_DENORM); \
|
FP_SET_EXCEPTION(FP_EX_DENORM); \
|
||||||
FP_SET_EXCEPTION(FP_EX_INEXACT); \
|
if (_FP_EXPBIAS_##sfs \
|
||||||
|
< _FP_EXPBIAS_##dfs + _FP_FRACBITS_##dfs - 1) \
|
||||||
|
{ \
|
||||||
|
_FP_FRAC_SRS_##swc(S, (_FP_WFRACBITS_##sfs \
|
||||||
|
- _FP_WFRACBITS_##dfs), \
|
||||||
|
_FP_WFRACBITS_##sfs); \
|
||||||
|
_FP_FRAC_COPY_##dwc##_##swc(D, S); \
|
||||||
|
} \
|
||||||
|
else \
|
||||||
|
{ \
|
||||||
|
_FP_FRAC_SET_##dwc(D, _FP_ZEROFRAC_##dwc); \
|
||||||
|
_FP_FRAC_LOW_##dwc(D) |= 1; \
|
||||||
|
} \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
else \
|
else \
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* Software floating-point emulation.
|
/* Software floating-point emulation.
|
||||||
Definitions for IEEE Quad Precision.
|
Definitions for IEEE Quad Precision.
|
||||||
Copyright (C) 1997,1998,1999,2006 Free Software Foundation, Inc.
|
Copyright (C) 1997,1998,1999,2006,2007 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Richard Henderson (rth@cygnus.com),
|
Contributed by Richard Henderson (rth@cygnus.com),
|
||||||
Jakub Jelinek (jj@ultra.linux.cz),
|
Jakub Jelinek (jj@ultra.linux.cz),
|
||||||
@ -176,15 +176,15 @@ union _FP_UNION_Q
|
|||||||
} longs;
|
} longs;
|
||||||
struct {
|
struct {
|
||||||
#if __BYTE_ORDER == __BIG_ENDIAN
|
#if __BYTE_ORDER == __BIG_ENDIAN
|
||||||
unsigned sign : 1;
|
unsigned sign : 1;
|
||||||
unsigned exp : _FP_EXPBITS_Q;
|
unsigned exp : _FP_EXPBITS_Q;
|
||||||
unsigned long frac1 : _FP_FRACBITS_Q-(_FP_IMPLBIT_Q != 0)-_FP_W_TYPE_SIZE;
|
_FP_W_TYPE frac1 : _FP_FRACBITS_Q - (_FP_IMPLBIT_Q != 0) - _FP_W_TYPE_SIZE;
|
||||||
unsigned long frac0 : _FP_W_TYPE_SIZE;
|
_FP_W_TYPE frac0 : _FP_W_TYPE_SIZE;
|
||||||
#else
|
#else
|
||||||
unsigned long frac0 : _FP_W_TYPE_SIZE;
|
_FP_W_TYPE frac0 : _FP_W_TYPE_SIZE;
|
||||||
unsigned long frac1 : _FP_FRACBITS_Q-(_FP_IMPLBIT_Q != 0)-_FP_W_TYPE_SIZE;
|
_FP_W_TYPE frac1 : _FP_FRACBITS_Q - (_FP_IMPLBIT_Q != 0) - _FP_W_TYPE_SIZE;
|
||||||
unsigned exp : _FP_EXPBITS_Q;
|
unsigned exp : _FP_EXPBITS_Q;
|
||||||
unsigned sign : 1;
|
unsigned sign : 1;
|
||||||
#endif
|
#endif
|
||||||
} bits;
|
} bits;
|
||||||
};
|
};
|
||||||
|
@ -703,7 +703,7 @@ sparc_override_options (void)
|
|||||||
error ("-mcmodel= is not supported on 32 bit systems");
|
error ("-mcmodel= is not supported on 32 bit systems");
|
||||||
}
|
}
|
||||||
|
|
||||||
fpu = TARGET_FPU; /* save current -mfpu status */
|
fpu = target_flags & MASK_FPU; /* save current -mfpu status */
|
||||||
|
|
||||||
/* Set the default CPU. */
|
/* Set the default CPU. */
|
||||||
for (def = &cpu_default[0]; def->name; ++def)
|
for (def = &cpu_default[0]; def->name; ++def)
|
||||||
@ -7968,8 +7968,10 @@ sparc_vis_init_builtins (void)
|
|||||||
Expand builtin functions for sparc intrinsics. */
|
Expand builtin functions for sparc intrinsics. */
|
||||||
|
|
||||||
static rtx
|
static rtx
|
||||||
sparc_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
|
sparc_expand_builtin (tree exp, rtx target,
|
||||||
enum machine_mode tmode, int ignore ATTRIBUTE_UNUSED)
|
rtx subtarget ATTRIBUTE_UNUSED,
|
||||||
|
enum machine_mode tmode ATTRIBUTE_UNUSED,
|
||||||
|
int ignore ATTRIBUTE_UNUSED)
|
||||||
{
|
{
|
||||||
tree arglist;
|
tree arglist;
|
||||||
tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
|
tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
|
||||||
@ -7978,14 +7980,13 @@ sparc_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
|
|||||||
enum machine_mode mode[4];
|
enum machine_mode mode[4];
|
||||||
int arg_count = 0;
|
int arg_count = 0;
|
||||||
|
|
||||||
mode[arg_count] = tmode;
|
mode[0] = insn_data[icode].operand[0].mode;
|
||||||
|
if (!target
|
||||||
if (target == 0
|
|| GET_MODE (target) != mode[0]
|
||||||
|| GET_MODE (target) != tmode
|
|| ! (*insn_data[icode].operand[0].predicate) (target, mode[0]))
|
||||||
|| ! (*insn_data[icode].operand[0].predicate) (target, tmode))
|
op[0] = gen_reg_rtx (mode[0]);
|
||||||
op[arg_count] = gen_reg_rtx (tmode);
|
|
||||||
else
|
else
|
||||||
op[arg_count] = target;
|
op[0] = target;
|
||||||
|
|
||||||
for (arglist = TREE_OPERAND (exp, 1); arglist;
|
for (arglist = TREE_OPERAND (exp, 1); arglist;
|
||||||
arglist = TREE_CHAIN (arglist))
|
arglist = TREE_CHAIN (arglist))
|
||||||
@ -8101,11 +8102,11 @@ sparc_fold_builtin (tree fndecl, tree arglist, bool ignore)
|
|||||||
{
|
{
|
||||||
tree arg0, arg1, arg2;
|
tree arg0, arg1, arg2;
|
||||||
tree rtype = TREE_TYPE (TREE_TYPE (fndecl));
|
tree rtype = TREE_TYPE (TREE_TYPE (fndecl));
|
||||||
|
|
||||||
|
|
||||||
if (ignore && DECL_FUNCTION_CODE (fndecl) != CODE_FOR_alignaddrsi_vis
|
if (ignore
|
||||||
|
&& DECL_FUNCTION_CODE (fndecl) != CODE_FOR_alignaddrsi_vis
|
||||||
&& DECL_FUNCTION_CODE (fndecl) != CODE_FOR_alignaddrdi_vis)
|
&& DECL_FUNCTION_CODE (fndecl) != CODE_FOR_alignaddrdi_vis)
|
||||||
return build_int_cst (rtype, 0);
|
return fold_convert (rtype, integer_zero_node);
|
||||||
|
|
||||||
switch (DECL_FUNCTION_CODE (fndecl))
|
switch (DECL_FUNCTION_CODE (fndecl))
|
||||||
{
|
{
|
||||||
@ -8219,6 +8220,7 @@ sparc_fold_builtin (tree fndecl, tree arglist, bool ignore)
|
|||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL_TREE;
|
return NULL_TREE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,3 +1,93 @@
|
|||||||
|
2007-07-19 Release Manager
|
||||||
|
|
||||||
|
* GCC 4.2.1 released.
|
||||||
|
|
||||||
|
2007-07-07 Mark Mitchell <mark@codesourcery.com>
|
||||||
|
|
||||||
|
PR c++/32232
|
||||||
|
* pt.c (resolve_overloaded_unification): Robustify. Return a
|
||||||
|
bool, not an int.
|
||||||
|
(type_unification_real): Adjust accordingly.
|
||||||
|
|
||||||
|
2007-07-06 Mark Mitchell <mark@codesourcery.com>
|
||||||
|
|
||||||
|
PR c++/32245
|
||||||
|
* init.c (build_zero_init): Always build an initializer for
|
||||||
|
non-static storage.
|
||||||
|
* typeck2.c (build_functional_cast): Use build_zero_init.
|
||||||
|
|
||||||
|
PR c++/32251
|
||||||
|
* init.c (build_new_1): Always pass the allocation function to
|
||||||
|
build_op_delete_call.
|
||||||
|
* call.c (build_op_delete_call): Handle operator delete with a
|
||||||
|
variable-argument list. Do not issue an error when no matching
|
||||||
|
deallocation function is available for a new operator.
|
||||||
|
|
||||||
|
PR c++/31992
|
||||||
|
* cp-tree.h (any_value_dependent_elements_p): Declare it.
|
||||||
|
* decl.c (value_dependent_init_p): New function.
|
||||||
|
(cp_finish_decl): Use it.
|
||||||
|
* pt.c (value_dependent_expression_p): Use
|
||||||
|
any_value_dependent_elements_p.
|
||||||
|
* parser.c (cp_parser_primary_expression): Add comment about
|
||||||
|
treating dependent qualified names as integral
|
||||||
|
constant-expressions.
|
||||||
|
|
||||||
|
2007-07-03 Mark Mitchell <mark@codesourcery.com>
|
||||||
|
|
||||||
|
PR c++/31338
|
||||||
|
* cp-tree.h (ARITHMETIC_TYPE): Include COMPLEX_TYPE.
|
||||||
|
* typeck.c (type_after_usual_arithmetic_conversions): Adjust, as
|
||||||
|
COMPLEX_TYPE is now an ARITHMETIC_TYPE.
|
||||||
|
* init.c (build_zero_init): Adjust, as
|
||||||
|
COMPLEX_TYPE is now a SCALAR_TYPE.
|
||||||
|
* typeck2.c (digest_init): Allow brace-enclosed initializers for
|
||||||
|
COMPLEX_TYPE, even though that is now a SCALAR_TYPE.
|
||||||
|
|
||||||
|
2007-07-03 Richard Guenther <rguenther@suse.de>
|
||||||
|
|
||||||
|
PR c++/32609
|
||||||
|
* class.c (fixed_type_or_null): Re-lookup the hashtable slot
|
||||||
|
after recursing.
|
||||||
|
|
||||||
|
2007-07-02 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
PR c++/31748
|
||||||
|
* semantics.c (finish_omp_clauses): Use %qD instead of %qE for
|
||||||
|
DECL_P in not a variable and appears more than once error messages.
|
||||||
|
|
||||||
|
2007-06-27 Simon Martin <simartin@users.sourceforge.net>
|
||||||
|
|
||||||
|
PR c++/27492
|
||||||
|
* decl.c (duplicate_decls): Don't reset DECL_INVALID_OVERRIDER_P for
|
||||||
|
function decls.
|
||||||
|
|
||||||
|
2007-06-15 Mark Mitchell <mark@codesourcery.com>
|
||||||
|
|
||||||
|
* cp-tree.h (DECL_VAR_MARKED_P): Remove.
|
||||||
|
(DECL_ANON_UNION_VAR_P): New macro.
|
||||||
|
* class.c (fixed_type_or_null): Tidy. Use a hash table, rather
|
||||||
|
than DECL_VAR_MARKED_P, to keep track of which variables we have
|
||||||
|
seen.
|
||||||
|
* decl.c (redeclaration_error_message): Complain about redeclaring
|
||||||
|
anonymous union members at namespace scope.
|
||||||
|
* decl2.c (build_anon_union_vars): Set DECL_ANON_UNION_VAR_P.
|
||||||
|
|
||||||
|
2007-06-08 Dirk Mueller <dmueller@suse.de>
|
||||||
|
|
||||||
|
PR c++/31809
|
||||||
|
PR c++/31806
|
||||||
|
Backport from mainline:
|
||||||
|
2007-05-31 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
* decl.c (cp_finish_decl): Also clear was_readonly if a static var
|
||||||
|
needs runtime initialization.
|
||||||
|
|
||||||
|
2007-05-30 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
* decl.c (cp_finish_decl): Clear TREE_READONLY flag on TREE_STATIC
|
||||||
|
variables that need runtime initialization.
|
||||||
|
|
||||||
2007-05-13 Release Manager
|
2007-05-13 Release Manager
|
||||||
|
|
||||||
* GCC 4.2.0 released.
|
* GCC 4.2.0 released.
|
||||||
|
@ -3985,8 +3985,12 @@ build_new_op (enum tree_code code, int flags, tree arg1, tree arg2, tree arg3,
|
|||||||
GLOBAL_P is true if the delete-expression should not consider
|
GLOBAL_P is true if the delete-expression should not consider
|
||||||
class-specific delete operators.
|
class-specific delete operators.
|
||||||
PLACEMENT is the corresponding placement new call, or NULL_TREE.
|
PLACEMENT is the corresponding placement new call, or NULL_TREE.
|
||||||
If PLACEMENT is non-NULL, then ALLOC_FN is the allocation function
|
|
||||||
called to perform the placement new. */
|
If this call to "operator delete" is being generated as part to
|
||||||
|
deallocate memory allocated via a new-expression (as per [expr.new]
|
||||||
|
which requires that if the initialization throws an exception then
|
||||||
|
we call a deallocation function), then ALLOC_FN is the allocation
|
||||||
|
function. */
|
||||||
|
|
||||||
tree
|
tree
|
||||||
build_op_delete_call (enum tree_code code, tree addr, tree size,
|
build_op_delete_call (enum tree_code code, tree addr, tree size,
|
||||||
@ -4077,9 +4081,13 @@ build_op_delete_call (enum tree_code code, tree addr, tree size,
|
|||||||
if (!a && !t)
|
if (!a && !t)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* On the second pass, the second argument must be
|
/* On the second pass, look for a function with exactly two
|
||||||
"size_t". */
|
arguments: "void *" and "size_t". */
|
||||||
else if (pass == 1
|
else if (pass == 1
|
||||||
|
/* For "operator delete(void *, ...)" there will be
|
||||||
|
no second argument, but we will not get an exact
|
||||||
|
match above. */
|
||||||
|
&& t
|
||||||
&& same_type_p (TREE_VALUE (t), sizetype)
|
&& same_type_p (TREE_VALUE (t), sizetype)
|
||||||
&& TREE_CHAIN (t) == void_list_node)
|
&& TREE_CHAIN (t) == void_list_node)
|
||||||
break;
|
break;
|
||||||
@ -4119,10 +4127,18 @@ build_op_delete_call (enum tree_code code, tree addr, tree size,
|
|||||||
return build_function_call (fn, args);
|
return build_function_call (fn, args);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If we are doing placement delete we do nothing if we don't find a
|
/* [expr.new]
|
||||||
matching op delete. */
|
|
||||||
if (placement)
|
If no unambiguous matching deallocation function can be found,
|
||||||
return NULL_TREE;
|
propagating the exception does not cause the object's memory to
|
||||||
|
be freed. */
|
||||||
|
if (alloc_fn)
|
||||||
|
{
|
||||||
|
if (!placement)
|
||||||
|
warning (0, "no corresponding deallocation function for `%D'",
|
||||||
|
alloc_fn);
|
||||||
|
return NULL_TREE;
|
||||||
|
}
|
||||||
|
|
||||||
error ("no suitable %<operator %s%> for %qT",
|
error ("no suitable %<operator %s%> for %qT",
|
||||||
operator_name_info[(int)code].name, type);
|
operator_name_info[(int)code].name, type);
|
||||||
|
@ -5350,22 +5350,34 @@ fixed_type_or_null (tree instance, int* nonnull, int* cdtorp)
|
|||||||
}
|
}
|
||||||
else if (TREE_CODE (TREE_TYPE (instance)) == REFERENCE_TYPE)
|
else if (TREE_CODE (TREE_TYPE (instance)) == REFERENCE_TYPE)
|
||||||
{
|
{
|
||||||
|
/* We only need one hash table because it is always left empty. */
|
||||||
|
static htab_t ht;
|
||||||
|
if (!ht)
|
||||||
|
ht = htab_create (37,
|
||||||
|
htab_hash_pointer,
|
||||||
|
htab_eq_pointer,
|
||||||
|
/*htab_del=*/NULL);
|
||||||
|
|
||||||
/* Reference variables should be references to objects. */
|
/* Reference variables should be references to objects. */
|
||||||
if (nonnull)
|
if (nonnull)
|
||||||
*nonnull = 1;
|
*nonnull = 1;
|
||||||
|
|
||||||
/* DECL_VAR_MARKED_P is used to prevent recursion; a
|
/* Enter the INSTANCE in a table to prevent recursion; a
|
||||||
variable's initializer may refer to the variable
|
variable's initializer may refer to the variable
|
||||||
itself. */
|
itself. */
|
||||||
if (TREE_CODE (instance) == VAR_DECL
|
if (TREE_CODE (instance) == VAR_DECL
|
||||||
&& DECL_INITIAL (instance)
|
&& DECL_INITIAL (instance)
|
||||||
&& !DECL_VAR_MARKED_P (instance))
|
&& !htab_find (ht, instance))
|
||||||
{
|
{
|
||||||
tree type;
|
tree type;
|
||||||
DECL_VAR_MARKED_P (instance) = 1;
|
void **slot;
|
||||||
|
|
||||||
|
slot = htab_find_slot (ht, instance, INSERT);
|
||||||
|
*slot = instance;
|
||||||
type = fixed_type_or_null (DECL_INITIAL (instance),
|
type = fixed_type_or_null (DECL_INITIAL (instance),
|
||||||
nonnull, cdtorp);
|
nonnull, cdtorp);
|
||||||
DECL_VAR_MARKED_P (instance) = 0;
|
htab_remove_elt (ht, instance);
|
||||||
|
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -107,7 +107,7 @@ struct diagnostic_context;
|
|||||||
DECL_IMPLICIT_TYPEDEF_P (in a TYPE_DECL)
|
DECL_IMPLICIT_TYPEDEF_P (in a TYPE_DECL)
|
||||||
3: DECL_IN_AGGR_P.
|
3: DECL_IN_AGGR_P.
|
||||||
4: DECL_C_BIT_FIELD (in a FIELD_DECL)
|
4: DECL_C_BIT_FIELD (in a FIELD_DECL)
|
||||||
DECL_VAR_MARKED_P (in a VAR_DECL)
|
DECL_ANON_UNION_VAR_P (in a VAR_DECL)
|
||||||
DECL_SELF_REFERENCE_P (in a TYPE_DECL)
|
DECL_SELF_REFERENCE_P (in a TYPE_DECL)
|
||||||
DECL_INVALID_OVERRIDER_P (in a FUNCTION_DECL)
|
DECL_INVALID_OVERRIDER_P (in a FUNCTION_DECL)
|
||||||
5: DECL_INTERFACE_KNOWN.
|
5: DECL_INTERFACE_KNOWN.
|
||||||
@ -2111,10 +2111,10 @@ extern void decl_shadowed_for_var_insert (tree, tree);
|
|||||||
(DECL_LANG_SPECIFIC (VAR_TEMPL_TYPE_OR_FUNCTION_DECL_CHECK (NODE)) \
|
(DECL_LANG_SPECIFIC (VAR_TEMPL_TYPE_OR_FUNCTION_DECL_CHECK (NODE)) \
|
||||||
->decl_flags.u.template_info)
|
->decl_flags.u.template_info)
|
||||||
|
|
||||||
/* For a VAR_DECL, indicates that the variable has been processed.
|
/* For a VAR_DECL, indicates that the variable is actually a
|
||||||
This flag is set and unset throughout the code; it is always
|
non-static data member of anonymous union that has been promoted to
|
||||||
used for a temporary purpose. */
|
variable status. */
|
||||||
#define DECL_VAR_MARKED_P(NODE) \
|
#define DECL_ANON_UNION_VAR_P(NODE) \
|
||||||
(DECL_LANG_FLAG_4 (VAR_DECL_CHECK (NODE)))
|
(DECL_LANG_FLAG_4 (VAR_DECL_CHECK (NODE)))
|
||||||
|
|
||||||
/* Template information for a RECORD_TYPE or UNION_TYPE. */
|
/* Template information for a RECORD_TYPE or UNION_TYPE. */
|
||||||
@ -2418,14 +2418,21 @@ extern void decl_shadowed_for_var_insert (tree, tree);
|
|||||||
/* [basic.fundamental]
|
/* [basic.fundamental]
|
||||||
|
|
||||||
Integral and floating types are collectively called arithmetic
|
Integral and floating types are collectively called arithmetic
|
||||||
types. Keep these checks in ascending code order. */
|
types.
|
||||||
|
|
||||||
|
As a GNU extension, we also accept complex types.
|
||||||
|
|
||||||
|
Keep these checks in ascending code order. */
|
||||||
#define ARITHMETIC_TYPE_P(TYPE) \
|
#define ARITHMETIC_TYPE_P(TYPE) \
|
||||||
(CP_INTEGRAL_TYPE_P (TYPE) || TREE_CODE (TYPE) == REAL_TYPE)
|
(CP_INTEGRAL_TYPE_P (TYPE) \
|
||||||
|
|| TREE_CODE (TYPE) == REAL_TYPE \
|
||||||
|
|| TREE_CODE (TYPE) == COMPLEX_TYPE)
|
||||||
|
|
||||||
/* [basic.types]
|
/* [basic.types]
|
||||||
|
|
||||||
Arithmetic types, enumeration types, pointer types, and
|
Arithmetic types, enumeration types, pointer types, and
|
||||||
pointer-to-member types, are collectively called scalar types.
|
pointer-to-member types, are collectively called scalar types.
|
||||||
|
|
||||||
Keep these checks in ascending code order. */
|
Keep these checks in ascending code order. */
|
||||||
#define SCALAR_TYPE_P(TYPE) \
|
#define SCALAR_TYPE_P(TYPE) \
|
||||||
(TYPE_PTRMEM_P (TYPE) \
|
(TYPE_PTRMEM_P (TYPE) \
|
||||||
@ -4146,6 +4153,7 @@ extern bool dependent_template_id_p (tree, tree);
|
|||||||
extern bool type_dependent_expression_p (tree);
|
extern bool type_dependent_expression_p (tree);
|
||||||
extern bool any_type_dependent_arguments_p (tree);
|
extern bool any_type_dependent_arguments_p (tree);
|
||||||
extern bool value_dependent_expression_p (tree);
|
extern bool value_dependent_expression_p (tree);
|
||||||
|
extern bool any_value_dependent_elements_p (tree);
|
||||||
extern tree resolve_typename_type (tree, bool);
|
extern tree resolve_typename_type (tree, bool);
|
||||||
extern tree template_for_substitution (tree);
|
extern tree template_for_substitution (tree);
|
||||||
extern tree build_non_dependent_expr (tree);
|
extern tree build_non_dependent_expr (tree);
|
||||||
|
@ -1573,6 +1573,7 @@ duplicate_decls (tree newdecl, tree olddecl, bool newdecl_is_friend)
|
|||||||
DECL_STATIC_DESTRUCTOR (newdecl) |= DECL_STATIC_DESTRUCTOR (olddecl);
|
DECL_STATIC_DESTRUCTOR (newdecl) |= DECL_STATIC_DESTRUCTOR (olddecl);
|
||||||
DECL_PURE_VIRTUAL_P (newdecl) |= DECL_PURE_VIRTUAL_P (olddecl);
|
DECL_PURE_VIRTUAL_P (newdecl) |= DECL_PURE_VIRTUAL_P (olddecl);
|
||||||
DECL_VIRTUAL_P (newdecl) |= DECL_VIRTUAL_P (olddecl);
|
DECL_VIRTUAL_P (newdecl) |= DECL_VIRTUAL_P (olddecl);
|
||||||
|
DECL_INVALID_OVERRIDER_P (newdecl) |= DECL_INVALID_OVERRIDER_P (olddecl);
|
||||||
DECL_THIS_STATIC (newdecl) |= DECL_THIS_STATIC (olddecl);
|
DECL_THIS_STATIC (newdecl) |= DECL_THIS_STATIC (olddecl);
|
||||||
if (DECL_OVERLOADED_OPERATOR_P (olddecl) != ERROR_MARK)
|
if (DECL_OVERLOADED_OPERATOR_P (olddecl) != ERROR_MARK)
|
||||||
SET_OVERLOADED_OPERATOR_CODE
|
SET_OVERLOADED_OPERATOR_CODE
|
||||||
@ -2161,8 +2162,24 @@ redeclaration_error_message (tree newdecl, tree olddecl)
|
|||||||
}
|
}
|
||||||
else if (toplevel_bindings_p () || DECL_NAMESPACE_SCOPE_P (newdecl))
|
else if (toplevel_bindings_p () || DECL_NAMESPACE_SCOPE_P (newdecl))
|
||||||
{
|
{
|
||||||
/* Objects declared at top level: */
|
/* The objects have been declared at namespace scope. If either
|
||||||
/* If at least one is a reference, it's ok. */
|
is a member of an anonymous union, then this is an invalid
|
||||||
|
redeclaration. For example:
|
||||||
|
|
||||||
|
int i;
|
||||||
|
union { int i; };
|
||||||
|
|
||||||
|
is invalid. */
|
||||||
|
if (DECL_ANON_UNION_VAR_P (newdecl)
|
||||||
|
|| DECL_ANON_UNION_VAR_P (olddecl))
|
||||||
|
return "redeclaration of %q#D";
|
||||||
|
/* If at least one declaration is a reference, there is no
|
||||||
|
conflict. For example:
|
||||||
|
|
||||||
|
int i = 3;
|
||||||
|
extern int i;
|
||||||
|
|
||||||
|
is valid. */
|
||||||
if (DECL_EXTERNAL (newdecl) || DECL_EXTERNAL (olddecl))
|
if (DECL_EXTERNAL (newdecl) || DECL_EXTERNAL (olddecl))
|
||||||
return NULL;
|
return NULL;
|
||||||
/* Reject two definitions. */
|
/* Reject two definitions. */
|
||||||
@ -5076,6 +5093,36 @@ initialize_artificial_var (tree decl, tree init)
|
|||||||
make_rtl_for_nonlocal_decl (decl, init, /*asmspec=*/NULL);
|
make_rtl_for_nonlocal_decl (decl, init, /*asmspec=*/NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* INIT is the initializer for a variable, as represented by the
|
||||||
|
parser. Returns true iff INIT is value-dependent. */
|
||||||
|
|
||||||
|
static bool
|
||||||
|
value_dependent_init_p (tree init)
|
||||||
|
{
|
||||||
|
if (TREE_CODE (init) == TREE_LIST)
|
||||||
|
/* A parenthesized initializer, e.g.: int i (3, 2); ? */
|
||||||
|
return any_value_dependent_elements_p (init);
|
||||||
|
else if (TREE_CODE (init) == CONSTRUCTOR)
|
||||||
|
/* A brace-enclosed initializer, e.g.: int i = { 3 }; ? */
|
||||||
|
{
|
||||||
|
VEC(constructor_elt, gc) *elts;
|
||||||
|
size_t nelts;
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
elts = CONSTRUCTOR_ELTS (init);
|
||||||
|
nelts = VEC_length (constructor_elt, elts);
|
||||||
|
for (i = 0; i < nelts; ++i)
|
||||||
|
if (value_dependent_init_p (VEC_index (constructor_elt,
|
||||||
|
elts, i)->value))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
/* It must be a simple expression, e.g., int i = 3; */
|
||||||
|
return value_dependent_expression_p (init);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/* Finish processing of a declaration;
|
/* Finish processing of a declaration;
|
||||||
install its line number and initial value.
|
install its line number and initial value.
|
||||||
If the length of an array type is not known before,
|
If the length of an array type is not known before,
|
||||||
@ -5148,18 +5195,16 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p,
|
|||||||
TREE_CONSTANT (decl) = 1;
|
TREE_CONSTANT (decl) = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!init
|
/* Generally, initializers in templates are expanded when the
|
||||||
|| !DECL_CLASS_SCOPE_P (decl)
|
template is instantiated. But, if DECL is an integral
|
||||||
|| !DECL_INTEGRAL_CONSTANT_VAR_P (decl)
|
constant static data member, then it can be used in future
|
||||||
|| type_dependent_p
|
integral constant expressions, and its value must be
|
||||||
|| value_dependent_expression_p (init)
|
available. */
|
||||||
/* Check also if initializer is a value dependent
|
if (!(init
|
||||||
{ integral_constant_expression }. */
|
&& DECL_CLASS_SCOPE_P (decl)
|
||||||
|| (TREE_CODE (init) == CONSTRUCTOR
|
&& DECL_INTEGRAL_CONSTANT_VAR_P (decl)
|
||||||
&& VEC_length (constructor_elt, CONSTRUCTOR_ELTS (init)) == 1
|
&& !type_dependent_p
|
||||||
&& value_dependent_expression_p
|
&& !value_dependent_init_p (init)))
|
||||||
(VEC_index (constructor_elt,
|
|
||||||
CONSTRUCTOR_ELTS (init), 0)->value)))
|
|
||||||
{
|
{
|
||||||
if (init)
|
if (init)
|
||||||
DECL_INITIAL (decl) = init;
|
DECL_INITIAL (decl) = init;
|
||||||
@ -5368,7 +5413,18 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p,
|
|||||||
initializer. It is not legal to redeclare a static data
|
initializer. It is not legal to redeclare a static data
|
||||||
member, so this issue does not arise in that case. */
|
member, so this issue does not arise in that case. */
|
||||||
if (var_definition_p && TREE_STATIC (decl))
|
if (var_definition_p && TREE_STATIC (decl))
|
||||||
expand_static_init (decl, init);
|
{
|
||||||
|
/* If a TREE_READONLY variable needs initialization
|
||||||
|
at runtime, it is no longer readonly and we need to
|
||||||
|
avoid MEM_READONLY_P being set on RTL created for it. */
|
||||||
|
if (init)
|
||||||
|
{
|
||||||
|
if (TREE_READONLY (decl))
|
||||||
|
TREE_READONLY (decl) = 0;
|
||||||
|
was_readonly = 0;
|
||||||
|
}
|
||||||
|
expand_static_init (decl, init);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1056,6 +1056,7 @@ build_anon_union_vars (tree type, tree object)
|
|||||||
tree base;
|
tree base;
|
||||||
|
|
||||||
decl = build_decl (VAR_DECL, DECL_NAME (field), TREE_TYPE (field));
|
decl = build_decl (VAR_DECL, DECL_NAME (field), TREE_TYPE (field));
|
||||||
|
DECL_ANON_UNION_VAR_P (decl) = 1;
|
||||||
|
|
||||||
base = get_base_address (object);
|
base = get_base_address (object);
|
||||||
TREE_PUBLIC (decl) = TREE_PUBLIC (base);
|
TREE_PUBLIC (decl) = TREE_PUBLIC (base);
|
||||||
|
@ -178,8 +178,7 @@ build_zero_init (tree type, tree nelts, bool static_storage_p)
|
|||||||
items with static storage duration that are not otherwise
|
items with static storage duration that are not otherwise
|
||||||
initialized are initialized to zero. */
|
initialized are initialized to zero. */
|
||||||
;
|
;
|
||||||
else if (SCALAR_TYPE_P (type)
|
else if (SCALAR_TYPE_P (type))
|
||||||
|| TREE_CODE (type) == COMPLEX_TYPE)
|
|
||||||
init = convert (type, integer_zero_node);
|
init = convert (type, integer_zero_node);
|
||||||
else if (CLASS_TYPE_P (type))
|
else if (CLASS_TYPE_P (type))
|
||||||
{
|
{
|
||||||
@ -196,7 +195,7 @@ build_zero_init (tree type, tree nelts, bool static_storage_p)
|
|||||||
corresponding to base classes as well. Thus, iterating
|
corresponding to base classes as well. Thus, iterating
|
||||||
over TYPE_FIELDs will result in correct initialization of
|
over TYPE_FIELDs will result in correct initialization of
|
||||||
all of the subobjects. */
|
all of the subobjects. */
|
||||||
if (static_storage_p && !zero_init_p (TREE_TYPE (field)))
|
if (!static_storage_p || !zero_init_p (TREE_TYPE (field)))
|
||||||
{
|
{
|
||||||
tree value = build_zero_init (TREE_TYPE (field),
|
tree value = build_zero_init (TREE_TYPE (field),
|
||||||
/*nelts=*/NULL_TREE,
|
/*nelts=*/NULL_TREE,
|
||||||
@ -1970,8 +1969,7 @@ build_new_1 (tree placement, tree type, tree nelts, tree init,
|
|||||||
globally_qualified_p,
|
globally_qualified_p,
|
||||||
(placement_allocation_fn_p
|
(placement_allocation_fn_p
|
||||||
? alloc_call : NULL_TREE),
|
? alloc_call : NULL_TREE),
|
||||||
(placement_allocation_fn_p
|
alloc_fn);
|
||||||
? alloc_fn : NULL_TREE));
|
|
||||||
|
|
||||||
if (!cleanup)
|
if (!cleanup)
|
||||||
/* We're done. */;
|
/* We're done. */;
|
||||||
|
@ -3197,7 +3197,19 @@ cp_parser_primary_expression (cp_parser *parser,
|
|||||||
/* If name lookup gives us a SCOPE_REF, then the
|
/* If name lookup gives us a SCOPE_REF, then the
|
||||||
qualifying scope was dependent. */
|
qualifying scope was dependent. */
|
||||||
if (TREE_CODE (decl) == SCOPE_REF)
|
if (TREE_CODE (decl) == SCOPE_REF)
|
||||||
return decl;
|
{
|
||||||
|
/* At this point, we do not know if DECL is a valid
|
||||||
|
integral constant expression. We assume that it is
|
||||||
|
in fact such an expression, so that code like:
|
||||||
|
|
||||||
|
template <int N> struct A {
|
||||||
|
int a[B<N>::i];
|
||||||
|
};
|
||||||
|
|
||||||
|
is accepted. At template-instantiation time, we
|
||||||
|
will check that B<N>::i is actually a constant. */
|
||||||
|
return decl;
|
||||||
|
}
|
||||||
/* Check to see if DECL is a local variable in a context
|
/* Check to see if DECL is a local variable in a context
|
||||||
where that is forbidden. */
|
where that is forbidden. */
|
||||||
if (parser->local_variables_forbidden_p
|
if (parser->local_variables_forbidden_p
|
||||||
|
@ -91,8 +91,8 @@ static htab_t local_specializations;
|
|||||||
|
|
||||||
static void push_access_scope (tree);
|
static void push_access_scope (tree);
|
||||||
static void pop_access_scope (tree);
|
static void pop_access_scope (tree);
|
||||||
static int resolve_overloaded_unification (tree, tree, tree, tree,
|
static bool resolve_overloaded_unification (tree, tree, tree, tree,
|
||||||
unification_kind_t, int);
|
unification_kind_t, int);
|
||||||
static int try_one_overload (tree, tree, tree, tree, tree,
|
static int try_one_overload (tree, tree, tree, tree, tree,
|
||||||
unification_kind_t, int, bool);
|
unification_kind_t, int, bool);
|
||||||
static int unify (tree, tree, tree, tree, int);
|
static int unify (tree, tree, tree, tree, int);
|
||||||
@ -9943,17 +9943,18 @@ type_unification_real (tree tparms,
|
|||||||
gcc_assert (TREE_TYPE (arg) != NULL_TREE);
|
gcc_assert (TREE_TYPE (arg) != NULL_TREE);
|
||||||
if (type_unknown_p (arg))
|
if (type_unknown_p (arg))
|
||||||
{
|
{
|
||||||
/* [temp.deduct.type] A template-argument can be deduced from
|
/* [temp.deduct.type]
|
||||||
a pointer to function or pointer to member function
|
|
||||||
argument if the set of overloaded functions does not
|
|
||||||
contain function templates and at most one of a set of
|
|
||||||
overloaded functions provides a unique match. */
|
|
||||||
|
|
||||||
|
A template-argument can be deduced from a pointer to
|
||||||
|
function or pointer to member function argument if
|
||||||
|
the set of overloaded functions does not contain
|
||||||
|
function templates and at most one of a set of
|
||||||
|
overloaded functions provides a unique match. */
|
||||||
if (resolve_overloaded_unification
|
if (resolve_overloaded_unification
|
||||||
(tparms, targs, parm, arg, strict, sub_strict)
|
(tparms, targs, parm, arg, strict, sub_strict))
|
||||||
!= 0)
|
continue;
|
||||||
return 1;
|
|
||||||
continue;
|
return 1;
|
||||||
}
|
}
|
||||||
arg = unlowered_expr_type (arg);
|
arg = unlowered_expr_type (arg);
|
||||||
if (arg == error_mark_node)
|
if (arg == error_mark_node)
|
||||||
@ -10006,12 +10007,13 @@ type_unification_real (tree tparms,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Subroutine of type_unification_real. Args are like the variables at the
|
/* Subroutine of type_unification_real. Args are like the variables
|
||||||
call site. ARG is an overloaded function (or template-id); we try
|
at the call site. ARG is an overloaded function (or template-id);
|
||||||
deducing template args from each of the overloads, and if only one
|
we try deducing template args from each of the overloads, and if
|
||||||
succeeds, we go with that. Modifies TARGS and returns 0 on success. */
|
only one succeeds, we go with that. Modifies TARGS and returns
|
||||||
|
true on success. */
|
||||||
|
|
||||||
static int
|
static bool
|
||||||
resolve_overloaded_unification (tree tparms,
|
resolve_overloaded_unification (tree tparms,
|
||||||
tree targs,
|
tree targs,
|
||||||
tree parm,
|
tree parm,
|
||||||
@ -10070,16 +10072,17 @@ resolve_overloaded_unification (tree tparms,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (TREE_CODE (arg) != OVERLOAD
|
||||||
|
&& TREE_CODE (arg) != FUNCTION_DECL)
|
||||||
|
/* If ARG is, for example, "(0, &f)" then its type will be unknown
|
||||||
|
-- but the deduction does not succeed because the expression is
|
||||||
|
not just the function on its own. */
|
||||||
|
return false;
|
||||||
else
|
else
|
||||||
{
|
for (; arg; arg = OVL_NEXT (arg))
|
||||||
gcc_assert (TREE_CODE (arg) == OVERLOAD
|
good += try_one_overload (tparms, targs, tempargs, parm,
|
||||||
|| TREE_CODE (arg) == FUNCTION_DECL);
|
TREE_TYPE (OVL_CURRENT (arg)),
|
||||||
|
strict, sub_strict, addr_p);
|
||||||
for (; arg; arg = OVL_NEXT (arg))
|
|
||||||
good += try_one_overload (tparms, targs, tempargs, parm,
|
|
||||||
TREE_TYPE (OVL_CURRENT (arg)),
|
|
||||||
strict, sub_strict, addr_p);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* [temp.deduct.type] A template-argument can be deduced from a pointer
|
/* [temp.deduct.type] A template-argument can be deduced from a pointer
|
||||||
to function or pointer to member function argument if the set of
|
to function or pointer to member function argument if the set of
|
||||||
@ -10097,9 +10100,9 @@ resolve_overloaded_unification (tree tparms,
|
|||||||
TREE_VEC_ELT (targs, i) = TREE_VEC_ELT (tempargs, i);
|
TREE_VEC_ELT (targs, i) = TREE_VEC_ELT (tempargs, i);
|
||||||
}
|
}
|
||||||
if (good)
|
if (good)
|
||||||
return 0;
|
return true;
|
||||||
|
|
||||||
return 1;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Subroutine of resolve_overloaded_unification; does deduction for a single
|
/* Subroutine of resolve_overloaded_unification; does deduction for a single
|
||||||
@ -12895,12 +12898,7 @@ value_dependent_expression_p (tree expression)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (TREE_CODE (expression) == TREE_LIST)
|
if (TREE_CODE (expression) == TREE_LIST)
|
||||||
{
|
return any_value_dependent_elements_p (expression);
|
||||||
for (; expression; expression = TREE_CHAIN (expression))
|
|
||||||
if (value_dependent_expression_p (TREE_VALUE (expression)))
|
|
||||||
return true;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return value_dependent_expression_p (expression);
|
return value_dependent_expression_p (expression);
|
||||||
}
|
}
|
||||||
@ -13104,6 +13102,19 @@ any_type_dependent_arguments_p (tree args)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Returns TRUE if LIST (a TREE_LIST whose TREE_VALUEs are
|
||||||
|
expressions) contains any value-dependent expressions. */
|
||||||
|
|
||||||
|
bool
|
||||||
|
any_value_dependent_elements_p (tree list)
|
||||||
|
{
|
||||||
|
for (; list; list = TREE_CHAIN (list))
|
||||||
|
if (value_dependent_expression_p (TREE_VALUE (list)))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/* Returns TRUE if the ARG (a template argument) is dependent. */
|
/* Returns TRUE if the ARG (a template argument) is dependent. */
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
|
@ -3344,14 +3344,17 @@ finish_omp_clauses (tree clauses)
|
|||||||
{
|
{
|
||||||
if (processing_template_decl)
|
if (processing_template_decl)
|
||||||
break;
|
break;
|
||||||
error ("%qE is not a variable in clause %qs", t, name);
|
if (DECL_P (t))
|
||||||
|
error ("%qD is not a variable in clause %qs", t, name);
|
||||||
|
else
|
||||||
|
error ("%qE is not a variable in clause %qs", t, name);
|
||||||
remove = true;
|
remove = true;
|
||||||
}
|
}
|
||||||
else if (bitmap_bit_p (&generic_head, DECL_UID (t))
|
else if (bitmap_bit_p (&generic_head, DECL_UID (t))
|
||||||
|| bitmap_bit_p (&firstprivate_head, DECL_UID (t))
|
|| bitmap_bit_p (&firstprivate_head, DECL_UID (t))
|
||||||
|| bitmap_bit_p (&lastprivate_head, DECL_UID (t)))
|
|| bitmap_bit_p (&lastprivate_head, DECL_UID (t)))
|
||||||
{
|
{
|
||||||
error ("%qE appears more than once in data clauses", t);
|
error ("%qD appears more than once in data clauses", t);
|
||||||
remove = true;
|
remove = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -256,11 +256,9 @@ type_after_usual_arithmetic_conversions (tree t1, tree t2)
|
|||||||
|
|
||||||
/* FIXME: Attributes. */
|
/* FIXME: Attributes. */
|
||||||
gcc_assert (ARITHMETIC_TYPE_P (t1)
|
gcc_assert (ARITHMETIC_TYPE_P (t1)
|
||||||
|| TREE_CODE (t1) == COMPLEX_TYPE
|
|
||||||
|| TREE_CODE (t1) == VECTOR_TYPE
|
|| TREE_CODE (t1) == VECTOR_TYPE
|
||||||
|| TREE_CODE (t1) == ENUMERAL_TYPE);
|
|| TREE_CODE (t1) == ENUMERAL_TYPE);
|
||||||
gcc_assert (ARITHMETIC_TYPE_P (t2)
|
gcc_assert (ARITHMETIC_TYPE_P (t2)
|
||||||
|| TREE_CODE (t2) == COMPLEX_TYPE
|
|
||||||
|| TREE_CODE (t2) == VECTOR_TYPE
|
|| TREE_CODE (t2) == VECTOR_TYPE
|
||||||
|| TREE_CODE (t2) == ENUMERAL_TYPE);
|
|| TREE_CODE (t2) == ENUMERAL_TYPE);
|
||||||
|
|
||||||
@ -761,9 +759,9 @@ common_type (tree t1, tree t2)
|
|||||||
code2 = TREE_CODE (t2);
|
code2 = TREE_CODE (t2);
|
||||||
|
|
||||||
if ((ARITHMETIC_TYPE_P (t1) || code1 == ENUMERAL_TYPE
|
if ((ARITHMETIC_TYPE_P (t1) || code1 == ENUMERAL_TYPE
|
||||||
|| code1 == COMPLEX_TYPE || code1 == VECTOR_TYPE)
|
|| code1 == VECTOR_TYPE)
|
||||||
&& (ARITHMETIC_TYPE_P (t2) || code2 == ENUMERAL_TYPE
|
&& (ARITHMETIC_TYPE_P (t2) || code2 == ENUMERAL_TYPE
|
||||||
|| code2 == COMPLEX_TYPE || code2 == VECTOR_TYPE))
|
|| code2 == VECTOR_TYPE))
|
||||||
return type_after_usual_arithmetic_conversions (t1, t2);
|
return type_after_usual_arithmetic_conversions (t1, t2);
|
||||||
|
|
||||||
else if ((TYPE_PTR_P (t1) && TYPE_PTR_P (t2))
|
else if ((TYPE_PTR_P (t1) && TYPE_PTR_P (t2))
|
||||||
|
@ -710,7 +710,8 @@ digest_init (tree type, tree init)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Handle scalar types (including conversions) and references. */
|
/* Handle scalar types (including conversions) and references. */
|
||||||
if (SCALAR_TYPE_P (type) || code == REFERENCE_TYPE)
|
if (TREE_CODE (type) != COMPLEX_TYPE
|
||||||
|
&& (SCALAR_TYPE_P (type) || code == REFERENCE_TYPE))
|
||||||
return convert_for_initialization (0, type, init, LOOKUP_NORMAL,
|
return convert_for_initialization (0, type, init, LOOKUP_NORMAL,
|
||||||
"initialization", NULL_TREE, 0);
|
"initialization", NULL_TREE, 0);
|
||||||
|
|
||||||
@ -1347,7 +1348,9 @@ build_functional_cast (tree exp, tree parms)
|
|||||||
&& !CLASSTYPE_NON_POD_P (type)
|
&& !CLASSTYPE_NON_POD_P (type)
|
||||||
&& TYPE_HAS_DEFAULT_CONSTRUCTOR (type))
|
&& TYPE_HAS_DEFAULT_CONSTRUCTOR (type))
|
||||||
{
|
{
|
||||||
exp = build_constructor (type, NULL);
|
exp = build_zero_init (type,
|
||||||
|
/*nelts=*/NULL_TREE,
|
||||||
|
/*static_storage_p=*/false);
|
||||||
return get_target_expr (exp);
|
return get_target_expr (exp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -129,13 +129,14 @@
|
|||||||
.\" ========================================================================
|
.\" ========================================================================
|
||||||
.\"
|
.\"
|
||||||
.IX Title "CPP 1"
|
.IX Title "CPP 1"
|
||||||
.TH CPP 1 "2006-03-06" "gcc-3.4.6" "GNU"
|
.TH CPP 1 "2007-07-19" "gcc-4.2.1" "GNU"
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
cpp \- The C Preprocessor
|
cpp \- The C Preprocessor
|
||||||
.SH "SYNOPSIS"
|
.SH "SYNOPSIS"
|
||||||
.IX Header "SYNOPSIS"
|
.IX Header "SYNOPSIS"
|
||||||
cpp [\fB\-D\fR\fImacro\fR[=\fIdefn\fR]...] [\fB\-U\fR\fImacro\fR]
|
cpp [\fB\-D\fR\fImacro\fR[=\fIdefn\fR]...] [\fB\-U\fR\fImacro\fR]
|
||||||
[\fB\-I\fR\fIdir\fR...] [\fB\-W\fR\fIwarn\fR...]
|
[\fB\-I\fR\fIdir\fR...] [\fB\-iquote\fR\fIdir\fR...]
|
||||||
|
[\fB\-W\fR\fIwarn\fR...]
|
||||||
[\fB\-M\fR|\fB\-MM\fR] [\fB\-MG\fR] [\fB\-MF\fR \fIfilename\fR]
|
[\fB\-M\fR|\fB\-MM\fR] [\fB\-MG\fR] [\fB\-MF\fR \fIfilename\fR]
|
||||||
[\fB\-MP\fR] [\fB\-MQ\fR \fItarget\fR...]
|
[\fB\-MP\fR] [\fB\-MQ\fR \fItarget\fR...]
|
||||||
[\fB\-MT\fR \fItarget\fR...]
|
[\fB\-MT\fR \fItarget\fR...]
|
||||||
@ -218,7 +219,6 @@ options may \fInot\fR be grouped: \fB\-dM\fR is very different from
|
|||||||
Predefine \fIname\fR as a macro, with definition \f(CW1\fR.
|
Predefine \fIname\fR as a macro, with definition \f(CW1\fR.
|
||||||
.IP "\fB\-D\fR \fIname\fR\fB=\fR\fIdefinition\fR" 4
|
.IP "\fB\-D\fR \fIname\fR\fB=\fR\fIdefinition\fR" 4
|
||||||
.IX Item "-D name=definition"
|
.IX Item "-D name=definition"
|
||||||
Predefine \fIname\fR as a macro, with definition \fIdefinition\fR.
|
|
||||||
The contents of \fIdefinition\fR are tokenized and processed as if
|
The contents of \fIdefinition\fR are tokenized and processed as if
|
||||||
they appeared during translation phase three in a \fB#define\fR
|
they appeared during translation phase three in a \fB#define\fR
|
||||||
directive. In particular, the definition will be truncated by
|
directive. In particular, the definition will be truncated by
|
||||||
@ -282,7 +282,6 @@ comment, or whenever a backslash-newline appears in a \fB//\fR comment.
|
|||||||
(Both forms have the same effect.)
|
(Both forms have the same effect.)
|
||||||
.IP "\fB\-Wtrigraphs\fR" 4
|
.IP "\fB\-Wtrigraphs\fR" 4
|
||||||
.IX Item "-Wtrigraphs"
|
.IX Item "-Wtrigraphs"
|
||||||
@anchor{Wtrigraphs}
|
|
||||||
Most trigraphs in comments cannot affect the meaning of the program.
|
Most trigraphs in comments cannot affect the meaning of the program.
|
||||||
However, a trigraph that would form an escaped newline (\fB??/\fR at
|
However, a trigraph that would form an escaped newline (\fB??/\fR at
|
||||||
the end of a line) can, by changing where the comment begins or ends.
|
the end of a line) can, by changing where the comment begins or ends.
|
||||||
@ -316,7 +315,7 @@ time it is redefined or undefined.
|
|||||||
Built-in macros, macros defined on the command line, and macros
|
Built-in macros, macros defined on the command line, and macros
|
||||||
defined in include files are not warned about.
|
defined in include files are not warned about.
|
||||||
.Sp
|
.Sp
|
||||||
\&\fBNote:\fR If a macro is actually used, but only used in skipped
|
\&\fINote:\fR If a macro is actually used, but only used in skipped
|
||||||
conditional blocks, then \s-1CPP\s0 will report it as unused. To avoid the
|
conditional blocks, then \s-1CPP\s0 will report it as unused. To avoid the
|
||||||
warning in such a case, you might improve the scope of the macro's
|
warning in such a case, you might improve the scope of the macro's
|
||||||
definition by, for example, moving it into the first skipped block.
|
definition by, for example, moving it into the first skipped block.
|
||||||
@ -397,8 +396,6 @@ This implies that the choice of angle brackets or double quotes in an
|
|||||||
\&\fB#include\fR directive does not in itself determine whether that
|
\&\fB#include\fR directive does not in itself determine whether that
|
||||||
header will appear in \fB\-MM\fR dependency output. This is a
|
header will appear in \fB\-MM\fR dependency output. This is a
|
||||||
slight change in semantics from \s-1GCC\s0 versions 3.0 and earlier.
|
slight change in semantics from \s-1GCC\s0 versions 3.0 and earlier.
|
||||||
.Sp
|
|
||||||
@anchor{dashMF}
|
|
||||||
.IP "\fB\-MF\fR \fIfile\fR" 4
|
.IP "\fB\-MF\fR \fIfile\fR" 4
|
||||||
.IX Item "-MF file"
|
.IX Item "-MF file"
|
||||||
When used with \fB\-M\fR or \fB\-MM\fR, specifies a
|
When used with \fB\-M\fR or \fB\-MM\fR, specifies a
|
||||||
@ -471,8 +468,7 @@ argument but with a suffix of \fI.d\fR, otherwise it take the
|
|||||||
basename of the input file and applies a \fI.d\fR suffix.
|
basename of the input file and applies a \fI.d\fR suffix.
|
||||||
.Sp
|
.Sp
|
||||||
If \fB\-MD\fR is used in conjunction with \fB\-E\fR, any
|
If \fB\-MD\fR is used in conjunction with \fB\-E\fR, any
|
||||||
\&\fB\-o\fR switch is understood to specify the dependency output file
|
\&\fB\-o\fR switch is understood to specify the dependency output file, but if used without \fB\-E\fR, each \fB\-o\fR
|
||||||
(but \f(CW@pxref\fR{dashMF,,\-MF}), but if used without \fB\-E\fR, each \fB\-o\fR
|
|
||||||
is understood to specify a target object file.
|
is understood to specify a target object file.
|
||||||
.Sp
|
.Sp
|
||||||
Since \fB\-E\fR is not implied, \fB\-MD\fR can be used to generate
|
Since \fB\-E\fR is not implied, \fB\-MD\fR can be used to generate
|
||||||
@ -480,7 +476,7 @@ a dependency output file as a side-effect of the compilation process.
|
|||||||
.IP "\fB\-MMD\fR" 4
|
.IP "\fB\-MMD\fR" 4
|
||||||
.IX Item "-MMD"
|
.IX Item "-MMD"
|
||||||
Like \fB\-MD\fR except mention only user header files, not system
|
Like \fB\-MD\fR except mention only user header files, not system
|
||||||
\&\-header files.
|
header files.
|
||||||
.IP "\fB\-x c\fR" 4
|
.IP "\fB\-x c\fR" 4
|
||||||
.IX Item "-x c"
|
.IX Item "-x c"
|
||||||
.PD 0
|
.PD 0
|
||||||
@ -500,7 +496,7 @@ extensions for \*(C+ and assembly are also recognized. If cpp does not
|
|||||||
recognize the extension, it will treat the file as C; this is the most
|
recognize the extension, it will treat the file as C; this is the most
|
||||||
generic mode.
|
generic mode.
|
||||||
.Sp
|
.Sp
|
||||||
\&\fBNote:\fR Previous versions of cpp accepted a \fB\-lang\fR option
|
\&\fINote:\fR Previous versions of cpp accepted a \fB\-lang\fR option
|
||||||
which selected both the language and the standards conformance level.
|
which selected both the language and the standards conformance level.
|
||||||
This option has been removed, because it conflicts with the \fB\-l\fR
|
This option has been removed, because it conflicts with the \fB\-l\fR
|
||||||
option.
|
option.
|
||||||
@ -584,6 +580,8 @@ directories are searched for all \fB#include\fR directives.
|
|||||||
.Sp
|
.Sp
|
||||||
In addition, \fB\-I\-\fR inhibits the use of the directory of the current
|
In addition, \fB\-I\-\fR inhibits the use of the directory of the current
|
||||||
file directory as the first search directory for \f(CW\*(C`#include\ "\f(CIfile\f(CW"\*(C'\fR.
|
file directory as the first search directory for \f(CW\*(C`#include\ "\f(CIfile\f(CW"\*(C'\fR.
|
||||||
|
.Sp
|
||||||
|
This option has been deprecated.
|
||||||
.IP "\fB\-nostdinc\fR" 4
|
.IP "\fB\-nostdinc\fR" 4
|
||||||
.IX Item "-nostdinc"
|
.IX Item "-nostdinc"
|
||||||
Do not search the standard system directories for header files.
|
Do not search the standard system directories for header files.
|
||||||
@ -634,16 +632,34 @@ Append \fIdir\fR to the prefix specified previously with
|
|||||||
\&\fB\-iprefix\fR, and add the resulting directory to the include search
|
\&\fB\-iprefix\fR, and add the resulting directory to the include search
|
||||||
path. \fB\-iwithprefixbefore\fR puts it in the same place \fB\-I\fR
|
path. \fB\-iwithprefixbefore\fR puts it in the same place \fB\-I\fR
|
||||||
would; \fB\-iwithprefix\fR puts it where \fB\-idirafter\fR would.
|
would; \fB\-iwithprefix\fR puts it where \fB\-idirafter\fR would.
|
||||||
|
.IP "\fB\-isysroot\fR \fIdir\fR" 4
|
||||||
|
.IX Item "-isysroot dir"
|
||||||
|
This option is like the \fB\-\-sysroot\fR option, but applies only to
|
||||||
|
header files. See the \fB\-\-sysroot\fR option for more information.
|
||||||
|
.IP "\fB\-imultilib\fR \fIdir\fR" 4
|
||||||
|
.IX Item "-imultilib dir"
|
||||||
|
Use \fIdir\fR as a subdirectory of the directory containing
|
||||||
|
target-specific \*(C+ headers.
|
||||||
.IP "\fB\-isystem\fR \fIdir\fR" 4
|
.IP "\fB\-isystem\fR \fIdir\fR" 4
|
||||||
.IX Item "-isystem dir"
|
.IX Item "-isystem dir"
|
||||||
Search \fIdir\fR for header files, after all directories specified by
|
Search \fIdir\fR for header files, after all directories specified by
|
||||||
\&\fB\-I\fR but before the standard system directories. Mark it
|
\&\fB\-I\fR but before the standard system directories. Mark it
|
||||||
as a system directory, so that it gets the same special treatment as
|
as a system directory, so that it gets the same special treatment as
|
||||||
is applied to the standard system directories.
|
is applied to the standard system directories.
|
||||||
|
.IP "\fB\-iquote\fR \fIdir\fR" 4
|
||||||
|
.IX Item "-iquote dir"
|
||||||
|
Search \fIdir\fR only for header files requested with
|
||||||
|
\&\f(CW\*(C`#include\ "\f(CIfile\f(CW"\*(C'\fR; they are not searched for
|
||||||
|
\&\f(CW\*(C`#include\ <\f(CIfile\f(CW>\*(C'\fR, before all directories specified by
|
||||||
|
\&\fB\-I\fR and before the standard system directories.
|
||||||
.IP "\fB\-fdollars\-in\-identifiers\fR" 4
|
.IP "\fB\-fdollars\-in\-identifiers\fR" 4
|
||||||
.IX Item "-fdollars-in-identifiers"
|
.IX Item "-fdollars-in-identifiers"
|
||||||
@anchor{fdollars\-in\-identifiers}
|
|
||||||
Accept \fB$\fR in identifiers.
|
Accept \fB$\fR in identifiers.
|
||||||
|
.IP "\fB\-fextended\-identifiers\fR" 4
|
||||||
|
.IX Item "-fextended-identifiers"
|
||||||
|
Accept universal character names in identifiers. This option is
|
||||||
|
experimental; in a future version of \s-1GCC\s0, it will be enabled by
|
||||||
|
default for C99 and \*(C+.
|
||||||
.IP "\fB\-fpreprocessed\fR" 4
|
.IP "\fB\-fpreprocessed\fR" 4
|
||||||
.IX Item "-fpreprocessed"
|
.IX Item "-fpreprocessed"
|
||||||
Indicate to the preprocessor that the input file has already been
|
Indicate to the preprocessor that the input file has already been
|
||||||
@ -674,17 +690,17 @@ supported by the system's \f(CW\*(C`iconv\*(C'\fR library routine.
|
|||||||
Set the wide execution character set, used for wide string and
|
Set the wide execution character set, used for wide string and
|
||||||
character constants. The default is \s-1UTF\-32\s0 or \s-1UTF\-16\s0, whichever
|
character constants. The default is \s-1UTF\-32\s0 or \s-1UTF\-16\s0, whichever
|
||||||
corresponds to the width of \f(CW\*(C`wchar_t\*(C'\fR. As with
|
corresponds to the width of \f(CW\*(C`wchar_t\*(C'\fR. As with
|
||||||
\&\fB\-ftarget\-charset\fR, \fIcharset\fR can be any encoding supported
|
\&\fB\-fexec\-charset\fR, \fIcharset\fR can be any encoding supported
|
||||||
by the system's \f(CW\*(C`iconv\*(C'\fR library routine; however, you will have
|
by the system's \f(CW\*(C`iconv\*(C'\fR library routine; however, you will have
|
||||||
problems with encodings that do not fit exactly in \f(CW\*(C`wchar_t\*(C'\fR.
|
problems with encodings that do not fit exactly in \f(CW\*(C`wchar_t\*(C'\fR.
|
||||||
.IP "\fB\-finput\-charset=\fR\fIcharset\fR" 4
|
.IP "\fB\-finput\-charset=\fR\fIcharset\fR" 4
|
||||||
.IX Item "-finput-charset=charset"
|
.IX Item "-finput-charset=charset"
|
||||||
Set the input character set, used for translation from the character
|
Set the input character set, used for translation from the character
|
||||||
set of the input file to the source character set used by \s-1GCC\s0. If the
|
set of the input file to the source character set used by \s-1GCC\s0. If the
|
||||||
locale does not specify, or \s-1GCC\s0 cannot get this information from the
|
locale does not specify, or \s-1GCC\s0 cannot get this information from the
|
||||||
locale, the default is \s-1UTF\-8\s0. This can be overridden by either the locale
|
locale, the default is \s-1UTF\-8\s0. This can be overridden by either the locale
|
||||||
or this command line option. Currently the command line option takes
|
or this command line option. Currently the command line option takes
|
||||||
precedence if there's a conflict. \fIcharset\fR can be any encoding
|
precedence if there's a conflict. \fIcharset\fR can be any encoding
|
||||||
supported by the system's \f(CW\*(C`iconv\*(C'\fR library routine.
|
supported by the system's \f(CW\*(C`iconv\*(C'\fR library routine.
|
||||||
.IP "\fB\-fworking\-directory\fR" 4
|
.IP "\fB\-fworking\-directory\fR" 4
|
||||||
.IX Item "-fworking-directory"
|
.IX Item "-fworking-directory"
|
||||||
@ -892,7 +908,7 @@ main input file is omitted.
|
|||||||
.SH "COPYRIGHT"
|
.SH "COPYRIGHT"
|
||||||
.IX Header "COPYRIGHT"
|
.IX Header "COPYRIGHT"
|
||||||
Copyright (c) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
Copyright (c) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
|
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
|
||||||
Free Software Foundation, Inc.
|
Free Software Foundation, Inc.
|
||||||
.PP
|
.PP
|
||||||
Permission is granted to copy, distribute and/or modify this document
|
Permission is granted to copy, distribute and/or modify this document
|
||||||
|
11186
contrib/gcc/doc/gcc.1
11186
contrib/gcc/doc/gcc.1
File diff suppressed because it is too large
Load Diff
@ -129,7 +129,7 @@
|
|||||||
.\" ========================================================================
|
.\" ========================================================================
|
||||||
.\"
|
.\"
|
||||||
.IX Title "GCOV 1"
|
.IX Title "GCOV 1"
|
||||||
.TH GCOV 1 "2006-03-06" "gcc-3.4.6" "GNU"
|
.TH GCOV 1 "2007-07-19" "gcc-4.2.1" "GNU"
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
gcov \- coverage testing tool
|
gcov \- coverage testing tool
|
||||||
.SH "SYNOPSIS"
|
.SH "SYNOPSIS"
|
||||||
@ -222,8 +222,8 @@ and exit without doing any further processing.
|
|||||||
.IP "\fB\-\-all\-blocks\fR" 4
|
.IP "\fB\-\-all\-blocks\fR" 4
|
||||||
.IX Item "--all-blocks"
|
.IX Item "--all-blocks"
|
||||||
.PD
|
.PD
|
||||||
Write individual execution counts for every basic block. Normally gcov
|
Write individual execution counts for every basic block. Normally gcov
|
||||||
outputs execution counts only for the main blocks of a line. With this
|
outputs execution counts only for the main blocks of a line. With this
|
||||||
option you can determine if blocks within a single line are not being
|
option you can determine if blocks within a single line are not being
|
||||||
executed.
|
executed.
|
||||||
.IP "\fB\-b\fR" 4
|
.IP "\fB\-b\fR" 4
|
||||||
@ -234,7 +234,7 @@ executed.
|
|||||||
.PD
|
.PD
|
||||||
Write branch frequencies to the output file, and write branch summary
|
Write branch frequencies to the output file, and write branch summary
|
||||||
info to the standard output. This option allows you to see how often
|
info to the standard output. This option allows you to see how often
|
||||||
each branch in your program was taken. Unconditional branches will not
|
each branch in your program was taken. Unconditional branches will not
|
||||||
be shown, unless the \fB\-u\fR option is given.
|
be shown, unless the \fB\-u\fR option is given.
|
||||||
.IP "\fB\-c\fR" 4
|
.IP "\fB\-c\fR" 4
|
||||||
.IX Item "-c"
|
.IX Item "-c"
|
||||||
@ -262,7 +262,7 @@ header file \fIx.h\fR contains code, and was included in the file
|
|||||||
\&\fIa.c\fR, then running \fBgcov\fR on the file \fIa.c\fR will produce
|
\&\fIa.c\fR, then running \fBgcov\fR on the file \fIa.c\fR will produce
|
||||||
an output file called \fIa.c##x.h.gcov\fR instead of \fIx.h.gcov\fR.
|
an output file called \fIa.c##x.h.gcov\fR instead of \fIx.h.gcov\fR.
|
||||||
This can be useful if \fIx.h\fR is included in multiple source
|
This can be useful if \fIx.h\fR is included in multiple source
|
||||||
files. If you uses the \fB\-p\fR option, both the including and
|
files. If you use the \fB\-p\fR option, both the including and
|
||||||
included file names will be complete path names.
|
included file names will be complete path names.
|
||||||
.IP "\fB\-p\fR" 4
|
.IP "\fB\-p\fR" 4
|
||||||
.IX Item "-p"
|
.IX Item "-p"
|
||||||
@ -271,11 +271,12 @@ included file names will be complete path names.
|
|||||||
.IX Item "--preserve-paths"
|
.IX Item "--preserve-paths"
|
||||||
.PD
|
.PD
|
||||||
Preserve complete path information in the names of generated
|
Preserve complete path information in the names of generated
|
||||||
\&\fI.gcov\fR files. Without this option, just the filename component is
|
\&\fI.gcov\fR files. Without this option, just the filename component is
|
||||||
used. With this option, all directories are used, with '/' characters
|
used. With this option, all directories are used, with \fB/\fR characters
|
||||||
translated to '#' characters, '.' directory components removed and '..'
|
translated to \fB#\fR characters, \fI.\fR directory components
|
||||||
components renamed to '^'. This is useful if sourcefiles are in several
|
removed and \fI..\fR
|
||||||
different directories. It also affects the \fB\-l\fR option.
|
components renamed to \fB^\fR. This is useful if sourcefiles are in several
|
||||||
|
different directories. It also affects the \fB\-l\fR option.
|
||||||
.IP "\fB\-f\fR" 4
|
.IP "\fB\-f\fR" 4
|
||||||
.IX Item "-f"
|
.IX Item "-f"
|
||||||
.PD 0
|
.PD 0
|
||||||
@ -292,11 +293,11 @@ Output summaries for each function in addition to the file level summary.
|
|||||||
.IX Item "--object-file file"
|
.IX Item "--object-file file"
|
||||||
.PD
|
.PD
|
||||||
Specify either the directory containing the gcov data files, or the
|
Specify either the directory containing the gcov data files, or the
|
||||||
object path name. The \fI.gcno\fR, and
|
object path name. The \fI.gcno\fR, and
|
||||||
\&\fI.gcda\fR data files are searched for using this option. If a directory
|
\&\fI.gcda\fR data files are searched for using this option. If a directory
|
||||||
is specified, the data files are in that directory and named after the
|
is specified, the data files are in that directory and named after the
|
||||||
source file name, without its extension. If a file is specified here,
|
source file name, without its extension. If a file is specified here,
|
||||||
the data files are named after that file, without its extension. If this
|
the data files are named after that file, without its extension. If this
|
||||||
option is not supplied, it defaults to the current directory.
|
option is not supplied, it defaults to the current directory.
|
||||||
.IP "\fB\-u\fR" 4
|
.IP "\fB\-u\fR" 4
|
||||||
.IX Item "-u"
|
.IX Item "-u"
|
||||||
@ -304,35 +305,53 @@ option is not supplied, it defaults to the current directory.
|
|||||||
.IP "\fB\-\-unconditional\-branches\fR" 4
|
.IP "\fB\-\-unconditional\-branches\fR" 4
|
||||||
.IX Item "--unconditional-branches"
|
.IX Item "--unconditional-branches"
|
||||||
.PD
|
.PD
|
||||||
When branch counts are given, include those of unconditional branches.
|
When branch probabilities are given, include those of unconditional branches.
|
||||||
Unconditional branches are normally not interesting.
|
Unconditional branches are normally not interesting.
|
||||||
.PP
|
.PP
|
||||||
\&\fBgcov\fR should be run with the current directory the same as that
|
\&\fBgcov\fR should be run with the current directory the same as that
|
||||||
when you invoked the compiler. Otherwise it will not be able to locate
|
when you invoked the compiler. Otherwise it will not be able to locate
|
||||||
the source files. \fBgcov\fR produces files called
|
the source files. \fBgcov\fR produces files called
|
||||||
\&\fI\fImangledname\fI.gcov\fR in the current directory. These contain
|
\&\fI\fImangledname\fI.gcov\fR in the current directory. These contain
|
||||||
the coverage information of the source file they correspond to.
|
the coverage information of the source file they correspond to.
|
||||||
One \fI.gcov\fR file is produced for each source file containing code,
|
One \fI.gcov\fR file is produced for each source file containing code,
|
||||||
which was compiled to produce the data files. The \fImangledname\fR part
|
which was compiled to produce the data files. The \fImangledname\fR part
|
||||||
of the output file name is usually simply the source file name, but can
|
of the output file name is usually simply the source file name, but can
|
||||||
be something more complicated if the \fB\-l\fR or \fB\-p\fR options are
|
be something more complicated if the \fB\-l\fR or \fB\-p\fR options are
|
||||||
given. Refer to those options for details.
|
given. Refer to those options for details.
|
||||||
.PP
|
.PP
|
||||||
The \fI.gcov\fR files contain the ':' separated fields along with
|
The \fI.gcov\fR files contain the \fB:\fR separated fields along with
|
||||||
program source code. The format is
|
program source code. The format is
|
||||||
.PP
|
.PP
|
||||||
.Vb 1
|
.Vb 1
|
||||||
\& <execution_count>:<line_number>:<source line text>
|
\& <execution_count>:<line_number>:<source line text>
|
||||||
.Ve
|
.Ve
|
||||||
.PP
|
.PP
|
||||||
Additional block information may succeed each line, when requested by
|
Additional block information may succeed each line, when requested by
|
||||||
command line option. The \fIexecution_count\fR is \fB\-\fR for lines
|
command line option. The \fIexecution_count\fR is \fB\-\fR for lines
|
||||||
containing no code and \fB#####\fR for lines which were never
|
containing no code and \fB#####\fR for lines which were never executed.
|
||||||
executed. Some lines of information at the start have \fIline_number\fR
|
Some lines of information at the start have \fIline_number\fR of zero.
|
||||||
of zero.
|
.PP
|
||||||
|
The preamble lines are of the form
|
||||||
|
.PP
|
||||||
|
.Vb 1
|
||||||
|
\& -:0:<tag>:<value>
|
||||||
|
.Ve
|
||||||
|
.PP
|
||||||
|
The ordering and number of these preamble lines will be augmented as
|
||||||
|
\&\fBgcov\fR development progresses \-\-\- do not rely on them remaining
|
||||||
|
unchanged. Use \fItag\fR to locate a particular preamble line.
|
||||||
|
.PP
|
||||||
|
The additional block information is of the form
|
||||||
|
.PP
|
||||||
|
.Vb 1
|
||||||
|
\& <tag> <information>
|
||||||
|
.Ve
|
||||||
|
.PP
|
||||||
|
The \fIinformation\fR is human readable, but designed to be simple
|
||||||
|
enough for machine parsing too.
|
||||||
.PP
|
.PP
|
||||||
When printing percentages, 0% and 100% are only printed when the values
|
When printing percentages, 0% and 100% are only printed when the values
|
||||||
are \fIexactly\fR 0% and 100% respectively. Other values which would
|
are \fIexactly\fR 0% and 100% respectively. Other values which would
|
||||||
conventionally be rounded to 0% or 100% are instead printed as the
|
conventionally be rounded to 0% or 100% are instead printed as the
|
||||||
nearest non-boundary value.
|
nearest non-boundary value.
|
||||||
.PP
|
.PP
|
||||||
@ -364,7 +383,7 @@ is what you see when you use the basic \fBgcov\fR facility:
|
|||||||
The file \fItmp.c.gcov\fR contains output from \fBgcov\fR.
|
The file \fItmp.c.gcov\fR contains output from \fBgcov\fR.
|
||||||
Here is a sample:
|
Here is a sample:
|
||||||
.PP
|
.PP
|
||||||
.Vb 23
|
.Vb 22
|
||||||
\& -: 0:Source:tmp.c
|
\& -: 0:Source:tmp.c
|
||||||
\& -: 0:Graph:tmp.gcno
|
\& -: 0:Graph:tmp.gcno
|
||||||
\& -: 0:Data:tmp.gcda
|
\& -: 0:Data:tmp.gcda
|
||||||
@ -373,7 +392,6 @@ Here is a sample:
|
|||||||
\& -: 1:#include <stdio.h>
|
\& -: 1:#include <stdio.h>
|
||||||
\& -: 2:
|
\& -: 2:
|
||||||
\& -: 3:int main (void)
|
\& -: 3:int main (void)
|
||||||
\& function main called 1 returned 1 blocks executed 75%
|
|
||||||
\& 1: 4:{
|
\& 1: 4:{
|
||||||
\& 1: 5: int i, total;
|
\& 1: 5: int i, total;
|
||||||
\& -: 6:
|
\& -: 6:
|
||||||
@ -393,7 +411,7 @@ Here is a sample:
|
|||||||
When you use the \fB\-a\fR option, you will get individual block
|
When you use the \fB\-a\fR option, you will get individual block
|
||||||
counts, and the output looks like this:
|
counts, and the output looks like this:
|
||||||
.PP
|
.PP
|
||||||
.Vb 30
|
.Vb 29
|
||||||
\& -: 0:Source:tmp.c
|
\& -: 0:Source:tmp.c
|
||||||
\& -: 0:Graph:tmp.gcno
|
\& -: 0:Graph:tmp.gcno
|
||||||
\& -: 0:Data:tmp.gcda
|
\& -: 0:Data:tmp.gcda
|
||||||
@ -402,7 +420,6 @@ counts, and the output looks like this:
|
|||||||
\& -: 1:#include <stdio.h>
|
\& -: 1:#include <stdio.h>
|
||||||
\& -: 2:
|
\& -: 2:
|
||||||
\& -: 3:int main (void)
|
\& -: 3:int main (void)
|
||||||
\& function main called 1 returned 1 blocks executed 75%
|
|
||||||
\& 1: 4:{
|
\& 1: 4:{
|
||||||
\& 1: 4-block 0
|
\& 1: 4-block 0
|
||||||
\& 1: 5: int i, total;
|
\& 1: 5: int i, total;
|
||||||
@ -427,11 +444,11 @@ counts, and the output looks like this:
|
|||||||
.Ve
|
.Ve
|
||||||
.PP
|
.PP
|
||||||
In this mode, each basic block is only shown on one line \*(-- the last
|
In this mode, each basic block is only shown on one line \*(-- the last
|
||||||
line of the block. A multi-line block will only contribute to the
|
line of the block. A multi-line block will only contribute to the
|
||||||
execution count of that last line, and other lines will not be shown
|
execution count of that last line, and other lines will not be shown
|
||||||
to contain code, unless previous blocks end on those lines.
|
to contain code, unless previous blocks end on those lines.
|
||||||
The total execution count of a line is shown and subsequent lines show
|
The total execution count of a line is shown and subsequent lines show
|
||||||
the execution counts for individual blocks that end on that line. After each
|
the execution counts for individual blocks that end on that line. After each
|
||||||
block, the branch and call counts of the block will be shown, if the
|
block, the branch and call counts of the block will be shown, if the
|
||||||
\&\fB\-b\fR option is given.
|
\&\fB\-b\fR option is given.
|
||||||
.PP
|
.PP
|
||||||
@ -484,6 +501,10 @@ Here is a sample of a resulting \fItmp.c.gcov\fR file:
|
|||||||
\& -: 17:}
|
\& -: 17:}
|
||||||
.Ve
|
.Ve
|
||||||
.PP
|
.PP
|
||||||
|
For each function, a line is printed showing how many times the function
|
||||||
|
is called, how many times it returns and what percentage of the
|
||||||
|
function's blocks were executed.
|
||||||
|
.PP
|
||||||
For each basic block, a line is printed after the last line of the basic
|
For each basic block, a line is printed after the last line of the basic
|
||||||
block describing the branch or call that ends the basic block. There can
|
block describing the branch or call that ends the basic block. There can
|
||||||
be multiple branches and calls listed for a single source line if there
|
be multiple branches and calls listed for a single source line if there
|
||||||
@ -496,12 +517,12 @@ on the source line.
|
|||||||
For a branch, if it was executed at least once, then a percentage
|
For a branch, if it was executed at least once, then a percentage
|
||||||
indicating the number of times the branch was taken divided by the
|
indicating the number of times the branch was taken divided by the
|
||||||
number of times the branch was executed will be printed. Otherwise, the
|
number of times the branch was executed will be printed. Otherwise, the
|
||||||
message ``never executed'' is printed.
|
message \*(L"never executed\*(R" is printed.
|
||||||
.PP
|
.PP
|
||||||
For a call, if it was executed at least once, then a percentage
|
For a call, if it was executed at least once, then a percentage
|
||||||
indicating the number of times the call returned divided by the number
|
indicating the number of times the call returned divided by the number
|
||||||
of times the call was executed will be printed. This will usually be
|
of times the call was executed will be printed. This will usually be
|
||||||
100%, but may be less for functions call \f(CW\*(C`exit\*(C'\fR or \f(CW\*(C`longjmp\*(C'\fR,
|
100%, but may be less for functions that call \f(CW\*(C`exit\*(C'\fR or \f(CW\*(C`longjmp\*(C'\fR,
|
||||||
and thus may not return every time they are called.
|
and thus may not return every time they are called.
|
||||||
.PP
|
.PP
|
||||||
The execution counts are cumulative. If the example program were
|
The execution counts are cumulative. If the example program were
|
||||||
@ -581,14 +602,14 @@ same source lines, the line counts themselves might seem inconsistent.
|
|||||||
\&\fIgpl\fR\|(7), \fIgfdl\fR\|(7), \fIfsf\-funding\fR\|(7), \fIgcc\fR\|(1) and the Info entry for \fIgcc\fR.
|
\&\fIgpl\fR\|(7), \fIgfdl\fR\|(7), \fIfsf\-funding\fR\|(7), \fIgcc\fR\|(1) and the Info entry for \fIgcc\fR.
|
||||||
.SH "COPYRIGHT"
|
.SH "COPYRIGHT"
|
||||||
.IX Header "COPYRIGHT"
|
.IX Header "COPYRIGHT"
|
||||||
Copyright (c) 1996, 1997, 1999, 2000, 2001, 2002, 2003
|
Copyright (c) 1996, 1997, 1999, 2000, 2001, 2002, 2003, 2004, 2005
|
||||||
Free Software Foundation, Inc.
|
Free Software Foundation, Inc.
|
||||||
.PP
|
.PP
|
||||||
Permission is granted to copy, distribute and/or modify this document
|
Permission is granted to copy, distribute and/or modify this document
|
||||||
under the terms of the \s-1GNU\s0 Free Documentation License, Version 1.2 or
|
under the terms of the \s-1GNU\s0 Free Documentation License, Version 1.2 or
|
||||||
any later version published by the Free Software Foundation; with the
|
any later version published by the Free Software Foundation; with the
|
||||||
Invariant Sections being ``\s-1GNU\s0 General Public License'' and ``Funding
|
Invariant Sections being \*(L"\s-1GNU\s0 General Public License\*(R" and \*(L"Funding
|
||||||
Free Software'', the Front-Cover texts being (a) (see below), and with
|
Free Software\*(R", the Front-Cover texts being (a) (see below), and with
|
||||||
the Back-Cover Texts being (b) (see below). A copy of the license is
|
the Back-Cover Texts being (b) (see below). A copy of the license is
|
||||||
included in the \fIgfdl\fR\|(7) man page.
|
included in the \fIgfdl\fR\|(7) man page.
|
||||||
.PP
|
.PP
|
||||||
|
@ -14289,7 +14289,9 @@ dwarf2out_finish (const char *filename)
|
|||||||
else if (TYPE_P (node->created_for))
|
else if (TYPE_P (node->created_for))
|
||||||
context = TYPE_CONTEXT (node->created_for);
|
context = TYPE_CONTEXT (node->created_for);
|
||||||
|
|
||||||
gcc_assert (context && TREE_CODE (context) == FUNCTION_DECL);
|
gcc_assert (context
|
||||||
|
&& (TREE_CODE (context) == FUNCTION_DECL
|
||||||
|
|| TREE_CODE (context) == NAMESPACE_DECL));
|
||||||
|
|
||||||
origin = lookup_decl_die (context);
|
origin = lookup_decl_die (context);
|
||||||
if (origin)
|
if (origin)
|
||||||
|
@ -1005,7 +1005,11 @@ duplicate_eh_regions (struct function *ifun, duplicate_eh_regions_map map,
|
|||||||
for (prev_try = VEC_index (eh_region, cfun->eh->region_array, outer_region);
|
for (prev_try = VEC_index (eh_region, cfun->eh->region_array, outer_region);
|
||||||
prev_try && prev_try->type != ERT_TRY;
|
prev_try && prev_try->type != ERT_TRY;
|
||||||
prev_try = prev_try->outer)
|
prev_try = prev_try->outer)
|
||||||
;
|
if (prev_try->type == ERT_MUST_NOT_THROW)
|
||||||
|
{
|
||||||
|
prev_try = NULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
/* Remap all of the internal catch and cleanup linkages. Since we
|
/* Remap all of the internal catch and cleanup linkages. Since we
|
||||||
duplicate entire subtrees, all of the referenced regions will have
|
duplicate entire subtrees, all of the referenced regions will have
|
||||||
|
@ -4450,13 +4450,24 @@ merge_ranges (int *pin_p, tree *plow, tree *phigh, int in0_p, tree low0,
|
|||||||
{
|
{
|
||||||
low = range_successor (high1);
|
low = range_successor (high1);
|
||||||
high = high0;
|
high = high0;
|
||||||
in_p = (low != 0);
|
in_p = 1;
|
||||||
|
if (low == 0)
|
||||||
|
{
|
||||||
|
/* We are in the weird situation where high0 > high1 but
|
||||||
|
high1 has no successor. Punt. */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (! subset || highequal)
|
else if (! subset || highequal)
|
||||||
{
|
{
|
||||||
low = low0;
|
low = low0;
|
||||||
high = range_predecessor (low1);
|
high = range_predecessor (low1);
|
||||||
in_p = (high != 0);
|
in_p = 1;
|
||||||
|
if (high == 0)
|
||||||
|
{
|
||||||
|
/* low0 < low1 but low1 has no predecessor. Punt. */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return 0;
|
return 0;
|
||||||
@ -4476,7 +4487,12 @@ merge_ranges (int *pin_p, tree *plow, tree *phigh, int in0_p, tree low0,
|
|||||||
{
|
{
|
||||||
low = range_successor (high0);
|
low = range_successor (high0);
|
||||||
high = high1;
|
high = high1;
|
||||||
in_p = (low != 0);
|
in_p = 1;
|
||||||
|
if (low == 0)
|
||||||
|
{
|
||||||
|
/* high1 > high0 but high0 has no successor. Punt. */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -12634,9 +12650,14 @@ tree_expr_nonnegative_warnv_p (tree t, bool *strict_overflow_p)
|
|||||||
/* ... fall through ... */
|
/* ... fall through ... */
|
||||||
|
|
||||||
default:
|
default:
|
||||||
if (truth_value_p (TREE_CODE (t)))
|
{
|
||||||
/* Truth values evaluate to 0 or 1, which is nonnegative. */
|
tree type = TREE_TYPE (t);
|
||||||
return 1;
|
if ((TYPE_PRECISION (type) != 1 || TYPE_UNSIGNED (type))
|
||||||
|
&& truth_value_p (TREE_CODE (t)))
|
||||||
|
/* Truth values evaluate to 0 or 1, which is nonnegative unless we
|
||||||
|
have a signed:1 type (where the value is -1 and 0). */
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We don't know sign of `t', so be conservative and return false. */
|
/* We don't know sign of `t', so be conservative and return false. */
|
||||||
|
@ -5076,6 +5076,14 @@ thread_prologue_and_epilogue_insns (rtx f ATTRIBUTE_UNUSED)
|
|||||||
/* Retain a map of the prologue insns. */
|
/* Retain a map of the prologue insns. */
|
||||||
record_insns (seq, &prologue);
|
record_insns (seq, &prologue);
|
||||||
prologue_end = emit_note (NOTE_INSN_PROLOGUE_END);
|
prologue_end = emit_note (NOTE_INSN_PROLOGUE_END);
|
||||||
|
|
||||||
|
#ifndef PROFILE_BEFORE_PROLOGUE
|
||||||
|
/* Ensure that instructions are not moved into the prologue when
|
||||||
|
profiling is on. The call to the profiling routine can be
|
||||||
|
emitted within the live range of a call-clobbered register. */
|
||||||
|
if (current_function_profile)
|
||||||
|
emit_insn (gen_rtx_ASM_INPUT (VOIDmode, ""));
|
||||||
|
#endif
|
||||||
|
|
||||||
seq = get_insns ();
|
seq = get_insns ();
|
||||||
end_sequence ();
|
end_sequence ();
|
||||||
|
@ -4053,6 +4053,19 @@ gimplify_asm_expr (tree *expr_p, tree *pre_p, tree *post_p)
|
|||||||
parse_input_constraint (&constraint, 0, 0, noutputs, 0,
|
parse_input_constraint (&constraint, 0, 0, noutputs, 0,
|
||||||
oconstraints, &allows_mem, &allows_reg);
|
oconstraints, &allows_mem, &allows_reg);
|
||||||
|
|
||||||
|
/* If we can't make copies, we can only accept memory. */
|
||||||
|
if (TREE_ADDRESSABLE (TREE_TYPE (TREE_VALUE (link))))
|
||||||
|
{
|
||||||
|
if (allows_mem)
|
||||||
|
allows_reg = 0;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
error ("impossible constraint in %<asm%>");
|
||||||
|
error ("non-memory input %d must stay in memory", i);
|
||||||
|
return GS_ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* If the operand is a memory input, it should be an lvalue. */
|
/* If the operand is a memory input, it should be an lvalue. */
|
||||||
if (!allows_reg && allows_mem)
|
if (!allows_reg && allows_mem)
|
||||||
{
|
{
|
||||||
@ -4802,7 +4815,20 @@ gimplify_adjust_omp_clauses_1 (splay_tree_node n, void *data)
|
|||||||
else if (flags & GOVD_SHARED)
|
else if (flags & GOVD_SHARED)
|
||||||
{
|
{
|
||||||
if (is_global_var (decl))
|
if (is_global_var (decl))
|
||||||
return 0;
|
{
|
||||||
|
struct gimplify_omp_ctx *ctx = gimplify_omp_ctxp->outer_context;
|
||||||
|
while (ctx != NULL)
|
||||||
|
{
|
||||||
|
splay_tree_node on
|
||||||
|
= splay_tree_lookup (ctx->variables, (splay_tree_key) decl);
|
||||||
|
if (on && (on->value & (GOVD_FIRSTPRIVATE | GOVD_LASTPRIVATE
|
||||||
|
| GOVD_PRIVATE | GOVD_REDUCTION)) != 0)
|
||||||
|
break;
|
||||||
|
ctx = ctx->outer_context;
|
||||||
|
}
|
||||||
|
if (ctx == NULL)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
code = OMP_CLAUSE_SHARED;
|
code = OMP_CLAUSE_SHARED;
|
||||||
}
|
}
|
||||||
else if (flags & GOVD_PRIVATE)
|
else if (flags & GOVD_PRIVATE)
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* POSIX threads dummy routines for systems without weak definitions. */
|
/* POSIX threads dummy routines for systems without weak definitions. */
|
||||||
/* Compile this one with gcc. */
|
/* Compile this one with gcc. */
|
||||||
/* Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc.
|
/* Copyright (C) 2003, 2004, 2005, 2007 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GCC.
|
This file is part of GCC.
|
||||||
|
|
||||||
@ -28,6 +28,7 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
|
|||||||
|
|
||||||
#include "tconfig.h"
|
#include "tconfig.h"
|
||||||
#include "tm.h"
|
#include "tm.h"
|
||||||
|
# define __gthrw_pragma(pragma) _Pragma (#pragma)
|
||||||
/* Define so we provide weak definitions of functions used by libobjc only. */
|
/* Define so we provide weak definitions of functions used by libobjc only. */
|
||||||
#define _LIBOBJC_WEAK
|
#define _LIBOBJC_WEAK
|
||||||
#include "gthr.h"
|
#include "gthr.h"
|
||||||
@ -75,7 +76,7 @@ pthread_create (pthread_t *thread ATTRIBUTE_UNUSED,
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
pthread_cancel(pthread_t thread ATTRIBUTE_UNUSED)
|
pthread_cancel (pthread_t thread ATTRIBUTE_UNUSED)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* Threads compatibility routines for libgcc2 and libobjc. */
|
/* Threads compatibility routines for libgcc2 and libobjc. */
|
||||||
/* Compile this one with gcc. */
|
/* Compile this one with gcc. */
|
||||||
/* Copyright (C) 1997, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
|
/* Copyright (C) 1997, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
|
||||||
Free Software Foundation, Inc.
|
Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GCC.
|
This file is part of GCC.
|
||||||
@ -59,8 +59,12 @@ typedef pthread_mutex_t __gthread_recursive_mutex_t;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if SUPPORTS_WEAK && GTHREAD_USE_WEAK
|
#if SUPPORTS_WEAK && GTHREAD_USE_WEAK
|
||||||
|
# ifndef __gthrw_pragma
|
||||||
|
# define __gthrw_pragma(pragma)
|
||||||
|
# endif
|
||||||
# define __gthrw2(name,name2,type) \
|
# define __gthrw2(name,name2,type) \
|
||||||
static __typeof(type) name __attribute__ ((__weakref__(#name2)));
|
static __typeof(type) name __attribute__ ((__weakref__(#name2))); \
|
||||||
|
__gthrw_pragma(weak type)
|
||||||
# define __gthrw_(name) __gthrw_ ## name
|
# define __gthrw_(name) __gthrw_ ## name
|
||||||
#else
|
#else
|
||||||
# define __gthrw2(name,name2,type)
|
# define __gthrw2(name,name2,type)
|
||||||
|
@ -1490,7 +1490,7 @@ implies_p (rtx a, rtx b)
|
|||||||
mode = VOIDmode;
|
mode = VOIDmode;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mode != VOIDmode
|
if (SCALAR_INT_MODE_P (mode)
|
||||||
&& rtx_equal_p (op1, opb1)
|
&& rtx_equal_p (op1, opb1)
|
||||||
&& simplify_gen_binary (MINUS, mode, opb0, op0) == const1_rtx)
|
&& simplify_gen_binary (MINUS, mode, opb0, op0) == const1_rtx)
|
||||||
return true;
|
return true;
|
||||||
|
@ -1,3 +1,7 @@
|
|||||||
|
2007-07-19 Release Manager
|
||||||
|
|
||||||
|
* GCC 4.2.1 released.
|
||||||
|
|
||||||
2007-05-13 Release Manager
|
2007-05-13 Release Manager
|
||||||
|
|
||||||
* GCC 4.2.0 released.
|
* GCC 4.2.0 released.
|
||||||
|
@ -384,9 +384,12 @@ determine_parallel_type (struct omp_region *region)
|
|||||||
|
|
||||||
if (single_succ (par_entry_bb) == ws_entry_bb
|
if (single_succ (par_entry_bb) == ws_entry_bb
|
||||||
&& single_succ (ws_exit_bb) == par_exit_bb
|
&& single_succ (ws_exit_bb) == par_exit_bb
|
||||||
&& workshare_safe_to_combine_p (par_entry_bb, ws_entry_bb))
|
&& workshare_safe_to_combine_p (par_entry_bb, ws_entry_bb)
|
||||||
|
&& (OMP_PARALLEL_COMBINED (last_stmt (par_entry_bb))
|
||||||
|
|| (last_and_only_stmt (ws_entry_bb)
|
||||||
|
&& last_and_only_stmt (par_exit_bb))))
|
||||||
{
|
{
|
||||||
tree ws_stmt = last_stmt (region->inner->entry);
|
tree ws_stmt = last_stmt (ws_entry_bb);
|
||||||
|
|
||||||
if (region->inner->type == OMP_FOR)
|
if (region->inner->type == OMP_FOR)
|
||||||
{
|
{
|
||||||
@ -1505,9 +1508,9 @@ lookup_decl_in_outer_ctx (tree decl, omp_context *ctx)
|
|||||||
for (up = ctx->outer, t = NULL; up && t == NULL; up = up->outer)
|
for (up = ctx->outer, t = NULL; up && t == NULL; up = up->outer)
|
||||||
t = maybe_lookup_decl (decl, up);
|
t = maybe_lookup_decl (decl, up);
|
||||||
|
|
||||||
gcc_assert (t);
|
gcc_assert (t || is_global_var (decl));
|
||||||
|
|
||||||
return t;
|
return t ? t : decl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -4119,6 +4122,28 @@ lower_omp_for (tree *stmt_p, omp_context *ctx)
|
|||||||
*stmt_p = new_stmt;
|
*stmt_p = new_stmt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Callback for walk_stmts. Check if *TP only contains OMP_FOR
|
||||||
|
or OMP_PARALLEL. */
|
||||||
|
|
||||||
|
static tree
|
||||||
|
check_combined_parallel (tree *tp, int *walk_subtrees, void *data)
|
||||||
|
{
|
||||||
|
struct walk_stmt_info *wi = data;
|
||||||
|
int *info = wi->info;
|
||||||
|
|
||||||
|
*walk_subtrees = 0;
|
||||||
|
switch (TREE_CODE (*tp))
|
||||||
|
{
|
||||||
|
case OMP_FOR:
|
||||||
|
case OMP_SECTIONS:
|
||||||
|
*info = *info == 0 ? 1 : -1;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
*info = -1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/* Lower the OpenMP parallel directive in *STMT_P. CTX holds context
|
/* Lower the OpenMP parallel directive in *STMT_P. CTX holds context
|
||||||
information for the directive. */
|
information for the directive. */
|
||||||
@ -4136,6 +4161,19 @@ lower_omp_parallel (tree *stmt_p, omp_context *ctx)
|
|||||||
par_bind = OMP_PARALLEL_BODY (stmt);
|
par_bind = OMP_PARALLEL_BODY (stmt);
|
||||||
par_body = BIND_EXPR_BODY (par_bind);
|
par_body = BIND_EXPR_BODY (par_bind);
|
||||||
child_fn = ctx->cb.dst_fn;
|
child_fn = ctx->cb.dst_fn;
|
||||||
|
if (!OMP_PARALLEL_COMBINED (stmt))
|
||||||
|
{
|
||||||
|
struct walk_stmt_info wi;
|
||||||
|
int ws_num = 0;
|
||||||
|
|
||||||
|
memset (&wi, 0, sizeof (wi));
|
||||||
|
wi.callback = check_combined_parallel;
|
||||||
|
wi.info = &ws_num;
|
||||||
|
wi.val_only = true;
|
||||||
|
walk_stmts (&wi, &par_bind);
|
||||||
|
if (ws_num == 1)
|
||||||
|
OMP_PARALLEL_COMBINED (stmt) = 1;
|
||||||
|
}
|
||||||
|
|
||||||
push_gimplify_context ();
|
push_gimplify_context ();
|
||||||
|
|
||||||
|
@ -22,13 +22,12 @@ Boston, MA 02110-1301, USA. */
|
|||||||
#include "system.h"
|
#include "system.h"
|
||||||
#include "pointer-set.h"
|
#include "pointer-set.h"
|
||||||
|
|
||||||
/* A pointer sets is represented as a simple open-addressing hash
|
/* A pointer set is represented as a simple open-addressing hash
|
||||||
table. Simplifications: The hash code is based on the value of the
|
table. Simplifications: The hash code is based on the value of the
|
||||||
pointer, not what it points to. The number of buckets is always a
|
pointer, not what it points to. The number of buckets is always a
|
||||||
power of 2. Null pointers are a reserved value. Deletion is not
|
power of 2. Null pointers are a reserved value. Deletion is not
|
||||||
supported. There is no mechanism for user control of hash
|
supported (yet). There is no mechanism for user control of hash
|
||||||
function, equality comparison, initial size, or resizing policy.
|
function, equality comparison, initial size, or resizing policy. */
|
||||||
*/
|
|
||||||
|
|
||||||
struct pointer_set_t
|
struct pointer_set_t
|
||||||
{
|
{
|
||||||
@ -114,22 +113,16 @@ pointer_set_contains (struct pointer_set_t *pset, void *p)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Subroutine of pointer_set_insert. Inserts P into an empty
|
/* Subroutine of pointer_set_insert. Return the insertion slot for P into
|
||||||
element of SLOTS, an array of length N_SLOTS. Returns nonzero
|
an empty element of SLOTS, an array of length N_SLOTS. */
|
||||||
if P was already present in N_SLOTS. */
|
static inline size_t
|
||||||
static int
|
|
||||||
insert_aux (void *p, void **slots, size_t n_slots, size_t log_slots)
|
insert_aux (void *p, void **slots, size_t n_slots, size_t log_slots)
|
||||||
{
|
{
|
||||||
size_t n = hash1 (p, n_slots, log_slots);
|
size_t n = hash1 (p, n_slots, log_slots);
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
if (slots[n] == p)
|
if (slots[n] == p || slots[n] == 0)
|
||||||
return 1;
|
return n;
|
||||||
else if (slots[n] == 0)
|
|
||||||
{
|
|
||||||
slots[n] = p;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
++n;
|
++n;
|
||||||
@ -144,12 +137,10 @@ insert_aux (void *p, void **slots, size_t n_slots, size_t log_slots)
|
|||||||
int
|
int
|
||||||
pointer_set_insert (struct pointer_set_t *pset, void *p)
|
pointer_set_insert (struct pointer_set_t *pset, void *p)
|
||||||
{
|
{
|
||||||
if (insert_aux (p, pset->slots, pset->n_slots, pset->log_slots))
|
size_t n;
|
||||||
return 1;
|
|
||||||
|
/* For simplicity, expand the set even if P is already there. This can be
|
||||||
/* We've inserted a new element. Expand the table if necessary to keep
|
superfluous but can happen at most once. */
|
||||||
the load factor small. */
|
|
||||||
++pset->n_elements;
|
|
||||||
if (pset->n_elements > pset->n_slots / 4)
|
if (pset->n_elements > pset->n_slots / 4)
|
||||||
{
|
{
|
||||||
size_t new_log_slots = pset->log_slots + 1;
|
size_t new_log_slots = pset->log_slots + 1;
|
||||||
@ -158,9 +149,10 @@ pointer_set_insert (struct pointer_set_t *pset, void *p)
|
|||||||
size_t i;
|
size_t i;
|
||||||
|
|
||||||
for (i = 0; i < pset->n_slots; ++i)
|
for (i = 0; i < pset->n_slots; ++i)
|
||||||
{
|
{
|
||||||
if (pset->slots[i])
|
void *value = pset->slots[i];
|
||||||
insert_aux (pset->slots[i], new_slots, new_n_slots, new_log_slots);
|
n = insert_aux (value, new_slots, new_n_slots, new_log_slots);
|
||||||
|
new_slots[n] = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
XDELETEVEC (pset->slots);
|
XDELETEVEC (pset->slots);
|
||||||
@ -169,5 +161,144 @@ pointer_set_insert (struct pointer_set_t *pset, void *p)
|
|||||||
pset->slots = new_slots;
|
pset->slots = new_slots;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
n = insert_aux (p, pset->slots, pset->n_slots, pset->log_slots);
|
||||||
|
if (pset->slots[n])
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
pset->slots[n] = p;
|
||||||
|
++pset->n_elements;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Pass each pointer in PSET to the function in FN, together with the fixed
|
||||||
|
parameter DATA. If FN returns false, the iteration stops. */
|
||||||
|
|
||||||
|
void pointer_set_traverse (struct pointer_set_t *pset,
|
||||||
|
bool (*fn) (void *, void *), void *data)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
for (i = 0; i < pset->n_slots; ++i)
|
||||||
|
if (pset->slots[i] && !fn (pset->slots[i], data))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* A pointer map is represented the same way as a pointer_set, so
|
||||||
|
the hash code is based on the address of the key, rather than
|
||||||
|
its contents. Null keys are a reserved value. Deletion is not
|
||||||
|
supported (yet). There is no mechanism for user control of hash
|
||||||
|
function, equality comparison, initial size, or resizing policy. */
|
||||||
|
|
||||||
|
struct pointer_map_t
|
||||||
|
{
|
||||||
|
size_t log_slots;
|
||||||
|
size_t n_slots; /* n_slots = 2^log_slots */
|
||||||
|
size_t n_elements;
|
||||||
|
|
||||||
|
void **keys;
|
||||||
|
void **values;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Allocate an empty pointer map. */
|
||||||
|
struct pointer_map_t *
|
||||||
|
pointer_map_create (void)
|
||||||
|
{
|
||||||
|
struct pointer_map_t *result = XNEW (struct pointer_map_t);
|
||||||
|
|
||||||
|
result->n_elements = 0;
|
||||||
|
result->log_slots = 8;
|
||||||
|
result->n_slots = (size_t) 1 << result->log_slots;
|
||||||
|
|
||||||
|
result->keys = XCNEWVEC (void *, result->n_slots);
|
||||||
|
result->values = XCNEWVEC (void *, result->n_slots);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Reclaims all memory associated with PMAP. */
|
||||||
|
void pointer_map_destroy (struct pointer_map_t *pmap)
|
||||||
|
{
|
||||||
|
XDELETEVEC (pmap->keys);
|
||||||
|
XDELETEVEC (pmap->values);
|
||||||
|
XDELETE (pmap);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Returns a pointer to the value to which P maps, if PMAP contains P. P
|
||||||
|
must be nonnull. Return NULL if PMAP does not contain P.
|
||||||
|
|
||||||
|
Collisions are resolved by linear probing. */
|
||||||
|
void **
|
||||||
|
pointer_map_contains (struct pointer_map_t *pmap, void *p)
|
||||||
|
{
|
||||||
|
size_t n = hash1 (p, pmap->n_slots, pmap->log_slots);
|
||||||
|
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
if (pmap->keys[n] == p)
|
||||||
|
return &pmap->values[n];
|
||||||
|
else if (pmap->keys[n] == 0)
|
||||||
|
return NULL;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
++n;
|
||||||
|
if (n == pmap->n_slots)
|
||||||
|
n = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Inserts P into PMAP if it wasn't already there. Returns a pointer
|
||||||
|
to the value. P must be nonnull. */
|
||||||
|
void **
|
||||||
|
pointer_map_insert (struct pointer_map_t *pmap, void *p)
|
||||||
|
{
|
||||||
|
size_t n;
|
||||||
|
|
||||||
|
/* For simplicity, expand the map even if P is already there. This can be
|
||||||
|
superfluous but can happen at most once. */
|
||||||
|
if (pmap->n_elements > pmap->n_slots / 4)
|
||||||
|
{
|
||||||
|
size_t new_log_slots = pmap->log_slots + 1;
|
||||||
|
size_t new_n_slots = pmap->n_slots * 2;
|
||||||
|
void **new_keys = XCNEWVEC (void *, new_n_slots);
|
||||||
|
void **new_values = XCNEWVEC (void *, new_n_slots);
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < pmap->n_slots; ++i)
|
||||||
|
if (pmap->keys[i])
|
||||||
|
{
|
||||||
|
void *key = pmap->keys[i];
|
||||||
|
n = insert_aux (key, new_keys, new_n_slots, new_log_slots);
|
||||||
|
new_keys[n] = key;
|
||||||
|
new_values[n] = pmap->values[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
XDELETEVEC (pmap->keys);
|
||||||
|
XDELETEVEC (pmap->values);
|
||||||
|
pmap->n_slots = new_n_slots;
|
||||||
|
pmap->log_slots = new_log_slots;
|
||||||
|
pmap->keys = new_keys;
|
||||||
|
pmap->values = new_values;
|
||||||
|
}
|
||||||
|
|
||||||
|
n = insert_aux (p, pmap->keys, pmap->n_slots, pmap->log_slots);
|
||||||
|
if (!pmap->keys[n])
|
||||||
|
{
|
||||||
|
++pmap->n_elements;
|
||||||
|
pmap->keys[n] = p;
|
||||||
|
}
|
||||||
|
|
||||||
|
return &pmap->values[n];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Pass each pointer in PMAP to the function in FN, together with the pointer
|
||||||
|
to the value and the fixed parameter DATA. If FN returns false, the
|
||||||
|
iteration stops. */
|
||||||
|
|
||||||
|
void pointer_map_traverse (struct pointer_map_t *pmap,
|
||||||
|
bool (*fn) (void *, void **, void *), void *data)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
for (i = 0; i < pmap->n_slots; ++i)
|
||||||
|
if (pmap->keys[i] && !fn (pmap->keys[i], &pmap->values[i], data))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
@ -22,11 +22,21 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
|
|||||||
#define POINTER_SET_H
|
#define POINTER_SET_H
|
||||||
|
|
||||||
struct pointer_set_t;
|
struct pointer_set_t;
|
||||||
|
|
||||||
struct pointer_set_t *pointer_set_create (void);
|
struct pointer_set_t *pointer_set_create (void);
|
||||||
void pointer_set_destroy (struct pointer_set_t *pset);
|
void pointer_set_destroy (struct pointer_set_t *pset);
|
||||||
|
|
||||||
int pointer_set_contains (struct pointer_set_t *pset, void *p);
|
int pointer_set_contains (struct pointer_set_t *pset, void *p);
|
||||||
int pointer_set_insert (struct pointer_set_t *pset, void *p);
|
int pointer_set_insert (struct pointer_set_t *pset, void *p);
|
||||||
|
void pointer_set_traverse (struct pointer_set_t *, bool (*) (void *, void *),
|
||||||
|
void *);
|
||||||
|
|
||||||
|
struct pointer_map_t;
|
||||||
|
struct pointer_map_t *pointer_map_create (void);
|
||||||
|
void pointer_map_destroy (struct pointer_map_t *pmap);
|
||||||
|
|
||||||
|
void **pointer_map_contains (struct pointer_map_t *pmap, void *p);
|
||||||
|
void **pointer_map_insert (struct pointer_map_t *pmap, void *p);
|
||||||
|
void pointer_map_traverse (struct pointer_map_t *,
|
||||||
|
bool (*) (void *, void **, void *), void *);
|
||||||
|
|
||||||
#endif /* POINTER_SET_H */
|
#endif /* POINTER_SET_H */
|
||||||
|
@ -1180,7 +1180,7 @@ push_reload (rtx in, rtx out, rtx *inloc, rtx *outloc,
|
|||||||
|
|
||||||
/* If IN appears in OUT, we can't share any input-only reload for IN. */
|
/* If IN appears in OUT, we can't share any input-only reload for IN. */
|
||||||
if (in != 0 && out != 0 && MEM_P (out)
|
if (in != 0 && out != 0 && MEM_P (out)
|
||||||
&& (REG_P (in) || MEM_P (in))
|
&& (REG_P (in) || MEM_P (in) || GET_CODE (in) == PLUS)
|
||||||
&& reg_overlap_mentioned_for_reload_p (in, XEXP (out, 0)))
|
&& reg_overlap_mentioned_for_reload_p (in, XEXP (out, 0)))
|
||||||
dont_share = 1;
|
dont_share = 1;
|
||||||
|
|
||||||
@ -6540,7 +6540,8 @@ reg_overlap_mentioned_for_reload_p (rtx x, rtx in)
|
|||||||
if (REG_P (in))
|
if (REG_P (in))
|
||||||
return 0;
|
return 0;
|
||||||
else if (GET_CODE (in) == PLUS)
|
else if (GET_CODE (in) == PLUS)
|
||||||
return (reg_overlap_mentioned_for_reload_p (x, XEXP (in, 0))
|
return (rtx_equal_p (x, in)
|
||||||
|
|| reg_overlap_mentioned_for_reload_p (x, XEXP (in, 0))
|
||||||
|| reg_overlap_mentioned_for_reload_p (x, XEXP (in, 1)));
|
|| reg_overlap_mentioned_for_reload_p (x, XEXP (in, 1)));
|
||||||
else return (reg_overlap_mentioned_for_reload_p (XEXP (x, 0), in)
|
else return (reg_overlap_mentioned_for_reload_p (XEXP (x, 0), in)
|
||||||
|| reg_overlap_mentioned_for_reload_p (XEXP (x, 1), in));
|
|| reg_overlap_mentioned_for_reload_p (XEXP (x, 1), in));
|
||||||
|
@ -113,7 +113,8 @@ static bool if_convertible_stmt_p (struct loop *, basic_block, tree);
|
|||||||
static bool if_convertible_bb_p (struct loop *, basic_block, basic_block);
|
static bool if_convertible_bb_p (struct loop *, basic_block, basic_block);
|
||||||
static bool if_convertible_loop_p (struct loop *, bool);
|
static bool if_convertible_loop_p (struct loop *, bool);
|
||||||
static void add_to_predicate_list (basic_block, tree);
|
static void add_to_predicate_list (basic_block, tree);
|
||||||
static tree add_to_dst_predicate_list (struct loop * loop, basic_block, tree, tree,
|
static tree add_to_dst_predicate_list (struct loop * loop, edge,
|
||||||
|
tree, tree,
|
||||||
block_stmt_iterator *);
|
block_stmt_iterator *);
|
||||||
static void clean_predicate_lists (struct loop *loop);
|
static void clean_predicate_lists (struct loop *loop);
|
||||||
static basic_block find_phi_replacement_condition (struct loop *loop,
|
static basic_block find_phi_replacement_condition (struct loop *loop,
|
||||||
@ -143,7 +144,6 @@ tree_if_conversion (struct loop *loop, bool for_vectorizer)
|
|||||||
{
|
{
|
||||||
basic_block bb;
|
basic_block bb;
|
||||||
block_stmt_iterator itr;
|
block_stmt_iterator itr;
|
||||||
tree cond;
|
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
ifc_bbs = NULL;
|
ifc_bbs = NULL;
|
||||||
@ -163,11 +163,11 @@ tree_if_conversion (struct loop *loop, bool for_vectorizer)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
cond = NULL_TREE;
|
|
||||||
|
|
||||||
/* Do actual work now. */
|
/* Do actual work now. */
|
||||||
for (i = 0; i < loop->num_nodes; i++)
|
for (i = 0; i < loop->num_nodes; i++)
|
||||||
{
|
{
|
||||||
|
tree cond;
|
||||||
|
|
||||||
bb = ifc_bbs [i];
|
bb = ifc_bbs [i];
|
||||||
|
|
||||||
/* Update condition using predicate list. */
|
/* Update condition using predicate list. */
|
||||||
@ -191,7 +191,6 @@ tree_if_conversion (struct loop *loop, bool for_vectorizer)
|
|||||||
basic_block bb_n = single_succ (bb);
|
basic_block bb_n = single_succ (bb);
|
||||||
if (cond != NULL_TREE)
|
if (cond != NULL_TREE)
|
||||||
add_to_predicate_list (bb_n, cond);
|
add_to_predicate_list (bb_n, cond);
|
||||||
cond = NULL_TREE;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -275,12 +274,12 @@ tree_if_convert_cond_expr (struct loop *loop, tree stmt, tree cond,
|
|||||||
/* Add new condition into destination's predicate list. */
|
/* Add new condition into destination's predicate list. */
|
||||||
|
|
||||||
/* If 'c' is true then TRUE_EDGE is taken. */
|
/* If 'c' is true then TRUE_EDGE is taken. */
|
||||||
add_to_dst_predicate_list (loop, true_edge->dest, cond,
|
add_to_dst_predicate_list (loop, true_edge, cond,
|
||||||
unshare_expr (c), bsi);
|
unshare_expr (c), bsi);
|
||||||
|
|
||||||
/* If 'c' is false then FALSE_EDGE is taken. */
|
/* If 'c' is false then FALSE_EDGE is taken. */
|
||||||
c2 = invert_truthvalue (unshare_expr (c));
|
c2 = invert_truthvalue (unshare_expr (c));
|
||||||
add_to_dst_predicate_list (loop, false_edge->dest, cond, c2, bsi);
|
add_to_dst_predicate_list (loop, false_edge, cond, c2, bsi);
|
||||||
|
|
||||||
/* Now this conditional statement is redundant. Remove it.
|
/* Now this conditional statement is redundant. Remove it.
|
||||||
But, do not remove exit condition! Update exit condition
|
But, do not remove exit condition! Update exit condition
|
||||||
@ -565,7 +564,15 @@ if_convertible_loop_p (struct loop *loop, bool for_vectorizer ATTRIBUTE_UNUSED)
|
|||||||
/* ??? Check data dependency for vectorizer. */
|
/* ??? Check data dependency for vectorizer. */
|
||||||
|
|
||||||
/* What about phi nodes ? */
|
/* What about phi nodes ? */
|
||||||
for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
|
phi = phi_nodes (bb);
|
||||||
|
|
||||||
|
/* Clear aux field of incoming edges to a bb with a phi node. */
|
||||||
|
if (phi)
|
||||||
|
FOR_EACH_EDGE (e, ei, bb->preds)
|
||||||
|
e->aux = NULL;
|
||||||
|
|
||||||
|
/* Check statements. */
|
||||||
|
for (; phi; phi = PHI_CHAIN (phi))
|
||||||
if (!if_convertible_phi_p (loop, bb, phi))
|
if (!if_convertible_phi_p (loop, bb, phi))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@ -602,13 +609,13 @@ add_to_predicate_list (basic_block bb, tree new_cond)
|
|||||||
existing condition. */
|
existing condition. */
|
||||||
|
|
||||||
static tree
|
static tree
|
||||||
add_to_dst_predicate_list (struct loop * loop, basic_block bb,
|
add_to_dst_predicate_list (struct loop * loop, edge e,
|
||||||
tree prev_cond, tree cond,
|
tree prev_cond, tree cond,
|
||||||
block_stmt_iterator *bsi)
|
block_stmt_iterator *bsi)
|
||||||
{
|
{
|
||||||
tree new_cond = NULL_TREE;
|
tree new_cond = NULL_TREE;
|
||||||
|
|
||||||
if (!flow_bb_inside_loop_p (loop, bb))
|
if (!flow_bb_inside_loop_p (loop, e->dest))
|
||||||
return NULL_TREE;
|
return NULL_TREE;
|
||||||
|
|
||||||
if (prev_cond == boolean_true_node || !prev_cond)
|
if (prev_cond == boolean_true_node || !prev_cond)
|
||||||
@ -629,6 +636,11 @@ add_to_dst_predicate_list (struct loop * loop, basic_block bb,
|
|||||||
if (tmp_stmts2)
|
if (tmp_stmts2)
|
||||||
bsi_insert_before (bsi, tmp_stmts2, BSI_SAME_STMT);
|
bsi_insert_before (bsi, tmp_stmts2, BSI_SAME_STMT);
|
||||||
|
|
||||||
|
/* Add the condition to aux field of the edge. In case edge
|
||||||
|
destination is a PHI node, this condition will be ANDed with
|
||||||
|
block predicate to construct complete condition. */
|
||||||
|
e->aux = cond;
|
||||||
|
|
||||||
/* new_cond == prev_cond AND cond */
|
/* new_cond == prev_cond AND cond */
|
||||||
tmp = build2 (TRUTH_AND_EXPR, boolean_type_node,
|
tmp = build2 (TRUTH_AND_EXPR, boolean_type_node,
|
||||||
unshare_expr (prev_cond), cond);
|
unshare_expr (prev_cond), cond);
|
||||||
@ -636,22 +648,30 @@ add_to_dst_predicate_list (struct loop * loop, basic_block bb,
|
|||||||
bsi_insert_before (bsi, tmp_stmt, BSI_SAME_STMT);
|
bsi_insert_before (bsi, tmp_stmt, BSI_SAME_STMT);
|
||||||
new_cond = TREE_OPERAND (tmp_stmt, 0);
|
new_cond = TREE_OPERAND (tmp_stmt, 0);
|
||||||
}
|
}
|
||||||
add_to_predicate_list (bb, new_cond);
|
add_to_predicate_list (e->dest, new_cond);
|
||||||
return new_cond;
|
return new_cond;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* During if-conversion aux field from basic block is used to hold predicate
|
/* During if-conversion aux field from basic block structure is used to hold
|
||||||
list. Clean each basic block's predicate list for the given LOOP. */
|
predicate list. Clean each basic block's predicate list for the given LOOP.
|
||||||
|
Also clean aux field of succesor edges, used to hold true and false
|
||||||
|
condition from conditional expression. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
clean_predicate_lists (struct loop *loop)
|
clean_predicate_lists (struct loop *loop)
|
||||||
{
|
{
|
||||||
basic_block *bb;
|
basic_block *bb;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
edge e;
|
||||||
|
edge_iterator ei;
|
||||||
|
|
||||||
bb = get_loop_body (loop);
|
bb = get_loop_body (loop);
|
||||||
for (i = 0; i < loop->num_nodes; i++)
|
for (i = 0; i < loop->num_nodes; i++)
|
||||||
bb[i]->aux = NULL;
|
{
|
||||||
|
bb[i]->aux = NULL;
|
||||||
|
FOR_EACH_EDGE (e, ei, bb[i]->succs)
|
||||||
|
e->aux = NULL;
|
||||||
|
}
|
||||||
free (bb);
|
free (bb);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -664,13 +684,12 @@ find_phi_replacement_condition (struct loop *loop,
|
|||||||
basic_block bb, tree *cond,
|
basic_block bb, tree *cond,
|
||||||
block_stmt_iterator *bsi)
|
block_stmt_iterator *bsi)
|
||||||
{
|
{
|
||||||
basic_block first_bb = NULL;
|
edge first_edge, second_edge;
|
||||||
basic_block second_bb = NULL;
|
|
||||||
tree tmp_cond, new_stmts;
|
tree tmp_cond, new_stmts;
|
||||||
|
|
||||||
gcc_assert (EDGE_COUNT (bb->preds) == 2);
|
gcc_assert (EDGE_COUNT (bb->preds) == 2);
|
||||||
first_bb = (EDGE_PRED (bb, 0))->src;
|
first_edge = EDGE_PRED (bb, 0);
|
||||||
second_bb = (EDGE_PRED (bb, 1))->src;
|
second_edge = EDGE_PRED (bb, 1);
|
||||||
|
|
||||||
/* Use condition based on following criteria:
|
/* Use condition based on following criteria:
|
||||||
1)
|
1)
|
||||||
@ -691,42 +710,55 @@ find_phi_replacement_condition (struct loop *loop,
|
|||||||
S3: x = (c == d) ? b : a;
|
S3: x = (c == d) ? b : a;
|
||||||
|
|
||||||
S3 is preferred over S1 and S2*, Make 'b' first_bb and use
|
S3 is preferred over S1 and S2*, Make 'b' first_bb and use
|
||||||
its condition.
|
its condition.
|
||||||
|
|
||||||
4) If pred B is dominated by pred A then use pred B's condition.
|
4) If pred B is dominated by pred A then use pred B's condition.
|
||||||
See PR23115. */
|
See PR23115. */
|
||||||
|
|
||||||
/* Select condition that is not TRUTH_NOT_EXPR. */
|
/* Select condition that is not TRUTH_NOT_EXPR. */
|
||||||
tmp_cond = first_bb->aux;
|
tmp_cond = (first_edge->src)->aux;
|
||||||
if (TREE_CODE (tmp_cond) == TRUTH_NOT_EXPR)
|
if (TREE_CODE (tmp_cond) == TRUTH_NOT_EXPR)
|
||||||
{
|
{
|
||||||
basic_block tmp_bb;
|
edge tmp_edge;
|
||||||
tmp_bb = first_bb;
|
|
||||||
first_bb = second_bb;
|
tmp_edge = first_edge;
|
||||||
second_bb = tmp_bb;
|
first_edge = second_edge;
|
||||||
|
second_edge = tmp_edge;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check if FIRST_BB is loop header or not and make sure that
|
/* Check if FIRST_BB is loop header or not and make sure that
|
||||||
FIRST_BB does not dominate SECOND_BB. */
|
FIRST_BB does not dominate SECOND_BB. */
|
||||||
if (first_bb == loop->header
|
if (first_edge->src == loop->header
|
||||||
|| dominated_by_p (CDI_DOMINATORS, second_bb, first_bb))
|
|| dominated_by_p (CDI_DOMINATORS,
|
||||||
|
second_edge->src, first_edge->src))
|
||||||
{
|
{
|
||||||
tmp_cond = second_bb->aux;
|
*cond = (second_edge->src)->aux;
|
||||||
if (TREE_CODE (tmp_cond) == TRUTH_NOT_EXPR)
|
|
||||||
{
|
/* If there is a condition on an incoming edge,
|
||||||
/* Select non loop header condition but do not switch basic blocks. */
|
AND it with the incoming bb predicate. */
|
||||||
*cond = invert_truthvalue (unshare_expr (tmp_cond));
|
if (second_edge->aux)
|
||||||
}
|
*cond = build2 (TRUTH_AND_EXPR, boolean_type_node,
|
||||||
|
*cond, second_edge->aux);
|
||||||
|
|
||||||
|
if (TREE_CODE (*cond) == TRUTH_NOT_EXPR)
|
||||||
|
/* We can be smart here and choose inverted
|
||||||
|
condition without switching bbs. */
|
||||||
|
*cond = invert_truthvalue (*cond);
|
||||||
else
|
else
|
||||||
{
|
/* Select non loop header bb. */
|
||||||
/* Select non loop header condition. */
|
first_edge = second_edge;
|
||||||
first_bb = second_bb;
|
|
||||||
*cond = first_bb->aux;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
/* FIRST_BB is not loop header */
|
{
|
||||||
*cond = first_bb->aux;
|
/* FIRST_BB is not loop header */
|
||||||
|
*cond = (first_edge->src)->aux;
|
||||||
|
|
||||||
|
/* If there is a condition on an incoming edge,
|
||||||
|
AND it with the incoming bb predicate. */
|
||||||
|
if (first_edge->aux)
|
||||||
|
*cond = build2 (TRUTH_AND_EXPR, boolean_type_node,
|
||||||
|
*cond, first_edge->aux);
|
||||||
|
}
|
||||||
|
|
||||||
/* Create temp. for the condition. Vectorizer prefers to have gimple
|
/* Create temp. for the condition. Vectorizer prefers to have gimple
|
||||||
value as condition. Various targets use different means to communicate
|
value as condition. Various targets use different means to communicate
|
||||||
@ -746,7 +778,7 @@ find_phi_replacement_condition (struct loop *loop,
|
|||||||
|
|
||||||
gcc_assert (*cond);
|
gcc_assert (*cond);
|
||||||
|
|
||||||
return first_bb;
|
return first_edge->src;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -777,10 +809,6 @@ replace_phi_with_cond_modify_expr (tree phi, tree cond, basic_block true_bb,
|
|||||||
/* Find basic block and initialize iterator. */
|
/* Find basic block and initialize iterator. */
|
||||||
bb = bb_for_stmt (phi);
|
bb = bb_for_stmt (phi);
|
||||||
|
|
||||||
new_stmt = NULL_TREE;
|
|
||||||
arg_0 = NULL_TREE;
|
|
||||||
arg_1 = NULL_TREE;
|
|
||||||
|
|
||||||
/* Use condition that is not TRUTH_NOT_EXPR in conditional modify expr. */
|
/* Use condition that is not TRUTH_NOT_EXPR in conditional modify expr. */
|
||||||
if (EDGE_PRED (bb, 1)->src == true_bb)
|
if (EDGE_PRED (bb, 1)->src == true_bb)
|
||||||
{
|
{
|
||||||
|
@ -1747,6 +1747,12 @@ infer_loop_bounds_from_undefined (struct loop *loop)
|
|||||||
{
|
{
|
||||||
bb = bbs[i];
|
bb = bbs[i];
|
||||||
|
|
||||||
|
/* If BB is not executed in each iteration of the loop, we cannot
|
||||||
|
use the operations in it to infer reliable upper bound on the
|
||||||
|
# of iterations of the loop. */
|
||||||
|
if (!dominated_by_p (CDI_DOMINATORS, loop->latch, bb))
|
||||||
|
continue;
|
||||||
|
|
||||||
for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
|
for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
|
||||||
{
|
{
|
||||||
tree stmt = bsi_stmt (bsi);
|
tree stmt = bsi_stmt (bsi);
|
||||||
|
@ -2162,9 +2162,14 @@ build_ssa_operands (tree stmt)
|
|||||||
{
|
{
|
||||||
stmt_ann_t ann = get_stmt_ann (stmt);
|
stmt_ann_t ann = get_stmt_ann (stmt);
|
||||||
|
|
||||||
/* Initially assume that the statement has no volatile operands. */
|
/* Initially assume that the statement has no volatile operands and
|
||||||
|
does not take the address of any symbols. */
|
||||||
if (ann)
|
if (ann)
|
||||||
ann->has_volatile_ops = false;
|
{
|
||||||
|
ann->has_volatile_ops = false;
|
||||||
|
if (ann->addresses_taken)
|
||||||
|
ann->addresses_taken = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
start_ssa_stmt_operands ();
|
start_ssa_stmt_operands ();
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -195,6 +195,27 @@ is_overflow_infinity (tree val)
|
|||||||
|| operand_equal_p (val, TYPE_MIN_VALUE (TREE_TYPE (val)), 0)));
|
|| operand_equal_p (val, TYPE_MIN_VALUE (TREE_TYPE (val)), 0)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* If VAL is now an overflow infinity, return VAL. Otherwise, return
|
||||||
|
the same value with TREE_OVERFLOW clear. This can be used to avoid
|
||||||
|
confusing a regular value with an overflow value. */
|
||||||
|
|
||||||
|
static inline tree
|
||||||
|
avoid_overflow_infinity (tree val)
|
||||||
|
{
|
||||||
|
if (!is_overflow_infinity (val))
|
||||||
|
return val;
|
||||||
|
|
||||||
|
if (operand_equal_p (val, TYPE_MAX_VALUE (TREE_TYPE (val)), 0))
|
||||||
|
return TYPE_MAX_VALUE (TREE_TYPE (val));
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#ifdef ENABLE_CHECKING
|
||||||
|
gcc_assert (operand_equal_p (val, TYPE_MIN_VALUE (TREE_TYPE (val)), 0));
|
||||||
|
#endif
|
||||||
|
return TYPE_MIN_VALUE (TREE_TYPE (val));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Return whether VAL is equal to the maximum value of its type. This
|
/* Return whether VAL is equal to the maximum value of its type. This
|
||||||
will be true for a positive overflow infinity. We can't do a
|
will be true for a positive overflow infinity. We can't do a
|
||||||
@ -351,23 +372,11 @@ set_value_range_to_varying (value_range_t *vr)
|
|||||||
infinity when we shouldn't. */
|
infinity when we shouldn't. */
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
set_value_range_to_value (value_range_t *vr, tree val)
|
set_value_range_to_value (value_range_t *vr, tree val, bitmap equiv)
|
||||||
{
|
{
|
||||||
gcc_assert (is_gimple_min_invariant (val));
|
gcc_assert (is_gimple_min_invariant (val));
|
||||||
if (is_overflow_infinity (val))
|
val = avoid_overflow_infinity (val);
|
||||||
{
|
set_value_range (vr, VR_RANGE, val, val, equiv);
|
||||||
if (operand_equal_p (val, TYPE_MAX_VALUE (TREE_TYPE (val)), 0))
|
|
||||||
val = TYPE_MAX_VALUE (TREE_TYPE (val));
|
|
||||||
else
|
|
||||||
{
|
|
||||||
#ifdef ENABLE_CHECKING
|
|
||||||
gcc_assert (operand_equal_p (val,
|
|
||||||
TYPE_MIN_VALUE (TREE_TYPE (val)), 0));
|
|
||||||
#endif
|
|
||||||
val = TYPE_MIN_VALUE (TREE_TYPE (val));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
set_value_range (vr, VR_RANGE, val, val, NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set value range VR to a non-negative range of type TYPE.
|
/* Set value range VR to a non-negative range of type TYPE.
|
||||||
@ -411,8 +420,7 @@ set_value_range_to_nonnull (value_range_t *vr, tree type)
|
|||||||
static inline void
|
static inline void
|
||||||
set_value_range_to_null (value_range_t *vr, tree type)
|
set_value_range_to_null (value_range_t *vr, tree type)
|
||||||
{
|
{
|
||||||
tree zero = build_int_cst (type, 0);
|
set_value_range_to_value (vr, build_int_cst (type, 0), vr->equiv);
|
||||||
set_value_range (vr, VR_RANGE, zero, zero, vr->equiv);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -763,7 +771,9 @@ compare_values_warnv (tree val1, tree val2, bool *strict_overflow_p)
|
|||||||
if (!TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (val1)))
|
if (!TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (val1)))
|
||||||
return -2;
|
return -2;
|
||||||
|
|
||||||
if (strict_overflow_p != NULL)
|
if (strict_overflow_p != NULL
|
||||||
|
&& (code1 == SSA_NAME || !TREE_NO_WARNING (val1))
|
||||||
|
&& (code2 == SSA_NAME || !TREE_NO_WARNING (val2)))
|
||||||
*strict_overflow_p = true;
|
*strict_overflow_p = true;
|
||||||
|
|
||||||
if (code1 == SSA_NAME)
|
if (code1 == SSA_NAME)
|
||||||
@ -1028,6 +1038,8 @@ extract_range_from_assert (value_range_t *vr_p, tree expr)
|
|||||||
cond_code = swap_tree_comparison (TREE_CODE (cond));
|
cond_code = swap_tree_comparison (TREE_CODE (cond));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
limit = avoid_overflow_infinity (limit);
|
||||||
|
|
||||||
type = TREE_TYPE (limit);
|
type = TREE_TYPE (limit);
|
||||||
gcc_assert (limit != var);
|
gcc_assert (limit != var);
|
||||||
|
|
||||||
@ -1167,6 +1179,8 @@ extract_range_from_assert (value_range_t *vr_p, tree expr)
|
|||||||
{
|
{
|
||||||
tree one = build_int_cst (type, 1);
|
tree one = build_int_cst (type, 1);
|
||||||
max = fold_build2 (MINUS_EXPR, type, max, one);
|
max = fold_build2 (MINUS_EXPR, type, max, one);
|
||||||
|
if (EXPR_P (max))
|
||||||
|
TREE_NO_WARNING (max) = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
set_value_range (vr_p, VR_RANGE, min, max, vr_p->equiv);
|
set_value_range (vr_p, VR_RANGE, min, max, vr_p->equiv);
|
||||||
@ -1200,6 +1214,8 @@ extract_range_from_assert (value_range_t *vr_p, tree expr)
|
|||||||
{
|
{
|
||||||
tree one = build_int_cst (type, 1);
|
tree one = build_int_cst (type, 1);
|
||||||
min = fold_build2 (PLUS_EXPR, type, min, one);
|
min = fold_build2 (PLUS_EXPR, type, min, one);
|
||||||
|
if (EXPR_P (min))
|
||||||
|
TREE_NO_WARNING (min) = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
set_value_range (vr_p, VR_RANGE, min, max, vr_p->equiv);
|
set_value_range (vr_p, VR_RANGE, min, max, vr_p->equiv);
|
||||||
@ -1619,7 +1635,7 @@ extract_range_from_binary_expr (value_range_t *vr, tree expr)
|
|||||||
if (TREE_CODE (op0) == SSA_NAME)
|
if (TREE_CODE (op0) == SSA_NAME)
|
||||||
vr0 = *(get_value_range (op0));
|
vr0 = *(get_value_range (op0));
|
||||||
else if (is_gimple_min_invariant (op0))
|
else if (is_gimple_min_invariant (op0))
|
||||||
set_value_range_to_value (&vr0, op0);
|
set_value_range_to_value (&vr0, op0, NULL);
|
||||||
else
|
else
|
||||||
set_value_range_to_varying (&vr0);
|
set_value_range_to_varying (&vr0);
|
||||||
|
|
||||||
@ -1627,7 +1643,7 @@ extract_range_from_binary_expr (value_range_t *vr, tree expr)
|
|||||||
if (TREE_CODE (op1) == SSA_NAME)
|
if (TREE_CODE (op1) == SSA_NAME)
|
||||||
vr1 = *(get_value_range (op1));
|
vr1 = *(get_value_range (op1));
|
||||||
else if (is_gimple_min_invariant (op1))
|
else if (is_gimple_min_invariant (op1))
|
||||||
set_value_range_to_value (&vr1, op1);
|
set_value_range_to_value (&vr1, op1, NULL);
|
||||||
else
|
else
|
||||||
set_value_range_to_varying (&vr1);
|
set_value_range_to_varying (&vr1);
|
||||||
|
|
||||||
@ -2006,7 +2022,7 @@ extract_range_from_unary_expr (value_range_t *vr, tree expr)
|
|||||||
if (TREE_CODE (op0) == SSA_NAME)
|
if (TREE_CODE (op0) == SSA_NAME)
|
||||||
vr0 = *(get_value_range (op0));
|
vr0 = *(get_value_range (op0));
|
||||||
else if (is_gimple_min_invariant (op0))
|
else if (is_gimple_min_invariant (op0))
|
||||||
set_value_range_to_value (&vr0, op0);
|
set_value_range_to_value (&vr0, op0, NULL);
|
||||||
else
|
else
|
||||||
set_value_range_to_varying (&vr0);
|
set_value_range_to_varying (&vr0);
|
||||||
|
|
||||||
@ -2091,6 +2107,8 @@ extract_range_from_unary_expr (value_range_t *vr, tree expr)
|
|||||||
&& is_gimple_val (new_max)
|
&& is_gimple_val (new_max)
|
||||||
&& tree_int_cst_equal (new_min, orig_min)
|
&& tree_int_cst_equal (new_min, orig_min)
|
||||||
&& tree_int_cst_equal (new_max, orig_max)
|
&& tree_int_cst_equal (new_max, orig_max)
|
||||||
|
&& (!is_overflow_infinity (new_min)
|
||||||
|
|| !is_overflow_infinity (new_max))
|
||||||
&& compare_values (new_min, new_max) <= 0
|
&& compare_values (new_min, new_max) <= 0
|
||||||
&& compare_values (new_min, new_max) >= -1)
|
&& compare_values (new_min, new_max) >= -1)
|
||||||
{
|
{
|
||||||
@ -2393,7 +2411,10 @@ extract_range_from_comparison (value_range_t *vr, tree expr)
|
|||||||
its type may be different from _Bool. Convert VAL to EXPR's
|
its type may be different from _Bool. Convert VAL to EXPR's
|
||||||
type. */
|
type. */
|
||||||
val = fold_convert (TREE_TYPE (expr), val);
|
val = fold_convert (TREE_TYPE (expr), val);
|
||||||
set_value_range (vr, VR_RANGE, val, val, vr->equiv);
|
if (is_gimple_min_invariant (val))
|
||||||
|
set_value_range_to_value (vr, val, vr->equiv);
|
||||||
|
else
|
||||||
|
set_value_range (vr, VR_RANGE, val, val, vr->equiv);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
set_value_range_to_varying (vr);
|
set_value_range_to_varying (vr);
|
||||||
@ -2424,7 +2445,7 @@ extract_range_from_expr (value_range_t *vr, tree expr)
|
|||||||
else if (TREE_CODE_CLASS (code) == tcc_comparison)
|
else if (TREE_CODE_CLASS (code) == tcc_comparison)
|
||||||
extract_range_from_comparison (vr, expr);
|
extract_range_from_comparison (vr, expr);
|
||||||
else if (is_gimple_min_invariant (expr))
|
else if (is_gimple_min_invariant (expr))
|
||||||
set_value_range_to_value (vr, expr);
|
set_value_range_to_value (vr, expr, NULL);
|
||||||
else
|
else
|
||||||
set_value_range_to_varying (vr);
|
set_value_range_to_varying (vr);
|
||||||
|
|
||||||
@ -2545,6 +2566,13 @@ adjust_range_with_scev (value_range_t *vr, struct loop *loop, tree stmt,
|
|||||||
if (compare_values (min, max) == 1)
|
if (compare_values (min, max) == 1)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* According to the loop information, the variable does not
|
||||||
|
overflow. If we think it does, probably because of an
|
||||||
|
overflow due to arithmetic on a different INF value,
|
||||||
|
reset now. */
|
||||||
|
if (is_negative_overflow_infinity (min))
|
||||||
|
min = tmin;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -2557,12 +2585,61 @@ adjust_range_with_scev (value_range_t *vr, struct loop *loop, tree stmt,
|
|||||||
if (compare_values (min, max) == 1)
|
if (compare_values (min, max) == 1)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (is_positive_overflow_infinity (max))
|
||||||
|
max = tmax;
|
||||||
}
|
}
|
||||||
|
|
||||||
set_value_range (vr, VR_RANGE, min, max, vr->equiv);
|
set_value_range (vr, VR_RANGE, min, max, vr->equiv);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Return true if VAR may overflow at STMT. This checks any available
|
||||||
|
loop information to see if we can determine that VAR does not
|
||||||
|
overflow. */
|
||||||
|
|
||||||
|
static bool
|
||||||
|
vrp_var_may_overflow (tree var, tree stmt)
|
||||||
|
{
|
||||||
|
struct loop *l;
|
||||||
|
tree chrec, init, step;
|
||||||
|
|
||||||
|
if (current_loops == NULL)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
l = loop_containing_stmt (stmt);
|
||||||
|
if (l == NULL)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
chrec = instantiate_parameters (l, analyze_scalar_evolution (l, var));
|
||||||
|
if (TREE_CODE (chrec) != POLYNOMIAL_CHREC)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
init = initial_condition_in_loop_num (chrec, l->num);
|
||||||
|
step = evolution_part_in_loop_num (chrec, l->num);
|
||||||
|
|
||||||
|
if (step == NULL_TREE
|
||||||
|
|| !is_gimple_min_invariant (step)
|
||||||
|
|| !valid_value_p (init))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
/* If we get here, we know something useful about VAR based on the
|
||||||
|
loop information. If it wraps, it may overflow. */
|
||||||
|
|
||||||
|
if (scev_probably_wraps_p (init, step, stmt,
|
||||||
|
current_loops->parray[CHREC_VARIABLE (chrec)],
|
||||||
|
true))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (dump_file && (dump_flags & TDF_DETAILS) != 0)
|
||||||
|
{
|
||||||
|
print_generic_expr (dump_file, var, 0);
|
||||||
|
fprintf (dump_file, ": loop information indicates does not overflow\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Given two numeric value ranges VR0, VR1 and a comparison code COMP:
|
/* Given two numeric value ranges VR0, VR1 and a comparison code COMP:
|
||||||
|
|
||||||
@ -4156,7 +4233,7 @@ compare_names (enum tree_code comp, tree n1, tree n2,
|
|||||||
t = retval = NULL_TREE;
|
t = retval = NULL_TREE;
|
||||||
EXECUTE_IF_SET_IN_BITMAP (e2, 0, i2, bi2)
|
EXECUTE_IF_SET_IN_BITMAP (e2, 0, i2, bi2)
|
||||||
{
|
{
|
||||||
bool sop;
|
bool sop = false;
|
||||||
|
|
||||||
value_range_t vr2 = *(vr_value[i2]);
|
value_range_t vr2 = *(vr_value[i2]);
|
||||||
|
|
||||||
@ -4773,7 +4850,8 @@ vrp_visit_phi_node (tree phi)
|
|||||||
if (vrp_val_is_max (vr_result.max))
|
if (vrp_val_is_max (vr_result.max))
|
||||||
goto varying;
|
goto varying;
|
||||||
|
|
||||||
if (!needs_overflow_infinity (TREE_TYPE (vr_result.min)))
|
if (!needs_overflow_infinity (TREE_TYPE (vr_result.min))
|
||||||
|
|| !vrp_var_may_overflow (lhs, phi))
|
||||||
vr_result.min = TYPE_MIN_VALUE (TREE_TYPE (vr_result.min));
|
vr_result.min = TYPE_MIN_VALUE (TREE_TYPE (vr_result.min));
|
||||||
else if (supports_overflow_infinity (TREE_TYPE (vr_result.min)))
|
else if (supports_overflow_infinity (TREE_TYPE (vr_result.min)))
|
||||||
vr_result.min =
|
vr_result.min =
|
||||||
@ -4791,7 +4869,8 @@ vrp_visit_phi_node (tree phi)
|
|||||||
if (vrp_val_is_min (vr_result.min))
|
if (vrp_val_is_min (vr_result.min))
|
||||||
goto varying;
|
goto varying;
|
||||||
|
|
||||||
if (!needs_overflow_infinity (TREE_TYPE (vr_result.max)))
|
if (!needs_overflow_infinity (TREE_TYPE (vr_result.max))
|
||||||
|
|| !vrp_var_may_overflow (lhs, phi))
|
||||||
vr_result.max = TYPE_MAX_VALUE (TREE_TYPE (vr_result.max));
|
vr_result.max = TYPE_MAX_VALUE (TREE_TYPE (vr_result.max));
|
||||||
else if (supports_overflow_infinity (TREE_TYPE (vr_result.max)))
|
else if (supports_overflow_infinity (TREE_TYPE (vr_result.max)))
|
||||||
vr_result.max =
|
vr_result.max =
|
||||||
@ -4971,6 +5050,8 @@ test_for_singularity (enum tree_code cond_code, tree op0,
|
|||||||
{
|
{
|
||||||
tree one = build_int_cst (TREE_TYPE (op0), 1);
|
tree one = build_int_cst (TREE_TYPE (op0), 1);
|
||||||
max = fold_build2 (MINUS_EXPR, TREE_TYPE (op0), max, one);
|
max = fold_build2 (MINUS_EXPR, TREE_TYPE (op0), max, one);
|
||||||
|
if (EXPR_P (max))
|
||||||
|
TREE_NO_WARNING (max) = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (cond_code == GE_EXPR || cond_code == GT_EXPR)
|
else if (cond_code == GE_EXPR || cond_code == GT_EXPR)
|
||||||
@ -4984,6 +5065,8 @@ test_for_singularity (enum tree_code cond_code, tree op0,
|
|||||||
{
|
{
|
||||||
tree one = build_int_cst (TREE_TYPE (op0), 1);
|
tree one = build_int_cst (TREE_TYPE (op0), 1);
|
||||||
min = fold_build2 (PLUS_EXPR, TREE_TYPE (op0), min, one);
|
min = fold_build2 (PLUS_EXPR, TREE_TYPE (op0), min, one);
|
||||||
|
if (EXPR_P (min))
|
||||||
|
TREE_NO_WARNING (min) = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user