Commit Graph

170853 Commits

Author SHA1 Message Date
Eric Botcazou 7ee98586a6 re PR rtl-optimization/91347 (hppa: wrong code generated with tail call optimisation)
PR rtl-optimization/91347
	* dse.c (scan_insn): Call add_wild_read for non-const/memset tail calls
	before reload if HARD_FRAME_POINTER_IS_ARG_POINTER.

From-SVN: r274708
2019-08-20 09:10:53 +00:00
Richard Sandiford 257caa552b Add a pass_by_reference flag to function_arg_info
This patch adds a flag that tells targets whether an argument
has been converted to pass-by-reference form.  This replaces
assign_parm_data_one::passed_pointer in function.c.

The flag is set automatically for places that call
apply_pass_by_reference_rules.  Places that apply
pass-by-reference manually need to set it themselves.

(After previous changes, no targets apply pass-by-reference
manually.  They all go through apply_pass_by_reference_rules.)

2019-08-20  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
	* calls.h (function_arg_info): Add a pass_by_reference field,
	defaulting to false.
	* calls.c (apply_pass_by_reference_rules): Set pass_by_reference
	when applying pass-by-reference semantics.
	(initialize_argument_information): Likewise.
	(emit_library_call_value_1): Likewise.
	* function.c (assign_parm_data_one): Remove passed_pointer field.
	(assign_parm_find_data_types): Don't set it.
	(assign_parm_find_stack_rtl, assign_parm_adjust_stack_rtl)
	(assign_parm_setup_reg, assign_parms, gimplify_parameters): Use
	arg.pass_by_reference instead of passed_pointer.

From-SVN: r274707
2019-08-20 08:54:03 +00:00
Richard Sandiford cf0d189eb9 Make calls.c use function_arg_info internally
This patch makes the two main calls.c argument-processing
routines track the state of the argument in a function_arg_info
instead of using separate mode variables.

2019-08-20  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
	* calls.c (emit_library_call_value_1): Merge arg and orig_arg
	into a single function_arg_info, updating its fields when we
	apply pass-by-reference and promotion semantics.  Use the
	function_arg_info to track the mode rather than keeping it in
	a separate local variable.
	(initialize_argument_information): Likewise.  Base the final
	arg_to_skip on this new function_arg_info rather than creating
	a new one from scratch.

From-SVN: r274706
2019-08-20 08:53:56 +00:00
Richard Sandiford 634afa05a8 Make function.c use function_arg_info internally
This patch adds a function_arg_info field to assign_parm_data_one,
so that:

  - passed_type -> arg.type
  - promoted_mode -> arg.mode
  - named_arg -> arg.named

We can then pass this function_arg_info directly to the converted
hooks.

Between the initialisation of the assign_parm_data_one and the
application of promotion rules (which is a state internal to
assign_parm_find_data_types), arg.mode is equivalent to passed_mode
(i.e. to TYPE_MODE).

2019-08-20  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
	* function.c (assign_parm_data_one): Replace passed_type,
	promoted_mode and named_arg with a function_arg_info field.
	(assign_parm_find_data_types): Remove local variables and
	assign directly to "data".  Make data->passed_mode shadow
	data->arg.mode until promotion, then assign the promoted
	mode to data->arg.mode.
	(assign_parms_setup_varargs, assign_parm_find_entry_rtl)
	(assign_parm_find_stack_rtl, assign_parm_adjust_entry_rtl)
	(assign_parm_remove_parallels, assign_parm_setup_block_p)
	(assign_parm_setup_block, assign_parm_setup_reg)
	(assign_parm_setup_stack, assign_parms, gimplify_parameters): Use
	arg.mode instead of promoted_mode, arg.type instead of passed_type
	and arg.named instead of named_arg.  Use data->arg for
	function_arg_info structures that had the field values passed_type,
	promoted_mode and named_arg.  Base other function_arg_infos on
	data->arg, changing the necessary properties.

From-SVN: r274705
2019-08-20 08:53:52 +00:00
Richard Sandiford b12cdd6e8e Add a apply_pass_by_reference_rules helper
This patch adds a helper routine that applies pass-by-reference
semantics to an existing function_arg_info.

The c6x part means that c6x_function_arg and c6x_function_arg_advance
see the same "named" value as pass_by_reference did, rather than
pass_by_reference seeing "true" and the others seeing "false".
This doesn't matter because the c6x port doesn't care about namedness.

The rs6000.c patch removes an assignment to "type", but the only
later code to use it was the patched promote_mode line.

(The reason for patching these places despite the above is that
often target code gets used as a basis for new targets or changes
to existing ones.)

2019-08-20  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
	* calls.h (apply_pass_by_reference_rules): Declare.
	* calls.c (apply_pass_by_reference_rules): New function.
	* config/c6x/c6x.c (c6x_call_saved_register_used): Use it.
	* config/rs6000/rs6000-call.c (rs6000_parm_needs_stack): Likewise.
	* config/s390/s390.c (s390_call_saved_register_used): Likewise.
	* function.c (assign_parm_find_data_types): Likewise.
	* var-tracking.c (prepare_call_arguments): Likewise.

From-SVN: r274704
2019-08-20 08:53:47 +00:00
Richard Sandiford 0ffef2005f Use function_arg_info for TARGET_MUST_PASS_IN_STACK
The hook is passed the promoted mode instead of the original type mode.

The expr.h reference in the documentation is no longer correct, but
pointing to calls.h or calls.c doesn't help much either.  I just left
this as-is since it's not related to the point of the series.

After previous changes, most places already pass arg.mode and arg.type.
Only i386 and mcore needed to construct a new one out of nothing.
rs6000 needs to construct one slightly earlier than before.

2019-08-20  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
	* target.def (must_pass_in_stack): Take a function_arg_info instead
	of a mode and a type.
	* doc/tm.texi: Regenerate.
	* calls.h (must_pass_in_stack_var_size): Take a function_arg_info
	instead of a mode and a type.
	(must_pass_in_stack_var_size_or_pad): Likewise.
	* calls.c (must_pass_in_stack_var_size): Likewise.
	(must_pass_in_stack_var_size_or_pad): Likewise.
	(initialize_argument_information): Update call to
	targetm.calls.must_pass_in_stack.
	(must_pass_va_arg_on_stack): Likewise.
	* function.c (assign_parm_find_entry_rtl): Likewise.
	* targhooks.c (hook_pass_by_reference_must_pass_in_stack): Likewise.
	* config/alpha/alpha.c (alpha_function_arg): Likewise.
	(alpha_function_arg_advance): Likewise.
	* config/cr16/cr16.c (cr16_function_arg): Likewise.
	(cr16_function_arg_advance): Likewise.
	* config/cris/cris.c (cris_pass_by_reference): Likewise.
	(cris_arg_partial_bytes): Likewise.
	* config/iq2000/iq2000.c (iq2000_pass_by_reference): Likewise.
	* config/lm32/lm32.c (lm32_function_arg): Likewise.
	* config/mcore/mcore.c (mcore_num_arg_regs): Likewise.
	(mcore_function_arg, mcore_arg_partial_bytes): Likewise.
	* config/mips/mips.c (mips_pass_by_reference): Likewise.
	* config/mmix/mmix.c (mmix_function_arg_advance): Likewise.
	(mmix_function_arg_1, mmix_pass_by_reference): Likewise.
	* config/sh/sh.c (sh_pass_by_reference): Likewise.
	* config/stormy16/stormy16.c (xstormy16_function_arg): Likewise.
	* config/xtensa/xtensa.c (xtensa_function_arg_advance): Likewise.
	* config/arm/arm.c (arm_must_pass_in_stack): Take a function_arg_info
	instead of a mode and a type.
	* config/fr30/fr30.c (fr30_must_pass_in_stack): Likewise.
	(fr30_num_arg_regs): Likewise.
	(fr30_setup_incoming_varargs): Update calls accordingly.
	(fr30_arg_partial_bytes, fr30_function_arg): Likewise.
	(fr30_function_arg_advance): Likewise.
	* config/frv/frv.c (frv_must_pass_in_stack): Take a function_arg_info
	instead of a mode and a type.
	* config/gcn/gcn.c (num_arg_regs): Likewise.
	(gcn_function_arg, gcn_function_arg_advance): Update calls to
	num_arg_regs and targetm.calls.must_pass_in_stack.
	(gcn_arg_partial_bytes): Likewise.
	* config/i386/i386.c (ix86_must_pass_in_stack): Take a
	function_arg_info instead of a mode and a type.
	(classify_argument): Update call accordingly.
	* config/nds32/nds32.c (nds32_must_pass_in_stack): Take a
	function_arg_info instead of a mode and a type.
	* config/rs6000/rs6000-internal.h (rs6000_must_pass_in_stack):
	Likewise.
	* config/rs6000/rs6000-call.c (rs6000_must_pass_in_stack): Likewise.
	(rs6000_parm_needs_stack): Update call accordingly.
	(setup_incoming_varargs): Likewise.

From-SVN: r274703
2019-08-20 08:53:39 +00:00
Richard Sandiford 7256c7194e Use function_arg_info for TARGET_CALLEE_COPIES
The hook is passed the unpromoted type mode instead of the promoted mode.

The aarch64 definition is redundant, but worth keeping for emphasis.

