Jonathan Wakely [Thu, 19 Aug 2021 10:48:40 +0000 (11:48 +0100)]
libstdc++: Fix move construction of std::tuple with array elements [PR101960]
An array member cannot be direct-initialized in a ctor-initializer-list,
so use the base class' move constructor, which does the right thing for
both arrays and non-arrays.
This constructor could be defaulted, but that would make it trivial for
some specializations, which would change the argument passing ABI. Do
that for the versioned namespace only.
Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
libstdc++-v3/ChangeLog:
PR libstdc++/101960
* include/std/tuple (_Tuple_impl(_Tuple_impl&&)): Use base
class' move constructor. Define as defaulted for versioned
namespace.
* testsuite/20_util/tuple/cons/101960.cc: New test.
Jonathan Wakely [Thu, 19 Aug 2021 10:03:01 +0000 (11:03 +0100)]
libstdc++: Improve overflow check for file timestamps
The current code assumes that system_clock::duration is nanoseconds, and
also performs a value-changing conversion from nanoseconds::max() to
double (which doesn't matter after dividing by 1e9, but triggers a
warning with Clang nonetheless).
A better solution is to use system_clock::duration::max() and perform
the comparison entirely using the std::chrono types, rather than with
dimensionless arithmetic types.
This doesn't address the FIXME in the function, so the overflow check
still rejects some values that could be represented by the file_clock.
Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
libstdc++-v3/ChangeLog:
* src/filesystem/ops-common.h (filesystem::file_time): Improve
overflow check by using system_clock::duration::max().
Jakub Jelinek [Thu, 19 Aug 2021 09:00:27 +0000 (11:00 +0200)]
expand: Add new clrsb fallback expansion [PR101950]
As suggested in the PR, the following patch adds two new clrsb
expansion possibilities if target doesn't have clrsb_optab for the
requested nor wider modes, but does have clz_optab for the requested
mode.
One expansion is
clrsb (op0)
expands as
clz (op0 ^ (((stype)op0) >> (prec-1))) - 1
which is usable if CLZ_DEFINED_VALUE_AT_ZERO is 2 with value
of prec, because the clz argument can be 0 and clrsb should give
prec-1 in that case.
The other expansion is
clz (((op0 << 1) ^ (((stype)op0) >> (prec-1))) | 1)
where the clz argument is never 0, but it is one operation longer.
E.g. on x86_64-linux with -O2 -mno-lzcnt, this results for
int foo (int x) { return __builtin_clrsb (x); }
in
- subq $8, %rsp
- movslq %edi, %rdi
- call __clrsbdi2
- addq $8, %rsp
- subl $32, %eax
+ leal (%rdi,%rdi), %eax
+ sarl $31, %edi
+ xorl %edi, %eax
+ orl $1, %eax
+ bsrl %eax, %eax
+ xorl $31, %eax
and with -O2 -mlzcnt:
+ movl %edi, %eax
+ sarl $31, %eax
+ xorl %edi, %eax
+ lzcntl %eax, %eax
+ subl $1, %eax
On armv7hl-linux-gnueabi with -O2:
- push {r4, lr}
- bl __clrsbsi2
- pop {r4, pc}
+ @ link register save eliminated.
+ eor r0, r0, r0, asr #31
+ clz r0, r0
+ sub r0, r0, #1
+ bx lr
As it (at least usually) will make code larger, it is
disabled for -Os or cold instructions.
2021-08-19 Jakub Jelinek <jakub@redhat.com>
PR middle-end/101950
* optabs.c (expand_clrsb_using_clz): New function.
(expand_unop): Use it as another clrsb expansion fallback.
* gcc.target/i386/pr101950-1.c: New test.
* gcc.target/i386/pr101950-2.c: New test.
Jakub Jelinek [Thu, 19 Aug 2021 08:38:19 +0000 (10:38 +0200)]
openmp: Fix ICE on requires clause with atomic_default_mem_order (
When working on error directive, I've noticed the C FE ICEs on
#pragma omp requires atomic_default_mem_order (
where it tries to peek 2nd token after the CPP_PRAGMA_EOL (or CPP_EOF)
in there in order to improve error-recovery on say
atomic_default_mem_order (acquire)
or
atomic_default_mem_order (seqcst)
etc. The C++ FE didn't ICE, but it is better to follow the same thing there.
2021-08-19 Jakub Jelinek <jakub@redhat.com>
gcc/c/
* c-parser.c (c_parser_omp_requires): Don't call
c_parser_peek_2nd_token and optionally consume token if current
token is CPP_EOF, CPP_PRAGMA_EOL or CPP_CLOSE_PAREN.
gcc/cp/
* parser.c (cp_parser_omp_requires): Don't call cp_lexer_nth_token_is
and optionally consume token if current token is CPP_EOF,
CPP_PRAGMA_EOL or CPP_CLOSE_PAREN.
gcc/testsuite/
* c-c++-common/gomp/requires-3.c: Add testcase for
atomic_default_mem_order ( at the end of line without corresponding ).
Jakub Jelinek [Thu, 19 Aug 2021 08:35:39 +0000 (10:35 +0200)]
openmp: For C++ ensure nothing directive has no operands
When working on error directive, I've noticed that while C FE diagnosed
clauses on nothing directive which doesn't allow any, the C++ FE silently
accepted it.
2021-08-19 Jakub Jelinek <jakub@redhat.com>
* parser.c (cp_parser_omp_nothing): Use cp_parser_require_pragma_eol
instead of cp_parser_skip_to_pragma_eol.
Iain Sandoe [Thu, 5 Aug 2021 09:07:03 +0000 (10:07 +0100)]
JIT, testsuite, Darwin: Initial testsuite fixes.
The testsuite setup for jit is not compatible with Darwin since it
assumes that all targets support --export-dynamic.
- this is fixed by adding '-rdynamic' conditionally upon target
support for that (-rdynamic will be converted to the appropriate
linker option).
There is also an assumption that a suitable version of dejagnu.h
is present in some default include search path that is usable from
the testsuite. This is not the case for Darwin (dejagnu.h is not
installed, and would not, in general, be found in any default include
search path if installed via one of the main 'distros'). Also the
upstream dejagnu.h has a definition of 'wait()' that clashes with a
libc routines and therefore causes fails in the testsuite.
- This patch imports the header from dejagnu-1.6.2 and
* renames it to 'jit-dejagnu.h'
* patches it to avoid unused variable warnings and the clash
with the libc definition of wait ()
* In accordance with the advice in the expect man page, ensures
that the final output of the 'totals' print is stable.
* docs/examples/tut04-toyvm/toyvm.c: Include jit-dejagnu.h.
* docs/examples/tut04-toyvm/toyvm.cc: Likewise.
* jit-dejagnu.h: New file, imported from dejagnu-1.6.2 and
patched for this application.
gcc/testsuite/ChangeLog:
* jit.dg/harness.h: Include jit-dejagnu.h.
* jit.dg/jit.exp: Use -rdynamic conditionally on target
support, instead of unconditional -Wl,--export-dynamic.
Tobias Burnus [Wed, 18 Aug 2021 19:47:04 +0000 (21:47 +0200)]
Fortran: Add OpenMP's nothing directive support (con't)
Fix directory to enable -fopenmp processing.
gcc/testsuite/
PR testsuite/101963
* gfortran.dg/nothing-1.f90: Moved to ...
* gfortran.dg/gomp/nothing-1.f90: ... here.
* gfortran.dg/nothing-2.f90: Moved to ...
* gfortran.dg/gomp/nothing-2.f90: ... here;
avoid $ issue in $OMP in dg-error.
Iain Sandoe [Thu, 5 Aug 2021 08:55:19 +0000 (09:55 +0100)]
Darwin, jit: Fix build [PR100613].
The generic unix build is not completely suitable for Darwin
platforms:
* It is a convention to encode the library versioning in the
binary and to have only one level of symlink for the installed
files. This needs to be applied to the installation too.
* The library needs to be built with its correct install name
so that two-level library naming works.
* The extension for shared libraries should be .dylib
Signed-off-by: Iain Sandoe <iain@sandoe.co.uk>
PR jit/100613 - libgccjit should produce dylib on macOS
Iain Sandoe [Sat, 14 Aug 2021 11:27:55 +0000 (12:27 +0100)]
Objective-C: fix crash with -fobjc-nilcheck
When -fobjc-nilcheck is enabled, messages that result in a struct type should
yield a zero-initialized struct when sent to nil. Currently, the frontend
crashes when it encounters this situation. This patch fixes the crash by
generating the tree for the `{}` initializer.
Signed-off-by: Iain Sandoe <iain@sandoe.co.uk> Co-authored-by: Matt Jacobson <mhjacobson@me.com>
PR objc/101666
libiberty, Darwin : Fix simple-object LTO table for cross-endian case.
We encapsulate streamed IR in three special sections with a table
that describes their entries. The table is expected to be written
with native endianness for the target, but for cross-endian cross-
compilation the swapping was omitted. Fixed thus.
Ankur Saini [Sun, 15 Aug 2021 13:49:07 +0000 (19:19 +0530)]
analyzer: detect and analyze virtual function calls
2021-08-15 Ankur Saini <arsenic@sourceware.org>
gcc/analyzer/ChangeLog:
PR analyzer/97114
* region-model.cc (region_model::get_rvalue_1): Add case for
OBJ_TYPE_REF.
gcc/testsuite/ChangeLog:
PR analyzer/97114
* g++.dg/analyzer/vfunc-2.C: New test.
* g++.dg/analyzer/vfunc-3.C: New test.
* g++.dg/analyzer/vfunc-4.C: New test.
* g++.dg/analyzer/vfunc-5.C: New test.
analyzer: detect and analyze calls via function pointer
2021-07-29 Ankur Saini <arsenic@sourceware.org>
gcc/analyzer/ChangeLog:
PR analyzer/100546
* analysis-plan.cc (analysis_plan::use_summary_p): Don't use call
summaries if there is no callgraph edge
* checker-path.cc (call_event::call_event): Handle calls events that
are not represented by a supergraph call edge
(return_event::return_event): Likewise.
(call_event::get_desc): Work with new call_event structure.
(return_event::get_desc): Likeise.
* checker-path.h (call_event::m_src_snode): New field.
(call_event::m_dest_snode): New field.
(return_event::m_src_snode): New field.
(return_event::m_dest_snode): New field.
* diagnostic-manager.cc
(diagnostic_manager::prune_for_sm_diagnostic)<case EK_CALL_EDGE>:
Refactor to work with edges without callgraph edge.
(diagnostic_manager::prune_for_sm_diagnostic)<case EK_RETURN_EDGE>:
Likewise.
* engine.cc (dynamic_call_info_t::update_model): New function.
(dynamic_call_info_t::add_events_to_path): New function.
(exploded_graph::create_dynamic_call): New function.
(exploded_graph::process_node): Work with dynamically discovered calls.
* exploded-graph.h (class dynamic_call_info_t): New class.
(exploded_graph::create_dynamic_call): New decl.
* program-point.cc (program_point::push_to_call_stack): New function.
(program_point::pop_from_call_stack): New function.
* program-point.h (program_point::push_to_call_stack): New decl.
(program_point::pop_from_call_stack): New decl.
* program-state.cc (program_state::push_call): New function.
(program_state::returning_call): New function.
* program-state.h (program_state::push_call): New decl.
(program_state::returning_call): New decl.
* region-model.cc (region_model::update_for_gcall) New function.
(region_model::update_for_return_gcall): New function.
(egion_model::update_for_call_superedge): Get the underlying gcall and
update for gcall.
(region_model::update_for_return_superedge): Likewise.
* region-model.h (region_model::update_for_gcall): New decl.
(region_model::update_for_return_gcall): New decl.
* state-purge.cc (state_purge_per_ssa_name::process_point): Update to
work with calls without underlying cgraph edge.
* supergraph.cc (supergraph::supergraph) Split snodes at every callsite.
* supergraph.h (supernode::get_returning_call) New accessor.
gcc/testsuite/ChangeLog:
PR analyzer/100546
* gcc.dg/analyzer/function-ptr-4.c: New test.
* gcc.dg/analyzer/pr100546.c: New test.
Thomas Schwinge [Wed, 18 Aug 2021 15:20:40 +0000 (17:20 +0200)]
Make 'gcc/hash-map-tests.c:test_map_of_type_with_ctor_and_dtor_expand' work on 32-bit architectures [PR101959]
Bug fix for recent commit e4f16e9f357a38ec702fb69a0ffab9d292a6af9b
"Add more self-tests for 'hash_map' with Value type with non-trivial
constructor/destructor".
gcc/
PR bootstrap/101959
* hash-map-tests.c (test_map_of_type_with_ctor_and_dtor_expand):
Use an 'int_hash'.
Jonathan Wright [Wed, 18 Aug 2021 08:10:22 +0000 (09:10 +0100)]
aarch64: Fix float <-> int errors in vld4[q]_lane intrinsics
A previous commit "aarch64: Remove macros for vld4[q]_lane Neon
intrinsics" introduced some float <-> int type conversion errors.
This patch fixes those errors.
gcc/ChangeLog:
2021-08-18 Jonathan Wright <jonathan.wright@arm.com>
* config/aarch64/arm_neon.h (vld3_lane_f64): Use float RTL
pattern and type cast.
(vld4_lane_f32): Use float RTL pattern.
(vld4q_lane_f64): Use float type cast.
Jonathan Wakely [Tue, 17 Aug 2021 19:27:02 +0000 (20:27 +0100)]
libstdc++: Enable doxygen processing for C++20 components
Improve grouping, add @since and @deprecated information.
Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
libstdc++-v3/ChangeLog:
* doc/doxygen/user.cfg.in (PREDEFINED): Enable doxygen
processing for C++20 components and components that depend on
compiler features.
* include/bits/stl_algo.h (random_shuffle): Use @deprecated.
* include/std/type_traits: Improve doxygen comments for C++20
traits.
Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
libstdc++-v3/ChangeLog:
* include/ext/type_traits.h (__promote_2, __promote_3)
(__promote_4): Redfine as alias templates using __promoted_t.
* include/std/complex (__promote_2): Remove partial
specializations for std::complex.
Jonathan Wakely [Wed, 18 Aug 2021 11:24:12 +0000 (12:24 +0100)]
libstdc++: Minor optimization for min/max/minmax
The debug mode checks for a valid range are redundant when we have an
initializer_list argument, because we know it's a valid range already.
By making std::min(initialier_list<T>) call the internal __min_element
function directly we avoid a function call and skip those checks. The
same can be done for the overload taking a comparison function, and also
for the std::max and std::minmax overloads for initializer_list
arguments.
Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
libstdc++-v3/ChangeLog:
* include/bits/stl_algo.h (min(initializer_list<T>))
(min(initializer_list<T>, Compare)): Call __min_element directly to
avoid redundant debug checks for valid ranges.
(max(initializer_list<T>), max(initializer_list<T>, Compare)):
Likewise, for __max_element.
(minmax(initializer_list<T>), minmax(initializer_list<T>, Compare)):
Likewise, for __minmax_element.
Jonathan Wakely [Tue, 17 Aug 2021 17:19:27 +0000 (18:19 +0100)]
libstdc++: Fix CTAD for debug sequence containers
This fixes some 23_containers/*/cons/deduction.cc failures seen with
-std=c++17/-D_GLIBCXX_DEBUG, caused by non-immediate errors when
substituting template arguments into an incorrect specialization of the
std::__cxx1998 base class. This happens because the size_type member of
the debug container is _Base_type::size_type, so is non-deducible, and
the deduced types get substituted into _Base_type, triggering the
static_assert that checks the allocator's value_type matches the
container's.
The solution is to make the C(size_type, const T&, const Alloc&)
constructors of the debug sequence containers non-deducible. In order to
make CTAD work again deduction guides that use std::size_t for the first
argument are added.
Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
libstdc++-v3/ChangeLog:
Jonathan Wakely [Tue, 17 Aug 2021 14:06:22 +0000 (15:06 +0100)]
libstdc++: Fix vector<bool> printer tests to work in debug mode
This fixes a compilation error in debug mode, due to std::_Bit_reference
not being defined, because it's in namespace std::__cxx1998 instead. We
can refer to it as vector<bool>::reference instead, which always works.
That fixes some compilation errors in debug mode, but the tests fail at
run-time instead because the printers for vector<bool> helpers are only
registered for the std namespace, not std::__cxx1998. That is fixed by
using add_container to register the printers instead of add_version, as
the former registers them in the std and std::__cxx1998 namespaces.
Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
libstdc++-v3/ChangeLog:
* python/libstdcxx/v6/printers.py (StdBitReferencePrinter): Use
'std::vector<bool>::reference' as type name, not _Bit_reference.
(build_libstdcxx_dictionary): Register printers for vector<bool>
types in debug mode too.
* testsuite/libstdc++-prettyprinters/simple.cc: Adjust expected
output for invalid _Bit_reference. Use vector<bool>::reference
instead of _Bit_reference.
* testsuite/libstdc++-prettyprinters/simple11.cc: Likewise.
Patrick Palka [Wed, 18 Aug 2021 12:37:45 +0000 (08:37 -0400)]
c++: aggregate CTAD and brace elision [PR101344]
Here the problem is ultimately that collect_ctor_idx_types always
recurses into an eligible sub-CONSTRUCTOR regardless of whether the
corresponding pair of braces was elided in the original initializer.
This causes us to reject some completely-braced forms of aggregate
CTAD as in the first testcase below, because collect_ctor_idx_types
effectively assumes that the original initializer is always minimally
braced (and so the aggregate deduction candidate is given a function
type that's incompatible with the original completely-braced initializer).
In order to fix this, collect_ctor_idx_types needs to somehow know the
shape of the original initializer when iterating over the reshaped
initializer. To that end this patch makes reshape_init flag sub-ctors
that were built to undo brace elision in the original ctor, so that
collect_ctor_idx_types that determine whether to recurse into a sub-ctor
by simply inspecting this flag.
This happens to also fix PR101820, which is about aggregate CTAD using
designated initializers, for much the same reasons.
A curious case is the "intermediately-braced" initialization of 'e3'
(which we reject) in the first testcase below. It seems to me we're
behaving as specified here (according to [over.match.class.deduct]/1)
because the initializer element x_1={1, 2, 3, 4} corresponds to the
subobject e_1=E::t, hence the type T_1 of the first function parameter
of the aggregate deduction candidate is T(&&)[2][2], but T can't be
deduced from x_1 using this parameter type (as opposed to say T(&&)[4]).
PR c++/101344
PR c++/101820
gcc/cp/ChangeLog:
* cp-tree.h (CONSTRUCTOR_BRACES_ELIDED_P): Define.
* decl.c (reshape_init_r): Set it.
* pt.c (collect_ctor_idx_types): Recurse into a sub-CONSTRUCTOR
iff CONSTRUCTOR_BRACES_ELIDED_P.
gcc/testsuite/ChangeLog:
* g++.dg/cpp2a/class-deduction-aggr11.C: New test.
* g++.dg/cpp2a/class-deduction-aggr12.C: New test.
Patrick Palka [Wed, 18 Aug 2021 12:37:42 +0000 (08:37 -0400)]
c++: ignore explicit dguides during NTTP CTAD [PR101883]
Since (template) argument passing is a copy-initialization context,
we mustn't consider explicit deduction guides when deducing a CTAD
placeholder type of an NTTP.
PR c++/101883
gcc/cp/ChangeLog:
* pt.c (convert_template_argument): Pass LOOKUP_IMPLICIT to
do_auto_deduction.
Tobias Burnus [Wed, 18 Aug 2021 09:14:05 +0000 (11:14 +0200)]
Fortran/OpenMP: Add memory routines existing for C/C++
This patch adds the Fortran interface for omp_alloc/omp_free
and the omp_target_* memory routines, which were added in
OpenMP 5.0 for C/C++ but only OpenMP 5.1 added them for Fortran.
Those functions use BIND(C), i.e. on the libgomp side, the same
interface as for C/C++ is used.
Note: By using BIND(C) in omp_lib.h, files including this file
no longer compiler with -std=f95 but require at least -std=f2003.
Jakub Jelinek [Wed, 18 Aug 2021 09:10:43 +0000 (11:10 +0200)]
openmp: Add nothing directive support
As has been clarified, it is intentional that nothing directive is accepted
in substatements of selection and looping statements and after labels and
is handled as if the directive just isn't there, so that
void
foo (int x)
{
if (x)
#pragma omp metadirective when (...:nothing) when (...:parallel)
bar ();
}
behaves consistently; declarative and stand-alone directives aren't allowed
at that point, but constructs are parsed with the following statement as
the construct body and nothing or missing default on metadirective therefore
should handle the following statement as part of the if substatement instead
of having nothing as the substatement and bar done unconditionally after the
if.
Jakub Jelinek [Wed, 18 Aug 2021 08:20:50 +0000 (10:20 +0200)]
openmp: Actually ignore pragma_stmt pragmas for which c_parser_pragma returns false
Unlike the C++ FE, the C FE ignored pragmas (as if they weren't there) in
pragma_stmt contexts if c*_parser_pragma returns false only when after labels,
not inside of substatements of selection or loop statements.
After making just that change, several gomp/goacc testcases started failing,
because extra diagnostics has been emitted (in C, in C++ it was emitted
already before). Say
void
foo (int x)
{
if (x)
#pragma omp barrier
}
used to in C emit just an error that the pragma is not allowed in such
contexts, but in C++ emitted both that and a parsing error that
if (x)
}
is invalid. So, the rest of this patch is mostly about returning true
after we report that that certain pragma is not allowed in pragma_stmt
contexts, because for error-recovery it seems better to treat the
pragma in that case as something that is the substatement of such if etc.
c*_parser_pragma return value is only ever used for pragma_stmt context,
in which false means act as if the pragma isn't there (e.g. has been handled
already by preprocessor etc.), and true which means it was there.
2021-08-18 Jakub Jelinek <jakub@redhat.com>
gcc/c/
* c-parser.c (c_parser_statement_after_labels): Add restart label
near the start of the function. If c_parser_pragma returns false,
goto restart.
(c_parser_pragma): For PRAGMA_OMP_CANCELLATION_POINT return what
c_parser_omp_cancellation_point returned. For PRAGMA_OMP_DECLARE
return what c_parser_omp_declare returned. Return true instead of
false after emitting errors that the directive is not allowed in
pragma_stmt context.
(c_parser_omp_ordered): Return true instead of
false after emitting errors that the directive is not allowed in
pragma_stmt context.
(c_parser_omp_target_update): Likewise.
(c_parser_omp_target_enter_data, c_parser_omp_target_exit_data):
Change return type from tree to bool, return false if the
directive should be ignored in pragma_stmt contexts.
(c_parser_omp_target): Adjust callers of c_parser_omp_target_*_data,
return their result directly.
(c_parser_omp_cancellation_point): Change return type from void to
bool, return false if the directive should be ignored in pragma_stmt
contexts.
(c_parser_omp_declare): Likewise.
gcc/cp/
* parser.c (cp_parser_omp_ordered): Return true instead of
false after emitting errors that the directive is not allowed in
pragma_stmt context.
(cp_parser_omp_target_update): Likewise.
(cp_parser_omp_cancellation_point): Change return type from void to
bool, return false if the directive should be ignored in pragma_stmt
contexts.
(cp_parser_omp_target_enter_data, cp_parser_omp_target_exit_data):
Change return type from tree to bool, return false if the
directive should be ignored in pragma_stmt contexts.
(cp_parser_omp_target): Adjust callers of cp_parser_omp_target_*_data,
return their result directly.
(cp_parser_pragma): For PRAGMA_OMP_CANCELLATION_POINT return what
cp_parser_omp_cancellation_point returned. Return true instead of
false after emitting errors that the directive is not allowed in
pragma_stmt context.
gcc/testsuite/
* c-c++-common/gomp/pr63326.c: Don't expect extra "before" errors
in C++.
* g++.dg/gomp/attrs-7.C: Don't expect one extra error.
* g++.dg/gomp/barrier-2.C: Likewise.
* gcc.dg/gomp/declare-simd-5.c: Likewise.
* gcc.dg/gomp/barrier-2.c: Likewise.
* gcc.dg/gomp/declare-variant-2.c: Likewise.
Martin Sebor [Tue, 17 Aug 2021 20:49:05 +0000 (14:49 -0600)]
Move more warning code to gimple-ssa-warn-access etc.
Also resolves:
PR middle-end/101854 - Invalid warning -Wstringop-overflow wrong argument
gcc/ChangeLog:
PR middle-end/101854
* builtins.c (expand_builtin_alloca): Move warning code to check_alloca
in gimple-ssa-warn-access.cc.
* calls.c (alloc_max_size): Move code to check_alloca.
(get_size_range): Move to pointer-query.cc.
(maybe_warn_alloc_args_overflow): Move to gimple-ssa-warn-access.cc.
(get_attr_nonstring_decl): Move to tree.c.
(fntype_argno_type): Move to gimple-ssa-warn-access.cc.
(append_attrname): Same.
(maybe_warn_rdwr_sizes): Same.
(initialize_argument_information): Move code to
gimple-ssa-warn-access.cc.
* calls.h (maybe_warn_alloc_args_overflow): Move to
gimple-ssa-warn-access.h.
(get_attr_nonstring_decl): Move to tree.h.
(maybe_warn_nonstring_arg): Move to gimple-ssa-warn-access.h.
(enum size_range_flags): Move to pointer-query.h.
(get_size_range): Same.
* gimple-ssa-warn-access.cc (has_location): Remove unused overload
to avoid Clang -Wunused-function.
(get_size_range): Declare static.
(maybe_emit_free_warning): Rename...
(maybe_check_dealloc_call): ...to this for consistency.
(class pass_waccess): Add members.
(pass_waccess::~pass_waccess): Defined.
(alloc_max_size): Move here from calls.c.
(maybe_warn_alloc_args_overflow): Same.
(check_alloca): New function.
(check_alloc_size_call): New function.
(check_strncat): Handle another warning flag.
(pass_waccess::check_builtin): Handle alloca.
(fntype_argno_type): Move here from calls.c.
(append_attrname): Same.
(maybe_warn_rdwr_sizes): Same.
(pass_waccess::check_call): Define.
(check_nonstring_args): New function.
(pass_waccess::check): Call new member functions.
(pass_waccess::execute): Enable ranger.
* gimple-ssa-warn-access.h (get_size_range): Move here from calls.h.
(maybe_warn_nonstring_arg): Same.
* gimple-ssa-warn-restrict.c: Remove #include.
* pointer-query.cc (get_size_range): Move here from calls.c.
* pointer-query.h (enum size_range_flags): Same.
(get_size_range): Same.
* tree.c (get_attr_nonstring_decl): Move here from calls.c.
* tree.h (get_attr_nonstring_decl): Move here from calls.h.
gcc/testsuite/ChangeLog:
* gcc.dg/attr-alloc_size-5.c: Adjust optimization to -O1.
* gcc.dg/attr-alloc_size-7.c: Use #pragmas to adjust optimization.
* gcc.dg/attr-alloc_size-8.c: Adjust optimization to -O1.
PR middle-end/101854
* gcc.dg/Wstringop-overflow-72.c: New test.
The following patch implements __is_layout_compatible trait and
__builtin_is_corresponding_member helper function for the
std::is_corresponding_member template function.
As the current definition of layout compatible type has various problems,
which result e.g. in corresponding members in layout compatible types having
different member offsets, the patch anticipates some changes to the C++
standard:
1) class or enumeral types aren't layout compatible if they have different
alignment or size
2) if two members have different offsets, they can't be corresponding members
([[no_unique_address]] with empty types can change that, or alignas
on the member decls)
3) in unions, bitfields can't correspond to non-unions, or bitfields can't
correspond to bitfields with different widths, or members with
[[no_unique_address]] can't correspond to members without that attribute
__builtin_is_corresponding_member for anonymous structs (GCC extension) will
recurse into the anonymous structs. For anonymous unions it will emit
a sorry if it can't prove such member types can't appear in the
anonymous unions or anonymous aggregates in that union, because
corresponding member is defined only using common initial sequence which is
only defined for std-layout non-union class types and so I have no idea what
to do otherwise in that case.
Matt Jacobson [Thu, 29 Jul 2021 08:57:23 +0000 (09:57 +0100)]
Objective-C: Default flag_objc_sjlj_exceptions off for NeXT ABI >= 2.
Signed-off-by: Matt Jacobson <mhjacobson@me.com>
gcc/c-family/ChangeLog:
* c-opts.c (c_common_post_options): Default to
flag_objc_sjlj_exceptions = 1 only when flag_objc_abi < 2.
gcc/objc/ChangeLog:
* objc-next-runtime-abi-02.c
(objc_next_runtime_abi_02_init): Warn about and reset
flag_objc_sjlj_exceptions regardless of flag_objc_exceptions.
(next_runtime_02_initialize): Use a checking assert that
flag_objc_sjlj_exceptions is off.
Thomas Schwinge [Tue, 17 Aug 2021 15:58:30 +0000 (17:58 +0200)]
libstdc++: Avoid illegal argument to verbose in dg-test callback, continued
This is a follow-up to commit 697b94cfaef4a958132faf0cf4b35b15dfb29acc
"libstdc++: Avoid illegal argument to verbose in dg-test callback".
I'm confirming the original problem, but on one system, it's not
resolved by this change, because instead we get:
extra_tool_flags are:
ERROR: tcl error sourcing [...]/libstdc++-v3/testsuite/libstdc++-dg/conformance.exp.
ERROR: usage: send [args] string
while executing
"send_log "$message\n""
(procedure "verbose" line 48)
invoked from within
"verbose -log -- $extra_tool_flags"
(procedure "libstdc++-dg-test" line 45)
invoked from within
"${tool}-dg-test $prog [lindex ${dg-do-what} 0] "$tool_flags ${dg-extra-tool-flags}""
(procedure "saved-dg-test" line 115)
invoked from within
[...]
That's Ubuntu's dejagnu 1.5-3ubuntu1 being so old that it doesn't include
DejaGnu commit 57c22601afe43d2c2b8819df4f2ecacb034516fd "Protect from leading
dash in message". (I suppose that's what'd make this work, but have not
verified.)
libstdc++-v3/
* testsuite/lib/libstdc++.exp: Avoid illegal argument to verbose,
continued.
Darwin, libcc1: Handle hosts with mdynamic-no-pic support.
The default for building host-side binaries for mdynamic-no-pic
hosts is to enable this. However, it is not compatible with
dynamic libraries, so must be switched off for libcc1.
Iain Sandoe [Fri, 13 Aug 2021 19:20:04 +0000 (20:20 +0100)]
Darwin: Reset section names table at the end of compile.
For a single use (typical compile) this vector will be reclaimed
as GGC. For JIT this is not sufficient since it does not reset
the pointer to NULL (and thus we think the the vector is already
allocated when a context is reused).
The clears the vector and sets the pointer to NULL at the end
of object output.
Versions of the assembler using clang from XCode 12.5/12.5.1
have a bug which produces different code layout between debug and
non-debug input, leading to a compare fail for default configure
parameters.
This is a workaround fix to disable the optimisation that is
responsible for the bug.
* config.in: Regenerate.
* config/i386/darwin.h (EXTRA_ASM_OPTS): New
(ASM_SPEC): Pass options to disable branch shortening where
needed.
* configure: Regenerate.
* configure.ac: Detect versions of 'as' that support the
optimisation which has the bug.
Richard Biener [Tue, 17 Aug 2021 13:50:31 +0000 (15:50 +0200)]
Fall back to masked_gather_load/masked_scatter_store
This adds a fallback to the masked_ variants for gather_load
and scatter_store if the latter are not available.
2021-08-17 Richard Biener <rguenther@suse.de>
* optabs-query.c (supports_vec_gather_load_p): Also check
for masked optabs.
(supports_vec_scatter_store_p): Likewise.
* tree-vect-data-refs.c (vect_gather_scatter_fn_p): Fall
back to masked variants if non-masked are not supported.
* tree-vect-patterns.c (vect_recog_gather_scatter_pattern):
When we need to use masked gather/scatter but do not have
a mask set up a constant true one.
* tree-vect-stmts.c (vect_check_scalar_mask): Also allow
non-SSA_NAME masks.
Luc Michel [Tue, 17 Aug 2021 15:34:37 +0000 (16:34 +0100)]
libstdc++: Fix testsuite for skipping gdb tests on remote/non-native target
This fixes an incorrect invocation of gdb on remote targets where
DejaGNU would try to run host's gdb in remote target simulator.
gdb-test skips the testing when target is remote or non native but the
gdb version check function does not.
Suggested-by: Jonathan Wakely <jwakely@redhat.com> Signed-off-by: Luc Michel <lmichel@kalray.eu> Co-authored-by: Marc Poulhies <mpoulhies@kalrayinc.com>
libstdc++-v3/ChangeLog:
* testsuite/lib/gdb-test.exp (gdb_version_check)
(gdb_version_check_xmethods): Only check the GDB version for
local native targets.
Antony Polukhin [Tue, 17 Aug 2021 12:50:53 +0000 (13:50 +0100)]
libstdc++: Optimize std::seed_seq construction
When std::seed_seq is constructed from random access iterators we can
detect the internal vector size in O(1). Reserving memory for elements
in such cases may avoid multiple memory allocations.
Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
libstdc++-v3/ChangeLog:
* include/bits/random.tcc (seed_seq::seed_seq): Reserve capacity
if distance is O(1).
* testsuite/26_numerics/random/pr60037-neg.cc: Adjust dg-error
line number.
Co-authored-by: Jonathan Wakely <jwakely@redhat.com>
Roger Sayle [Tue, 17 Aug 2021 13:59:14 +0000 (14:59 +0100)]
Improved handling of MINUS_EXPR in bit CCP.
This patch improves the bit bounds for MINUS_EXPR during tree-ssa's
conditional constant propagation (CCP) pass (and as an added bonus
adds support for POINTER_DIFF_EXPR).
The pessimistic assumptions made by the current algorithm are
demonstrated by considering 1 - (x&1). Intuitively this should
have possible values 0 and 1, and therefore an unknown mask of 1.
Alas by treating subtraction as a negation followed by addition,
the second operand first becomes 0 or -1, with an unknown mask
of all ones, which results in the addition containing no known bits.
Improved bounds are achieved by using the same approach used for
PLUS_EXPR, determining the result with the minimum number of borrows,
the result from the maximum number of borrows, and examining the bits
they have in common. One additional benefit of this approach
is that it is applicable to POINTER_DIFF_EXPR, where previously the
negation of a pointer didn't/doesn't make sense.
A more convincing example, where a transformation missed by .032t.cpp
isn't caught a few passes later by .038t.evrp, is the expression
(7 - (x&5)) & 2, which (in the new test case) currently survives the
tree-level optimizers but with this patch is now simplified to the
constant value 2.
2021-08-17 Roger Sayle <roger@nextmovesoftware.com>
gcc/ChangeLog
* tree-ssa-ccp.c (bit_value_binop) [MINUS_EXPR]: Use same
algorithm as PLUS_EXPR to improve subtraction bit bounds.
[POINTER_DIFF_EXPR]: Treat as synonymous with MINUS_EXPR.
gcc/testsuite/ChangeLog
* gcc.dg/tree-ssa/ssa-ccp-40.c: New test case.
Roger Sayle [Tue, 17 Aug 2021 13:50:54 +0000 (14:50 +0100)]
Improved handling of MULT_EXPR in bit CCP.
This patch allows GCC to constant fold (i | (i<<16)) | ((i<<24) | (i<<8)),
where i is an unsigned char, or the equivalent (i*65537) | (i*16777472), to
i*16843009. The trick is to teach tree_nonzero_bits which bits may be
set in the result of a multiplication by a constant given which bits are
potentially set in the operands. This allows the optimizations recently
added to match.pd to catch more cases.
The required mask/value pair from a multiplication may be calculated using
a classical shift-and-add algorithm, given we already have implementations
for both addition and shift by constant. To keep this optimization "cheap",
this functionality is only used if the constant multiplier has a few bits
set (unless flag_expensive_optimizations), and we provide a special case
fast-path implementation for the common case where the (non-constant)
operand has no bits that are guaranteed to be set. I have no evidence
that this functionality causes performance issues, it's just that sparse
multipliers provide the largest benefit to CCP.
2021-08-17 Roger Sayle <roger@nextmovesoftware.com>
gcc/ChangeLog
* tree-ssa-ccp.c (bit_value_mult_const): New helper function to
calculate the mask-value pair result of a multiplication by an
unsigned constant.
(bit_value_binop) [MULT_EXPR]: Call it from here for
multiplications by (sparse) non-negative constants.
gcc/testsuite/ChangeLog
* gcc.dg/fold-ior-5.c: New test case.
Tobias Burnus [Tue, 17 Aug 2021 13:50:11 +0000 (15:50 +0200)]
Fortran: Implement OpenMP 5.1 scope construct
Fortran version to commit e45483c7c4badc4bf2d6ced22360ce1ab172967f,
which implemented OpenMP's scope construct for C and C++.
Most testcases are based on the C testcases; it also contains some
testcases which existed previously but had no Fortran equivalent.
* testsuite/libgomp.fortran/scope-1.f90: New test.
* testsuite/libgomp.fortran/task-reduction-16.f90: New test.
gcc/testsuite/ChangeLog:
* gfortran.dg/gomp/scan-1.f90:
* gfortran.dg/gomp/cancel-1.f90: New test.
* gfortran.dg/gomp/cancel-4.f90: New test.
* gfortran.dg/gomp/loop-4.f90: New test.
* gfortran.dg/gomp/nesting-1.f90: New test.
* gfortran.dg/gomp/nesting-2.f90: New test.
* gfortran.dg/gomp/nesting-3.f90: New test.
* gfortran.dg/gomp/nowait-1.f90: New test.
* gfortran.dg/gomp/reduction-task-1.f90: New test.
* gfortran.dg/gomp/reduction-task-2.f90: New test.
* gfortran.dg/gomp/reduction-task-2a.f90: New test.
* gfortran.dg/gomp/reduction-task-3.f90: New test.
* gfortran.dg/gomp/scope-1.f90: New test.
* gfortran.dg/gomp/scope-2.f90: New test.
PR 101923 points out that the unconditional swap in the std::function
move constructor makes it slower than copying an empty std::function.
The copy constructor has to check for the empty case before doing
anything, and that makes it very fast for the empty case.
Adding the same check to the move constructor avoids copying the
_Any_data POD when we don't need to. We can also inline the effects of
swap, by copying each member and then zeroing the pointer members.
This makes moving an empty object at least as fast as copying an empty
object.
Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
libstdc++-v3/ChangeLog:
PR libstdc++/101923
* include/bits/std_function.h (function(function&&)): Check for
non-empty parameter before doing any work.
Jonathan Wakely [Mon, 16 Aug 2021 19:42:54 +0000 (20:42 +0100)]
libstdc++: Only define basic_string::contains for C++23
The new contains member of the COW string is defined for non-strict
gnu++20 mode as well as for C++23 modes. I think that was left in the
committed patch unintentionally. It is inconsistent with the SSO string,
and doesn't actually compile because it uses the
basic_string_view::contains member which only defined for C++23.
This makes it only defined for C++23.
Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
libstdc++-v3/ChangeLog:
* include/bits/cow_string.h (basic_string::contains): Do not
define for -std=gnu++20.
Jonathan Wakely [Mon, 16 Aug 2021 16:41:50 +0000 (17:41 +0100)]
libstdc++: Add pretty printer for std::error_code and std::error_condition
Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
libstdc++-v3/ChangeLog:
* python/libstdcxx/v6/printers.py (StdErrorCodePrinter): Define.
(build_libstdcxx_dictionary): Register printer for
std::error_code and std::error_condition.
* testsuite/libstdc++-prettyprinters/cxx11.cc: Test it.
Christophe Lyon [Tue, 17 Aug 2021 12:59:26 +0000 (12:59 +0000)]
Do not enable DT_INIT_ARRAY/DT_FINI_ARRAY on uclinuxfdpiceabi
Commit r12-1328 enabled DT_INIT_ARRAY/DT_FINI_ARRAY for all Linux
targets, but this does not work for arm-none-uclinuxfdpiceabi: it
makes all the execution tests fail.
This patch restores the original behavior for uclinuxfdpiceabi.
We iterate over debug stmts from the last one in new_bb, and we insert
them before the first post-label stmt in each dest block, without
moving the insertion iterator, so they end up reversed. Moving the
insertion iterator fixes this.
dump_function_to_file takes the function to dump as a parameter, and
parts of it use the local fun variable where cfun would be used
elsewhere. Others use cfun, presumably in error. Fixed to use fun
uniformly. Added a few more tests for non-NULL fun before
dereferencing it.
for gcc/ChangeLog
* tree-cfg.c (dump_function_to_file): Use fun, not cfun.
Andrew MacLeod [Tue, 17 Aug 2021 08:50:56 +0000 (10:50 +0200)]
Special case -TYPE_MIN_VALUE for flag_wrapv in operator_abs::op1_range.
With flag_wrapv, -TYPE_MIN_VALUE = TYPE_MIN_VALUE which is
unrepresentable. We currently special case this in the ABS folding
routine, but are missing similar treatment in operator_abs::op1_range.
Tested on x86-64 Linux.
PR tree-optimization/101938
gcc/ChangeLog:
* range-op.cc (operator_abs::op1_range): Special case
-TYPE_MIN_VALUE for flag_wrapv.
Kewen Lin [Tue, 17 Aug 2021 08:18:02 +0000 (03:18 -0500)]
vect: Add extraction cost for slp reduc
As Richi pointed out, currently for BB reductions we don't
actually build a SLP node with IFN_REDUC_* information,
ideally we may end up with that eventually.
For now, it's costed as shuffles and reduc operations, it
misses the cost of lane extraction. This patch is to add
one time of vec_to_scalar cost for lane extraction, it's to
make the costings consistent and conservative for now.
gcc/ChangeLog:
* tree-vect-slp.c (vectorizable_bb_reduc_epilogue): Add the cost for
value extraction.
Jakub Jelinek [Tue, 17 Aug 2021 07:30:09 +0000 (09:30 +0200)]
openmp: Implement OpenMP 5.1 scope construct
This patch implements the OpenMP 5.1 scope construct, which is similar
to worksharing constructs in many regards, but isn't one of them.
The body of the construct is encountered by all threads though, it can
be nested in itself or intermixed with taskgroup and worksharing etc.
constructs can appear inside of it (but it can't be nested in
worksharing etc. constructs). The main purpose of the construct
is to allow reductions (normal and task ones) without the need to
close the parallel and reopen another one.
If it doesn't have task reductions, it can be implemented without
any new library support, with nowait it just does the privatizations
at the start if any and reductions before the end of the body, with
without nowait emits a normal GOMP_barrier{,_cancel} at the end too.
For task reductions, we need to ensure only one thread initializes
the task reduction library data structures and other threads copy from that,
so a new GOMP_scope_start routine is added to the library for that.
It acts as if the start of the scope construct is a nowait worksharing
construct (that is ok, it can't be nested in other worksharing
constructs and all threads need to encounter the start in the same
order) which does the task reduction initialization, but as the body
can have other scope constructs and/or worksharing constructs, that is
all where we use this dummy worksharing construct. With task reductions,
the construct must not have nowait and ends with a GOMP_barrier{,_cancel},
followed by task reductions followed by GOMP_workshare_task_reduction_unregister.
Jakub Jelinek [Tue, 17 Aug 2021 07:25:56 +0000 (09:25 +0200)]
c++: Add C++20 #__VA_OPT__ support
The following patch implements C++20 # __VA_OPT__ (...) support.
Testcases cover what I came up with myself and what LLVM has for #__VA_OPT__
in its testsuite and the string literals are identical between the two
compilers on the va-opt-5.c testcase.
2021-08-17 Jakub Jelinek <jakub@redhat.com>
libcpp/
* macro.c (vaopt_state): Add m_stringify member.
(vaopt_state::vaopt_state): Initialize it.
(vaopt_state::update): Overwrite it.
(vaopt_state::stringify): New method.
(stringify_arg): Replace arg argument with first, count arguments
and add va_opt argument. Use first instead of arg->first and
count instead of arg->count, for va_opt add paste_tokens handling.
(paste_tokens): Fix up len calculation. Don't spell rhs twice,
instead use %.*s to supply lhs and rhs spelling lengths. Don't call
_cpp_backup_tokens here.
(paste_all_tokens): Call it here instead.
(replace_args): Adjust stringify_arg caller. For vaopt_state::END
if stringify is true handle __VA_OPT__ stringification.
(create_iso_definition): Handle # __VA_OPT__ similarly to # macro_arg.
gcc/testsuite/
* c-c++-common/cpp/va-opt-5.c: New test.
* c-c++-common/cpp/va-opt-6.c: New test.
Richard Biener [Mon, 16 Aug 2021 13:17:08 +0000 (15:17 +0200)]
tree-optimization/101925 - fix VN with reverse storage order
This fixes value-numbering breaking reverse storage order accesses
due to a missed check. It adds a new overload for
reverse_storage_order_for_component_p and sets reversed on the
VN IL ops for component and array accesses accordingly.
It also compares the reversed reference ops flag on reference
lookup.
2021-08-16 Richard Biener <rguenther@suse.de>
PR tree-optimization/101925
* tree-ssa-sccvn.c (copy_reference_ops_from_ref): Set
reverse on COMPONENT_REF and ARRAY_REF according to
what reverse_storage_order_for_component_p does.
(vn_reference_eq): Compare reversed on reference ops.
(reverse_storage_order_for_component_p): New overload.
(vn_reference_lookup_3): Check reverse_storage_order_for_component_p
on the reference looked up.
Jeff Law [Tue, 17 Aug 2021 02:23:30 +0000 (22:23 -0400)]
Improve SImode shifts for H8
Similar to the H8/300H patch, this improves SImode shifts for the H8/S.
It's not as big a win on the H8/S since we can shift two positions at a
time. But that also means that we can handle more residuals with minimal
ode growth after a special shift-by-16 or shift-by-24 sequence.
I think there's more to do here, but this seemed like as good a checkpoint
as any. Tested without regressions.
gcc/
* config/h8300/h8300.c (shift_alg_si): Avoid loops for most SImode
shifts on the H8/S.
(h8300_option_override): Use loops on H8/S more often when optimizing
for size.
(get_shift_alg): Handle new "special" cases on H8/S. Simplify
accordingly. Handle various arithmetic right shifts with special
sequences that we couldn't handle before.
liuhongt [Tue, 17 Aug 2021 01:32:35 +0000 (09:32 +0800)]
Adjust testcase.
This testcase is used to detect reuse of perm mask in the main loop,
in epilog, vpermi2b can still be used, so add the option
--param=vect-epilogues-nomask=0.
gcc/testsuite/ChangeLog:
* gcc.target/i386/pr82460-2.c: Adjust testcase by adding
--param=vect-epilogues-nomask=0
Jonathan Wakely [Mon, 16 Aug 2021 14:35:58 +0000 (15:35 +0100)]
libstdc++: Use qualified-id for class member constant [PR101937]
The expression ctx._M_indent is not a constant expression when ctx is a
reference parameter, even though _M_indent is an enumerator. Rename it
to _S_indent to be consistent with our conventions, and refer to it as
PrintContext::_S_indent to be valid C++ code (at least until P2280 is
accepted as a DR).
Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
libstdc++-v3/ChangeLog:
PR libstdc++/101937
* src/c++11/debug.cc (PrintContext::_M_indent): Replace with a
static data member.
(print_word): Use qualified-id to access it.
Jonathan Wakely [Thu, 12 Aug 2021 18:56:14 +0000 (19:56 +0100)]
libstdc++: Install GDB pretty printers for debug library
The additional libraries installed by --enable-libstdcxx-debug are built
without optimization to aid debugging, but the Python pretty printers
are not installed alongside them. This means that you can step through
the unoptimized library code, but at the expense of pretty printing the
library types.
This remedies the situation by installing another copy of the GDB hooks
alongside the debug version of libstdc++.so.
Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
libstdc++-v3/ChangeLog:
* python/Makefile.am [GLIBCXX_BUILD_DEBUG] (install-data-local):
Install another copy of the GDB hook.
* python/Makefile.in: Regenerate.
Sebastian Huber [Mon, 9 Aug 2021 07:06:14 +0000 (09:06 +0200)]
gcov: Add TARGET_GCOV_TYPE_SIZE target hook
If -fprofile-update=atomic is used, then the target must provide atomic
operations for the counters of the type returned by get_gcov_type().
This is a 64-bit type for targets which have a 64-bit long long type.
On 32-bit targets this could be an issue since they may not provide
64-bit atomic operations. Allow targets to override the default type
size with the new TARGET_GCOV_TYPE_SIZE target hook.
If a 32-bit gcov type size is used, then there is currently a warning in
libgcov-driver.c in a dead code block due to
sizeof (counter) == sizeof (gcov_unsigned_t):
libgcc/libgcov-driver.c: In function 'dump_counter':
libgcc/libgcov-driver.c:401:46: warning: right shift count >= width of type [-Wshift-count-overflow]
401 | dump_unsigned ((gcov_unsigned_t)(counter >> 32), dump_fn, arg);
| ^~
gcc/c-family/
* c-cppbuiltin.c (c_cpp_builtins): Define
__LIBGCC_GCOV_TYPE_SIZE if flag_building_libgcc is true.
gcc/
* config/sparc/rtemself.h (SPARC_GCOV_TYPE_SIZE): Define.
* config/sparc/sparc.c (sparc_gcov_type_size): New.
(TARGET_GCOV_TYPE_SIZE): Redefine if SPARC_GCOV_TYPE_SIZE is defined.
* coverage.c (get_gcov_type): Use targetm.gcov_type_size().
* doc/tm.texi (TARGET_GCOV_TYPE_SIZE): Add hook under "Misc".
* doc/tm.texi.in: Regenerate.
* target.def (gcov_type_size): New target hook.
* targhooks.c (default_gcov_type_size): New.
* targhooks.h (default_gcov_type_size): Declare.
* tree-profile.c (gimple_gen_edge_profiler): Use precision of
gcov_type_node.
(gimple_gen_time_profiler): Likewise.
libgcc/
* libgcov.h (gcov_type): Define using __LIBGCC_GCOV_TYPE_SIZE.
(gcov_type_unsigned): Likewise.
Eric Botcazou [Mon, 16 Aug 2021 13:26:22 +0000 (15:26 +0200)]
Fix regression in debug info for Ada with DWARF 5
add_scalar_info can directly generate a reference to an existing DIE for a
scalar attribute, e.g the upper bound of a VLA, but it does so only if this
existing DIE has a location or is a constant:
Now, in DWARF 5, members of a structure that are bitfields no longer have a
DW_AT_data_member_location but a DW_AT_data_bit_offset attribute instead, so
the condition is bypassed.
gcc/
* dwarf2out.c (add_scalar_info): Deal with DW_AT_data_bit_offset.
Martin Liska [Fri, 13 Aug 2021 15:22:35 +0000 (17:22 +0200)]
Speed up jump table switch detection.
PR tree-optimization/100393
gcc/ChangeLog:
* tree-switch-conversion.c (group_cluster::dump): Use
get_comparison_count.
(jump_table_cluster::find_jump_tables): Pre-compute number of
comparisons and then decrement it. Cache also max_ratio.
(jump_table_cluster::can_be_handled): Change signature.
* tree-switch-conversion.h (get_comparison_count): New.
Eric Botcazou [Mon, 16 Aug 2021 10:14:12 +0000 (12:14 +0200)]
Disable GNAT encodings by default
Given the latest work in the compiler and debugger, we no longer need to use
most GNAT-specific encodings in the debug info generated for an Ada program,
so the attached patch disables them, except with -fgnat-encodings=all.
gcc/
* dwarf2out.c (add_data_member_location_attribute): Use GNAT
encodings only when -fgnat-encodings=all is specified.
(add_bound_info): Likewise.
(add_byte_size_attribute): Likewise.
(gen_member_die): Likewise.