Skip to content
Snippets Groups Projects
  1. Nov 21, 2022
    • Martin Liska's avatar
      build: re-configure 2 files · 139ffc77
      Martin Liska authored
      libcpp/ChangeLog:
      
      	* config.in: Re-configure.
      
      libstdc++-v3/ChangeLog:
      
      	* src/experimental/Makefile.in: Re-configure.
      139ffc77
    • Andrew Pinski's avatar
      Fix PR 106560: Another ICE after conflicting types of redeclaration · b03ad138
      Andrew Pinski authored
      This another one of these ICE after error issues with the
      gimplifier and a fallout from r12-3278-g823685221de986af.
      The problem here is gimplify_modify_expr does not
      check if either from or to was an error operand.
      This adds the check and fixes the ICE.
      
      OK? Bootstrapped and tested on x86_64-linux-gnu with no regressions.
      
      gcc/ChangeLog:
      
      	* gimplify.cc (gimplify_modify_expr): If
      	either *from_p or *to_p were error_operand
      	return early.
      
      gcc/testsuite/ChangeLog:
      
      	* gcc.dg/redecl-23.c: New test.
      	* gcc.dg/redecl-24.c: New test.
      	* gcc.dg/redecl-25.c: New test.
      b03ad138
    • liuhongt's avatar
      define builtins for "shared" avxneconvert-avx512bf16vl builtins. · 183db4fb
      liuhongt authored
      This should fix incorrect error when call those builtin with
      -mavxneconvert and w/o -mavx512bf16 -mavx512vl.
      
      gcc/ChangeLog:
      
      	* config/i386/i386-builtins.cc (def_builtin): Handle "shared"
      	avx512bf16vl-avxneconvert builtins.
      
      gcc/testsuite/ChangeLog:
      
      	* gcc.target/i386/avxneconvert-1.c: New test.
      183db4fb
    • GCC Administrator's avatar
      Daily bump. · fb98ede8
      GCC Administrator authored
      fb98ede8
  2. Nov 20, 2022
    • François Dumont's avatar
      libstdc++: Add std qualification on isxdigit calls · a16a5460
      François Dumont authored
      Those qualifications are needed in _GLIBCXX_INLINE_VERSION mode because in <cctype>
      symbols are not put in versioned namespace.
      
      libstdc++-v3/ChangeLog
      
      	* include/std/format: Add std qualification on isxdigit calls.
      a16a5460
    • Patrick Palka's avatar
      c++: cache the normal form of a concept-id · 1ad735db
      Patrick Palka authored
      We already cache the overall normal form of a declaration's constraints
      (under the assumption that it can't change over the translation unit).
      But if we have something like
      
        template<class T> concept complicated = /* ... */;
        template<class T> void f() requires complicated<T> && /* ... */;
        template<class T> void g() requires complicated<T> && /* ... */;
      
      then despite this high-level caching we'd still redundantly have to
      expand the concept-id complicated<T> twice, once during normalization of
      f's constraints and again during normalization of g's.  Ideally, we'd
      reuse the previously computed normal form of complicated<T> the second
      time around.
      
      To that end this patch introduces an intermediate layer of caching
      during constraint normalization -- caching of the normal form of a
      concept-id -- that sits between our high-level caching of the overall
      normal form of a declaration's constraints and our low-level caching of
      each individual atomic constraint.
      
      It turns out this caching generalizes normalize_concept_check's caching
      of the normal form of a concept definition (which is equivalent to the
      normal form of the concept-id C<gtargs> where gtargs is C's generic
      arguments) so this patch unifies the caching accordingly.
      
      gcc/cp/ChangeLog:
      
      	* constraint.cc (struct norm_entry): Define.
      	(struct norm_hasher): Define.
      	(norm_cache): Define.
      	(normalize_concept_check): Add function comment.  Cache the
      	the normal form of the substituted concept-id.  Canonicalize
      	generic arguments as NULL_TREE.  Don't coerce arguments unless
      	they were substituted.
      	(normalize_concept_definition): Simplify.  Use norm_cache
      	instead of normalized_map.
      1ad735db
    • Patrick Palka's avatar
      c++: remove coerce_innermost_template_parms · b36a5f84
      Patrick Palka authored
      The only practical difference between coerce_innermost_template_parms
      and the main function coerce_template_parms is that the former accepts
      a potentially multi-level parameter list and returns an argument vector
      of the same depth, whereas the latter accepts only a single level of
      parameters and only returns only a single level of arguments.  Both
      functions accept a multi-level argument vector.
      
      In light of this, it seems more natural to just overload the behavior of
      the main function according to whether the given parameter list is
      multi-level or not.  And it turns out we can assume the given parms and
      args have the same depth in the multi-level case, which simplifies the
      overloading logic.
      
      Besides the simplification benefit, another benefit of this unification
      is that it avoids an extra copy of a multi-level args since now we can
      return new_args directly from c_t_p.  (And because of this, we need to
      turn new_inner_args into a reference so that overwriting it also updates
      new_args.)
      
      gcc/cp/ChangeLog:
      
      	* pt.cc (coerce_template_parms): Salvage part of the function
      	comment from c_innermost_t_p.  Handle parms being a full
      	template parameter list.
      	(coerce_innermost_template_parms): Remove.
      	(lookup_template_class): Use c_t_p instead of c_innermost_t_p.
      	(finish_template_variable): Likewise.
      	(tsubst_decl): Likewise.
      	(instantiate_alias_template): Likewise.
      b36a5f84
    • Jakub Jelinek's avatar
      reg-stack: Fix a -fcompare-debug bug in reg-stack [PR107183] · 6b5c98c1
      Jakub Jelinek authored
      As the following testcase shows, the swap_rtx_condition function
      in reg-stack can result in different code generation between -g and -g0.
      The function is doing the changes as it goes, so does analysis and
      changes together, which makes it harder to deal with DEBUG_INSNs,
      where normally analysis phase ignores them and the later phase
      doesn't.
      swap_rtx_condition walks instructions two different ways, one is
      using next_flags_user function which stops on non-call instructions
      that mention the flags register, and the other is a loop on fnstsw
      where it stops on instructions mentioning it and tries to find
      sahf instruction that uses it (in both cases calls stop it and so
      does end of basic block).
      Now both of these currently stop on DEBUG_INSNs that mention
      the flags register resp. the fnstsw result register.
      On success the function recurses on next flags user instruction
      if still live and if the recursion failed, reverts the changes
      it did too and fails.
      If it were just for the next_flags_user case, the fix could be
      just not doing
            INSN_CODE (insn) = -1;
            if (recog_memoized (insn) == -1)
              fail = 1;
      on DEBUG_INSNs (assuming all changes to those are fine),
      swap_rtx_condition_1 just changes one comparison to a different
      one.  But due to the possibility of fnstsw result being used
      in theory before sahf in some DEBUG_INSNs, this patch takes
      a different approach.  swap_rtx_condition has now a new argument
      and two modes.  The first mode is when debug_seen is >= 0, in this
      case both next_flags_user and the loop for fnstsw -> sahf will
      ignore but note DEBUG_INSNs (that mention flags register or fnstsw
      result).  If no such DEBUG_INSN is found during the whole call
      including recursive invocations (so e.g. for -g0 but probably most
      often for -g as well), it behaves as before, if it returns true
      all the changes are done and nothing further needs to be done later.
      If any DEBUG_INSNs are seen along the way, even when returning success
      all the changes are reverted, so it just reports that the function
      would be successful if DEBUG_INSNs were ignored.
      In this case, compare_for_stack_reg needs to call it again in
      debug_seen = -1 mode, which tells the function to update everything
      including DEBUG_INSNs.  For the fnstsw -> sahf case which I hope
      will be very rare I just reset the DEBUG_INSNs, I don't really
      know how to express it easily otherwise.  For the rest
      swap_rtx_condition_1 is done even on the DEBUG_INSNs.
      
      2022-11-20  Jakub Jelinek  <jakub@redhat.com>
      
      	PR target/107183
      	* reg-stack.cc (next_flags_user): Add DEBUG_SEEN argument.
      	If >= 0 and a DEBUG_INSN would be otherwise returned, set
      	DEBUG_SEEN to 1 and ignore it.
      	(swap_rtx_condition): Add DEBUG_SEEN argument.  In >= 0
      	mode only set DEBUG_SEEN to 1 if problematic DEBUG_ISNSs
      	were seen and revert all changes on success in that case.
      	Don't try to recog_memoized DEBUG_INSNs.
      	(compare_for_stack_reg): Adjust swap_rtx_condition caller.
      	If it returns true and debug_seen is 1, call swap_rtx_condition
      	again with debug_seen -1.
      
      	* gcc.dg/ubsan/pr107183.c: New test.
      6b5c98c1
    • Martin Liska's avatar
      gcc-changelog: temporarily disable check_line_start · 0275ff20
      Martin Liska authored
      contrib/ChangeLog:
      
      	* gcc-changelog/git_commit.py: Temporarily disable
      	check_line.start.
      0275ff20
    • Jeff Law's avatar
      [PR other/104044] Remove extraneous semicolons · 6d82e0fe
      Jeff Law authored
      gcc/
      	PR other/104044
      	* config/mn10300/mn10300.cc (mn10300_print_operand): Remove
      	extraneous semicolon.
      	* config/nvptx/nvptx.cc (nvptx_goacc_reduction_fini): Likewise.
      
      gcc/jit/
      	PR other/104044
      	* jit-playback.cc (playback::lvale::mark_addressable): Remove
      	extraeous semicolon
      6d82e0fe
    • Jeff Law's avatar
      Fix test to not depend on DECL_UIDs · 53a6b2e0
      Jeff Law authored
      The tester started tripping this on s390-linux-gnu:
      
      Tests that now fail, but worked before (19 tests):
      
      gcc.dg/pr96542.c scan-tree-dump-times evrp "254" 2
      
      The problem is we search for "254" in the dump file.  The dump file contains
      UIDs for function declarations.  So changes in the number of predefined DECL
      nodes can make the test pass or file depending on whether or not a decl with
      a UID containing "254" shows up.  Like this:
      
      ;; Function foo (foo, funcdef_no=0, decl_uid=2542, cgraph_uid=1, symbol_order=0)
      
      ISTM the test wants to look for a "return 254" rather than just "254".
      I added a change for that to the tester.  Naturally that fixed the test on
      s390 and the dozen or so targets I tested didn't show any regressions.
      
      gcc/testsuite
      	* gcc.dg/pr96542.c: Avoid falsely matching DECL_UIDs with
      	the number 254 in them.
      53a6b2e0
  3. Nov 19, 2022
    • Jonathan Wakely's avatar
      libstdc++: Add always_inline to trivial range access functions · 0723ad39
      Jonathan Wakely authored
      This makes all the [iterator.range] functions always-inline, except the
      ones that construct a std::reverse_iterator, as they do a little more
      work. They could probably be made always_inline too though, and maybe
      the std::reverse_iterator constructor too.
      
      This means that even for -O0 these functions have no runtime overhead
      compared with calling a member of the container, or performing pointer
      arithmetic for arrays.
      
      libstdc++-v3/ChangeLog:
      
      	* include/bits/range_access.h: Add always_inline attribute to
      	trivial functions.
      0723ad39
    • Andrew Pinski's avatar
      constexprify some tree variables · 5c021f17
      Andrew Pinski authored
      Since we use C++11 by default now, we can
      use constexpr for some const decls in tree-core.h.
      
      This patch does that and it allows for better optimizations
      of GCC code with checking enabled and without LTO.
      
      For an example generic-match.cc compiling is speed up due
      to the less number of basic blocks and less debugging info
      produced. I did not check the speed of compiling the same source
      but rather the speed of compiling the old vs new sources here
      (but with the same compiler base).
      
      The small slow down in the parsing of the arrays in each TU
      is migrated by a speed up in how much code/debugging info
      is produced in the end.
      
      Note I looked at generic-match.cc since it is one of the
      compiling sources which causes parallel building to stall and
      I wanted to speed it up.
      
      OK? Bootstrapped and tested on x86_64-linux-gnu with no regressions.
      
      gcc/ChangeLog:
      
      	PR middle-end/14840
      	* tree-core.h (tree_code_type): Constexprify
      	by including all-tree.def.
      	(tree_code_length): Likewise.
      	* tree.cc (tree_code_type): Remove.
      	(tree_code_length): Remove.
      5c021f17
    • Jonathan Wakely's avatar
      libstdc++: Fix -Wsign-compare warnings in std::format · 18169e8e
      Jonathan Wakely authored
      libstdc++-v3/ChangeLog:
      
      	* include/std/format: Fix -Wsign-compare warnings.
      18169e8e
    • Jonathan Wakely's avatar
      libstdc++: Fix Doxygen warning · fca0f50b
      Jonathan Wakely authored
      This fixes a Doxygen warning about a mismatched parameter name. The
      standard uses 'r' here, like the Doxygen comment, so use '__r' instead
      of '__e'.
      
      libstdc++-v3/ChangeLog:
      
      	* include/bits/ptr_traits.h (pointer_traits::pointer_to): Rename
      	parameter.
      fca0f50b
    • Jonathan Wakely's avatar
      libstdc++: Fix one more malformed requires-clause [PR107649] · 945e86dd
      Jonathan Wakely authored
      libstdc++-v3/ChangeLog:
      
      	PR libstdc++/107649
      	* include/std/complex (__complex_proj): Fix requires-clause.
      945e86dd
    • Thomas Schwinge's avatar
      nvptx: In 'STARTFILE_SPEC', fix 'crt0.o' for '-mmainkernel' · dda43e1e
      Thomas Schwinge authored
      A recent nvptx-tools change: commit 886a95faf66bf66a82fc0fe7d2a9fd9e9fec2820
      "ld: Don't search for input files in '-L'directories" (of
      <https://github.com/MentorEmbedded/nvptx-tools/pull/38>
      "Match standard 'ld' "search" behavior") in GCC/nvptx target testing
      generally causes linking to fail with:
      
          error opening crt0.o
          collect2: error: ld returned 1 exit status
          compiler exited with status 1
      
      Indeed per GCC '-v' output, there is an undecorated 'crt0.o' on the linker
      ('collect2') command line:
      
           [...]/build-gcc/./gcc/collect2 -o [...] crt0.o [...]
      
      This is due to:
      
          gcc/config/nvptx/nvptx.h:#define STARTFILE_SPEC "%{mmainkernel:crt0.o}"
      
      ..., and the fix, as used by numerous other GCC targets, is to instead use
      'crt0.o%s'; for '%s' means, per 'gcc/gcc.cc', "The Specs Language":
      
           %s     current argument is the name of a library or startup file of some sort.
                  Search for that file in a standard list of directories
                  and substitute the full name found.
      
      With that, we get the expected path to 'crt0.o'.
      
      	gcc/
      	* config/nvptx/nvptx.h (STARTFILE_SPEC): Fix 'crt0.o' for
      	'-mmainkernel'.
      dda43e1e
    • Bernhard Reutner-Fischer's avatar
      libcpp: Add missing config for --enable-valgrind-annotations [PR107691] · 5a6c698e
      Bernhard Reutner-Fischer authored
      r7-912 copied (parts of) the valgrind annotation checks from gcc
      to libcpp. The above copies the missing pieces to libcpp to diagnose
      when libcpp is configured with --enable-valgrind-annotations but
      valgrind is not installed.
      
      libcpp/ChangeLog:
      
      	PR preprocessor/107691
      	* configure.ac: Add valgrind header checks.
      	* configure: Regenerate.
      5a6c698e
    • Jonathan Wakely's avatar
      jit: Use std::mutex instead of pthread_mutex_t · 0a62889c
      Jonathan Wakely authored
      
      This allows JIT to be built with a different thread model from posix
      where pthread isn't available
      
      By renaming the acquire_mutex () and release_mutex () member functions
      to lock() and unlock() we make the playback::context type meet the C++
      Lockable requirements. This allows it to be used with a scoped lock
      (i.e. RAII) type as std::lock_guard. This automatically releases the
      mutex when leaving the scope.
      
      Co-authored-by: default avatarLIU Hao <lh_mouse@126.com>
      
      gcc/jit/ChangeLog:
      
      	* jit-playback.cc (playback::context::scoped_lock): Define RAII
      	lock type.
      	(playback::context::compile): Use scoped_lock to acquire mutex
      	for the active playback context.
      	(jit_mutex): Change to std::mutex.
      	(playback::context::acquire_mutex): Rename to ...
      	(playback::context::lock): ... this.
      	(playback::context::release_mutex): Rename to ...
      	(playback::context::unlock): ... this.
      	* jit-playback.h (playback::context): Rename members and declare
      	scoped_lock.
      	* jit-recording.cc (INCLUDE_PTHREAD_H): Remove unused define.
      	* libgccjit.cc (version_mutex): Change to std::mutex.
      	(struct jit_version_info): Use std::lock_guard to acquire and
      	release mutex.
      
      gcc/ChangeLog:
      
      	* system.h [INCLUDE_MUTEX]: Include header for std::mutex.
      0a62889c
    • Tobias Burnus's avatar
      libgomp/gcn: Prepare for reverse-offload callback handling · 8c05d8cd
      Tobias Burnus authored
      libgomp/ChangeLog:
      
      	* config/gcn/libgomp-gcn.h: New file; contains
      	struct output, declared previously in plugin-gcn.c.
      	* config/gcn/target.c: Include it.
      	(GOMP_ADDITIONAL_ICVS): Declare as extern var.
      	(GOMP_target_ext): Handle reverse offload.
      	* plugin/plugin-gcn.c: Include libgomp-gcn.h.
      	(struct kernargs): Replace struct def by the one
      	from libgomp-gcn.h for output_data.
      	(process_reverse_offload): New.
      	(console_output): Call it.
      8c05d8cd
    • Jakub Jelinek's avatar
      i386: Outline fast BF -> SF conversion and fix up sNaN handling in it [PR107628] · b1115dbf
      Jakub Jelinek authored
      On Fri, Oct 21, 2022 at 10:23:14AM +0200, Uros Bizjak wrote:
      > OK, but now we have two more copies of a function that effectively
      > extends BF to SF. Can you please split this utility function out and
      > use it here and in cbranchbf4/cstorebf4? I'm talking about this part:
      >
      > +      op = gen_lowpart (HImode, op1);
      > +      if (CONST_INT_P (op))
      > +       op = simplify_const_unary_operation (FLOAT_EXTEND, SFmode,
      > +                                            op1, BFmode);
      > +      else
      > +       {
      > +         rtx t1 = gen_reg_rtx (SImode);
      > +         emit_insn (gen_zero_extendhisi2 (t1, op));
      > +         emit_insn (gen_ashlsi3 (t1, t1, GEN_INT (16)));
      > +         op = gen_lowpart (SFmode, t1);
      > +       }
      >
      > Taking this a bit further, it looks like a generic function to extend
      > BF to SF, when extendbfsf2 named function is not defined.
      >
      > The above could be a follow-up patch, the proposed patch is OK.
      
      Sorry for the delay, only got to this now.
      And I'm fixing the sNaN handling in it too.  If the argument is a BFmode sNaN
      constant, we want in this case just a SFmode sNaN constant, but
      simplify_const_unary_operation (FLOAT_EXTEND, ...)
      in that case returns NULL (as normally conversions of a sNaN to some
      other float type should raise an exception).  In this case we want
      to bypass that, as we know the sNaN will be used immediately in the SFmode
      comparison a few instructions later.  The patch fixes it by just
      simplifying the lowpart to HImode and its zero extension to SImode, then
      force into a pseudo and do the left shift and subreg to SFmode on the
      pseudo.  CSE or combine can handle it later.
      
      2022-11-19  Jakub Jelinek  <jakub@redhat.com>
      
      	PR target/107628
      	* config/i386/i386-protos.h (ix86_expand_fast_convert_bf_to_sf):
      	Declare.
      	* config/i386/i386-expand.cc (ix86_expand_fast_convert_bf_to_sf): New
      	function.
      	* config/i386/i386.md (cbranchbf4, cstorebf4): Use it.
      
      	* gcc.target/i386/pr107628.c: New test.
      b1115dbf
    • Jakub Jelinek's avatar
      c++: Implement C++23 P2647R1 - Permitting static constexpr variables in constexpr functions · 32d16fe9
      Jakub Jelinek authored
      The following patch implements this paper.
      Per further discussions it is implemented for C++23 only, so isn't
      treated as a DR, e.g. because the part of the standard the paper is
      changing didn't even exist in C++20.
      And we gave up on trying to implement it as a pedwarn rather than
      error for C++20 and older, because of implicit constexpr lambdas or
      -fimplicit-constexpr reasons.
      For C++20 and older, the only change is that passing through
      definitions of static or thread_local vars usable in constant expressions
      is now accepted in statement expressions if they aren't inside of constexpr
      or consteval functions.
      
      2022-11-19  Jakub Jelinek  <jakub@redhat.com>
      
      gcc/c-family/
      	* c-cppbuiltin.cc (c_cpp_builtins): Bump __cpp_constexpr
      	value from 202207L to 202211L.
      gcc/cp/
      	* constexpr.cc (cxx_eval_constant_expression): Implement C++23
      	P2647R1 - Permitting static constexpr variables in constexpr functions.
      	Allow DECL_EXPRs of decl_constant_var_p static or thread_local vars.
      	(potential_constant_expression_1): Similarly, except use
      	decl_maybe_constant_var_p instead of decl_constant_var_p if
      	processing_template_decl.
      gcc/testsuite/
      	* g++.dg/cpp23/constexpr-nonlit17.C: New test.
      	* g++.dg/cpp23/constexpr-nonlit18.C: New test.
      	* g++.dg/cpp23/feat-cxx2b.C: Adjust expected __cpp_constexpr
      	value.
      	* g++.dg/ext/stmtexpr19.C: Don't expect an error.
      	* g++.dg/ext/stmtexpr25.C: New test.
      32d16fe9
    • Jeff Chapman II's avatar
      c++: implement P1492 contracts · 2efb237f
      Jeff Chapman II authored
      
      Implement the P1492 versions of contracts, along with extensions that
      support the emulation of N4820 and other proposals. This implementation
      assigns a concrete semantic (one of: ignore, assume, enforce, or
      observe) to each contract attribute depending on its labels and
      configuration options.
      
      Co-authored-by: default avatarAndrew Sutton <asutton@lock3software.com>
      Co-authored-by: default avatarAndrew Marmaduke <amarmaduke@lock3software.com>
      Co-authored-by: default avatarMichael Lopez <mlopez@lock3software.com>
      Co-authored-by: default avatarJason Merrill <jason@redhat.com>
      
      gcc/ChangeLog:
      
      	* doc/invoke.texi: Document contracts flags.
      
      gcc/c-family/ChangeLog:
      
      	* c.opt: Add contracts flags.
      	* c-cppbuiltin.cc (c_cpp_builtins): Add contracts feature-test
      	macros.
      
      gcc/cp/ChangeLog:
      
      	* cp-tree.h (enum cp_tree_index): Add
      	CPTI_PSEUDO_CONTRACT_VIOLATION.
      	(pseudo_contract_violation_type): New macro.
      	(struct saved_scope): Add x_processing_contract_condition.
      	(processing_contract_condition): New macro.
      	(comparing_override_contracts): New variable decl.
      	(find_contract): New inline.
      	(set_decl_contracts): New inline.
      	(get_contract_semantic): New inline.
      	(set_contract_semantic): New inline.
      	* constexpr.cc (cxx_eval_assert): Split out from...
      	(cxx_eval_internal_function): ...here.
      	(cxx_eval_constant_expression): Use it for contracts.
      	(potential_constant_expression_1): Handle contracts.
      	* cp-gimplify.cc (cp_genericize_r): Handle contracts.
      	* cp-objcp-common.cc (cp_tree_size): Handle contracts.
      	(cp_common_init_ts): Handle contracts.
      	(cp_handle_option): Handle contracts.
      	* decl.cc (duplicate_decls): Handle contracts.
      	(check_tag_decl): Check for bogus contracts.
      	(start_decl): Check flag_contracts.
      	(grokfndecl): Call rebuild_postconditions.
      	(grokdeclarator): Handle contract attributes.
      	(start_preparsed_function): Call start_function_contracts.
      	(finish_function): Call finish_function_contracts.
      	* decl2.cc (cp_check_const_attributes): Skip contracts.
      	(comdat_linkage): Handle outlined contracts.
      	* error.cc (dump_type): Handle null TYPE_IDENTIFIER.
      	* g++spec.cc (EXPERIMENTAL): New macro.
      	(lang_specific_driver): Add -lstdc++exp if -fcontracts.
      	* mangle.cc (write_encoding): Handle outlined contracts.
      	* module.cc (trees_out::fn_parms_init): Handle outlined contracts.
      	(trees_in::fn_parms_init): Likewise.
      	(check_mergeable_decl): Likewise.
      	(module_state_config::get_dialect): Record -fcontracts.
      	* parser.h (struct cp_unparsed_functions_entry): Add contracts.
      	* parser.cc (unparsed_contracts): New macro.
      	(push_unparsed_function_queues): Adjust.
      	(contract_attribute_p): New.
      	(cp_parser_statement): Check contracts.
      	(cp_parser_decl_specifier_seq): Handle contracts.
      	(cp_parser_skip_to_closing_square_bracket): Split out...
      	(cp_parser_skip_up_to_closing_square_bracket): ...this fn.
      	(cp_parser_class_specifier): Do contract late parsing.
      	(cp_parser_class_head): Check contracts.
      	(cp_parser_contract_role): New.
      	(cp_parser_contract_mode_opt): New.
      	(find_error, contains_error_p): New.
      	(cp_parser_contract_attribute_spec): New.
      	(cp_parser_late_contract_condition): New.
      	(cp_parser_std_attribute_spec): Handle contracts.
      	(cp_parser_save_default_args): Also save contracts.
      	* pt.cc (register_parameter_specializations): No longer static.
      	(register_local_identity): New.
      	(check_explicit_specialization): Call remove_contract_attributes.
      	(tsubst_contract, tsubst_contract_attribute): New.
      	(tsubst_contract_attributes): New.
      	(tsubst_attribute): Add comment.
      	(tsubst_copy): Also allow parm when processing_contract_condition.
      	(tsubst_expr): Handle contracts.
      	(regenerate_decl_from_template): Handle contracts.
      	* search.cc (check_final_overrider): Compare contracts.
      	* semantics.cc (set_cleanup_locs): Skip POSTCONDITION_STMT.
      	(finish_non_static_data_member): Check contracts.
      	(finish_this_expr): Check contracts.
      	(process_outer_var_ref): Handle contracts.
      	(finish_id_expression_1): Handle contracts.
      	(apply_deduced_return_type): Adjust contracts.
      	* tree.cc (handle_contract_attribute): New.
      	(get_innermost_component, is_this_expression): New.
      	(comparing_this_references): New.
      	(equivalent_member_references): New.
      	(cp_tree_equal): Check it.
      	* typeck.cc (check_return_expr): Apply contracts.
      	* Make-lang.in: Add contracts.o.
      	* config-lang.in: Add contracts.cc.
      	* cp-tree.def (ASSERTION_STMT, PRECONDITION_STMT)
      	(POSTCONDITION_STMT): New.
      	* contracts.h: New file.
      	* contracts.cc: New file.
      
      gcc/testsuite/ChangeLog:
      
      	* g++.dg/modules/modules.exp: Pass dg-options to link command.
      	* lib/g++.exp: Add -L for libstdc++exp.a.
      	* g++.dg/contracts/backtrace_handler/assert_fail.cpp: New test.
      	* g++.dg/contracts/backtrace_handler/handle_contract_violation.cpp: New test.
      	* g++.dg/contracts/contracts-access1.C: New test.
      	* g++.dg/contracts/contracts-assume1.C: New test.
      	* g++.dg/contracts/contracts-assume2.C: New test.
      	* g++.dg/contracts/contracts-assume3.C: New test.
      	* g++.dg/contracts/contracts-assume4.C: New test.
      	* g++.dg/contracts/contracts-assume5.C: New test.
      	* g++.dg/contracts/contracts-assume6.C: New test.
      	* g++.dg/contracts/contracts-comdat1.C: New test.
      	* g++.dg/contracts/contracts-config1.C: New test.
      	* g++.dg/contracts/contracts-constexpr1.C: New test.
      	* g++.dg/contracts/contracts-constexpr2.C: New test.
      	* g++.dg/contracts/contracts-constexpr3.C: New test.
      	* g++.dg/contracts/contracts-conversion1.C: New test.
      	* g++.dg/contracts/contracts-ctor-dtor1.C: New test.
      	* g++.dg/contracts/contracts-ctor-dtor2.C: New test.
      	* g++.dg/contracts/contracts-cv1.C: New test.
      	* g++.dg/contracts/contracts-deduced1.C: New test.
      	* g++.dg/contracts/contracts-deduced2.C: New test.
      	* g++.dg/contracts/contracts-friend1.C: New test.
      	* g++.dg/contracts/contracts-ft1.C: New test.
      	* g++.dg/contracts/contracts-ignore1.C: New test.
      	* g++.dg/contracts/contracts-ignore2.C: New test.
      	* g++.dg/contracts/contracts-large-return.C: New test.
      	* g++.dg/contracts/contracts-multiline1.C: New test.
      	* g++.dg/contracts/contracts-multiple-inheritance1.C: New test.
      	* g++.dg/contracts/contracts-multiple-inheritance2.C: New test.
      	* g++.dg/contracts/contracts-nested-class1.C: New test.
      	* g++.dg/contracts/contracts-nested-class2.C: New test.
      	* g++.dg/contracts/contracts-nocopy1.C: New test.
      	* g++.dg/contracts/contracts-override.C: New test.
      	* g++.dg/contracts/contracts-post1.C: New test.
      	* g++.dg/contracts/contracts-post2.C: New test.
      	* g++.dg/contracts/contracts-post3.C: New test.
      	* g++.dg/contracts/contracts-post4.C: New test.
      	* g++.dg/contracts/contracts-post5.C: New test.
      	* g++.dg/contracts/contracts-post6.C: New test.
      	* g++.dg/contracts/contracts-pre1.C: New test.
      	* g++.dg/contracts/contracts-pre10.C: New test.
      	* g++.dg/contracts/contracts-pre2.C: New test.
      	* g++.dg/contracts/contracts-pre2a1.C: New test.
      	* g++.dg/contracts/contracts-pre2a2.C: New test.
      	* g++.dg/contracts/contracts-pre3.C: New test.
      	* g++.dg/contracts/contracts-pre4.C: New test.
      	* g++.dg/contracts/contracts-pre5.C: New test.
      	* g++.dg/contracts/contracts-pre6.C: New test.
      	* g++.dg/contracts/contracts-pre7.C: New test.
      	* g++.dg/contracts/contracts-pre9.C: New test.
      	* g++.dg/contracts/contracts-redecl1.C: New test.
      	* g++.dg/contracts/contracts-redecl2.C: New test.
      	* g++.dg/contracts/contracts-redecl3.C: New test.
      	* g++.dg/contracts/contracts-redecl4.C: New test.
      	* g++.dg/contracts/contracts-redecl5.C: New test.
      	* g++.dg/contracts/contracts-redecl6.C: New test.
      	* g++.dg/contracts/contracts-redecl7.C: New test.
      	* g++.dg/contracts/contracts-redecl8.C: New test.
      	* g++.dg/contracts/contracts-tmpl-attr1.C: New test.
      	* g++.dg/contracts/contracts-tmpl-spec1.C: New test.
      	* g++.dg/contracts/contracts-tmpl-spec2.C: New test.
      	* g++.dg/contracts/contracts-tmpl-spec3.C: New test.
      	* g++.dg/contracts/contracts1.C: New test.
      	* g++.dg/contracts/contracts10.C: New test.
      	* g++.dg/contracts/contracts11.C: New test.
      	* g++.dg/contracts/contracts12.C: New test.
      	* g++.dg/contracts/contracts13.C: New test.
      	* g++.dg/contracts/contracts14.C: New test.
      	* g++.dg/contracts/contracts15.C: New test.
      	* g++.dg/contracts/contracts16.C: New test.
      	* g++.dg/contracts/contracts17.C: New test.
      	* g++.dg/contracts/contracts18.C: New test.
      	* g++.dg/contracts/contracts19.C: New test.
      	* g++.dg/contracts/contracts2.C: New test.
      	* g++.dg/contracts/contracts20.C: New test.
      	* g++.dg/contracts/contracts22.C: New test.
      	* g++.dg/contracts/contracts24.C: New test.
      	* g++.dg/contracts/contracts25.C: New test.
      	* g++.dg/contracts/contracts3.C: New test.
      	* g++.dg/contracts/contracts35.C: New test.
      	* g++.dg/contracts/contracts4.C: New test.
      	* g++.dg/contracts/contracts5.C: New test.
      	* g++.dg/contracts/contracts6.C: New test.
      	* g++.dg/contracts/contracts7.C: New test.
      	* g++.dg/contracts/contracts8.C: New test.
      	* g++.dg/contracts/contracts9.C: New test.
      	* g++.dg/modules/contracts-1_a.C: New test.
      	* g++.dg/modules/contracts-1_b.C: New test.
      	* g++.dg/modules/contracts-2_a.C: New test.
      	* g++.dg/modules/contracts-2_b.C: New test.
      	* g++.dg/modules/contracts-2_c.C: New test.
      	* g++.dg/modules/contracts-3_a.C: New test.
      	* g++.dg/modules/contracts-3_b.C: New test.
      	* g++.dg/modules/contracts-4_a.C: New test.
      	* g++.dg/modules/contracts-4_b.C: New test.
      	* g++.dg/modules/contracts-4_c.C: New test.
      	* g++.dg/modules/contracts-4_d.C: New test.
      	* g++.dg/modules/contracts-tpl-friend-1_a.C: New test.
      	* g++.dg/modules/contracts-tpl-friend-1_b.C: New test.
      	* g++.dg/contracts/backtrace_handler/Makefile: New test.
      	* g++.dg/contracts/backtrace_handler/README: New test.
      	* g++.dg/contracts/backtrace_handler/example_out.txt: New test.
      	* g++.dg/contracts/backtrace_handler/example_pretty.txt: New test.
      	* g++.dg/contracts/backtrace_handler/prettytrace.sh: New test.
      	* g++.dg/contracts/except_preload_handler/Makefile: New test.
      	* g++.dg/contracts/except_preload_handler/README: New test.
      	* g++.dg/contracts/except_preload_handler/assert_fail.cpp: New test.
      	* g++.dg/contracts/except_preload_handler/handle_contract_violation.cpp: New test.
      	* g++.dg/contracts/noexcept_preload_handler/Makefile: New test.
      	* g++.dg/contracts/noexcept_preload_handler/README: New test.
      	* g++.dg/contracts/noexcept_preload_handler/assert_fail.cpp: New test.
      	* g++.dg/contracts/noexcept_preload_handler/handle_contract_violation.cpp: New test.
      	* g++.dg/contracts/preload_handler/Makefile: New test.
      	* g++.dg/contracts/preload_handler/README: New test.
      	* g++.dg/contracts/preload_handler/assert_fail.cpp: New test.
      	* g++.dg/contracts/preload_handler/handle_contract_violation.cpp: New test.
      	* g++.dg/contracts/preload_nocontinue_handler/Makefile: New test.
      	* g++.dg/contracts/preload_nocontinue_handler/README: New test.
      	* g++.dg/contracts/preload_nocontinue_handler/assert_fail.cpp: New test.
      	* g++.dg/contracts/preload_nocontinue_handler/handle_contract_violation.cpp: New test.
      	* g++.dg/contracts/preload_nocontinue_handler/nocontinue.cpp: New test.
      2efb237f
    • Jeff Chapman II's avatar
      libstdc++: add experimental Contracts support · ea63396f
      Jeff Chapman II authored
      
      This patch adds the library support for the experimental C++ Contracts
      implementation.  This now consists only of a default definition of the
      violation handler, which users can override through defining their own
      version.  To avoid ABI stability problems with libstdc++.so this is added to
      a separate -lstdc++exp static library, which the driver knows to add when it
      sees -fcontracts.
      
      Co-authored-by: default avatarAndrew Marmaduke <amarmaduke@lock3software.com>
      Co-authored-by: default avatarJason Merrill <jason@redhat.com>
      
      libstdc++-v3/ChangeLog:
      
      	* acinclude.m4 (glibcxx_SUBDIRS): Add src/experimental.
      	* include/Makefile.am (experimental_headers): Add contract.
      	* include/Makefile.in: Regenerate.
      	* src/Makefile.am (SUBDIRS): Add experimental.
      	* src/Makefile.in: Regenerate.
      	* configure: Regenerate.
      	* src/experimental/contract.cc: New file.
      	* src/experimental/Makefile.am: New file.
      	* src/experimental/Makefile.in: New file.
      	* include/experimental/contract: New file.
      ea63396f
    • David Malcolm's avatar
      analyzer: fix feasibility false +ve on jumps through function ptrs [PR107582] · a7aef0a5
      David Malcolm authored
      
      PR analyzer/107582 reports a false +ve from
      -Wanalyzer-use-of-uninitialized-value where
      the analyzer's feasibility checker erroneously decides
      that point (B) in the code below is reachable, with "x" being
      uninitialized there:
      
          pthread_cleanup_push(func, NULL);
      
          while (ret != ETIMEDOUT)
      	ret = rand() % 1000;
      
          /* (A): after the while loop  */
      
          if (ret != ETIMEDOUT)
            x = &z;
      
          pthread_cleanup_pop(1);
      
          if (ret == ETIMEDOUT)
            return 0;
      
          /* (B): after not bailing out  */
      
      due to these contradictionary conditions somehow both holding:
        * (ret == ETIMEDOUT), at (A) (skipping the initialization of x), and
        * (ret != ETIMEDOUT), at (B)
      
      The root cause is that after the while loop, state merger puts ret in
      the exploded graph in an UNKNOWN state, and saves the diagnostic at (B).
      
      Later, as we explore the feasibilty of reaching the enode for (B),
      dynamic_call_info_t::update_model is called to push/pop the
      frames for handling the call to "func" in pthread_cleanup_pop.
      The "ret" at these nodes in the feasible_graph has a conjured_svalue for
      "ret", and a constraint on it being either == *or* != ETIMEDOUT.
      
      However dynamic_call_info_t::update_model blithely clobbers the
      model with a copy from the exploded_graph, in which "ret" is UNKNOWN.
      
      This patch fixes dynamic_call_info_t::update_model so that it
      simulates pushing/popping a frame on the model we're working with,
      preserving knowledge of the constraint on "ret", and enabling the
      analyzer to "know" that the bail-out must happen.
      
      Doing so fixes the false positive.
      
      gcc/analyzer/ChangeLog:
      	PR analyzer/107582
      	* engine.cc (dynamic_call_info_t::update_model): Update the model
      	by pushing or pop a frame, rather than by clobbering it with the
      	model from the exploded_node's state.
      
      gcc/testsuite/ChangeLog:
      	PR analyzer/107582
      	* gcc.dg/analyzer/feasibility-4.c: New test.
      	* gcc.dg/analyzer/feasibility-pr107582-1.c: New test.
      	* gcc.dg/analyzer/feasibility-pr107582-2.c: New test.
      
      Signed-off-by: default avatarDavid Malcolm <dmalcolm@redhat.com>
      a7aef0a5
  4. Nov 18, 2022
    • David Malcolm's avatar
      analyzer: move more impl_* to known_function · 1c4a7881
      David Malcolm authored
      
      Fix a missing check that the argument to __analyzer_dump_capacity must
      be a pointer type (which would otherwise lead to an ICE).
      
      Do so by using the known_function_manager rather than by doing lots of
      string matching.  Do the same for many other functions.
      
      Doing so moves the type-checking closer to the logic that makes use
      of it, by putting them in the same class, rather than splitting them
      up between two source files (and sometimes three, e.g. for "pipe").
      I hope this reduces the number of missing checks.
      
      gcc/analyzer/ChangeLog:
      	* analyzer.cc (is_pipe_call_p): Delete.
      	* analyzer.h (is_pipe_call_p): Delete.
      	* region-model-impl-calls.cc (call_details::get_location): New.
      	(class kf_analyzer_break): New, adapted from
      	region_model::on_stmt_pre.
      	(region_model::impl_call_analyzer_describe): Convert to...
      	(class kf_analyzer_describe): ...this.
      	(region_model::impl_call_analyzer_dump_capacity): Convert to...
      	(class kf_analyzer_dump_capacity): ...this.
      	(region_model::impl_call_analyzer_dump_escaped): Convert to...
      	(class kf_analyzer_dump_escaped): ...this.
      	(class kf_analyzer_dump_exploded_nodes): New.
      	(region_model::impl_call_analyzer_dump_named_constant): Convert
      	to...
      	(class kf_analyzer_dump_named_constant): ...this.
      	(class dump_path_diagnostic): Move here from region-model.cc.
      	(class kf_analyzer_dump_path) New, adapted from
      	region_model::on_stmt_pre.
      	(class kf_analyzer_dump_region_model): Likewise.
      	(region_model::impl_call_analyzer_eval): Convert to...
      	(class kf_analyzer_eval): ...this.
      	(region_model::impl_call_analyzer_get_unknown_ptr): Convert to...
      	(class kf_analyzer_get_unknown_ptr): ...this.
      	(class known_function_accept): Rename to...
      	(class kf_accept): ...this.
      	(class known_function_bind): Rename to...
      	(class kf_bind): ...this.
      	(class known_function_connect): Rename to...
      	(class kf_connect): ...this.
      	(region_model::impl_call_errno_location): Convert to...
      	(class kf_errno_location): ...this.
      	(class known_function_listen): Rename to...
      	(class kf_listen): ...this.
      	(region_model::impl_call_pipe): Convert to...
      	(class kf_pipe): ...this.
      	(region_model::impl_call_putenv): Convert to...
      	(class kf_putenv): ...this.
      	(region_model::impl_call_operator_new): Convert to...
      	(class kf_operator_new): ...this.
      	(region_model::impl_call_operator_delete): Convert to...
      	(class kf_operator_delete): ...this.
      	(class known_function_socket): Rename to...
      	(class kf_socket): ...this.
      	(register_known_functions): Rename param to KFM.  Break out
      	existing known functions into a "POSIX" section, and add "pipe",
      	"pipe2", and "putenv".  Add debugging functions
      	"__analyzer_break", "__analyzer_describe",
      	"__analyzer_dump_capacity", "__analyzer_dump_escaped",
      	"__analyzer_dump_exploded_nodes",
      	"__analyzer_dump_named_constant", "__analyzer_dump_path",
      	"__analyzer_dump_region_model", "__analyzer_eval",
      	"__analyzer_get_unknown_ptr".  Add C++ support functions
      	"operator new", "operator new []", "operator delete", and
      	"operator delete []".
      	* region-model.cc (class dump_path_diagnostic): Move to
      	region-model-impl-calls.cc.
      	(region_model::on_stmt_pre): Eliminate special-casing of
      	"__analyzer_describe", "__analyzer_dump_capacity",
      	"__analyzer_dump_escaped", "__analyzer_dump_named_constant",
      	"__analyzer_dump_path", "__analyzer_dump_region_model",
      	"__analyzer_eval", "__analyzer_break",
      	"__analyzer_dump_exploded_nodes", "__analyzer_get_unknown_ptr",
      	"__errno_location", "pipe", "pipe2", "putenv", "operator new",
      	"operator new []", "operator delete", "operator delete []"
      	"pipe" and "pipe2", handling them instead via the known_functions
      	mechanism.
      	* region-model.h (call_details::get_location): New decl.
      	(region_model::impl_call_analyzer_describe): Delete decl.
      	(region_model::impl_call_analyzer_dump_capacity): Delete decl.
      	(region_model::impl_call_analyzer_dump_escaped): Delete decl.
      	(region_model::impl_call_analyzer_dump_named_constant): Delete decl.
      	(region_model::impl_call_analyzer_eval): Delete decl.
      	(region_model::impl_call_analyzer_get_unknown_ptr): Delete decl.
      	(region_model::impl_call_errno_location): Delete decl.
      	(region_model::impl_call_pipe): Delete decl.
      	(region_model::impl_call_putenv): Delete decl.
      	(region_model::impl_call_operator_new): Delete decl.
      	(region_model::impl_call_operator_delete): Delete decl.
      	* sm-fd.cc: Update comments.
      
      gcc/testsuite/ChangeLog:
      	* gcc.dg/analyzer/analyzer-debugging-fns-1.c: New test.
      	* gcc.dg/analyzer/attr-const-3.c: Increase the
      	"analyzer-max-svalue-depth" from 0 to 4 to ensure that
      	"__analyzer_eval" is recognized.
      
      Signed-off-by: default avatarDavid Malcolm <dmalcolm@redhat.com>
      1c4a7881
    • Philipp Tomsich's avatar
      RISC-V: No extensions for SImode min/max against safe constant · 3142265d
      Philipp Tomsich authored
      Optimize the common case of a SImode min/max against a constant
      that is safe both for sign- and zero-extension.
      E.g., consider the case
        int f(unsigned int* a)
        {
          const int C = 1000;
          return *a * 3 > C ? C : *a * 3;
        }
      where the constant C will yield the same result in DImode whether
      sign- or zero-extended.
      
      This should eventually go away once the lowering to RTL smartens up
      and considers the precision/signedness and the value-ranges of the
      operands to MIN_EXPR and MAX_EXPR.
      
      gcc/ChangeLog:
      
      	* config/riscv/bitmanip.md (*minmax): Additional pattern for
      	  min/max against constants that are extension-invariant.
      	* config/riscv/iterators.md (minmax_optab): Add an iterator
      	  that has only min and max rtl.
      
      gcc/testsuite/ChangeLog:
      
      	* gcc.target/riscv/zbb-min-max-02.c: New test.
      3142265d
    • Philipp Tomsich's avatar
      RISC-V: Handle "(a & twobits) == singlebit" in branches using Zbs · 60d2bcc5
      Philipp Tomsich authored
      Use Zbs when generating a sequence for
         "if ((a & twobits) == singlebit) ..."
      that can be expressed as
         bexti + bexti + andn.
      
      gcc/ChangeLog:
      
      	* config/riscv/bitmanip.md
      	(*branch<X:mode>_mask_twobits_equals_singlebit):
      	Handle "if ((a & T) == C)" using Zbs, when T has 2 bits set and C
      	has one	of these tow bits set.
      	* config/riscv/predicates.md (const_twobits_not_arith_operand):
      	New predicate.
      
      gcc/testsuite/ChangeLog:
      
      	* gcc.target/riscv/zbs-if_then_else-01.c: New test.
      60d2bcc5
    • Philipp Tomsich's avatar
      RISC-V: Use bseti/bclri/binvi to extend reach of ori/andi/xori · bc6beecb
      Philipp Tomsich authored
      Sequences of the form "a | C" and "a ^ C" with C being the positive
      half of a signed immediate's range with one extra bit set in addition
      are mapped to ori/xori and one bseti/binvi to avoid using a temporary
      (and a multi-insn sequence to load C into that temporary).
      
      Something similar holds for "a & ~C" being representable as either
      bclri + bclri or bclri + andi.
      
      gcc/ChangeLog:
      
      	* config/riscv/bitmanip.md (*<or_optab>i<mode>_extrabit):
      	New pattern for binvi+binvi/xori and bseti+bseti/ori
      	(*andi<mode>_extrabit): New pattern for bclri+bclri/andi
      	* config/riscv/iterators.md (any_or): Match or and ior
      	* config/riscv/predicates.md (const_twobits_operand):
      	New predicate.
      	(uimm_extra_bit_operand): New predicate.
      	(uimm_extra_bit_or_twobits): New predicate.
      	(not_uimm_extra_bit_operand): New predicate.
      	(not_uimm_extra_bit_or_nottwobits): New predicate.
      	* config/riscv/riscv.h (UIMM_EXTRA_BIT_OPERAND):
      	Helper for the uimm_extra_bit_operand and
      	not_uimm_extra_bit_operand predicates.
      
      gcc/testsuite/ChangeLog:
      
      	* gcc.target/riscv/zbs-bclri.c: Rename
      	* gcc.target/riscv/zbs-bclri-01.c: Renamed from above.
      	* gcc.target/riscv/zbs-bclri-02.c: New test.
      	* gcc.target/riscv/zbs-binvi.c: New test.
      	* gcc.target/riscv/zbs-bseti.c: New test.
      bc6beecb
    • Philipp Tomsich's avatar
      RISC-V: Optimize slli(.uw)? + addw + zext.w into sh[123]add + zext.w · 787ac959
      Philipp Tomsich authored
      gcc/ChangeLog:
      
      	* config/riscv/bitmanip.md: Handle corner-cases for combine
      	when chaining slli(.uw)? + addw
      	* config/riscv/riscv-protos.h (riscv_shamt_matches_mask_p):
      	Define prototype.
      	* config/riscv/riscv.cc (riscv_shamt_matches_mask_p):
      	Helper for evaluating the relationship between two operands.
      
      gcc/testsuite/ChangeLog:
      
      	* gcc.target/riscv/zba-shNadd-04.c: New test.
      787ac959
    • Philipp Tomsich's avatar
      RISC-V: split to allow formation of sh[123]add before 32bit divw · 30c2d8df
      Philipp Tomsich authored
      When using strength-reduction, we will reduce a multiplication to a
      sequence of shifts and adds.  If this is performed with 32-bit types
      and followed by a division, the lack of w-form sh[123]add will make
      combination impossible and lead to a slli + addw being generated.
      
      Split the sequence with the knowledge that a w-form div will perform
      implicit sign-extensions.
      
      gcc/ChangeLog:
      
      	* config/riscv/bitmanip.md: Add a define_split to optimize
      	  slliw + addiw + divw into sh[123]add + divw.
      
      gcc/testsuite/ChangeLog:
      
      	* gcc.target/riscv/zba-shNadd-05.c: New test.
      30c2d8df
    • Philipp Tomsich's avatar
      RISC-V: Optimize branches testing a bit-range or a shifted immediate · acbb5ef0
      Philipp Tomsich authored
      gcc/ChangeLog:
      
      	* config/riscv/predicates.md (shifted_const_arith_operand): New predicate.
      	(uimm_extra_bit_operand): New predicate.
      	* config/riscv/riscv.md (*branch<ANYI:mode>_shiftedarith_equals_zero):
      	New pattern.
      	(*branch<ANYI:mode>_shiftedmask_equals_zero): New pattern.
      
      gcc/testsuite/ChangeLog:
      
      	* gcc.target/riscv/branch-1.c: New test.
      acbb5ef0
    • Philipp Tomsich's avatar
      RISC-V: allow bseti on SImode without sign-extension · 23d9f62c
      Philipp Tomsich authored
      As long as the SImode operand is not a partial subreg, we can use a
      bseti without postprocessing to or in a bit, as the middle end is
      smart enough to stay away from the signbit.
      
      gcc/ChangeLog:
      
      	* config/riscv/bitmanip.md (*bsetidisi): New pattern.
      
      gcc/testsuite/ChangeLog:
      
      	* gcc.target/riscv/zbs-bseti-02.c: New test.
      23d9f62c
    • Richard Purdie's avatar
      libcpp: Avoid remapping filenames within directives · 11543b27
      Richard Purdie authored
      Code such as:
      
       #include __FILE__
      
      can interact poorly with the *-prefix-map options when cross compiling. In
      general you're after to remap filenames for use in target context but the
      local paths should be used to find include files at compile time. Ingoring
      filename remapping for directives allows avoiding such failures.
      
      Fix this to improve such usage and then document this against file-prefix-map
      (referenced by the other *-prefix-map options) to make the behaviour clear
      and defined.
      
      libcpp/ChangeLog:
      
      	* macro.cc (_cpp_builtin_macro_text): Don't remap filenames within
      	directives.
      
      gcc/ChangeLog:
      
      	* doc/invoke.texi: Document prefix-maps don't affect directives.
      11543b27
    • Jakub Jelinek's avatar
      Manually add entries for r13-4128. · 59cc4da6
      Jakub Jelinek authored
      Aldo, replace some invalid tab + 2 spaces with just tab.
      59cc4da6
    • Harald Anlauf's avatar
      Fortran: reject NULL actual argument without explicit interface [PR107576] · 820c25c8
      Harald Anlauf authored
      gcc/fortran/ChangeLog:
      
      	PR fortran/107576
      	* interface.cc (gfc_procedure_use): Reject NULL as actual argument
      	when there is no explicit procedure interface.
      
      gcc/testsuite/ChangeLog:
      
      	PR fortran/107576
      	* gfortran.dg/null_actual_3.f90: New test.
      820c25c8
    • GCC Administrator's avatar
      Daily bump. · add89840
      GCC Administrator authored
      add89840
    • Jakub Jelinek's avatar
      Add another commit to ignore · f003fdff
      Jakub Jelinek authored
      We can't handle r13-4128-g1957bedf29a1b2cc231972aba680fe80199d5498
      
      	* gcc-changelog/git_update_version.py: Add
      	1957bedf to ignored commits.
      f003fdff
    • Andrew Pinski's avatar
      Fix PR middle-end/107705: ICE after reclaration error · ceba66ee
      Andrew Pinski authored
      The problem here is after we created a call expression
      in the C front-end, we replace the decl type with
      an error mark node. We then end up calling
      aggregate_value_p with the call expression
      with the decl with the error mark as the type
      and we ICE.
      
      The fix is to check the function type
      after we process the call expression inside
      aggregate_value_p to get it.
      
      OK? Bootstrapped and tested on x86_64-linux-gnu with no regressions.
      
      Thanks,
      Andrew Pinski
      
      gcc/ChangeLog:
      
      	PR middle-end/107705
      	* function.cc (aggregate_value_p): Return 0 if
      	the function type was an error operand.
      
      gcc/testsuite/ChangeLog:
      
      	* gcc.dg/redecl-22.c: New test.
      ceba66ee
    • Andrew Pinski's avatar
      Fix PRs 106764, 106765, and 107307, all ICE after invalid re-declaration · bd0c9d9e
      Andrew Pinski authored
      The problem here is the gimplifier returns GS_ERROR but
      in some cases we don't check that soon enough and try
      to do other work which could crash.
      So the fix in these two cases is to return GS_ERROR
      early if the gimplify_* functions had return GS_ERROR.
      
      OK? Bootstrapped and tested on x86_64-linux-gnu with no regressions.
      
      Thanks,
      Andrew Pinski
      
      gcc/ChangeLog:
      
      	PR c/106764
      	PR c/106765
      	PR c/107307
      	* gimplify.cc (gimplify_compound_lval): Return GS_ERROR
      	if gimplify_expr had return GS_ERROR.
      	(gimplify_call_expr): Likewise.
      
      gcc/testsuite/ChangeLog:
      
      	PR c/106764
      	PR c/106765
      	PR c/107307
      	* gcc.dg/redecl-19.c: New test.
      	* gcc.dg/redecl-20.c: New test.
      	* gcc.dg/redecl-21.c: New test.
      bd0c9d9e
Loading