2019-08-20  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
	* target.def (callee_copies): Take a function_arg_info instead
	of a mode, type and named flag.
	* doc/tm.texi: Regenerate.
	* targhooks.h (hook_callee_copies_named): Take a function_arg_info
	instead of a mode, type and named flag.
	(hook_bool_CUMULATIVE_ARGS_mode_tree_bool_false): Delete.
	(hook_bool_CUMULATIVE_ARGS_mode_tree_bool_true): Likewise.
	(hook_bool_CUMULATIVE_ARGS_arg_info_true): New function.
	* targhooks.c (hook_callee_copies_named): Take a function_arg_info
	instead of a mode, type and named flag.
	(hook_bool_CUMULATIVE_ARGS_mode_tree_bool_false): Delete.
	(hook_bool_CUMULATIVE_ARGS_mode_tree_bool_true): Likewise.
	(hook_bool_CUMULATIVE_ARGS_arg_info_true): New function.
	* calls.h (reference_callee_copied): Take a function_arg_info
	instead of a mode, type and named flag.
	* calls.c (reference_callee_copied): Likewise.
	(initialize_argument_information): Update call accordingly.
	(emit_library_call_value_1): Likewise.
	* function.c (gimplify_parameters): Likewise.
	* config/aarch64/aarch64.c (TARGET_CALLEE_COPIES): Define to
	hook_bool_CUMULATIVE_ARGS_arg_info_false instead of
	hook_bool_CUMULATIVE_ARGS_mode_tree_bool_false.
	* config/c6x/c6x.c (c6x_callee_copies): Delete.
	(TARGET_CALLEE_COPIES): Define to
	hook_bool_CUMULATIVE_ARGS_arg_info_true instead.
	* config/epiphany/epiphany.c (TARGET_CALLEE_COPIES): Define to
	hook_bool_CUMULATIVE_ARGS_arg_info_true instead of
	hook_bool_CUMULATIVE_ARGS_mode_tree_bool_true.
	* config/mips/mips.c (mips_callee_copies): Take a function_arg_info
	instead of a mode, type and named flag.
	* config/mmix/mmix.c (TARGET_CALLEE_COPIES): Define to
	hook_bool_CUMULATIVE_ARGS_arg_info_true instead of
	hook_bool_CUMULATIVE_ARGS_mode_tree_bool_true.
	* config/mn10300/mn10300.c (TARGET_CALLEE_COPIES): Likewise.
	* config/msp430/msp430.c (msp430_callee_copies): Delete.
	(TARGET_CALLEE_COPIES): Define to
	hook_bool_CUMULATIVE_ARGS_arg_info_true instead.
	* config/pa/pa.c (pa_callee_copies): Take a function_arg_info
	instead of a mode, type and named flag.
	* config/sh/sh.c (sh_callee_copies): Likewise.
	* config/v850/v850.c (TARGET_CALLEE_COPIES): Define to
	hook_bool_CUMULATIVE_ARGS_arg_info_true instead of
	hook_bool_CUMULATIVE_ARGS_mode_tree_bool_true.

From-SVN: r274702
2019-08-20 08:53:23 +00:00
Richard Sandiford 6930c98c69 Use function_arg_info for TARGET_FUNCTION_ARG_ADVANCE
There seems to be a bit of confusion around this one.  Almost all
callers pass the same arguments as TARGET_FUNCTION_ARG, meaning
that the mode is the promoted mode rather than the type mode.
But the calls.c handling for normal typed arguments instead passes
the unpromoted TYPE_MODE (despite passing the promoted mode to
TARGET_FUNCTION_ARG).  I've kept this behaviour with a ??? comment.

(The calls.c handling of libgcc functions does pass the promoted
mode though, as does the function.c handling of incoming arguments.)

Also, a couple of the arm callers don't seem to be using the hook
correctly.  Again I kept the current choices and added a ??? comment.

2019-08-20  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
	* target.def (function_arg_advance): Take a function_arg_info instead
	of a mode, type and named flag.
	* doc/tm.texi: Regenerate.
	* targhooks.h (default_function_arg_advance): Take a function_arg_info
	instead of a mode, type and named flag.
	* targhooks.c (default_function_arg_advance): Likewise.
	* calls.c (initialize_argument_information): Update call to
	targetm.calls.function_arg_advance.
	(emit_library_call_value_1): Likewise.
	* dse.c (get_call_args): Likewise.
	* expr.c (block_move_libcall_safe_for_call_parm): Likewise.
	* function.c (assign_parms, gimplify_parameters): Likewise.
	* var-tracking.c (prepare_call_arguments): Likewise.
	* config/aarch64/aarch64.c (aarch64_function_arg_advance): Take a
	function_arg_info instead of a mode, type and named flag.
	(aarch64_setup_incoming_varargs): Update call accordingly.
	* config/alpha/alpha.c (alpha_function_arg_advance): Take a
	function_arg_info instead of a mode, type and named flag.
	(alpha_setup_incoming_varargs): Update call accordingly.
	* config/arc/arc.c (arc_function_arg_advance): Take a
	function_arg_info instead of a mode, type and named flag.
	(arc_setup_incoming_varargs): Update call accordingly.
	* config/arm/arm.c (arm_function_arg_advance): Take a
	function_arg_info instead of a mode, type and named flag.
	(cmse_func_args_or_return_in_stack): Update call accordingly.
	(arm_function_ok_for_sibcall): Likewise.
	(cmse_nonsecure_call_clear_caller_saved): Likewise.
	* config/avr/avr.c (avr_function_arg_advance): Take a
	function_arg_info instead of a mode, type and named flag.
	* config/bfin/bfin.c (bfin_function_arg_advance): Likewise.
	* config/c6x/c6x.c (c6x_function_arg_advance): Likewise.
	(c6x_call_saved_register_used): Update call accordingly.
	* config/cr16/cr16.c (cr16_function_arg_advance): Take a
	function_arg_info instead of a mode, type and named flag.
	* config/cris/cris.c (cris_function_arg_advance): Likewise.
	* config/csky/csky.c (csky_function_arg_advance): Likewise.
	(csky_setup_incoming_varargs): Update call accordingly.
	* config/epiphany/epiphany.c (epiphany_function_arg_advance): Take a
	function_arg_info instead of a mode, type and named flag.
	* config/fr30/fr30.c (fr30_function_arg_advance): Likewise.
	* config/frv/frv.c (frv_function_arg_advance): Likewise.
	* config/ft32/ft32.c (ft32_function_arg_advance): Likewise.
	* config/gcn/gcn.c (gcn_function_arg_advance): Likewise.
	* config/h8300/h8300.c (h8300_function_arg_advance): Likewise.
	* config/i386/i386.c (ix86_function_arg_advance): Likewise.
	(ix86_setup_incoming_varargs): Update call accordingly.
	* config/ia64/ia64.c (ia64_function_arg_advance): Take a
	function_arg_info instead of a mode, type and named flag.
	(ia64_setup_incoming_varargs): Update call accordingly.
	* config/iq2000/iq2000.c (iq2000_function_arg_advance): Take a
	function_arg_info instead of a mode, type and named flag.
	(iq2000_expand_prologue): Update call accordingly.
	* config/lm32/lm32.c (lm32_function_arg_advance): Take a
	function_arg_info instead of a mode, type and named flag.
	* config/m32c/m32c.c (m32c_function_arg_advance): Likewise.
	* config/m32r/m32r.c (m32r_function_arg_advance): Likewise.
	* config/m68k/m68k.c (m68k_function_arg_advance): Likewise.
	* config/mcore/mcore.c (mcore_function_arg_advance): Likewise.
	* config/microblaze/microblaze.c (microblaze_function_arg_advance):
	Likewise.
	(microblaze_expand_prologue): Update call accordingly.
	* config/mips/mips.c (mips_function_arg_advance): Take a
	function_arg_info instead of a mode, type and named flag.
	(mips_setup_incoming_varargs): Update call accordingly.
	(mips_output_args_xfer): Likewise.
	* config/mmix/mmix.c (mmix_function_arg_advance): Take a
	function_arg_info instead of a mode, type and named flag.
	* config/mn10300/mn10300.c (mn10300_function_arg_advance): Likewise.
	* config/moxie/moxie.c (moxie_function_arg_advance): Likewise.
	* config/msp430/msp430.c (msp430_function_arg_advance): Likewise.
	* config/nds32/nds32.c (nds32_function_arg_advance): Likewise.
	* config/nios2/nios2.c (nios2_function_arg_advance): Likewise.
	(nios2_setup_incoming_varargs): Update call accordingly.
	* config/nvptx/nvptx.c (nvptx_function_arg_advance): Take a
	function_arg_info instead of a mode, type and named flag.
	* config/or1k/or1k.c (or1k_function_arg_advance): Likewise.
	* config/pa/pa.c (pa_function_arg_advance): Likewise.
	* config/pdp11/pdp11.c (pdp11_function_arg_advance): Likewise.
	* config/pru/pru.c (pru_function_arg_advance): Likewise.
	* config/riscv/riscv.c (riscv_function_arg_advance): Likewise.
	(riscv_setup_incoming_varargs): Update call accordingly.
	* config/rl78/rl78.c (rl78_function_arg_advance): Take a
	function_arg_info instead of a mode, type and named flag.
	* config/rs6000/rs6000-internal.h (rs6000_function_arg_advance):
	Likewise.
	* config/rs6000/rs6000-call.c (rs6000_function_arg_advance): Likewise.
	(rs6000_parm_needs_stack): Update call accordingly.
	* config/rx/rx.c (rx_function_arg_advance): Take a function_arg_info
	instead of a mode, type and named flag.
	* config/s390/s390.c (s390_function_arg_advance): Likewise.
	(s390_call_saved_register_used): Update call accordingly.
	* config/sh/sh.c (sh_function_arg_advance): Take a function_arg_info
	instead of a mode, type and named flag.
	(sh_output_mi_thunk): Update call accordingly.
	* config/sparc/sparc.c (sparc_function_arg_advance): Take a
	function_arg_info instead of a mode, type and named flag.
	* config/spu/spu.c (spu_function_arg_advance): Likewise.
	(spu_setup_incoming_varargs): Update call accordingly.
	* config/stormy16/stormy16.c (xstormy16_function_arg_advance): Take a
	function_arg_info instead of a mode, type and named flag.
	* config/tilegx/tilegx.c (tilegx_function_arg_advance): Likewise.
	(tilegx_setup_incoming_varargs): Update call accordingly.
	* config/tilepro/tilepro.c (tilepro_function_arg_advance): Take a
	function_arg_info instead of a mode, type and named flag.
	(tilegx_setup_incoming_varargs): Update call accordingly.
	* config/v850/v850.c (v850_function_arg_advance): Take a
	function_arg_info instead of a mode, type and named flag.
	* config/vax/vax.c (vax_function_arg_advance): Likewise.
	* config/visium/visium.c (visium_function_arg_advance): Likewise.
	(visium_setup_incoming_varargs): Update call accordingly.
	* config/xtensa/xtensa.c (xtensa_function_arg_advance): Take a
	function_arg_info instead of a mode, type and named flag.

