1. Jul 07, 2022
    • Kito Cheng's avatar
      RISC-V: Support zfh and zfhmin extension · 874026e3
      Kito Cheng authored
      Zfh and Zfhmin are extensions for IEEE half precision, both are ratified
      in Jan. 2022[1]:
      
      - Zfh has full set of operation like F or D for single or double precision.
      - Zfhmin has only provide minimal support for half precision operation,
        like conversion, load, store and move instructions.
      
      [1] https://github.com/riscv/riscv-isa-manual/commit/b35a54079e0da11740ce5b1e6db999d1d5172768
      
      gcc/ChangeLog:
      
      	* common/config/riscv/riscv-common.cc (riscv_implied_info): Add
      	zfh and zfhmin.
      	(riscv_ext_version_table): Ditto.
      	(riscv_ext_flag_table): Ditto.
      	* config/riscv/riscv-opts.h (MASK_ZFHMIN): New.
      	(MASK_ZFH): Ditto.
      	(TARGET_ZFHMIN): Ditto.
      	(TARGET_ZFH): Ditto.
      	* config/riscv/riscv.cc (riscv_output_move): Handle HFmode move
      	for zfh and zfhmin.
      	(riscv_emit_float_compare): Handle HFmode.
      	* config/riscv/riscv.md (ANYF): Add HF.
      	(SOFTF): Add HF.
      	(load): Ditto.
      	(store): Ditto.
      	(truncsfhf2): New.
      	(truncdfhf2): Ditto.
      	(extendhfsf2): Ditto.
      	(extendhfdf2): Ditto.
      	(*movhf_hardfloat): Ditto.
      	(*movhf_softfloat): Make sure not ZFHMIN.
      	* config/riscv/riscv.opt (riscv_zf_subext): New.
      
      gcc/testsuite/ChangeLog:
      
      	* gcc.target/riscv/_Float16-zfh-1.c: New.
      	* gcc.target/riscv/_Float16-zfh-2.c: Ditto.
      	* gcc.target/riscv/_Float16-zfh-3.c: Ditto.
      	* gcc.target/riscv/_Float16-zfhmin-1.c: Ditto.
      	* gcc.target/riscv/_Float16-zfhmin-2.c: Ditto.
      	* gcc.target/riscv/_Float16-zfhmin-3.c: Ditto.
      	* gcc.target/riscv/arch-16.c: Ditto.
      	* gcc.target/riscv/arch-17.c: Ditto.
      	* gcc.target/riscv/predef-21.c: Ditto.
      	* gcc.target/riscv/predef-22.c: Ditto.
      874026e3
    • Kito Cheng's avatar
      RISC-V: Support _Float16 type. · e99b247d
      Kito Cheng authored
      RISC-V decide use _Float16 as primary IEEE half precision type, and this
      already become part of psABI, this patch has added folloing support for
      _Float16:
      
      - Soft-float support for _Float16.
      - Make sure _Float16 available on C++ mode.
      - Name mangling for _Float16 on C++ mode.
      
      gcc/ChangeLog
      
      	* config/riscv/riscv-builtins.cc: include stringpool.h
      	(riscv_float16_type_node): New.
      	(riscv_init_builtin_types): Ditto.
      	(riscv_init_builtins): Call riscv_init_builtin_types.
      	* config/riscv/riscv-modes.def (HF): New.
      	* gcc/config/riscv/riscv.cc (riscv_output_move): Handle HFmode.
      	(riscv_mangle_type): New.
      	(riscv_scalar_mode_supported_p): Ditto.
      	(riscv_libgcc_floating_mode_supported_p): Ditto.
      	(riscv_excess_precision): Ditto.
      	(riscv_floatn_mode): Ditto.
      	(riscv_init_libfuncs): Ditto.
      	(TARGET_MANGLE_TYPE): Ditto.
      	(TARGET_SCALAR_MODE_SUPPORTED_P): Ditto.
      	(TARGET_LIBGCC_FLOATING_MODE_SUPPORTED_P): Ditto.
      	(TARGET_INIT_LIBFUNCS): Ditto.
      	(TARGET_C_EXCESS_PRECISION): Ditto.
      	(TARGET_FLOATN_MODE): Ditto.
      	* gcc/config/riscv/riscv.md (mode): Add HF.
      	(softload): Add HF.
      	(softstore): Ditto.
      	(fmt): Ditto.
      	(UNITMODE): Ditto.
      	(movhf): New.
      	(*movhf_softfloat): New.
      
      libgcc/ChangeLog:
      
      	* config/riscv/sfp-machine.h (_FP_NANFRAC_H): New.
      	(_FP_NANFRAC_H): Ditto.
      	(_FP_NANSIGN_H): Ditto.
      	* config/riscv/t-softfp32 (softfp_extensions): Add HF related
      	routines.
      	(softfp_truncations): Ditto.
      	(softfp_extras): Ditto.
      	* config/riscv/t-softfp64 (softfp_extras): Add HF related routines.
      
      gcc/testsuite/ChangeLog:
      
      	* gcc/testsuite/g++.target/riscv/_Float16.C: New.
      	* gcc/testsuite/gcc.target/riscv/_Float16-soft-1.c: Ditto.
      	* gcc/testsuite/gcc.target/riscv/_Float16-soft-2.c: Ditto.
      	* gcc/testsuite/gcc.target/riscv/_Float16-soft-3.c: Ditto.
      	* gcc/testsuite/gcc.target/riscv/_Float16-soft-4.c: Ditto.
      	* gcc/testsuite/gcc.target/riscv/_Float16.c: Ditto.
      e99b247d
    • Kito Cheng's avatar
      soft-fp: Update soft-fp from glibc. · 94db8e3a
      Kito Cheng authored
      Add more IEEE half conversion routines:
      
        - Convert 32-bit/64-bit integer to IEEE half.
        - Convert IEEE half to 32-bit/64-bit integer.
      
      These are needed by RISC-V _Float16 support.
      
      libgcc/ChangeLog:
      
      	* soft-fp/fixhfdi.c: New.
      	* soft-fp/fixhfsi.c: Ditto.
      	* soft-fp/fixunshfdi.c: Ditto.
      	* soft-fp/fixunshfsi.c: Ditto.
      	* soft-fp/floatdihf.c: Ditto.
      	* soft-fp/floatsihf.c: Ditto.
      	* soft-fp/floatundihf.c: Ditto.
      	* soft-fp/floatunsihf.c: Ditto.
      94db8e3a
  2. Jul 04, 2022
    • Richard Biener's avatar
      Revert update-ssa assert in vectorizer · 3769ad4c
      Richard Biener authored
      The following reverts the just added assert that virtual SSA does not
      need updating.  It instead goes for a select whitelist of transforms
      known to be prone to difficulties with virtual SSA update.
      
      	* tree-vect-loop-manip.cc (vect_do_peeling): Revert assert
      	and update virtual SSA form again.  Assert we do so for
      	a known set of transforms only.
      	* tree-vectorizer.h (vec_info::any_known_not_updated_vssa): New.
      	* tree-vect-stmts.cc (vectorizable_load): When vectorizing
      	using load-lanes allow virtual SSA update.
      3769ad4c
    • Tobias Burnus's avatar
      OpenMP: Move omp requires checks to libgomp · 683f1184
      Tobias Burnus authored
      
      
      Handle reverse_offload, unified_address, and unified_shared_memory
      requirements in libgomp by saving them alongside the offload table.
      When the device lto1 runs, it extracts the data for mkoffload. The
      latter than passes the value on to GOMP_offload_register_ver.
      
      lto1 (either the host one, with -flto [+ ENABLE_OFFLOADING], or in the
      offload-device lto1) also does the the consistency check is done,
      erroring out when the 'omp requires' clause use is inconsistent.
      
      For all in-principle supported devices, if a requirement cannot be fulfilled,
      the device is excluded from the (supported) devices list. Currently, none of
      those requirements are marked as supported for any of the non-host devices.
      
      gcc/c/ChangeLog:
      
      	* c-parser.cc (c_parser_omp_target_data, c_parser_omp_target_update,
      	c_parser_omp_target_enter_data, c_parser_omp_target_exit_data): Set
      	OMP_REQUIRES_TARGET_USED.
      	(c_parser_omp_requires): Remove sorry.
      
      gcc/ChangeLog:
      
      	* config/gcn/mkoffload.cc (process_asm): Write '#include <stdint.h>'.
      	(process_obj): Pass omp_requires_mask to GOMP_offload_register_ver.
      	(main): Ask lto1 to obtain omp_requires_mask and pass it on.
      	* config/nvptx/mkoffload.cc (process, main): Likewise.
      	* lto-cgraph.cc (omp_requires_to_name): New.
      	(input_offload_tables): Save omp_requires_mask.
      	(output_offload_tables): Read it, check for consistency,
      	save value for mkoffload.
      	* omp-low.cc (lower_omp_target): Force output_offloadtables
      	call for OMP_REQUIRES_TARGET_USED.
      
      gcc/cp/ChangeLog:
      
      	* parser.cc (cp_parser_omp_target_data,
      	cp_parser_omp_target_enter_data, cp_parser_omp_target_exit_data,
      	cp_parser_omp_target_update): Set OMP_REQUIRES_TARGET_USED.
      	(cp_parser_omp_requires): Remove sorry.
      
      gcc/fortran/ChangeLog:
      
      	* openmp.cc (gfc_match_omp_requires): Remove sorry.
      	* parse.cc (decode_omp_directive): Don't regard 'declare target'
      	as target usage for 'omp requires'; add more flags to
      	omp_requires_mask.
      
      include/ChangeLog:
      
      	* gomp-constants.h (GOMP_VERSION): Bump to 2.
      	(GOMP_REQUIRES_UNIFIED_ADDRESS, GOMP_REQUIRES_UNIFIED_SHARED_MEMORY,
      	GOMP_REQUIRES_REVERSE_OFFLOAD, GOMP_REQUIRES_TARGET_USED):
      	New defines.
      
      libgomp/ChangeLog:
      
      	* libgomp-plugin.h (GOMP_OFFLOAD_get_num_devices): Add
      	omp_requires_mask arg.
      	* plugin/plugin-gcn.c (GOMP_OFFLOAD_get_num_devices): Likewise;
      	return -1 when device available but omp_requires_mask != 0.
      	* plugin/plugin-nvptx.c (GOMP_OFFLOAD_get_num_devices): Likewise.
      	* oacc-host.c (host_get_num_devices, host_openacc_get_property):
      	Update call.
      	* oacc-init.c (resolve_device, acc_init_1, acc_shutdown_1,
      	goacc_attach_host_thread_to_device, acc_get_num_devices,
      	acc_set_device_num, get_property_any): Likewise.
      	* target.c (omp_requires_mask): New global var.
      	(gomp_requires_to_name): New.
      	(GOMP_offload_register_ver): Handle passed omp_requires_mask.
      	(gomp_target_init): Handle omp_requires_mask.
      	* libgomp.texi (OpenMP 5.0): Update requires impl. status.
      	(OpenMP 5.1): Add a missed item.
      	(OpenMP 5.2): Mark linear-clause change as supported in C/C++.
      	* testsuite/libgomp.c-c++-common/requires-1-aux.c: New test.
      	* testsuite/libgomp.c-c++-common/requires-1.c: New test.
      	* testsuite/libgomp.c-c++-common/requires-2-aux.c: New test.
      	* testsuite/libgomp.c-c++-common/requires-2.c: New test.
      	* testsuite/libgomp.c-c++-common/requires-3-aux.c: New test.
      	* testsuite/libgomp.c-c++-common/requires-3.c: New test.
      	* testsuite/libgomp.c-c++-common/requires-4-aux.c: New test.
      	* testsuite/libgomp.c-c++-common/requires-4.c: New test.
      	* testsuite/libgomp.c-c++-common/requires-5-aux.c: New test.
      	* testsuite/libgomp.c-c++-common/requires-5.c: New test.
      	* testsuite/libgomp.c-c++-common/requires-6.c: New test.
      	* testsuite/libgomp.c-c++-common/requires-7-aux.c: New test.
      	* testsuite/libgomp.c-c++-common/requires-7.c: New test.
      	* testsuite/libgomp.fortran/requires-1-aux.f90: New test.
      	* testsuite/libgomp.fortran/requires-1.f90: New test.
      
      liboffloadmic/ChangeLog:
      
      	* plugin/libgomp-plugin-intelmic.cpp (GOMP_OFFLOAD_get_num_devices):
      	Return -1 when device available but omp_requires_mask != 0.
      
      gcc/testsuite/ChangeLog:
      
      	* c-c++-common/gomp/requires-4.c: Update dg-*.
      	* c-c++-common/gomp/reverse-offload-1.c: Likewise.
      	* c-c++-common/gomp/target-device-ancestor-2.c: Likewise.
      	* c-c++-common/gomp/target-device-ancestor-3.c: Likewise.
      	* c-c++-common/gomp/target-device-ancestor-4.c: Likewise.
      	* c-c++-common/gomp/target-device-ancestor-5.c: Likewise.
      	* gfortran.dg/gomp/target-device-ancestor-3.f90: Likewise.
      	* gfortran.dg/gomp/target-device-ancestor-4.f90: Likewise.
      	* gfortran.dg/gomp/target-device-ancestor-5.f90: Likewise.
      	* gfortran.dg/gomp/target-device-ancestor-2.f90: Likewise. Move
      	post-FE checks to ...
      	* gfortran.dg/gomp/target-device-ancestor-2a.f90: ... this new file.
      	* gfortran.dg/gomp/requires-8.f90: Update as we don't regard
      	'declare target' for the 'requires' usage requirement.
      
      Co-authored-by: default avatarChung-Lin Tang <cltang@codesourcery.com>
      Co-authored-by: default avatarThomas Schwinge <thomas@codesourcery.com>
      683f1184
    • Richard Biener's avatar
      Keep virtual SSA up-to-date in vectorizer · 10b502fb
      Richard Biener authored
      The following removes a FIXME where we fail(ed) to keep virtual
      SSA up-to-date, patching up the remaining two cases I managed to
      trigger.  I've left an assert so that we pick up cases arising
      for the cases I wasn't able to trigger.
      
      2022-07-04  Richard Biener  <rguenther@suse.de>
      
      	* tree-vect-loop-manip.cc (vect_do_peeling): Assert that
      	no SSA update is needed instead of updating virtual SSA
      	form.
      	* tree-vect-stmts.cc (vectorizable_load): For hoisted
      	invariant load use the loop entry virtual use.
      	For emulated gather loads use the virtual use of the
      	original stmt like vect_finish_stmt_generation would do.
      10b502fb
    • Martin Liska's avatar
      gcc-descr: by default show revision for HEAD · 88b9d090
      Martin Liska authored
      I've made the mistake multiple times while doing a bisection.
      One would expect that gcc-descr w/o an argument would print
      revision for the current HEAD and not master.
      Thus change it.
      
      contrib/ChangeLog:
      
      	* git-descr.sh: By default print revision for HEAD.
      88b9d090
    • Eric Botcazou's avatar
      Fix crash on circular array types with -fdump switches · 104b9875
      Eric Botcazou authored
      Such questionable arrays types can occur in Ada.
      
      gcc/
      	* tree-pretty-print.cc (dump_generic_node) <ARRAY_TYPE>: Add guard
      	for direct circularity.
      104b9875
    • Eric Botcazou's avatar
      Use default lower bound for vector types in debug info · 483bd9a0
      Eric Botcazou authored
      Vector types are represented as array types with DW_AT_GNU_vector attribute
      in the debug info and a range [0 .. TYPE_VECTOR_SUBPARTS - 1].  Now that's
      obviously skewed toward the C family of languages, therefore the attached
      patch changes the lower bound to the default for the language of the CU.
      
      gcc/
      	* dwarf2out.cc (gen_array_type_die): Use the default lower bound of
      	the language for vector types.
      483bd9a0
    • Martin Liska's avatar
      MAINTAINERS: fix alphabetic sorting · a7ccdfa1
      Martin Liska authored
      ChangeLog:
      
      	* MAINTAINERS: fix sorting of names
      a7ccdfa1
    • Nick Clifton's avatar
      Prevent another potential stack overflow issue when demangling a maliciouslt mangled Rust name. · 1a770b01
      Nick Clifton authored
      libiberty/
      	* rust-demangle.c (demangle_path_maybe_open_generics): Add
      	recursion limit.
      1a770b01
    • Aldy Hernandez's avatar
      Integrate nonzero bits with irange. · 4e82205b
      Aldy Hernandez authored
      The nonzero bits and integer ranges compliment each other quite well,
      and it only makes sense to make the mask a first class citizen in the
      irange.  We do a half assed job of keeping ranges and nonzero bits
      somewhat in sync in SSA_NAME_RANGE_INFO, and the goal has always
      been to integrate them properly.  This patch does that, in preparation
      for streaming out full-resolution iranges between passes (think
      SSA_NAME_RANGE_INFO).
      
      Having nonzero bits in the irange allows us to get better results from
      things like irange::contains_p() and keeping them in the irange allows
      us to propagate the bits throughout with the ranger.  This patch
      provides the bare infrastructure, without any optimizations to
      range-ops, etc.  Those will come as follow-ups.
      
      A few notes:
      
      Legacy SSA_NAME_RANGE_INFO updates the nonzero bits every time a range
      is set.  Here instead, we don't update the nonzero bits on a new
      range, but calculate it on the fly when irange::get_nonzero_bits() is
      called.  The goal is to only store nonzero bits that provide
      meaningful information that can't be gleaned from the range itself.
      But you can always call get_nonzero_bits() and get the full
      information.
      
      Nonzero bits are not supported in legacy mode.  The mask may be set
      as a consequence of propagation or reading global ranges, but no
      one from legacy land should be querying irange::get_nonzero_bits.  There
      is an assert enforcing this.  However, legacy/global set_nonzero_bits()
      continue to work as before.  There is no change to legacy behavior.
      
      There is virtually no performance change with this patch, as there are
      no consumers.  The next patch I post will be the SSA_NAME_RANGE_INFO
      conversion to the new world, in which I will discuss performance
      proper.  Hint: I'll be chewing up the time budget we gained with the
      vrange conversion.
      
      Tested and benchmarked on x86-64 Linux.
      
      gcc/ChangeLog:
      
      	* value-range-storage.cc (irange_storage_slot::set_irange): Set
      	nonzero bits in irange.
      	(irange_storage_slot::get_irange): Get nonzero bits from irange.
      	* value-range.cc (irange::operator=): Set nonzero bits.
      	(irange::irange_set): Same.
      	(irange::irange_set_anti_range): Same.
      	(irange::set): Same.
      	(irange::verify_range): Same.
      	(irange::legacy_equal_p): Check nonzero bits.
      	(irange::equal_p): Same.
      	(irange::contains_p): Handle nonzero bits.
      	(irange::irange_union): Same.
      	(irange::irange_intersect): Same.
      	(irange::dump): Same.
      	(irange::set_nonzero_bits): New.
      	(irange::get_nonzero_bits): New.
      	(irange::intersect_nonzero_bits): New.
      	(irange::union_nonzero_bits): New.
      	(irange::dump_bitmasks): New.
      	* value-range.h (class irange): Add m_nonzero_mask.
      	(gt_ggc_mx): Handle nonzero bits.
      	(gt_pch_nx): Same.
      	(irange::set_undefined): Set nonzero bits.
      	(irange::set_varying): Same.
      	(irange::normalize_kind): Call set_undefined.
      4e82205b
    • Richard Biener's avatar
      Put virtual operands into loop-closed SSA · d2a89866
      Richard Biener authored
      When attempting to manually update SSA form after high-level loop
      transforms such as loop versioning it is helpful when the loop-closed
      SSA form includes virtual operands.  While we have the special
      rewrite_virtuals_into_loop_closed_ssa function that doesn't
      presently scale, invoking update_ssa by itself.  So the following
      makes the regular loop-closed SSA form also cover virtual operands.
      For users of loop_version this allows to use cheaper
      TODO_update_ssa_no_phi, skipping dominance frontier compute
      (for the whole function) and iterated dominance frontiers for each
      copied def.
      
      	* tree-ssa-loop-manip.h
      	(rewrite_virtuals_into_loop_closed_ssa): Remove.
      	(rewrite_into_loop_closed_ssa_1): Likewise.
      	* tree-ssa-loop-manip.cc (rewrite_into_loop_closed_ssa_1):
      	Make static.
      	(rewrite_into_loop_closed_ssa): Remove loop overload,
      	always rewrite virtuals into LC SSA.
      	(check_loop_closed_ssa_bb): Also check virtuals.
      	* tree-ssa-dce.cc (remove_dead_phis): Preserve virtual
      	LC PHIs when in LC SSA.
      	* gimple-loop-jam.cc (fuse_loops): Do not rewrite into
      	loop-closed SSA here, but ...
      	(tree_loop_unroll_and_jam): ... here once.
      	* tree-if-conv.cc (version_loop_for_if_conversion): Use
      	the cheaper TODO_update_ssa_no_phi.
      	* tree-loop-distribution.cc (version_loop_by_alias_check):
      	Likewise.
      	* tree-ssa-loop-unswitch.cc (tree_unswitch_single_loop):
      	Likewise.
      	* tree-vect-loop-manip.cc (vect_loop_versioning): Likewise.
      	(tree_unswitch_outer_loop): Do not rewrite virtuals into
      	LC ssa.
      	* tree-parloops.cc (transform_to_exit_first_loop_alt):
      	Likewise.
      	(pass_parallelize_loops::execute): After finishing rewrite
      	into LC SSA again because we do not maintain it properly.
      d2a89866
    • Eric Botcazou's avatar
      [Ada] Do not make procedure call with only tag-indeternminate actuals dispatching · 8c6bef0a
      Eric Botcazou authored
      The RM 3.9.2(19) clause says that the controlling tag value is statically
      determined to be the tag of the tagged type involved.  As a matter of fact,
      the call would be made dispatching only as a by-product of the propagation
      of the controlling tag value to the tag-indeternminate actuals, but that's
      unnecessary and not done in the equivalent case of a procedure call with
      both statically tagged and tag-indeternminate actuals.
      
      gcc/ada/
      
      	* sem_disp.adb (Check_Dispatching_Call): Merge the two special cases
      	where there are no controlling actuals but tag-indeternminate ones.
      8c6bef0a
    • Eric Botcazou's avatar
      [Ada] Fix dispatching call to primitive function with controlling tagged result · 1f03b43f
      Eric Botcazou authored
      When a dispatching call is made to a primitive function with a controlling
      tagged result, the call is dispatching on result and thus must return the
      class-wide type of the tagged type to accommodate all possible results.
      
      This was ensured by Expand_Dispatching_Call only in the common case where
      the result type is the type of the controlling argument, which does not
      cover the case of a primitive function inherited from an ancestor type.
      
      gcc/ada/
      
      	* exp_disp.adb (Expand_Dispatching_Call): Fix detection of calls
      	that are dispatching on tagged result.
      1f03b43f
    • Doug Rupp's avatar
      [Ada] vx7r2: do not include s-qnx.ads in the kernel and rtp runtimes · 4dab9bed
      Doug Rupp authored
      Target specific runtime files must be added to a the exclude list so the
      files don't automatically get copied to other runtimes.
      
      gcc/ada/
      
      	* Makefile.rtl (ADA_EXCLUDE_SRCS): Add s-qnx.ads.
      4dab9bed
    • Eric Botcazou's avatar
      [Ada] Small housekeeping work in Expand_N_Object_Declaration · aa683f5c
      Eric Botcazou authored
      The local function Rewrite_As_Renaming can be called twice in certain
      circumstances, which is both not quite safe and unnecessary, so this
      replaces it with a local variable whose value is computed only once.
      
      No functional changes.
      
      gcc/ada/
      
      	* exp_ch3.adb (Expand_N_Object_Declaration) <OK_To_Rename_Ref>: New
      	local function.
      	<Rewrite_As_Renaming>: Change to a local variable whose value is
      	computed once and generate a call to Finalize after this is done.
      	Simplify the code creating the renaming at the end.
      aa683f5c
    • Doug Rupp's avatar
      [Ada] Makefile.rtl: remove references t oVxworks RTP Cert .spec files · 2f94aea2
      Doug Rupp authored
      gcc/ada/
      
      	* Makefile.rtl (GCC_SPEC_FILES): Remove vxworks cert files.
      2f94aea2
    • Piotr Trojanek's avatar
      [Ada] Refactor duplicated resolution of Count and Index attributes · e0cd2398
      Piotr Trojanek authored
      Attribute Index, which was added to Ada 2022 by AI12-0143, is resolved
      just like attribute Count. However, code duplication rightly triggered a
      CodePeer warning.
      
      gcc/ada/
      
      	* sem_attr.adb (Resolve_Attribute): Refactor duplicated code for
      	Count and Index attributes.
      e0cd2398
    • Eric Botcazou's avatar
      [Ada] Use static stack allocation for small string if-expressions · a521dc37
      Eric Botcazou authored
      This changes the expanded code generated for if-expressions of 1-dimensional
      arrays to create a static temporary on the stack if a small upper bound can
      be computed for the length of a subtype covering the result.  Static stack
      allocation is preferred over dynamic allocation for code generation purpose.
      
      This also contains a couple of enhancements to the support code for checks,
      so as to avoid generating useless checks during the modified expansion.
      
      gcc/ada/
      
      	* checks.adb (Apply_Length_Check_On_Assignment): Return early if
      	the Suppress_Assignment_Checks flag is set.
      	(Selected_Range_Checks): Deal with conditional expressions.
      	* exp_ch4.adb (Too_Large_Length_For_Array): New constant.
      	(Expand_Concatenate): Use it in lieu of Too_Large_Max_Length.
      	(Expand_N_If_Expression): If the result has a unidimensional array
      	type but the dependent expressions have constrained subtypes with
      	known bounds, create a static temporary on the stack with a subtype
      	covering the result.
      	(Get_First_Index_Bounds): Deal with string literals.
      	* uintp.ads (Uint_256): New deferred constant.
      	* sinfo.ads (Suppress_Assignment_Checks): Document new usage.
      a521dc37
    • Eric Botcazou's avatar
      [Ada] Adjust previous change to Rewrite_As_Renaming · 0896e2b7
      Eric Botcazou authored
      gcc/ada/
      
      	* exp_ch3.adb (Expand_N_Object_Declaration.Rewrite_As_Renaming):
      	Do not rewrite if the declaration has got constraints.
      	* sinfo.ads (Case Expression Alternative): Fix typo.
      0896e2b7
    • Eric Botcazou's avatar
      [Ada] Use static stack allocation for small dynamic string concatenations · 2cad8a59
      Eric Botcazou authored
      This changes the expanded code generated for dynamic concatenations to
      use a static array subtype for the temporary created on the stack if a
      small upper bound can be computed for the length of the result.  Static
      stack allocation is preferred over dynamic allocation for code
      generation purposes.
      
      gcc/ada/
      
      	* exp_ch3.adb (Expand_N_Object_Declaration.Rewrite_As_Renaming):
      	Be prepared for slices.
      	* exp_ch4.adb (Get_First_Index_Bounds): New procedure.
      	(Expand_Array_Comparison.Length_Less_Than_4): Call it.
      	(Expand_Concatenate): Try to compute a maximum length for
      	operands with variable length and a maximum total length at the
      	end.  If the concatenation is dynamic, but a sensible maximum
      	total length has been computed, use this length to create a
      	static array subtype for the temporary and return a slice of it.
      2cad8a59
    • Steve Baird's avatar
      [Ada] Enforce deferred constant completion rules · f3451ba8
      Steve Baird authored
      If a constrained subtype is given when a deferred constant is declared,
      then the subtype given in the completion is required (at compile time)
      to be subject to a statically matching constraint. This rule was not
      properly enforced in some cases and constructs that should have been
      rejected were incorrectly accepted.
      
      gcc/ada/
      
      	* sem_ch3.adb (Check_Possible_Deferred_Completion): Delete
      	Prev_Obj_Def formal parameter.  Reorganize code so that
      	statically matching check is also performed in the case where
      	the subtype given in the initial declaration is constrained and
      	the subtype given in the completion is not.
      f3451ba8
    • Bob Duff's avatar
      [Ada] Assertions in Einfo.Utils · 4b766285
      Bob Duff authored
      Add predicates on subtypes E and N.
      
      gcc/ada/
      
      	* einfo-utils.ads, einfo-utils.adb: Add predicates on subtypes E
      	and N.  Change some parameters to use the unpredicated subtypes,
      	because they sometimes return e.g. Empty.  Note that N_Entity_Id
      	has a predicate; Entity_Id does not.
      	* exp_tss.adb (Base_Init_Proc): Use Entity_Id instead of E,
      	because otherwise we fail the predicate. We shouldn't be
      	referring to single-letter names from far away anyway.
      	* sem_aux.adb (Is_Derived_Type): Likewise.
      	* sem_res.adb (Is_Definite_Access_Type): Use N_Entity_Id for
      	predicate.
      	* types.ads (Entity_Id): Add comment explaining the difference
      	between Entity_Id and N_Entity_Id.
      4b766285
    • Justin Squirek's avatar
      [Ada] Tech debt: Remove code duplication · 78f13b00
      Justin Squirek authored
      This patch corrects removes some code duplication within the GNAT
      compiler.
      
      gcc/ada/
      
      	* exp_util.adb (Remove_Side_Effects): Combine identical
      	branches.
      	* sem_attr.adb (Analyze_Attribute): Combine identical cases
      	Attribute_Has_Same_Storage and Attribute_Overlaps_Storage.
      	* sem_prag.adb (Check_Role): Combine E_Out_Parameter case with
      	general case for parameters.
      	* sem_util.adb (Accessibility_Level): Combine identical
      	branches.
      	* sprint.adb (Sprint_Node_Actual): Combine cases for
      	N_Real_Range_Specification and N_Signed_Integer_Type_Definition.
      78f13b00
    • Justin Squirek's avatar
      [Ada] Single character argument in call to Quote_Argument raises error · 1fde86bb
      Justin Squirek authored
      This patch corrects an issue in the compiler whereby calling
      Quote_Argument with an argument that is of size 1 may lead to a
      CONSTRAINT_ERROR raised at runtime due to an undersized buffer.
      
      gcc/ada/
      
      	* libgnat/s-os_lib.adb (Quote_Argument): Modify the result
      	buffer size calculation to handle the case where Arg'Length is
      	1.
      1fde86bb
    • Bob Duff's avatar
      [Ada] Fix missing error on 'Access of constrained array · 3319015b
      Bob Duff authored
      For X'Access, the designated subtype of the access type must statically
      match the nominal subtype of X.  This patch fixes a bug where the error
      was not detected when there is an unrelated declaration of the form "Y :
      T := X;", where T is an unconstrained array subtype.
      
      gcc/ada/
      
      	* exp_util.adb (Expand_Subtype_From_Expr): Generate a new
      	subtype when Is_Constr_Subt_For_UN_Aliased is True, so the
      	Is_Constr_Subt_For_U_Nominal flag will not be set on the
      	preexisting subtype.
      	* sem_attr.adb, sem_ch3.adb: Minor.
      3319015b
    • Eric Botcazou's avatar
      [Ada] Do not use front-end build-in-place mechanism for nonlimited types · 02e41e69
      Eric Botcazou authored
      It was only used in specific cases for controlled types but no longer
      provides any significant benefit in practice.
      
      gcc/ada/
      
      	* debug.adb (d.9): Remove usage.
      	* exp_ch6.adb (Expand_Simple_Function_Return): Remove redundant
      	test on Debug_Flag_Dot_L.
      	(Is_Build_In_Place_Result_Type): Return false for nonlimited types.
      	(Is_Build_In_Place_Function): Tidy up and remove redundant test on
      	Debug_Flag_Dot_L.
      02e41e69
    • Eric Botcazou's avatar
      [Ada] Call-initialize all controlled objects in place · c901877f
      Eric Botcazou authored
      This changes the compiler to build in place almost all objects that need
      finalization and are initialized with the result of a function call, thus
      saving a pair of Adjust/Finalize calls for the anonymous return object.
      
      gcc/ada/
      
      	* exp_ch3.adb (Expand_N_Object_Declaration): Don't adjust the object
      	if the expression is a function call.
      	<Rewrite_As_Renaming>: Return true if the object needs finalization
      	and is initialized  with the result of a function call returned on
      	the secondary stack.
      	* exp_ch6.adb (Expand_Ctrl_Function_Call): Add Use_Sec_Stack boolean
      	parameter.  Early return if the parent is an object declaration and
      	Use_Sec_Stack is false.
      	(Expand_Call_Helper): Adjust call to Expand_Ctrl_Function_Call.
      	* exp_ch7.adb (Find_Last_Init): Be prepared for initialization still
      	present in the object declaration.
      	* sem_ch3.adb (Analyze_Object_Declaration): Call the predicates
      	Needs_Secondary_Stack and Needs_Finalization to guard the renaming
      	optimization.
      c901877f
    • Bob Duff's avatar
      [Ada] Add Ada 2022 Key function to sets containers · eb6e8a7a
      Bob Duff authored
      This patch adds the new Generic_Keys.Key function to the set children
      of Ada.Containers.
      
      gcc/ada/
      
      	* libgnat/a-cbhase.ads, libgnat/a-cborse.ads,
      	libgnat/a-cihase.ads, libgnat/a-ciorse.ads,
      	libgnat/a-cohase.ads, libgnat/a-coorse.ads (Key): New function
      	that takes a Container parameter, implemented as an expression
      	function, so it is self explanatory (doesn't need a comment).
      eb6e8a7a
    • Vasiliy Fofanov's avatar
      [Ada] Fix length of title underlines. · cac397f3
      Vasiliy Fofanov authored
      gcc/ada/
      
      	* doc/gnat_rm/the_gnat_library.rst: Fix length of title
      	underlines.
      cac397f3
    • Steve Baird's avatar
      [Ada] Compiler rejects legal allocator in record component constraint expression · 063c8f4c
      Steve Baird authored
      In some cases when a legal allocator which defines a new subtype for the
      allocated object occurs as part of a record component constraint
      expression, the compiler would incorrectly reject the allocator.
      
      gcc/ada/
      
      	* sem_ch4.adb (Analyze_Allocator): After calling Insert_Action
      	to insert a subtype declaration associated with an allocator,
      	the subtype declaration will usually be analyzed. But not
      	always. Add an explicit call to Preanalyze to cope with the
      	unusual case. The subtype declaration must be at least
      	preanalyzed before the call to Sem_Ch3.Process_Subtype a little
      	while later, during which we analyze an identifier that refers
      	to the subtype.
      063c8f4c
    • Steve Baird's avatar
      [Ada] Avoid unwanted warnings for statically-known-successful assertions · f7c05e82
      Steve Baird authored
      The -gnatwc switch enables warnings for test condition outcomes that are
      known at compile time. Such warnings are unlikely to be useful in the
      case of an assertion expression (or a subexpression thereof), so do not
      generate them in that case.
      
      gcc/ada/
      
      	* sem_warn.adb (Warn_On_Constant_Valid_Condition): Do not
      	generate a warning if the expression in question is an assertion
      	expression, or a subexpression thereof. But do call
      	Test_Comparison so that it can generate warnings for the cases
      	that it generates warnings for.
      	* sem_prag.ads: Modify Assertion_Expression_Pragma constant so
      	that the predicate Sem_Util.In_Assertion_Expression_Pragma
      	returns True for the expression of a Compile_Time_Error pragma.
      f7c05e82
    • Julien Bortolussi's avatar
      [Ada] Add a RM entry for the functional infinite sequences · e7428fff
      Julien Bortolussi authored
      Modify the RM to take into account the new functional container.
      
      gcc/ada/
      
      	* doc/gnat_rm/the_gnat_library.rst: Add the new entry.
      	* gnat_rm.texi: Regenerate.
      e7428fff
    • Eric Botcazou's avatar
      [Ada] Give missing error on ambiguous operand of equality operator · 4030e83c
      Eric Botcazou authored
      When the code responsible for giving errors on ambiguous operands of
      comparison and equality operators was moved from the 1st phase (analysis)
      to the 2nd phase (resolution) of semantic processing, it was incorrectly
      restricted to the operator case, which was valid during the 1st phase but
      is not during the 2nd phase.
      
      gcc/ada/
      
      	* sem_res.adb (Resolve_Comparison_Op): Deal with ambiguous operands
      	in all cases.
      	(Resolve_Equality_Op): Likewise, except for the case of the implicit
      	inequality operator created for a user-defined operator that is not
      	an intrinsic subprogram.
      4030e83c
    • Bob Duff's avatar
      [Ada] Add Ada 2022 features to sets containers · a8a1da10
      Bob Duff authored
      This patch adds some Ada 2022 features to the set children of
      Ada.Containers.
      
      gcc/ada/
      
      	* libgnat/a-cbhase.adb, libgnat/a-cbhase.ads,
      	libgnat/a-cborse.adb, libgnat/a-cborse.ads,
      	libgnat/a-cihase.adb, libgnat/a-cihase.ads,
      	libgnat/a-ciorse.adb, libgnat/a-ciorse.ads,
      	libgnat/a-cohase.adb, libgnat/a-cohase.ads,
      	libgnat/a-conhel.adb, libgnat/a-conhel.ads,
      	libgnat/a-coorse.adb, libgnat/a-coorse.ads: Add Has_Element,
      	Element, Query_Element, and Next subprograms that take a Set
      	parameter. Add Tampering_With_Cursors_Prohibited function. These
      	are all new in Ada 2022.
      a8a1da10
    • Claire Dross's avatar
      [Ada] Update the documentation of functional containers · 2e9b2ab3
      Claire Dross authored
      Functional containers are now controlled. Update the documentation
      accordingly.
      
      gcc/ada/
      
      	* doc/gnat_rm/the_gnat_library.rst: Functional vectors, sets,
      	and maps are now controlled.
      	* gnat_rm.texi: Regenerate.
      2e9b2ab3
    • Claire Dross's avatar
      [Ada] Add GNAT specific pragmas to the equivalent Assertion_Policy for -gnata · 82b63eb0
      Claire Dross authored
      All assertion pragmas are enabled by default when using -gnata. We need
      to add the GNAT specific ones to the list.
      
      gcc/ada/
      
      	* doc/gnat_ugn/building_executable_programs_with_gnat.rst
      	(Debugging and Assertion Control): Add GNAT specific assertion
      	pragmas to the equivalent Assertion_Policy for the -gnata
      	option.
      	* gnat_ugn.texi: Regenerate.
      82b63eb0
    • Justin Squirek's avatar
      [Ada] Incorrect accessibility check on return of discriminated type · ddd88925
      Justin Squirek authored
      This patch corrects an error in the compiler whereby the presence of a
      call to a function returning a type with an access discriminant within
      an expanded loop condition caused the wrong value to be supplied for the
      extra- accessibility-of-result actual, thus causing incorrect checks
      within the callee at the point of return.
      
      This change also corrects a problem where spurious "null value not
      allowed" warnings were generated for tagged type declarations with an
      access discriminant specified as "null."
      
      gcc/ada/
      
      	* sem_disp.adb (Most_Descendant_Use_Clause): Remove call to
      	deprecated Is_Internal.
      	* sem_util.adb (Innermost_Master_Scope_Depth): Use
      	Find_Enclosing_Scope instead of Nearest_Dynamic_Scope to avoid
      	cases where relevant scopes get skipped leading to an incorrect
      	scope depth calculation.
      ddd88925
    • Eric Botcazou's avatar
      [Ada] Plug loophole for built-in-place return with limited_with clause · bdd50567
      Eric Botcazou authored
      When the result type of a function requiring built-in-place return is
      only visible through a limited_with clause, the compiled needs to wait
      for the nonlimited view to be available in order to compute whether
      the built-in-place return is needed, and this comprises tagging the
      function with the Returns_By_Ref flag.
      
      gcc/ada/
      
      	* exp_ch6.adb (Build_In_Place_Formal): Also compute Returns_By_Ref
      	for the function if the extra formals were not built initially.
      bdd50567