From-SVN: r274701
2019-08-20 08:53:14 +00:00
Richard Sandiford 6783fdb705 Use function_arg_info for TARGET_FUNCTION_(INCOMING_)ARG
This patch makes both TARGET_FUNCTION_ARG and
TARGET_FUNCTION_INCOMING_ARG take a function_arg_info.
They have to be done together since many targets use the
same function for both.

The hooks are passed the promoted mode instead of the original type mode.

2019-08-20  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
	* target.def (function_arg, function_incoming_arg): Take a
	function_arg_info instead of a mode, tree and named flag.
	* doc/tm.texi: Regenerate.
	* targhooks.h (default_function_arg): Take a function_arg_info
	instead of a mode, tree and named flag.
	(default_function_incoming_arg): Likewise.
	* targhooks.c (default_function_arg): Likewise.
	(default_function_incoming_arg): Likewise.
	* calls.h (function_arg_info::end_marker_p): New function.
	(function_arg_info::end_marker): Likewise.
	* calls.c (prepare_call_address, initialize_argument_information)
	(expand_call, emit_library_call_value_1): Update calls to
	targetm.calls.function_arg and targetm.calls.function_incoming_arg.
	* dse.c: Include calls.h.
	(get_call_args): Update call to targetm.calls.function_arg.
	* expr.c (block_move_libcall_safe_for_call_parm): Likewise.
	* var-tracking.c (prepare_call_arguments): Likewise.
	* function.c (assign_parm_find_entry_rtl): Update call to
	targetm.calls.function_incoming_arg.
	* config/aarch64/aarch64.c (aarch64_function_arg): Take a
	function_arg_info instead of a mode, tree and named flag.
	* config/alpha/alpha.c (alpha_function_arg): Likewise.
	* config/arc/arc.c (arc_function_arg): Likewise.
	* config/arm/arm.c (arm_function_arg): Likewise.
	(cmse_func_args_or_return_in_stack): Update call accordingly.
	(arm_function_ok_for_sibcall): Likewise.
	(cmse_nonsecure_call_clear_caller_saved): Likewise.
	* config/avr/avr.c (avr_function_arg): Take a function_arg_info
	instead of a mode, tree and named flag.
	* config/bfin/bfin.c (bfin_function_arg): Likewise.
	* config/c6x/c6x.c (c6x_function_arg): Likewise.
	(c6x_call_saved_register_used): Update call accordingly.
	* config/cr16/cr16.c (cr16_function_arg): Take a function_arg_info
	instead of a mode, tree and named flag.
	* config/cris/cris.c (cris_function_arg, cris_function_incoming_arg)
	(cris_function_arg_1): Likewise.
	* config/csky/csky.c (csky_function_arg): Likewise.
	* config/epiphany/epiphany.c (epiphany_function_arg): Likewise.
	* config/fr30/fr30.c (fr30_function_arg): Likewise.
	* config/frv/frv.c (frv_function_arg, frv_function_incoming_arg)
	(frv_function_arg_1): Likewise.
	* config/ft32/ft32.c (ft32_function_arg): Likewise.
	* config/gcn/gcn.c (gcn_function_arg): Likewise.
	* config/h8300/h8300.c (h8300_function_arg): Likewise.
	* config/i386/i386.c (ix86_function_arg): Likewise.
	* config/ia64/ia64.c (ia64_function_arg, ia64_function_incoming_arg)
	(ia64_function_arg_1): Likewise.
	* config/iq2000/iq2000.c (iq2000_function_arg): Likewise.
	(iq2000_expand_prologue, iq2000_pass_by_reference): Update call
	accordingly.
	* config/lm32/lm32.c (lm32_function_arg): Take a function_arg_info
	instead of a mode, tree and named flag.
	* config/m32c/m32c.c (m32c_function_arg): Likewise.
	* config/m32r/m32r.c (m32r_function_arg): Likewise.
	* config/m68k/m68k.c (m68k_function_arg): Likewise.
	* config/mcore/mcore.c (mcore_function_arg): Likewise.
	* config/microblaze/microblaze.c (microblaze_function_arg): Likewise.
	(microblaze_expand_prologue): Update call accordingly.
	* config/mips/mips.c (mips_function_arg): Take a function_arg_info
	instead of a mode, tree and named flag.
	* config/mmix/mmix.c (mmix_function_incoming_arg, mmix_function_arg)
	(mmix_function_arg_1): Likewise.
	* config/mn10300/mn10300.c (mn10300_function_arg): Likewise.
	* config/moxie/moxie.c (moxie_function_arg): Likewise.
	* config/msp430/msp430.c (msp430_function_arg): Likewise.
	* config/nds32/nds32.c (nds32_function_arg): Likewise.
	* config/nios2/nios2.c (nios2_function_arg): Likewise.
	* config/nvptx/nvptx.c (nvptx_function_arg): Likewise.
	(nvptx_function_incoming_arg): Likewise.
	* config/or1k/or1k.c (or1k_function_arg): Likewise.
	* config/pa/pa.c (pa_function_arg): Likewise.
	* config/pdp11/pdp11.c (pdp11_function_arg): Likewise.
	* config/pru/pru.c (pru_function_arg): Likewise.
	* config/riscv/riscv.c (riscv_function_arg): Likewise.
	* config/rl78/rl78.c (rl78_function_arg): Likewise.
	* config/rs6000/rs6000-internal.h (rs6000_function_arg): Likewise.
	* config/rs6000/rs6000-call.c (rs6000_function_arg): Likewise.
	(rs6000_parm_needs_stack): Update call accordingly.
	* config/rx/rx.c (rx_function_arg): Take a function_arg_info
	instead of a mode, tree and named flag.
	* config/s390/s390.c (s390_function_arg): Likewise.
	(s390_call_saved_register_used): Update call accordingly.
	* config/sh/sh.c (sh_function_arg): Take a function_arg_info
	instead of a mode, tree and named flag.
	(sh_output_mi_thunk): Update call accordingly.
	* config/sparc/sparc.c (sparc_function_arg_1, sparc_function_arg)
	(sparc_function_incoming_arg): Take a function_arg_info instead of
	a mode, tree and named flag.
	* config/spu/spu.c (spu_function_arg): Likewise.
	* config/stormy16/stormy16.c (xstormy16_function_arg): Likewise.
	* config/tilegx/tilegx.c (tilegx_function_arg): Likewise.
	* config/tilepro/tilepro.c (tilepro_function_arg): Likewise.
	* config/v850/v850.c (v850_function_arg): Likewise.
	* config/vax/vax.c (vax_function_arg): Likewise.
	* config/visium/visium.c (visium_function_arg): Likewise.
	* config/xtensa/xtensa.c (xtensa_function_arg_1, xtensa_function_arg)
	(xtensa_function_incoming_arg): Likewise.

From-SVN: r274700
2019-08-20 08:53:04 +00:00
Richard Sandiford e7056ca417 Use function_arg_info for TARGET_SETUP_INCOMING_ARGS
The hook is passed the promoted mode instead of the original type mode.

2019-08-20  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
	* target.def (setup_incoming_varargs): Take a function_arg_info
	instead of a mode and tree.
	* doc/tm.texi: Regenerate.
	* targhooks.h (default_setup_incoming_varargs): Take a
	function_arg_info instead of a mode and tree.
	* targhooks.c (default_setup_incoming_varargs): Likewise.
	* config/aarch64/aarch64.c (aarch64_setup_incoming_varargs): Likewise.
	* config/alpha/alpha.c (alpha_setup_incoming_varargs): Likewise.
	* config/arc/arc.c (arc_setup_incoming_varargs): Likewise.
	* config/arm/arm.c (arm_setup_incoming_varargs): Likewise.
	* config/bfin/bfin.c (setup_incoming_varargs): Likewise.
	* config/cris/cris.c (cris_setup_incoming_varargs): Likewise.
	* config/csky/csky.c (csky_setup_incoming_varargs): Likewise.
	* config/epiphany/epiphany.c (epiphany_setup_incoming_varargs):
	Likewise.
	* config/fr30/fr30.c (fr30_setup_incoming_varargs): Likewise.
	* config/frv/frv.c (frv_setup_incoming_varargs): Likewise.
	* config/ft32/ft32.c (ft32_setup_incoming_varargs): Likewise.
	* config/i386/i386.c (ix86_setup_incoming_varargs): Likewise.
	* config/ia64/ia64.c (ia64_setup_incoming_varargs): Likewise.
	* config/iq2000/iq2000.c (iq2000_setup_incoming_varargs): Likewise.
	* config/lm32/lm32.c (lm32_setup_incoming_varargs): Likewise.
	* config/m32r/m32r.c (m32r_setup_incoming_varargs): Likewise.
	* config/mcore/mcore.c (mcore_setup_incoming_varargs): Likewise.
	* config/mips/mips.c (mips_setup_incoming_varargs): Likewise.
	* config/mmix/mmix.c (mmix_setup_incoming_varargs): Likewise.
	* config/moxie/moxie.c (moxie_setup_incoming_varargs): Likewise.
	* config/nds32/nds32.c (nds32_setup_incoming_varargs): Likewise.
	* config/nios2/nios2.c (nios2_setup_incoming_varargs): Likewise.
	* config/riscv/riscv.c (riscv_setup_incoming_varargs): Likewise.
	* config/rs6000/rs6000-internal.h (setup_incoming_varargs): Likewise.
	* config/rs6000/rs6000-call.c (setup_incoming_varargs): Likewise.
	* config/sh/sh.c (sh_setup_incoming_varargs): Likewise.
	* config/spu/spu.c (spu_setup_incoming_varargs): Likewise.
	* config/tilegx/tilegx.c (tilegx_setup_incoming_varargs): Likewise.
	* config/tilepro/tilepro.c (tilepro_setup_incoming_varargs): Likewise.
	* config/visium/visium.c (visium_setup_incoming_varargs): Likewise.
	* function.c (assign_parms_setup_varargs): Update call to
	targetm.calls.setup_incoming_varargs.

From-SVN: r274699
2019-08-20 08:52:48 +00:00
Richard Sandiford 52090e4dbd Use function_arg_info for TARGET_PASS_BY_REFERENCE
The hook is passed the unpromoted type mode instead of the promoted mode.

2019-08-20  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
	* target.def (pass_by_reference): Take a function_arg_info instead
	of a mode, type and named flag.
	* doc/tm.texi: Regenerate.
	* targhooks.h (hook_pass_by_reference_must_pass_in_stack): Update
	accordingly.
	(hook_bool_CUMULATIVE_ARGS_arg_info_false): Declare.
	* targhooks.c (hook_pass_by_reference_must_pass_in_stack): Take a
	function_arg_info instead of a mode, type and named flag.
	(hook_bool_CUMULATIVE_ARGS_arg_info_false): New function.
	* calls.h (pass_by_reference): Take a function_arg_info instead of a
	mode, type and named flag.
	* calls.c (pass_by_reference): Likewise.
	(pass_va_arg_by_reference): Update call accordingly.
	(initialize_argument_information): Likewise.
	(emit_library_call_value_1): Likewise.
	* function.c (assign_parm_find_data_types): Likewise.
	* var-tracking.c (prepare_call_arguments): Likewise.
	* stor-layout.c: Include calls.h.
	(compute_record_mode): Update call to targetm.calls.pass_by_reference.
	* config/aarch64/aarch64.c (aarch64_pass_by_reference): Take a
	function_arg_info instead of a mode, type and named flag.
	* config/alpha/alpha.c (alpha_pass_by_reference): Likewise.
	* config/arc/arc.c (arc_pass_by_reference): Likewise.
	* config/arm/arm.c (arm_pass_by_reference): Likewise.
	* config/bfin/bfin.c (bfin_pass_by_reference): Likewise.
	* config/c6x/c6x.c (c6x_pass_by_reference): Likewise.
	(c6x_call_saved_register_used): Update call to pass_by_reference.
	* config/cris/cris.c (cris_pass_by_reference): Take a
	function_arg_info instead of a mode, type and named flag.
	* config/epiphany/epiphany.c (epiphany_pass_by_reference): Take a
	function_arg_info instead of a mode, type and named flag.
	(epiphany_arg_partial_bytes): Update call accordingly.
	* config/ft32/ft32.c (ft32_pass_by_reference): Take a
	function_arg_info instead of a mode, type and named flag.
	(ft32_arg_partial_bytes): Update call accordingly.
	* config/i386/i386.c (ix86_pass_by_reference): Take a
	function_arg_info instead of a mode, type and named flag.
	* config/iq2000/iq2000.c (iq2000_pass_by_reference): Likewise.
	* config/m32c/m32c.c (m32c_pass_by_reference): Likewise.
	* config/m32r/m32r.c (m32r_pass_by_reference): Likewise.
	(m32r_return_in_memory): Update call accordingly.
	* config/mips/mips.c (mips_pass_by_reference): Take a
	function_arg_info instead of a mode, type and named flag.
	* config/mmix/mmix.c (mmix_pass_by_reference): Likewise.
	* config/mn10300/mn10300.c (mn10300_pass_by_reference): Likewise.
	* config/moxie/moxie.c (moxie_pass_by_reference): Likewise.
	(moxie_arg_partial_bytes): Update call accordingly.
	* config/msp430/msp430.c (msp430_pass_by_reference): Take a
	function_arg_info instead of a mode, type and named flag.
	* config/nvptx/nvptx.c (nvptx_pass_by_reference): Likewise.
	* config/or1k/or1k.c (or1k_pass_by_reference): Likewise.
	* config/pa/pa.c (pa_pass_by_reference): Likewise.
	* config/riscv/riscv.c (riscv_pass_by_reference): Likewise.
	(riscv_return_in_memory): Update call accordingly.
	* config/rs6000/rs6000-internal.h (rs6000_pass_by_reference): Take a
	function_arg_info instead of a mode, type and named flag.
	* config/rs6000/rs6000-call.c (rs6000_pass_by_reference): Likewise.
	(rs6000_parm_needs_stack): Update call to pass_by_reference.
	* config/s390/s390.c (s390_pass_by_reference): Take a
	function_arg_info instead of a mode, type and named flag.
	(s390_call_saved_register_used): Update call accordingly.
	* config/sh/sh.c (sh_pass_by_reference): Take a function_arg_info
	instead of a mode, type and named flag.
	* config/sparc/sparc.c (sparc_pass_by_reference): Likewise.
	* config/spu/spu.c (spu_pass_by_reference): Likewise.
	* config/tilegx/tilegx.c (tilegx_pass_by_reference): Likewise.
	* config/tilepro/tilepro.c (tilepro_pass_by_reference): Likewise.
	* config/v850/v850.c (v850_pass_by_reference): Likewise.
	* config/visium/visium.c (visium_pass_by_reference): Likewise.

gcc/ada/
	* gcc-interface/misc.c (default_pass_by_ref): Update call to
	pass_by_reference.

From-SVN: r274698
2019-08-20 08:52:40 +00:00
Richard Sandiford a7c81bc1fb Use function_arg_info for TARGET_ARG_PARTIAL_BYTES
This patch adds the function_arg_info class and uses it for
TARGET_ARG_PARTIAL_BYTES.

The hook is passed the promoted mode instead of the original type mode.

The arguments aren't mentioned in the documentation, which is why the
target.def change is so small.

The patch changes "true" to "arg.named" in:

  gcc_assert (!epiphany_pass_by_reference (cum, mode, type, /* named */ true));

but epiphany_pass_by_reference doesn't care about the named flag.

2019-08-20  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
	* target.def (arg_partial_bytes): Take a function_arg_info instead
	of a mode, type and named flag.
	* doc/tm.texi: Regenerate.
	* target.h (function_arg_info): Declare.
	* calls.h (function_arg_info): New class.
	* targhooks.h (hook_int_CUMULATIVE_ARGS_mode_tree_bool_0): Delete.
	(hook_int_CUMULATIVE_ARGS_arg_info_0): Declare.
	* targhooks.c (hook_int_CUMULATIVE_ARGS_mode_tree_bool_0): Delete.
	(hook_int_CUMULATIVE_ARGS_arg_info_0): New function.
	* calls.c (initialize_argument_information): Update call to
	targetm.calls.partial_bytes.
	(emit_library_call_value_1): Likewise.
	* expr.c (block_move_libcall_safe_for_call_parm): Likewise.
	* function.c (assign_parm_find_entry_rtl): Likewise.
	* config/alpha/alpha.c (alpha_arg_partial_bytes): Take a
	function_arg_info instead of a mode, type and named flag.
	* config/arc/arc.c (arc_arg_partial_bytes): Likewise.
	* config/arm/arm.c (arm_arg_partial_bytes): Likewise.
	(cmse_func_args_or_return_in_stack): Update accordingly.
	* config/bfin/bfin.c (bfin_arg_partial_bytes): Take a
	function_arg_info instead of a mode, type and named flag.
	* config/cris/cris.c (cris_arg_partial_bytes): Likewise.
	* config/csky/csky.c (csky_arg_partial_bytes): Likewise.
	* config/epiphany/epiphany.c (epiphany_arg_partial_bytes): Likewise.
	* config/fr30/fr30.c: Include calls.h.
	(fr30_arg_partial_bytes): Take a function_arg_info instead of a mode,
	type and named flag.
	* config/frv/frv.c: Include calls.h.
	(frv_arg_partial_bytes): Take a function_arg_info instead of a mode,
	type and named flag.
	* config/ft32/ft32.c (ft32_arg_partial_bytes): Likewise.
	* config/gcn/gcn.c (gcn_arg_partial_bytes): Likewise.
	* config/ia64/ia64.c (ia64_arg_partial_bytes): Likewise.
	* config/iq2000/iq2000.c (iq2000_arg_partial_bytes): Likewise.
	* config/m32r/m32r.c (m32r_arg_partial_bytes): Likewise.
	* config/mcore/mcore.c (mcore_arg_partial_bytes): Likewise.
	* config/microblaze/microblaze.c (function_arg_partial_bytes):
	Likewise.
	* config/mips/mips.c (mips_arg_partial_bytes): Likewise.
	* config/mn10300/mn10300.c (mn10300_arg_partial_bytes): Likewise.
	* config/moxie/moxie.c (moxie_arg_partial_bytes): Likewise.
	* config/msp430/msp430.c (msp430_arg_partial_bytes): Likewise.
	* config/nds32/nds32.c (nds32_arg_partial_bytes): Likewise.
	* config/nios2/nios2.c (nios2_arg_partial_bytes): Likewise.
	* config/pa/pa.c (pa_arg_partial_bytes): Likewise.
	* config/pru/pru.c (pru_arg_partial_bytes): Likewise.
	* config/riscv/riscv.c (riscv_arg_partial_bytes): Likewise.
	* config/rs6000/rs6000-internal.h (rs6000_arg_partial_bytes): Likewise.
	* config/rs6000/rs6000-call.c (rs6000_arg_partial_bytes): Likewise.
	(rs6000_parm_needs_stack): Update call accordingly.
	* config/sh/sh.c (sh_arg_partial_bytes): Take a
	function_arg_info instead of a mode, type and named flag.
	* config/sparc/sparc.c (sparc_arg_partial_bytes): Likewise.
	* config/v850/v850.c (v850_arg_partial_bytes): Likewise.

From-SVN: r274697
2019-08-20 08:52:17 +00:00
Richard Sandiford 4f53599cb5 Add must_pass_va_arg_in_stack
This patch splits out another idiom from the va_arg gimplification
routines, so that there's only one place to update later.

2019-08-20  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
	* calls.h (must_pass_va_arg_in_stack): Declare.
	* calls.c (must_pass_va_arg_in_stack): New function.
	* config/alpha/alpha.c (alpha_gimplify_va_arg_1): Use it.
	* config/sh/sh.c (sh_gimplify_va_arg_expr): Likewise.
	* config/stormy16/stormy16.c (xstormy16_gimplify_va_arg_expr):
	Likewise.
	* config/xtensa/xtensa.c (xtensa_gimplify_va_arg_expr): Likewise.

From-SVN: r274696
2019-08-20 08:51:09 +00:00
Richard Sandiford fde65a89fa Add pass_va_arg_by_reference
This patch splits out a common idiom from the va_arg gimplification
routines, so that there's only one place to update later.

2019-08-20  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
	* calls.h (pass_va_arg_by_reference): Declare.
	* calls.c (pass_va_arg_by_reference): New function.
	* config/aarch64/aarch64.c (aarch64_gimplify_va_arg_expr): Use it.
	* config/alpha/alpha.c (alpha_gimplify_va_arg): Likewise.
	* config/gcn/gcn.c (gcn_gimplify_va_arg_expr): Likewise.
	* config/i386/i386.c (ix86_gimplify_va_arg): Likewise.
	* config/ia64/ia64.c (ia64_gimplify_va_arg): Likewise.
	* config/mips/mips.c (mips_std_gimplify_va_arg_expr): Likewise.
	(mips_gimplify_va_arg_expr): Likewise.
	* config/msp430/msp430.c (msp430_gimplify_va_arg_expr): Likewise.
	* config/pa/pa.c (hppa_gimplify_va_arg_expr): Likewise.
	* config/rs6000/rs6000-call.c (rs6000_gimplify_va_arg): Likewise.
	* config/s390/s390.c (s390_gimplify_va_arg): Likewise.
	* config/sparc/sparc.c (sparc_gimplify_va_arg): Likewise.
	* config/spu/spu.c (spu_gimplify_va_arg_expr): Likewise.
	* config/tilegx/tilegx.c (tilegx_gimplify_va_arg_expr): Likewise.
	* config/tilepro/tilepro.c (tilepro_gimplify_va_arg_expr): Likewise.
	* config/visium/visium.c (visium_gimplify_va_arg): Likewise.
	* config/xtensa/xtensa.c (xtensa_gimplify_va_arg_expr): Likewise.
	* targhooks.c (std_gimplify_va_arg_expr): Likewise.

From-SVN: r274695
2019-08-20 08:50:59 +00:00
Richard Biener f386ca4138 re PR target/91498 (STV change in r274481 causes 300.twolf regression on Haswell)
2019-08-20  Richard Biener  <rguenther@suse.de>

	PR target/91498
	* config/i386/i386-features.c (general_scalar_chain::convert_op):
	Use (vec_merge (vec_duplicate..)) style vector from scalar move.
	(convert_scalars_to_vector): Add timode_p parameter and use it
	to guard TImode-only operation.
	(pass_stv::gate): Adjust so STV runs twice for TARGET_64BIT.
	(pass_stv::execute): Pass down timode_p.

	* gcc.target/i386/minmax-7.c: New testcase.

From-SVN: r274694
2019-08-20 08:45:56 +00:00
Hongtao Liu a9fcfec30f Add TIGERLAKE and COOPERLAKE to GCC.
2019-08-20  Lili Cui  <lili.cui@intel.com>

gcc/
	* common/config/i386/i386-common.c
	(processor_names): Add tigerlake and cooperlake.
	(processor_alias_table): Add tigerlake and cooperlake.
	* config.gcc: Add -march=tigerlake and cooperlake.
	* config/i386/driver-i386.c
	(host_detect_local_cpu): Detect tigerlake and cooperlake.
	Add "has_avx" to classify processor.
	* config/i386/i386-builtins.c (processor_model):
	Add M_INTEL_COREI7_TIGERLAKE and M_INTEL_COREI7_COOPERLAKE.
	(arch_names_table): Add tigerlake and cooperlake.
	(get_builtin_code_for_version) : Handle PROCESSOR_TIGERLAKE and
	PROCESSOR_COOPERLAKE.
	* config/i386/i386-c.c
	(ix86_target_macros_internal): Handle tigerlake and cooperlake.
	* config/i386/i386-options.c
	(m_TIGERLAKE)  : Define.
	(m_COOPERLAKE) : Ditto.
	(m_CORE_AVX512): Ditto.
	(processor_cost_table): Add cascadelake.
	(ix86_option_override_internal): Hadle PTA_MOVDIRI, PTA_MOVDIR64B.
	* config/i386/i386.h
	(ix86_size_cost) : Define TARGET_TIGERLAKE and TARGET_COOPERLAKE.
	(processor_type) : Add PROCESSOR_TIGERLAKE and PROCESSOR_COOPERLAKE.
	(PTA_MOVDIRI): Ditto.
	(PTA_MOVDIR64B): Ditto.
	(PTA_COOPERLAKE) : Ditto.
	(PTA_TIGERLAKE)  : Ditto.
	(processor_type) : Add PROCESSOR_TIGERLAKE and PROCESSOR_COOPERLAKE.
	* doc/extend.texi: Add tigerlake and cooperlake.
	* doc/invoke.texi: Add tigerlake and cooperlake.

gcc/testsuite/
	* gcc.target/i386/funcspec-56.inc: Handle new march.
	* g++.target/i386/mv16.C: Handle new march

libgcc/
	* config/i386/cpuinfo.h: Add INTEL_COREI7_TIGERLAKE and
	INTEL_COREI7_COOPERLAKE.

From-SVN: r274693
2019-08-20 07:06:03 +00:00
Gerald Pfeifer 607a71e842 install.texi (Specific, alpha): Remove note to use binutils 2.11.2 or later.
* doc/install.texi (Specific, alpha): Remove note to use
	binutils 2.11.2 or later.

From-SVN: r274692
2019-08-20 05:38:06 +00:00
Bernd Edlinger 1bcec8dfa3 re PR middle-end/89544 (Argument marshalling incorrectly assumes stack slots are naturally aligned.)
2019-08-20  Bernd Edlinger  <bernd.edlinger@hotmail.de>

        PR middle-end/89544
        * function.c (assign_parm_find_stack_rtl): Use larger alignment
        when possible.

testsuite:
2019-08-20  Bernd Edlinger  <bernd.edlinger@hotmail.de>

        PR middle-end/89544
        * gcc.target/arm/unaligned-argument-1.c: New test.
        * gcc.target/arm/unaligned-argument-2.c: New test.

From-SVN: r274691
2019-08-20 05:32:49 +00:00
GCC Administrator 876013aa41 Daily bump.
From-SVN: r274689
2019-08-20 00:16:22 +00:00
Ian Lance Taylor 5582fc15e5 compiler: new debugging output methods/functions
Add new hooks for dumping named objects, package bindings,
    and top level Gogo package list.
    
    Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/190877

From-SVN: r274682
2019-08-19 21:15:49 +00:00
Ian Lance Taylor 4f6bdb08ba runtime: be more strict in GC
With CL 190599, along with what we do in greyobject, we ensure
    that we only mark allocated heap objects. As a result we can be
    more strict in GC:
    
    - Enable "sweep increased allocation count" check, which checks
      that the number of mark bits set are no more than the number of
      allocation bits.
    
    - Enable invalid pointer check on heap scan. We only trace
      allocated heap objects, which should not contain invalid
      pointer.
    
    This also makes the libgo runtime more convergent with the gc
    runtime.
    
    Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/190797

From-SVN: r274678
2019-08-19 19:09:50 +00:00
Joel Hutton 188d00796f [AArch64] Use scvtf fbits option where appropriate
gcc/ChangeLog:
2019-08-19  Joel Hutton  <Joel.Hutton@arm.com>

	* config/aarch64/aarch64-protos.h (aarch64_fpconst_pow2_recip): New prototype
	* config/aarch64/aarch64.c (aarch64_fpconst_pow2_recip): New function
	* config/aarch64/aarch64.md (*aarch64_<su_optab>cvtf<fcvt_target><GPF:mode>2_mult): New pattern
	(*aarch64_<su_optab>cvtf<fcvt_iesize><GPF:mode>2_mult): New pattern
	* config/aarch64/constraints.md (Dt): New constraint
	* config/aarch64/predicates.md (aarch64_fpconst_pow2_recip): New predicate

gcc/testsuite/ChangeLog:
2019-08-19  Joel Hutton  <Joel.Hutton@arm.com>

	* gcc.target/aarch64/fmul_scvtf_1.c: New test.

From-SVN: r274676
2019-08-19 16:55:20 +00:00
Tom Tromey aac9103b0e Add --with-static-standard-libraries to the top level
gdb should normally not be linked with -static-libstdc++.  Currently
this has not caused problems, but it's incompatible with catching an
exception thrown from a shared library -- and a subsequent patch
changes gdb to do just this.

This patch adds a new --with-static-standard-libraries flag to the
top-level configure.  It defaults to "auto", which means enabled if
gcc is being built, and disabled otherwise.

ChangeLog
2019-08-19  Tom Tromey  <tom@tromey.com>

	* configure: Rebuild.
	* configure.ac: Add --with-static-standard-libraries.

From-SVN: r274673
2019-08-19 15:47:30 +00:00
Richard Biener 3bbc329b24 re PR tree-optimization/91403 (GCC fails with ICE.)
2019-08-19  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/91403
	* tree-scalar-evolution.c (follow_ssa_edge_binary): Inline
	cases we can handle with tail-recursion...
	(follow_ssa_edge_expr): ... here.  Do so.

From-SVN: r274672
2019-08-19 14:45:38 +00:00
Marek Polacek 04e1749c55 PR c++/91264 - detect modifying const objects in constexpr.
* constexpr.c (modifying_const_object_error): New function.
	(cxx_eval_call_expression): Set TREE_READONLY on a CONSTRUCTOR of
	a const-qualified object after it's been fully constructed.
	(modifying_const_object_p): New function.
	(cxx_eval_store_expression): Detect modifying a const object
	during constant expression evaluation.
	(cxx_eval_increment_expression): Use a better location when building
	up the store.
	(cxx_eval_constant_expression) <case DECL_EXPR>: Mark a constant
	object's constructor TREE_READONLY.

	* g++.dg/cpp1y/constexpr-tracking-const1.C: New test.
	* g++.dg/cpp1y/constexpr-tracking-const2.C: New test.
	* g++.dg/cpp1y/constexpr-tracking-const3.C: New test.
	* g++.dg/cpp1y/constexpr-tracking-const4.C: New test.
	* g++.dg/cpp1y/constexpr-tracking-const5.C: New test.
	* g++.dg/cpp1y/constexpr-tracking-const6.C: New test.
	* g++.dg/cpp1y/constexpr-tracking-const7.C: New test.
	* g++.dg/cpp1y/constexpr-tracking-const8.C: New test.
	* g++.dg/cpp1y/constexpr-tracking-const9.C: New test.
	* g++.dg/cpp1y/constexpr-tracking-const10.C: New test.
	* g++.dg/cpp1y/constexpr-tracking-const11.C: New test.
	* g++.dg/cpp1y/constexpr-tracking-const12.C: New test.
	* g++.dg/cpp1y/constexpr-tracking-const13.C: New test.
	* g++.dg/cpp1y/constexpr-tracking-const14.C: New test.

From-SVN: r274671
2019-08-19 13:59:13 +00:00
Mark Eggleston 5a9ea4fff4 Update BOZ constant documentation.
In the section "BOZ Literal constants" delete paragraph about integer
overload errors when initialising integer variables with BOZ constants
as these no longer occur.

From-SVN: r274667
2019-08-19 08:53:49 +00:00
Bob Duff 8fd97fcdba [Ada] Fix documentation for stream oriented attributes
2019-08-19  Bob Duff  <duff@adacore.com>

gcc/ada/

	* doc/gnat_rm/implementation_advice.rst: Fix documentation for
	stream oriented attributes.
	* gnat_rm.texi: Regenerate.

From-SVN: r274666
2019-08-19 08:37:39 +00:00
Gary Dismukes c27a8bce8a [Ada] Einfo: update comments for E_Function and E_Procedure
2019-08-19  Gary Dismukes  <dismukes@adacore.com>

gcc/ada/

	* einfo.ads (E_Function, E_Procedure): Update comments to
	reflect that Renamed_Entity is also used for nongeneric
	subprograms.

From-SVN: r274665
2019-08-19 08:37:34 +00:00
Eric Botcazou 8fafa0b420 [Ada] Fix bogus compilation error with Elaborate_Body and -gnatN
This fixes a bogus compilation error when a unit with SPARK_Mode
containing a pragma Elaborate_Body is with-ed by a generic unit
containing an inlined subprogram, and front-end inlining is enabled.

2019-08-19  Eric Botcazou  <ebotcazou@adacore.com>

gcc/ada/

	* sem_prag.adb (Is_Before_First_Decl): Deal with rewritten
	pragmas.

gcc/testsuite/

	* gnat.dg/elab8.adb, gnat.dg/elab8_gen.adb,
	gnat.dg/elab8_gen.ads, gnat.dg/elab8_pkg.adb,
	gnat.dg/elab8_pkg.ads: New testcase.

From-SVN: r274664
2019-08-19 08:37:28 +00:00
Bob Duff bfa6962fc2 [Ada] Suppress warnings on unreferenced parameters of dispatching ops
If the -gnatwf switch is used to activate warnings on unreferenced
formal parameters, the warning is no longer given if the subprogram is
dispatching, because such warnings tend to be noise. It is quite common
to have a parameter that is necessary just because the subprogram is
overriding, or just because we need a controlling parameter for the
dispatch.

2019-08-19  Bob Duff  <duff@adacore.com>

gcc/ada/

	* sem_warn.adb (Warn_On_Unreferenced_Entity): Suppress warning
	on formal parameters of dispatching operations.

gcc/testsuite/

	* gnat.dg/warn29.adb, gnat.dg/warn29.ads: New testcase.

From-SVN: r274663
2019-08-19 08:37:23 +00:00
Ed Schonberg fcef060c9b [Ada] Crash on object initialization that is call to expression function
This patch fixes a compiler abort on an object declaration for a
class-wide type whose expression is a call to an expression function
that returns type extension.

2019-08-19  Ed Schonberg  <schonberg@adacore.com>

gcc/ada/

	* sem_res.adb (Resolve_Call): A call to an expression function
	freezes when expander is active, unless the call appears within
	the body of another expression function,

gcc/testsuite/

	* gnat.dg/expr_func9.adb: New testcase.

From-SVN: r274662
2019-08-19 08:37:18 +00:00
Dmitriy Anisimkov c702203823 [Ada] Conversion routines between GNAT.OS_Lib.OS_Time and long integer
The new routines convert back and forth between private type OS_Time and
a long integer which can be used in package Ada.Calendar.Conversions
routines to convert to Ada.Calendar.Time.

2019-08-19  Dmitriy Anisimkov  <anisimko@adacore.com>

gcc/ada/

	* libgnat/s-os_lib.ads, libgnat/s-os_lib.adb (To_Ada, To_C): New
	routines.

From-SVN: r274661
2019-08-19 08:37:13 +00:00
Bob Duff 382b0e9771 [Ada] Incorrect code for -gnateV switch
This patch corrects the code generated by the -gnateV switch in the case
of a private type whose full type is a modular type, removing spurious
run-time failures.

In addition, this corrects the initialization of exception occurrences
in exception handlers to avoid leaving data uninitialized, which caused
-gnateV to raise spurious errors.

2019-08-19  Bob Duff  <duff@adacore.com>

gcc/ada/

	* exp_attr.adb (Attribute_Valid): Correct the handling of
	private types where the full type is modular. System.Address is
	an example. Otherwise, we convert uncheckedly to a signed type,
	so we get an incorrect range 0 .. -1, for which all values will
	fail.  The 'Valid attribute is illegal for such types, but we
	generate such illegal attribute_references for 'Valid_Scalars,
	and we generate 'Valid_Scalars when the -gnateV switch is used.
	Rename Btyp --> PBtyp to avoid hiding the outer Btyp, which was
	confusing.
	* libgnat/a-except.adb: Set the Exception_Raised component.
	Otherwise, we have incorrect reads of invalid data.

gcc/testsuite/

	* gnat.dg/valid_scalars2.adb: New testcase.

From-SVN: r274660
2019-08-19 08:37:09 +00:00
Pierre-Marie de Rodat 27ebda1930 [Ada] Import documentation from the RM for various runtime units
2019-08-19  Pierre-Marie de Rodat  <derodat@adacore.com>

gcc/ada/

	* libgnat/a-cgaaso.ads, libgnat/a-cgarso.ads,
	libgnat/a-cogeso.ads, libgnat/a-contai.ads,
	libgnat/a-locale.ads: Import documentation from the RM.

From-SVN: r274659
2019-08-19 08:37:03 +00:00
Jerome Guitton bd0feb3c61 [Ada] Generate ada_target_properties
Generate target-dependent info into a file named ada_target_properties.
This information is used by tools for static analysis: they need to know
the size of standard types for a given run-time library. This metadata
is meant to be saved at the root of the run-time directory.

2019-08-19  Jerome Guitton  <guitton@adacore.com>

gcc/ada/

	* Makefile.rtl (system.o): New target to add generation of
	target properties.
	* gcc-interface/Makefile.in (install-gnatlib): Install
	ada_target_properties.

From-SVN: r274658
2019-08-19 08:36:58 +00:00
Eric Botcazou 6c87c83bb2 [Ada] Lift restriction on instantiations that are compilation units
This change lifts the restriction that was still present in the new
on-demand instantiation scheme for the body of generics instantiated in
non-main units.

The instantiations that are compilation units were still dealt with in
the old-fashioned way, that is to say the decision of instantiating the
body was still made up front during the analysis of the instance
declaration, instead of being deferred until after a call to an inlined
subprogram is encountered.

This should save a few more cycles when full inlining across units is
enabled, but there should otherwise be no functional changes.

2019-08-19  Eric Botcazou  <ebotcazou@adacore.com>

gcc/ada/

	* inline.adb (Add_Inlined_Body): Do not special-case instances
	that are compilation units.
	(Add_Pending_Instantiation): Likewise.
	(Instantiate_Body): Skip instantiations that are compilation
	units and have already been performed.
	* sem_ch12.adb (Needs_Body_Instantiated): Do not special-case
	instances that are compilation units.
	(Load_Parent_Of_Generic): Be prepared for parent that is a
	compilation unit but whose instantiation node has not been
	replaced.

gcc/testsuite/

	* gnat.dg/generic_inst12.adb, gnat.dg/generic_inst12_pkg1.adb,
	gnat.dg/generic_inst12_pkg1.ads,
	gnat.dg/generic_inst12_pkg2.ads: New testcase.

From-SVN: r274657
2019-08-19 08:36:53 +00:00
Eric Botcazou 92b635e518 [Ada] Further cleanup in inlining machinery
This adds missing boilerplate stuff.  No functional changes.

2019-08-19  Eric Botcazou  <ebotcazou@adacore.com>

gcc/ada/

	* inline.adb (Initialize, Lock): Deal with
	Called_Pending_Instantiations.

From-SVN: r274656
2019-08-19 08:36:48 +00:00
Ed Schonberg 432c8cddda [Ada] Legality of protected subp. implementing interface operations
This patch refines the predicate that implements rule in RM 9.4 (11.9/2)

Compiling b94.ads must yield:

   b94.ads:11:17: illegal overriding of subprogram inherited from interface
   b94.ads:11:17: first formal of "N" declared at line 8 must be of mode
     "out", "in out" or access-to-variable

----
package B94 is

   type Prot2_Int is protected interface;
   procedure  J (PI : in     Prot2_Int; N : in Integer)  is null;
   procedure  K (PI : in out Prot2_Int; N : in Integer)  is null;
   procedure  L (PI :    out Prot2_Int; N : in Integer)  is null;
   procedure  M (PI : access Prot2_Int; N : in Integer)  is null;
   procedure  N (PI : access constant Prot2_Int; N : in Integer)  is null;

   protected type Protected_2 is new Prot2_Int with
      procedure N (N : in Integer);                   -- ERROR: {7;1}
   end Protected_2;

end B94;

2019-08-19  Ed Schonberg  <schonberg@adacore.com>

gcc/ada/

	* sem_ch6.adb (Check_Synchronized_Overriding): Complete
	predicate that applies legality check in 9.4 (11.9/2): if an
	inherited subprogram is implemented by a protected procedure or
	entry, its first paarameter must be out, in_out or
	access_to_varible.

From-SVN: r274655
2019-08-19 08:36:44 +00:00
Javier Miranda bd5ed03ae9 [Ada] Buffer reading overflow in dispatch table initialization
For tagged types not defined at library level that derive from library
level tagged types the compiler may generate code to initialize their
dispatch table of predefined primitives copying from the parent type
data stored in memory after the dispatch table of the parent; that is,
at runtime the initialization of dispatch tables overflows reading the
parent dispatch table.

This problem does not affect the execution of the program since the
target dispatch table always has enough space to store the extra data,
and after such copy the compiler generates code to complete the
initialization of the dispatch table.

The following test must compile and execute without errors.

package pkg_a is
   type Root is tagged null record;
end pkg_a;

with pkg_a;
procedure main is
   type Derived is new pkg_a.Root with null record;  -- Test
begin
   null;
end main;

Command: gnatmake -q main -fsanitize=address; ./main

2019-08-19  Javier Miranda  <miranda@adacore.com>

gcc/ada/

	PR ada/65696
	* exp_atag.ads, exp_atag.adb (Build_Inherit_Predefined_Prims):
	Adding formal to specify how many predefined primitives are
	inherited from the parent type.
	* exp_disp.adb (Number_Of_Predefined_Prims): New subprogram.
	(Make_Secondary_DT): Compute the number of predefined primitives
	of all tagged types (including tagged types not defined at
	library level).  Previously we unconditionally relied on the
	Max_Predef_Prims constant value when building the dispatch
	tables of tagged types not defined at library level (thus
	consuming more memory for their dispatch tables than required).
	(Make_DT): Compute the number of predefined primitives that must
	be inherited from their parent type when building the dispatch
	tables of tagged types not defined at library level. Previously
	we unconditionally relied on the Max_Predef_Prims constant value
	when building the dispatch tables of tagged types not defined at
	library level (thus copying more data than required from the
	parent type).

From-SVN: r274654
2019-08-19 08:36:39 +00:00
Bob Duff d403cfad2f [Ada] Process type extensions for -gnatw.h
This patch enables gap detection in type extensions.

With the -gnatw.h switch, on 64-bit machines,
the following test should get warnings:

gcc -c gaps.ads -gnatw.h
gaps.ads:16:07: warning: 48-bit gap before component "Comp2"
gaps.ads:17:07: warning: 8-bit gap before component "Comp3"

package Gaps is
   type Integer_16 is mod 2**16;

   type TestGap is tagged record
      Comp1 : Integer_16;
   end record;
   for TestGap use record
      Comp1 at 0 + 8 range 0..15;
   end record;

   type TestGap2 is new TestGap with record
      Comp2  : Integer_16;
      Comp3  : Integer_16;
   end record;
   for TestGap2 use record
      Comp2 at 08 + 8 range 0..15;
      Comp3 at 11 + 8 range 0..15;
   end record;

end Gaps;

2019-08-19  Bob Duff  <duff@adacore.com>

gcc/ada/

	* sem_ch13.adb (Record_Hole_Check): Procedure to check for holes
	that incudes processing type extensions. A type extension is
	processed by first calling Record_Hole_Check recursively on the
	parent type to compute the bit number after the last component
	of the parent.

From-SVN: r274653
2019-08-19 08:36:35 +00:00
Gary Dismukes eb6b9c9bcb [Ada] Improve warnings about "too few elements" and "too many elements"
When warning about length-check failures detected at compile time that
are flagged with "too few elements" or "too many elements", the compiler
now gives an additional message indicating the number of elements
expected by the context versus how many are present in the conflicting
expression (such as an aggregate that has too few or too many
components).

The test below reports the following warnings when compiled with this command:

$ gcc -c -gnatj78 length_warnings.adb

length_warnings.adb:6:09: warning: too few elements for subtype of
                          "Boolean_Array" defined at line 5, expected 10
                          elements; found 9 elements, "Constraint_Error" will
                          be raised at run time
length_warnings.adb:10:09: warning: too few elements for subtype of
                           "Boolean_Array" defined at line 9, expected 2
                           elements; found 1 element, "Constraint_Error" will
                           be raised at run time
length_warnings.adb:14:09: warning: too many elements for subtype of
                           "Boolean_Array" defined at line 13, expected 10
                           elements; found 11 elements, "Constraint_Error"
                           will be raised at run time
length_warnings.adb:18:09: warning: too many elements for subtype of
                           "Boolean_Array" defined at line 17, expected 0
                           elements; found 1 element, "Constraint_Error" will
                           be raised at run time
length_warnings.adb:22:09: warning: too many elements for subtype of
                           "Boolean_Array" defined at line 21, expected 1
                           element; found 2 elements, "Constraint_Error" will
                           be raised at run time

procedure Length_Check_Warnings is

   type Boolean_Array is array (Natural range <>) of Boolean;

   Bits_A : Boolean_Array (1 .. 10)
     := (True, True, True, True, True, True, True, True, True);
   -- Too few elements

   Bits_B : Boolean_Array (1 .. 2)
     := (1 => False);
   -- Too few elements

   Bits_C : Boolean_Array (1 .. 10)
     := (True, True, True, True, True, True, True, True, True, True, True);
   -- Too many elements

   Bits_D : Boolean_Array (1 .. 0)
     := (1 => True);
   -- Too many elements

   Bits_E : Boolean_Array (1 .. 1)
     := (True, False);
   -- Too many elements

begin
   null;
end Length_Check_Warnings;

2019-08-19  Gary Dismukes  <dismukes@adacore.com>

gcc/ada/

	* checks.adb (Length_Mismatch_Info_Message): New function in
	Selected_Length_Checks to return a message indicating the
	element counts for the mismatched lengths for a failed
	compile-time length check.
	(Plural_Or_Singular_Ending): Support function in
	Length_Mismatch_Info_Message to return either "" or "s", for
	concatenating to the end of words.
	(Selected_Length_Checks): Pass the result of
	Length_Mismatch_Info_Message as an extra warning message to
	Compile_Time_Constraint_Error to indicate the mismatched lengths
	for a failed compile-time length check.
	* sem_util.ads (Compile_Time_Constraint_Error): Add an optional
	message formal (Extra_Msg), defaulted to the empty string.
	* sem_util.adb (Compile_Time_Constraint_Error): Output an extra
	message following the main warning message (when Extra_Msg is
	not the empty string).

From-SVN: r274652
2019-08-19 08:36:30 +00:00
Patrick Bernardi 593e0eba77 [Ada] Enable use of GNAT.Sockets for VxWorks RTP
The recent introduction of GNAT.Sockets IPv6 support broke support for
VxWorks RTPs due to the use of internal VxWorks kernel calls. This patch
rectifies this by using the VxWorks public API for these routines.

The following RTP should compile successfully on a Development profile
VxWorks kernel that includes the INCLUDE_GETNAMEINFO component:

with GNAT.Sockets;      use GNAT.Sockets;

procedure IPvX is
   procedure Print_Address_Info
     (Host, Serv   : String;
      Family       : Family_Type := Family_Unspec)
   is
      Addresses : Address_Info_Array :=
        Get_Address_Info
          (Host, Serv, Family,
           Passive      => False,
           Numeric_Host => False);
   begin
      Sort (Addresses, IPv6_TCP_Preferred'Access);
   end Print_Address_Info;

begin
   Print_Address_Info ("localhost", "ssh");
end IPvX;

2019-08-19  Patrick Bernardi  <bernardi@adacore.com>

gcc/ada/

	* socket.c: Removed the redefinition of getaddrinfo, getnameinfo
	and freeaddrinfo to internal VxWorks kernel calls because they
	are, well, internal kernel calls and cannot be called from RTPs.
	VxWorks provides the necessary components to call these routines
	directly.

From-SVN: r274651
2019-08-19 08:36:26 +00:00
Eric Botcazou 1f5c7ba858 [Ada] Fix incorrect stub generation for types in instances
This fixes a fallout of a recent change clearing the
Is_Generic_Actual_Type on the implicit full view of a private actual
type in an instance.  This flag is used to help disambiguating formal
types instantiated on the same actual type within an instance, but it
should be cleared outside the instance to let the usual disambiguation
rules apply again to these types outside the instance.

This in particular means that Exp_Dist cannot rely on it to detect
subtypes representing generic actual types, hence the need for the new
predicate.

2019-08-19  Eric Botcazou  <ebotcazou@adacore.com>

gcc/ada/

	* exp_dist.adb (Is_Generic_Actual_Subtype): New predicate.
	(Build_From_Any_Call, Build_To_Any_Call, Build_TypeCode_Call):
	Use it instead of Is_Generic_Actual_Type flag to detect subtypes
	representing generic actual types.

From-SVN: r274650
2019-08-19 08:36:21 +00:00
Ed Schonberg 4527ea2ed9 [Ada] Improve placement of warning on formals of generic subprograms
This patch modifies the handling of warnings on unused formal parameters
of generic subprograms. Previously such warnings were placed on the
formal appearing in the subprogram declaration, in contrast with
warnings on non-generic subprograms, where the warning is placed on the
corresponding entity in the body of the subprogram. This patch makes the
handling of both cases uniform. It is preferable to place the warning in
the body because this also provides a better suggestion for the
placement of an Unreferenced pragma to suppress the warning when desired.

2019-08-19  Ed Schonberg  <schonberg@adacore.com>

gcc/ada/

	* sem_warn.adb (Check_References, Generic_Body_Formal): When a
	formal parameter of a generic subprogram is not referenced in
	the body, place the corresponding warning on the corresponding
	entity in the specification of the generic body, as is done for
	non-generic subprograms.

gcc/testsuite/

	* gnat.dg/warn28.adb, gnat.dg/warn28.ads: New testcase.

From-SVN: r274649
2019-08-19 08:36:17 +00:00
Bob Duff dafa2ae46c [Ada] Factor out the "size for& too small..." error message
Use a constant for the Size_Too_Small_Message, so if it changes, it
won't change in one place but not another.  DRY. It might be better to
move this code out of errout.adb, but that's for another day.

2019-08-19  Bob Duff  <duff@adacore.com>

gcc/ada/

	* errout.ads (Size_Too_Small_Message): New constant.
	* errout.adb, freeze.adb, sem_ch13.adb: Use it.

From-SVN: r274648
2019-08-19 08:36:12 +00:00
Eric Botcazou 27b2fbc95c [Ada] Fix internal error on subprogram instantiation with -gnatzc
This fixes a fallout of the recent change keeping the
Is_Generic_Instance flag on the wrapper package built for the
instantiation of a generic subprogram.

There is no need to visit the Instance_Spec of an
N_Subprogram_Instantiation node anymore because the regular processing
for an N_Package_Declaration node now does the job for instantiations of
generic subprograms.

The following subprogram must compile again quietly with -gnatzc:

with Gen_Proc;

package RCI is
   pragma Remote_Call_Interface;

   procedure Inst_Proc is new Gen_Proc;

   procedure P (S : String);
end RCI;

generic
procedure Gen_Proc (S : String);
pragma Remote_Call_Interface (Gen_Proc);

with Ada.Text_IO; use Ada.Text_IO;
procedure Gen_Proc (S : String) is
begin
   Put_Line ("Gen_Proc called: " & S);
end Gen_Proc;

2019-08-19  Eric Botcazou  <ebotcazou@adacore.com>

gcc/ada/

	* exp_dist.adb (Build_Package_Stubs): Do not specifically visit
	the declarations of an N_Subprogram_Instantiation node.

From-SVN: r274647
2019-08-19 08:36:07 +00:00
Bob Duff d41f5c1fac [Ada] Document missing gnatmetric switches
2019-08-19  Bob Duff  <duff@adacore.com>

gcc/ada/

	* doc/gnat_ugn/gnat_utility_programs.rst: Document missing
	metrics switches.

From-SVN: r274646
2019-08-19 08:36:02 +00:00
Piotr Trojanek 086734aed9 [Ada] Minor refactorings
2019-08-19  Piotr Trojanek  <trojanek@adacore.com>

gcc/ada/

	* sem_ch12.adb (Get_Unit_Instantiation_Node): Simplify Nkind_In
	membership test.
	* sem.adb (Depends_On_Main): Whitespace cleanup; only assign a
	local variable if needed.

From-SVN: r274645
2019-08-19 08:35:58 +00:00
Claire Dross ef1c6c0e54 [Ada] Allow reading a borrowed object inside a call to a pledge function
No impact on regular compilation.

2019-08-19  Claire Dross  <dross@adacore.com>

gcc/ada/

	* sem_spark.ads, sem_spark.adb (Is_Pledge_Function): New
	parameter of the generic. Function used to decide whether a
	function is a pledge function.
	(Check_Not_Borrowed): Disable check inside the second parameter
	of a pledge function for the path borrowed by the first
	parameter. Also disable checks for entities inside a Global
	contract.

From-SVN: r274644
2019-08-19 08:35:53 +00:00
Joffrey Huguet 123f021561 [Ada] Add formal function parameter equality to SPARK containers
This patch adds a formal function parameter "=" (L, R : Element_Type) to
SPARK containers. The equality that is used by default for Element_Type
after this patch is the primitive equality and not the predefined any
more. It also allows to use any function with the appropriate signature
for the equality function.

2019-08-19  Joffrey Huguet  <huguet@adacore.com>

gcc/ada/

	* libgnat/a-cfdlli.ads, libgnat/a-cfhama.ads,
	libgnat/a-cfinve.ads, libgnat/a-cforma.ads,
	libgnat/a-cofove.ads, libgnat/a-cofuma.ads,
	libgnat/a-cofuve.ads: Add formal function parameter "=" (L, R :
	Element_Type) to the generic packages.

From-SVN: r274643
2019-08-19 08:35:49 +00:00