Commit Graph

181553 Commits

Author SHA1 Message Date
Ed Schonberg
3268fb4dac [Ada] Spurious error on formal package with overloaded subprograms
gcc/ada/

	* sem_ch12.adb (Instantiate_Formal_Package): If previous matched
	entity is overloadable, advance in the list of actuals of the
	actual package, to prevent an erroneous match of two adjacent
	overloadable homonyms with the same entity.
2020-11-26 03:39:38 -05:00
Justin Squirek
1e00c00d8a [Ada] Compiler crash on named association in return aggregate
gcc/ada/

	* sem_ch6.adb (First_Selector): Utility routine to return the
	first selector or choice in an association.
	(Check_Return_Construct_Accessibility): Modify loop to handle
	named associations when iterating through discriminants.
2020-11-26 03:39:37 -05:00
Piotr Trojanek
8593037b17 [Ada] Fix casing of "circular instantiation" error
gcc/ada/

	* sem_ch12.adb: Fix casing from "Instantiation" to
	"instantiation".
2020-11-26 03:39:36 -05:00
Jakub Jelinek
32b0abb24b i386: Optimize psubusw compared to 0 into pminuw compared to op0 [PR96906]
The following patch renames VI12_AVX2 iterator to VI12_AVX2_AVX512BW
for consistency with some other iterators, as I need VI12_AVX2 without
AVX512BW for this change.
The real meat is a combiner split which combine
can use to optimize psubusw compared to 0 into pminuw compared to op0
(and similarly for psubusb compared to 0 into pminub compared to op0).
According to Agner Fog's tables, psubus[bw] and pminu[bw] timings
are the same, but the advantage of pminu[bw] is that the comparison
doesn't need a zero operand, so e.g. for -msse4.1 it causes changes like
-       psubusw %xmm1, %xmm0
-       pxor    %xmm1, %xmm1
+       pminuw  %xmm0, %xmm1
        pcmpeqw %xmm1, %xmm0
and similarly for avx2:
-       vpsubusb        %ymm1, %ymm0, %ymm0
-       vpxor   %xmm1, %xmm1, %xmm1
-       vpcmpeqb        %ymm1, %ymm0, %ymm0
+       vpminub %ymm1, %ymm0, %ymm1
+       vpcmpeqb        %ymm0, %ymm1, %ymm0

I haven't done the AVX512{BW,VL} define_split(s), they'll need
to match the UNSPEC_PCMP which are used for avx512 comparisons.

2020-11-26  Jakub Jelinek  <jakub@redhat.com>

	PR target/96906
	* config/i386/sse.md (VI12_AVX2): Remove V64QI/V32HI modes.
	(VI12_AVX2_AVX512BW): New mode iterator.
	(<sse2_avx2>_<plusminus_insn><mode>3<mask_name>,
	uavg<mode>3_ceil, <sse2_avx2>_uavg<mode>3<mask_name>): Use
	VI12_AVX2_AVX512BW iterator instead of VI12_AVX2.
	(*<sse2_avx2>_<plusminus_insn><mode>3<mask_name>): Likewise.
	(*<sse2_avx2>_uavg<mode>3<mask_name>): Likewise.
	(*<sse2_avx2>_<plusminus_insn><mode>3<mask_name>): Add a new
	define_split after this insn.

	* gcc.target/i386/pr96906-1.c: New test.
2020-11-26 08:46:14 +01:00
Martin Uecker
768ce4f0ce C: Do not drop qualifiers in typeof for _Atomic types. [PR65455,PR92935]
2020-11-25  Martin Uecker  <muecker@gwdg.de>

gcc/c/
	PR c/65455
	PR c/92935
	* c-parser.c (c_parser_declaration_or_fndef): Remove
	redundant code to drop qualifiers of _Atomic types for __auto_type.
	(c_parser_typeof_specifier): Do not drop qualifiers of _Atomic
	types for __typeof__.

gcc/
	PR c/65455
	PR c/92935
	* ginclude/stdatomic.h: Use comma operator to drop qualifiers.

gcc/testsuite/
	PR c/65455
	PR c/92935
	* gcc.dg/typeof-2.c: Adapt test.
2020-11-26 08:22:38 +01:00
David Edelsohn
8f81f43f60 testsuite: Adjust nextafter and skip profile-info-section on AIX.
nextafter-2.c builds nextafter-1.c with math.h, but nextafter-1.c
provides prototypes for the functions.  The prototypes can conflict
with the definitions in math.h.  This patch omits the prototypes
when compiling nextafer-2.c.

profile-info-section.c uses the profile-info-section flag that is not
valid on AIX, so skip the test on AIX.

gcc/testsuite/ChangeLog:

	* gcc.dg/nextafter-1.c: Omit prototypes if _NEXT_AFTER_2 defined.
	* gcc.dg/nextafter-2.c: Define _NEXT_AFTER_2.
	* gcc.dg/profile-info-section.c: Skip on AIX.
2020-11-25 20:36:01 -05:00
Vladimir N. Makarov
a02e304245 [PR97983] LRA: Use the right emit func for putting insn in the destination BB.
gcc/

2020-11-25  Vladimir Makarov  <vmakarov@redhat.com>

	PR bootstrap/97983
	* lra.c (lra_process_new_insns): Use emit_insn_before_noloc or
	emit_insn_after_noloc with the destination BB.
2020-11-25 19:58:01 -05:00
GCC Administrator
360258daf5 Daily bump. 2020-11-26 00:16:41 +00:00
Martin Sebor
ca23341b28 Clean up -Wformat-diag warnings (PR bootstrap/97622, PR bootstrap/94982)
gcc/c-family/ChangeLog:

	PR bootstrap/94982
	* c-attribs.c (handle_patchable_function_entry_attribute): Avoid
	-Wformat-diag.

gcc/cp/ChangeLog:

	PR bootstrap/94982
	* constraint.cc (debug_argument_list): Avoid -Wformat-diag.
	* error.c (function_category): Same.
	(print_template_differences): Same.
	* logic.cc (debug): Same.
	* name-lookup.c (lookup_using_decl): Same.
	* parser.c (maybe_add_cast_fixit): Same.
	(cp_parser_template_introduction): Same.
	* typeck.c (access_failure_info::add_fixit_hint): Same.

gcc/ChangeLog:

	PR bootstrap/97622
	PR bootstrap/94982
	* config/i386/i386-options.c (ix86_valid_target_attribute_inner_p):
	Avoid -Wformat-diag.
	* digraph.cc (struct test_edge): Same.
	* dumpfile.c (dump_loc): Same.
	(dump_context::begin_scope): Same.
	* edit-context.c (edited_file::print_diff): Same.
	(edited_file::print_diff_hunk): Same.
	* json.cc (object::print): Same.
	* lto-wrapper.c (merge_and_complain): Same.
	* reload.c (find_reloads): Same.
	* tree-diagnostic-path.cc (print_path_summary_as_text): Same.
	* ubsan.c (ubsan_type_descriptor): Same.

gcc/jit/ChangeLog:

	PR bootstrap/94982
	* jit-recording.c (recording::function::dump_to_dot): Avoid
	-Wformat-diag.
	(recording::block::dump_to_dot): Same.

gcc/testsuite/ChangeLog:

	PR bootstrap/94982
	* c-c++-common/patchable_function_entry-error-3.c: Adjust text
	of expected warning.
2020-11-25 15:00:27 -07:00
Jan Hubicka
15f82d80cf New ipa-modref testcases
gcc/testsuite/ChangeLog:
	* gcc.dg/lto/modref-3_0.c: New test.
	* gcc.dg/lto/modref-3_1.c: New test.
	* gcc.dg/lto/modref-4_0.c: New test.
	* gcc.dg/lto/modref-4_1.c: New test.
	* gcc.dg/tree-ssa/modref-5.c: New test.
2020-11-25 20:52:20 +01:00
Jan Hubicka
bb07490abb Add EAF_NODIRECTESCAPE flag
Main limitation of modref is the fact that it does not
track anything in memory. This is intentional - I wanted the initial
implementation to be cheap. However it also makes it very limited when it comes
to detecting noescape especially because it is paranoid about what memory
accesses may be used to copy (bits of) pointers.

This patch adds EAF_NODIRECTSCAPE that is weaker vairant of EAF_NOESCAPE where
we only know that the pointer itself does not escape, but memory pointed to
may.  This is a lot more reliable to auto-detect that EAF_NOESCAPE and still
enables additional optimization.  With patch we get nodirectscape flag for b
that enables in practice similar optimization as EAF_NOESCAPE for arrays of
integers that points nowhere :)

gcc/ChangeLog:
	* gimple.c (gimple_call_arg_flags): Also imply EAF_NODIRECTESCAPE.
	* tree-core.h (EAF_NODRECTESCAPE): New flag.
	* tree-ssa-structalias.c (make_indirect_escape_constraint): New
	function.
	(handle_rhs_call): Hanlde EAF_NODIRECTESCAPE.
	* ipa-modref.c (dump_eaf_flags): Print EAF_NODIRECTESCAPE.
	(deref_flags): Dereference is always EAF_NODIRECTESCAPE.
	(modref_lattice::init): Also set EAF_NODIRECTESCAPE.
	(analyze_ssa_name_flags): Pure functions do not affect
	EAF_NODIRECTESCAPE.
	(analyze_params): Likewise.
	(ipa_merge_modref_summary_after_inlining): Likewise.
	(modref_merge_call_site_flags): Likewise.
2020-11-25 20:51:26 +01:00
Jan Hubicka
5962efe918 Copy arg_flags in duplication hoooks in ipa-modref
* ipa-modref.c (modref_summaries::duplicate,
	modref_summaries_lto::duplicate): Copy arg_flags.
	(remap_arg_flags): Fix remapping of arg_flags.
2020-11-25 20:33:00 +01:00
Harald Anlauf
94172dc709 PR fortran/85796 - Floating point exception with implied do
Catch invalid step=0 in implied do loop within data statements.

gcc/fortran/ChangeLog:

	PR fortran/85796
	* resolve.c (traverse_data_list): Fix copy&paste errors; catch
	step=0 in implied do loop.

gcc/testsuite/ChangeLog:

	PR fortran/85796
	* gfortran.dg/pr85796.f90: New test.
2020-11-25 20:20:44 +01:00
Thomas Schwinge
1049e5408f Add 'g++.dg/gomp/map-{1,2}.C'
gcc/testsuite/
	* g++.dg/gomp/map-1.C: New.
	* g++.dg/gomp/map-2.C: Likewise.
	* c-c++-common/gomp/map-1.c: Adjust.
	* c-c++-common/gomp/map-2.c: Likewise.
2020-11-25 20:11:36 +01:00
Thomas Schwinge
0cab70604c Fix templatized C++ OpenACC 'cache' directive ICEs
This has been broken forever, whoops...

	gcc/cp/
	* pt.c (tsubst_omp_clauses): Handle 'OMP_CLAUSE__CACHE_'.
	(tsubst_expr): Handle 'OACC_CACHE'.
	gcc/testsuite/
	* c-c++-common/goacc/cache-1.c: Update.
	* c-c++-common/goacc/cache-2.c: Likewise.
	* g++.dg/goacc/cache-1.C: New.
	* g++.dg/goacc/cache-2.C: Likewise.
	libgomp/
	* testsuite/libgomp.oacc-c++/cache-1.C: New.
	* testsuite/libgomp.oacc-c-c++-common/cache-1.c: Update.
2020-11-25 19:57:39 +01:00
Stefan Kanthak
4919ed711c Improve abs with overflow implementations
libgcc/

	* libgcc2.c (absvSI2): Simplify/improve implementation by using
	builtin_add_overflow.
	(absvsi2, absvDI2): Likewise.
2020-11-25 11:38:46 -07:00
Jonathan Wakely
dfc537e554 libstdc++: Remove redundant clock conversions in atomic waits
For the case where a timeout is specified using the system_clock we
perform a conversion to the preferred clock (which is either
steady_clock or system_clock itself), wait using __cond_wait_until_impl,
and then check the time by that clock again to see if it was reached.
This is entirely redundant, as we can just call __cond_wait_until_impl
directly. It will wait using the specified clock, and there's no need to
check the time twice. For the no_timeout case this removes two
unnecessary calls to the clock's now() function, and for the timeout
case it removes three calls.

libstdc++-v3/ChangeLog:

	* include/bits/atomic_timed_wait.h (__cond_wait_until): Do not
	perform redundant conversions to the same clock.
2020-11-25 18:24:13 +00:00
Jonathan Wakely
7d2a98a727 libstdc++: Encapsulate __gthread_cond_t as std::__condvar
This introduces a new internal utility, std::__condvar, which is a
simplified form of std::condition_variable. It has no dependency on
<chrono> or std::unique_lock, which allows it to be used in
<bits/atomic_wait.h>.

This avoids repeating the #ifdef __GTHREAD_COND_INIT preprocessor
conditions and associated logic for initializing a __gthread_cond_t
correctly. It also encapsulates most of the __gthread_cond_xxx functions
as member functions of __condvar.

libstdc++-v3/ChangeLog:

	* include/bits/atomic_timed_wait.h (__cond_wait_until_impl):
	Do not define when _GLIBCXX_HAVE_LINUX_FUTEX is defined. Use
	__condvar and mutex instead of __gthread_cond_t and
	unique_lock<mutex>.
	(__cond_wait_until): Likewise. Fix test for return value of
	__cond_wait_until_impl.
	(__timed_waiters::_M_do_wait_until): Use __condvar instead
	of __gthread_cond_t.
	* include/bits/atomic_wait.h: Remove <bits/unique_lock.h>
	include. Only include <bits/std_mutex.h> if not using futexes.
	(__platform_wait_max_value): Remove unused variable.
	(__waiters::lock_t): Use lock_guard instead of unique_lock.
	(__waiters::_M_cv): Use __condvar instead of __gthread_cond_t.
	(__waiters::_M_do_wait(__platform_wait_t)): Likewise.
	(__waiters::_M_notify()): Likewise. Use notify_one() if not
	asked to notify all.
	* include/bits/std_mutex.h (__condvar): New type.
	* include/std/condition_variable (condition_variable::_M_cond)
	(condition_variable::wait_until): Use __condvar instead of
	__gthread_cond_t.
	* src/c++11/condition_variable.cc (condition_variable): Define
	default constructor and destructor as defaulted.
	(condition_variable::wait, condition_variable::notify_one)
	(condition_variable::notify_all): Forward to corresponding
	member function of __condvar.
2020-11-25 18:24:13 +00:00
Jonathan Wakely
f76cad692a libstdc++: Fix testsuite helper functions [PR 97936]
This fixes a race condition in the util/atomic/wait_notify_util.h header
used by several tests, which should make the tests work properly.

libstdc++-v3/ChangeLog:

	PR libstdc++/97936
	* testsuite/29_atomics/atomic/wait_notify/bool.cc: Re-eneable
	test.
	* testsuite/29_atomics/atomic/wait_notify/generic.cc: Likewise.
	* testsuite/29_atomics/atomic/wait_notify/pointers.cc: Likewise.
	* testsuite/29_atomics/atomic_flag/wait_notify/1.cc: Likewise.
	* testsuite/29_atomics/atomic_float/wait_notify.cc: Likewise.
	* testsuite/29_atomics/atomic_integral/wait_notify.cc: Likewise.
	* testsuite/util/atomic/wait_notify_util.h: Fix missed
	notifications by making the new thread wait until the parent
	thread is waiting on the condition variable.
2020-11-25 18:24:12 +00:00
Martin Sebor
aec2d68491 PR middle-end/97956 - ICE due to type mismatch in pointer_plus_expr during memchr folding
gcc/ChangeLog:

	PR middle-end/97956
	* gimple-fold.c (gimple_fold_builtin_memchr): Use sizetype for pointer
	offsets.

gcc/testsuite/ChangeLog:

	PR middle-end/97956
	* gcc.dg/memchr-3.c: New test.
2020-11-25 11:02:11 -07:00
Jonathan Wakely
9d908b7fc4 libstdc++: Fix missing subsumption in std::iterator_traits [PR 97935]
libstdc++-v3/ChangeLog:

	PR libstdc++/97935
	* include/bits/iterator_concepts.h (__detail::__iter_without_category):
	New helper concept.
	(__iterator_traits::__cat): Use __detail::__iter_without_category.
	* testsuite/24_iterators/associated_types/iterator.traits.cc: New test.
2020-11-25 17:22:47 +00:00
Jonathan Wakely
1a8d1f54de libstdc++: Fix test failure on AIX
This fixes a failure on AIX 7.2:

FAIL: 17_intro/names.cc (test for excess errors)
Excess errors:
/home/jwakely/src/gcc/libstdc++-v3/testsuite/17_intro/names.cc:99: error: expected identifier before '(' token
/usr/include/sys/var.h:187: error: expected unqualified-id before '{' token
/usr/include/sys/var.h:187: error: expected ')' before '{' token
/usr/include/sys/var.h:337: error: expected unqualified-id before ';' token
/usr/include/sys/var.h:337: error: expected ')' before ';' token

libstdc++-v3/ChangeLog:

	* testsuite/17_intro/names.cc: Do not test 'v' on AIX.
2020-11-25 17:22:47 +00:00
Matthew Malcomson
b85fb3187e libsanitizer: Add recently added commit to LOCAL_PATCHES
libsanitizer/ChangeLog:

	* LOCAL_PATCHES: Add one commit.
2020-11-25 16:39:11 +00:00
Matthew Malcomson
a47850552a libsanitizer: Add tests
Only interesting thing here is that we have to make sure the tagging mechanism
is deterministic to avoid flaky tests.

gcc/testsuite/ChangeLog:

	* c-c++-common/ubsan/sanitize-recover-7.c: Update error message format.
	* lib/asan-dg.exp (asan_link_flags): Implement as a helper
	function asan_link_flags_1 which asan_link_flags and
	hwasan_link_flags use.
	(asan_link_flags_1): Parametrised version of asan_link_flags.
	* c-c++-common/hwasan/aligned-alloc.c: New test.
	* c-c++-common/hwasan/alloca-array-accessible.c: New test.
	* c-c++-common/hwasan/alloca-base-init.c: New test.
	* c-c++-common/hwasan/alloca-gets-different-tag.c: New test.
	* c-c++-common/hwasan/alloca-outside-caught.c: New test.
	* c-c++-common/hwasan/arguments-1.c: New test.
	* c-c++-common/hwasan/arguments-2.c: New test.
	* c-c++-common/hwasan/arguments-3.c: New test.
	* c-c++-common/hwasan/arguments.c: New test.
	* c-c++-common/hwasan/asan-pr63316.c: New test.
	* c-c++-common/hwasan/asan-pr70541.c: New test.
	* c-c++-common/hwasan/asan-pr78106.c: New test.
	* c-c++-common/hwasan/asan-pr79944.c: New test.
	* c-c++-common/hwasan/asan-rlimit-mmap-test-1.c: New test.
	* c-c++-common/hwasan/bitfield-1.c: New test.
	* c-c++-common/hwasan/bitfield-2.c: New test.
	* c-c++-common/hwasan/builtin-special-handling.c: New test.
	* c-c++-common/hwasan/check-interface.c: New test.
	* c-c++-common/hwasan/halt_on_error-1.c: New test.
	* c-c++-common/hwasan/handles-poly_int-marked-vars.c: New test.
	* c-c++-common/hwasan/heap-overflow.c: New test.
	* c-c++-common/hwasan/hwasan-poison-optimisation.c: New test.
	* c-c++-common/hwasan/hwasan-thread-access-parent.c: New test.
	* c-c++-common/hwasan/hwasan-thread-basic-failure.c: New test.
	* c-c++-common/hwasan/hwasan-thread-clears-stack.c: New test.
	* c-c++-common/hwasan/hwasan-thread-success.c: New test.
	* c-c++-common/hwasan/kernel-defaults.c: New test.
	* c-c++-common/hwasan/large-aligned-0.c: New test.
	* c-c++-common/hwasan/large-aligned-1.c: New test.
	* c-c++-common/hwasan/large-aligned-untagging-0.c: New test.
	* c-c++-common/hwasan/large-aligned-untagging-1.c: New test.
	* c-c++-common/hwasan/large-aligned-untagging-2.c: New test.
	* c-c++-common/hwasan/large-aligned-untagging-3.c: New test.
	* c-c++-common/hwasan/large-aligned-untagging-4.c: New test.
	* c-c++-common/hwasan/large-aligned-untagging-5.c: New test.
	* c-c++-common/hwasan/large-aligned-untagging-6.c: New test.
	* c-c++-common/hwasan/large-aligned-untagging-7.c: New test.
	* c-c++-common/hwasan/macro-definition.c: New test.
	* c-c++-common/hwasan/no-sanitize-attribute.c: New test.
	* c-c++-common/hwasan/param-instrument-mem-intrinsics.c: New test.
	* c-c++-common/hwasan/param-instrument-reads-and-writes.c: New test.
	* c-c++-common/hwasan/param-instrument-reads.c: New test.
	* c-c++-common/hwasan/param-instrument-writes.c: New test.
	* c-c++-common/hwasan/random-frame-tag.c: New test.
	* c-c++-common/hwasan/sanity-check-pure-c.c: New test.
	* c-c++-common/hwasan/setjmp-longjmp-0.c: New test.
	* c-c++-common/hwasan/setjmp-longjmp-1.c: New test.
	* c-c++-common/hwasan/stack-tagging-basic-0.c: New test.
	* c-c++-common/hwasan/stack-tagging-basic-1.c: New test.
	* c-c++-common/hwasan/stack-tagging-disable.c: New test.
	* c-c++-common/hwasan/unprotected-allocas-0.c: New test.
	* c-c++-common/hwasan/unprotected-allocas-1.c: New test.
	* c-c++-common/hwasan/use-after-free.c: New test.
	* c-c++-common/hwasan/vararray-outside-caught.c: New test.
	* c-c++-common/hwasan/vararray-stack-restore-correct.c: New test.
	* c-c++-common/hwasan/very-large-objects.c: New test.
	* g++.dg/hwasan/hwasan.exp: New test.
	* g++.dg/hwasan/rvo-handled.C: New test.
	* gcc.dg/hwasan/hwasan.exp: New test.
	* gcc.dg/hwasan/nested-functions-0.c: New test.
	* gcc.dg/hwasan/nested-functions-1.c: New test.
	* gcc.dg/hwasan/nested-functions-2.c: New test.
	* lib/hwasan-dg.exp: New file.
2020-11-25 16:39:09 +00:00
Matthew Malcomson
93a7325148 libsanitizer: Add hwasan pass and associated gimple changes
There are four main features to this change:

1) Check pointer tags match address tags.

When sanitizing for hwasan we now put HWASAN_CHECK internal functions before
memory accesses in the `asan` pass.  This checks that a tag in the pointer
being used match the tag stored in shadow memory for the memory region being
used.

These internal functions are expanded into actual checks in the sanopt
pass that happens just before expansion into RTL.

We use the same mechanism that currently inserts ASAN_CHECK internal
functions to insert the new HWASAN_CHECK functions.

2) Instrument known builtin function calls.

Handle all builtin functions that we know use memory accesses.
This commit uses the machinery added for ASAN to identify builtin
functions that access memory.

The main differences between the approaches for HWASAN and ASAN are:
 - libhwasan intercepts much less builtin functions.
 - Alloca needs to be transformed differently (instead of adding
   redzones it needs to tag shadow memory and return a tagged pointer).
 - stack_restore needs to untag the shadow stack between the current
   position and where it's going.
 - `noreturn` functions can not be handled by simply unpoisoning the
   entire shadow stack -- there is no "always valid" tag.
   (exceptions and things such as longjmp need to be handled in a
   different way, usually in the runtime).

For hardware implemented checking (such as AArch64's memory tagging
extension) alloca and stack_restore will need to be handled by hooks in
the backend rather than transformation at the gimple level.  This will
allow architecture specific handling of such stack modifications.

3) Introduce HWASAN block-scope poisoning

Here we use exactly the same mechanism as ASAN_MARK to poison/unpoison
variables on entry/exit of a block.

In order to simply use the exact same machinery we're using the same
internal functions until the SANOPT pass.  This means that all handling
of ASAN_MARK is the same.
This has the negative that the naming may be a little confusing, but a
positive that handling of the internal function doesn't have to be
duplicated for a function that behaves exactly the same but has a
different name.

gcc/ChangeLog:

	* asan.c (asan_instrument_reads): New.
	(asan_instrument_writes): New.
	(asan_memintrin): New.
	(handle_builtin_stack_restore): Account for HWASAN.
	(handle_builtin_alloca): Account for HWASAN.
	(get_mem_refs_of_builtin_call): Special case strlen for HWASAN.
	(hwasan_instrument_reads): New.
	(hwasan_instrument_writes): New.
	(hwasan_memintrin): New.
	(report_error_func): Assert not HWASAN.
	(build_check_stmt): Make HWASAN_CHECK instead of ASAN_CHECK.
	(instrument_derefs): HWASAN does not tag globals.
	(instrument_builtin_call): Use new helper functions.
	(maybe_instrument_call): Don't instrument `noreturn` functions.
	(initialize_sanitizer_builtins): Add new type.
	(asan_expand_mark_ifn): Account for HWASAN.
	(asan_expand_check_ifn): Assert never called by HWASAN.
	(asan_expand_poison_ifn): Account for HWASAN.
	(asan_instrument): Branch based on whether using HWASAN or ASAN.
	(pass_asan::gate): Return true if sanitizing HWASAN.
	(pass_asan_O0::gate): Return true if sanitizing HWASAN.
	(hwasan_check_func): New.
	(hwasan_expand_check_ifn): New.
	(hwasan_expand_mark_ifn): New.
	(gate_hwasan): New.
	* asan.h (hwasan_expand_check_ifn): New decl.
	(hwasan_expand_mark_ifn): New decl.
	(gate_hwasan): New decl.
	(asan_intercepted_p): Always false for hwasan.
	(asan_sanitize_use_after_scope): Account for HWASAN.
	* builtin-types.def (BT_FN_PTR_CONST_PTR_UINT8): New.
	* gimple-fold.c (gimple_build): New overload for building function
	calls without arguments.
	(gimple_build_round_up): New.
	* gimple-fold.h (gimple_build): New decl.
	(gimple_build): New inline function.
	(gimple_build_round_up): New decl.
	(gimple_build_round_up): New inline function.
	* gimple-pretty-print.c (dump_gimple_call_args): Account for
	HWASAN.
	* gimplify.c (asan_poison_variable): Account for HWASAN.
	(gimplify_function_tree): Remove requirement of
	SANITIZE_ADDRESS, requiring asan or hwasan is accounted for in
	`asan_sanitize_use_after_scope`.
	* internal-fn.c (expand_HWASAN_CHECK): New.
	(expand_HWASAN_ALLOCA_UNPOISON): New.
	(expand_HWASAN_CHOOSE_TAG): New.
	(expand_HWASAN_MARK): New.
	(expand_HWASAN_SET_TAG): New.
	* internal-fn.def (HWASAN_ALLOCA_UNPOISON): New.
	(HWASAN_CHOOSE_TAG): New.
	(HWASAN_CHECK): New.
	(HWASAN_MARK): New.
	(HWASAN_SET_TAG): New.
	* sanitizer.def (BUILT_IN_HWASAN_LOAD1): New.
	(BUILT_IN_HWASAN_LOAD2): New.
	(BUILT_IN_HWASAN_LOAD4): New.
	(BUILT_IN_HWASAN_LOAD8): New.
	(BUILT_IN_HWASAN_LOAD16): New.
	(BUILT_IN_HWASAN_LOADN): New.
	(BUILT_IN_HWASAN_STORE1): New.
	(BUILT_IN_HWASAN_STORE2): New.
	(BUILT_IN_HWASAN_STORE4): New.
	(BUILT_IN_HWASAN_STORE8): New.
	(BUILT_IN_HWASAN_STORE16): New.
	(BUILT_IN_HWASAN_STOREN): New.
	(BUILT_IN_HWASAN_LOAD1_NOABORT): New.
	(BUILT_IN_HWASAN_LOAD2_NOABORT): New.
	(BUILT_IN_HWASAN_LOAD4_NOABORT): New.
	(BUILT_IN_HWASAN_LOAD8_NOABORT): New.
	(BUILT_IN_HWASAN_LOAD16_NOABORT): New.
	(BUILT_IN_HWASAN_LOADN_NOABORT): New.
	(BUILT_IN_HWASAN_STORE1_NOABORT): New.
	(BUILT_IN_HWASAN_STORE2_NOABORT): New.
	(BUILT_IN_HWASAN_STORE4_NOABORT): New.
	(BUILT_IN_HWASAN_STORE8_NOABORT): New.
	(BUILT_IN_HWASAN_STORE16_NOABORT): New.
	(BUILT_IN_HWASAN_STOREN_NOABORT): New.
	(BUILT_IN_HWASAN_TAG_MISMATCH4): New.
	(BUILT_IN_HWASAN_HANDLE_LONGJMP): New.
	(BUILT_IN_HWASAN_TAG_PTR): New.
	* sanopt.c (sanopt_optimize_walker): Act for hwasan.
	(pass_sanopt::execute): Act for hwasan.
	* toplev.c (compile_file): Use `gate_hwasan` function.
2020-11-25 16:39:07 +00:00
Matthew Malcomson
0854b584bd libsanitizer: mid-end: Introduce stack variable handling for HWASAN
Handling stack variables has three features.

1) Ensure HWASAN required alignment for stack variables

When tagging shadow memory, we need to ensure that each tag granule is
only used by one variable at a time.

This is done by ensuring that each tagged variable is aligned to the tag
granule representation size and also ensure that the end of each
object is aligned to ensure the start of any other data stored on the
stack is in a different granule.

This patch ensures the above by forcing the stack pointer to be aligned
before and after allocating any stack objects. Since we are forcing
alignment we also use `align_local_variable` to ensure this new alignment
is advertised properly through SET_DECL_ALIGN.

2) Put tags into each stack variable pointer

Make sure that every pointer to a stack variable includes a tag of some
sort on it.

The way tagging works is:
  1) For every new stack frame, a random tag is generated.
  2) A base register is formed from the stack pointer value and this
     random tag.
  3) References to stack variables are now formed with RTL describing an
     offset from this base in both tag and value.

The random tag generation is handled by a backend hook.  This hook
decides whether to introduce a random tag or use the stack background
based on the parameter hwasan-random-frame-tag.  Using the stack
background is necessary for testing and bootstrap.  It is necessary
during bootstrap to avoid breaking the `configure` test program for
determining stack direction.

Using the stack background means that every stack frame has the initial
tag of zero and variables are tagged with incrementing tags from 1,
which also makes debugging a bit easier.

Backend hooks define the size of a tag, the layout of the HWASAN shadow
memory, and handle emitting the code that inserts and extracts tags from a
pointer.

3) For each stack variable, tag and untag the shadow stack on function
   prologue and epilogue.

On entry to each function we tag the relevant shadow stack region for
each stack variable. This stack region is tagged to match the tag added to
each pointer to that variable.

This is the first patch where we use the HWASAN shadow space, so we need
to add in the libhwasan initialisation code that creates this shadow
memory region into the binary we produce.  This instrumentation is done
in `compile_file`.

When exiting a function we need to ensure the shadow stack for this
function has no remaining tags.  Without clearing the shadow stack area
for this stack frame, later function calls could get false positives
when those later function calls check untagged areas (such as parameters
passed on the stack) against a shadow stack area with left-over tag.

Hence we ensure that the entire stack frame is cleared on function exit.

config/ChangeLog:

	* bootstrap-hwasan.mk: Disable random frame tags for stack-tagging
	during bootstrap.

gcc/ChangeLog:

	* asan.c (struct hwasan_stack_var): New.
	(hwasan_sanitize_p): New.
	(hwasan_sanitize_stack_p): New.
	(hwasan_sanitize_allocas_p): New.
	(initialize_sanitizer_builtins): Define new builtins.
	(ATTR_NOTHROW_LIST): New macro.
	(hwasan_current_frame_tag): New.
	(hwasan_frame_base): New.
	(stack_vars_base_reg_p): New.
	(hwasan_maybe_init_frame_base_init): New.
	(hwasan_record_stack_var): New.
	(hwasan_get_frame_extent): New.
	(hwasan_increment_frame_tag): New.
	(hwasan_record_frame_init): New.
	(hwasan_emit_prologue): New.
	(hwasan_emit_untag_frame): New.
	(hwasan_finish_file): New.
	(hwasan_truncate_to_tag_size): New.
	* asan.h (hwasan_record_frame_init): New declaration.
	(hwasan_record_stack_var): New declaration.
	(hwasan_emit_prologue): New declaration.
	(hwasan_emit_untag_frame): New declaration.
	(hwasan_get_frame_extent): New declaration.
	(hwasan_maybe_enit_frame_base_init): New declaration.
	(hwasan_frame_base): New declaration.
	(stack_vars_base_reg_p): New declaration.
	(hwasan_current_frame_tag): New declaration.
	(hwasan_increment_frame_tag): New declaration.
	(hwasan_truncate_to_tag_size): New declaration.
	(hwasan_finish_file): New declaration.
	(hwasan_sanitize_p): New declaration.
	(hwasan_sanitize_stack_p): New declaration.
	(hwasan_sanitize_allocas_p): New declaration.
	(HWASAN_TAG_SIZE): New macro.
	(HWASAN_TAG_GRANULE_SIZE): New macro.
	(HWASAN_STACK_BACKGROUND): New macro.
	* builtin-types.def (BT_FN_VOID_PTR_UINT8_PTRMODE): New.
	* builtins.def (DEF_SANITIZER_BUILTIN): Enable for HWASAN.
	* cfgexpand.c (align_local_variable): When using hwasan ensure
	alignment to tag granule.
	(align_frame_offset): New.
	(expand_one_stack_var_at): For hwasan use tag offset.
	(expand_stack_vars): Record stack objects for hwasan.
	(expand_one_stack_var_1): Record stack objects for hwasan.
	(init_vars_expansion): Initialise hwasan state.
	(expand_used_vars): Emit hwasan prologue and generate hwasan epilogue.
	(pass_expand::execute): Emit hwasan base initialization if needed.
	* doc/tm.texi (TARGET_MEMTAG_TAG_SIZE,TARGET_MEMTAG_GRANULE_SIZE,
	TARGET_MEMTAG_INSERT_RANDOM_TAG,TARGET_MEMTAG_ADD_TAG,
	TARGET_MEMTAG_SET_TAG,TARGET_MEMTAG_EXTRACT_TAG,
	TARGET_MEMTAG_UNTAGGED_POINTER): Document new hooks.
	* doc/tm.texi.in (TARGET_MEMTAG_TAG_SIZE,TARGET_MEMTAG_GRANULE_SIZE,
	TARGET_MEMTAG_INSERT_RANDOM_TAG,TARGET_MEMTAG_ADD_TAG,
	TARGET_MEMTAG_SET_TAG,TARGET_MEMTAG_EXTRACT_TAG,
	TARGET_MEMTAG_UNTAGGED_POINTER): Document new hooks.
	* explow.c (get_dynamic_stack_base): Take new `base` argument.
	* explow.h (get_dynamic_stack_base): Take new `base` argument.
	* sanitizer.def (BUILT_IN_HWASAN_INIT): New.
	(BUILT_IN_HWASAN_TAG_MEM): New.
	* target.def (target_memtag_tag_size,target_memtag_granule_size,
	target_memtag_insert_random_tag,target_memtag_add_tag,
	target_memtag_set_tag,target_memtag_extract_tag,
	target_memtag_untagged_pointer): New hooks.
	* targhooks.c (HWASAN_SHIFT): New.
	(HWASAN_SHIFT_RTX): New.
	(default_memtag_tag_size): New default hook.
	(default_memtag_granule_size): New default hook.
	(default_memtag_insert_random_tag): New default hook.
	(default_memtag_add_tag): New default hook.
	(default_memtag_set_tag): New default hook.
	(default_memtag_extract_tag): New default hook.
	(default_memtag_untagged_pointer): New default hook.
	* targhooks.h (default_memtag_tag_size): New default hook.
	(default_memtag_granule_size): New default hook.
	(default_memtag_insert_random_tag): New default hook.
	(default_memtag_add_tag): New default hook.
	(default_memtag_set_tag): New default hook.
	(default_memtag_extract_tag): New default hook.
	(default_memtag_untagged_pointer): New default hook.
	* toplev.c (compile_file): Call hwasan_finish_file when finished.
2020-11-25 16:38:06 +00:00
Matthew Malcomson
3bd8783207 libsanitizer: options: Add hwasan flags and argument parsing
These flags can't be used at the same time as any of the other
sanitizers.
We add an equivalent flag to -static-libasan in -static-libhwasan to
ensure static linking.

The -fsanitize=kernel-hwaddress option is for compiling targeting the
kernel.  This flag has defaults to match the LLVM implementation and
sets some other behaviors to work in the kernel (e.g. accounting for
the fact that the stack pointer will have 0xff in the top byte and to not
call the userspace library initialisation routines).
The defaults are that we do not sanitize variables on the stack and
always recover from a detected bug.

Since we are introducing a few more conflicts between sanitizer flags we
refactor the checking for such conflicts to use a helper function which
makes checking for such conflicts more easy and consistent.

We introduce a backend hook `targetm.memtag.can_tag_addresses` that
indicates to the mid-end whether a target has a feature like AArch64 TBI
where the top byte of an address is ignored.
Without this feature hwasan sanitization is not done.

gcc/ChangeLog:

	* common.opt (flag_sanitize_recover): Default for kernel
	hwaddress.
	(static-libhwasan): New cli option.
	* config/aarch64/aarch64.c (aarch64_can_tag_addresses): New.
	(TARGET_MEMTAG_CAN_TAG_ADDRESSES): New.
	* config/gnu-user.h (LIBHWASAN_EARLY_SPEC): hwasan equivalent of
	asan command line flags.
	* cppbuiltin.c (define_builtin_macros_for_compilation_flags):
	Add hwasan equivalent of __SANITIZE_ADDRESS__.
	* doc/invoke.texi: Document hwasan command line flags.
	* doc/tm.texi: Document new hook.
	* doc/tm.texi.in: Document new hook.
	* flag-types.h (enum sanitize_code): New sanitizer values.
	* gcc.c (STATIC_LIBHWASAN_LIBS): New macro.
	(LIBHWASAN_SPEC): New macro.
	(LIBHWASAN_EARLY_SPEC): New macro.
	(SANITIZER_EARLY_SPEC): Update to include hwasan.
	(SANITIZER_SPEC): Update to include hwasan.
	(sanitize_spec_function): Use hwasan options.
	* opts.c (finish_options): Describe conflicts between address
	sanitizers.
	(find_sanitizer_argument): New.
	(report_conflicting_sanitizer_options): New.
	(sanitizer_opts): Introduce new sanitizer flags.
	(common_handle_option): Add defaults for kernel sanitizer.
	* params.opt (hwasan--instrument-stack): New
	(hwasan-random-frame-tag): New
	(hwasan-instrument-allocas): New
	(hwasan-instrument-reads): New
	(hwasan-instrument-writes): New
	(hwasan-instrument-mem-intrinsics): New
	* target.def (HOOK_PREFIX): Add new hook.
	(can_tag_addresses): Add new hook under memtag prefix.
	* targhooks.c (default_memtag_can_tag_addresses): New.
	* targhooks.h (default_memtag_can_tag_addresses): New decl.
	* toplev.c (process_options): Ensure hwasan only on
	architectures that advertise the possibility.
2020-11-25 16:35:39 +00:00
Matthew Malcomson
170e618ef5 libsanitizer: Add option to bootstrap using HWASAN
This is an analogous option to --bootstrap-asan to configure.  It allows
bootstrapping GCC using HWASAN.

For the same reasons as for ASAN we have to avoid using the HWASAN
sanitizer when compiling libiberty and the lto-plugin.

Also add a function to query whether -fsanitize=hwaddress has been
passed.

ChangeLog:

	* configure: Regenerate.
	* configure.ac: Add --bootstrap-hwasan option.

config/ChangeLog:

	* bootstrap-hwasan.mk: New file.

gcc/ChangeLog:

	* doc/install.texi: Document new option.

libiberty/ChangeLog:

	* configure: Regenerate.
	* configure.ac: Avoid using sanitizer.

lto-plugin/ChangeLog:

	* Makefile.am: Avoid using sanitizer.
	* Makefile.in: Regenerate.
2020-11-25 16:35:37 +00:00
Matthew Malcomson
8a769f816f libsanitizer: Only build libhwasan when targeting AArch64
Though the library has limited support for x86, we don't have any
support for generating code targeting x86 so there is no point building
for that target.

Ensure we build for AArch64 but not for AArch64 ilp32.

libsanitizer/ChangeLog:

	* Makefile.am: Condition Build hwasan directory.
	* Makefile.in: Regenerate.
	* configure: Regenerate.
	* configure.ac: Set HWASAN_SUPPORTED based on target
	architecture.
	* configure.tgt: Likewise.
2020-11-25 16:35:35 +00:00
Matthew Malcomson
edb07cb95a libsanitizer: Tie the hwasan library into our build system
This patch tries to tie libhwasan into the GCC build system in the same way
that the other sanitizer runtime libraries are handled.

libsanitizer/ChangeLog:

	* Makefile.am:  Build libhwasan.
	* Makefile.in:  Build libhwasan.
	* asan/Makefile.in:  Build libhwasan.
	* configure:  Build libhwasan.
	* configure.ac:  Build libhwasan.
	* hwasan/Makefile.am: New file.
	* hwasan/Makefile.in: New file.
	* hwasan/libtool-version: New file.
	* interception/Makefile.in: Build libhwasan.
	* libbacktrace/Makefile.in: Build libhwasan.
	* libsanitizer.spec.in: Build libhwasan.
	* lsan/Makefile.in: Build libhwasan.
	* sanitizer_common/Makefile.in: Build libhwasan.
	* tsan/Makefile.in: Build libhwasan.
	* ubsan/Makefile.in: Build libhwasan.
2020-11-25 16:35:33 +00:00
Matthew Malcomson
8eb12742e8 libsanitizer: Hwasan reporting check for dladdr failing
In `GetGlobalSizeFromDescriptor` we use `dladdr` to get info on the the
current address.  `dladdr` returns 0 if it failed.
During testing on Linux this returned 0 to indicate failure, and
populated the `info` structure with a NULL pointer which was
dereferenced later.

This patch checks for `dladdr` returning 0, and in that case returns 0
from `GetGlobalSizeFromDescriptor` to indicate failure of identifying
the address.

This occurs when `GetModuleNameAndOffsetForPC` succeeds for some address
not in a dynamically loaded library.  One example is when the found
"module" is '[stack]' having come from parsing /proc/self/maps.

Cherry-pick from 83ac18205ec69a00ac2be3b603bc3a61293fbe89.

Differential Revision: https://reviews.llvm.org/D91344
2020-11-25 16:35:31 +00:00
Martin Liska
1ee3d1ef10 libsanitizer: add hwasan.
Introduce the libhwasan library from LLVM sources.
2020-11-25 16:35:30 +00:00
Jakub Jelinek
b13dacdfb3 testsuite: Rename test to avoid typo in its name [PR95862]
2020-11-25  Jakub Jelinek  <jakub@redhat.com>

	PR rtl-optimization/95862
	* gcc.dg/builtin-artih-overflow-5.c: Renamed to ...
	* gcc.dg/builtin-arith-overflow-5.c: ... this.
2020-11-25 17:29:44 +01:00
Richard Sandiford
a4d9837ee4 aarch64: Avoid false dependencies for SVE unary operations
For calls like:

        z0 = svabs_s8_x (p0, z1)

we previously generated:

        abs     z0.b, p0/m, z1.b

However, this creates a false dependency on z0 (the merge input).
This can lead to strange results in some cases, e.g. serialising
the operation behind arbitrary earlier operations, or preventing
two iterations of a loop from being executed in parallel.

This patch therefore ties the input to the output, using a MOVPRFX
if necessary and possible.  (The SVE2 unary long instructions do
not support MOVPRFX.)

When testing the patch, I hit a bug in the big-endian SVE move
optimisation in aarch64_maybe_expand_sve_subreg_move.  I don't
have an indepenedent testcase for it, so I didn't split it out
into a separate patch.

gcc/
	* config/aarch64/aarch64.c (aarch64_maybe_expand_sve_subreg_move):
	Do not optimize LRA subregs.
	* config/aarch64/aarch64-sve.md
	(@aarch64_pred_<SVE_INT_UNARY:optab><mode>): Tie the input to the
	output.
	(@aarch64_sve_revbhw_<SVE_ALL:mode><PRED_HSD:mode>): Likewise.
	(*<ANY_EXTEND:optab><SVE_PARTIAL_I:mode><SVE_HSDI:mode>2): Likewise.
	(@aarch64_pred_sxt<SVE_FULL_HSDI:mode><SVE_PARTIAL_I:mode>): Likewise.
	(*cnot<mode>): Likewise.
	(@aarch64_pred_<SVE_COND_FP_UNARY:optab><mode>): Likewise.
	(@aarch64_sve_<optab>_nontrunc<SVE_FULL_F:mode><SVE_FULL_HSDI:mode>):
	Likewise.
	(@aarch64_sve_<optab>_trunc<VNx2DF_ONLY:mode><VNx4SI_ONLY:mode>):
	Likewise.
	(@aarch64_sve_<optab>_nonextend<SVE_FULL_HSDI:mode><SVE_FULL_F:mode>):
	Likewise.
	(@aarch64_sve_<optab>_extend<VNx4SI_ONLY:mode><VNx2DF_ONLY:mode>):
	Likewise.
	(@aarch64_sve_<optab>_trunc<SVE_FULL_SDF:mode><SVE_FULL_HSF:mode>):
	Likewise.
	(@aarch64_sve_<optab>_trunc<VNx4SF_ONLY:mode><VNx8BF_ONLY:mode>):
	Likewise.
	(@aarch64_sve_<optab>_nontrunc<SVE_FULL_HSF:mode><SVE_FULL_SDF:mode>):
	Likewise.
	* config/aarch64/aarch64-sve2.md
	(@aarch64_pred_<SVE2_COND_FP_UNARY_LONG:sve_fp_op><mode>): Likewise.
	(@aarch64_pred_<SVE2_COND_FP_UNARY_NARROWB:sve_fp_op><mode>): Likewise.
	(@aarch64_pred_<SVE2_U32_UNARY:sve_int_op><mode>): Likewise.
	(@aarch64_pred_<SVE2_COND_INT_UNARY_FP:sve_fp_op><mode>): Likewise.

gcc/testsuite/
	* gcc.target/aarch64/sve/acle/asm/abs_f16.c (abs_f16_x_untied): Expect
	a MOVPRFX instruction.
	* gcc.target/aarch64/sve/acle/asm/abs_f32.c (abs_f32_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/abs_f64.c (abs_f64_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/abs_s16.c (abs_s16_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/abs_s32.c (abs_s32_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/abs_s64.c (abs_s64_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/abs_s8.c (abs_s8_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/cls_s16.c (cls_s16_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/cls_s32.c (cls_s32_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/cls_s64.c (cls_s64_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/cls_s8.c (cls_s8_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/clz_s16.c (clz_s16_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/clz_s32.c (clz_s32_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/clz_s64.c (clz_s64_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/clz_s8.c (clz_s8_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/clz_u16.c (clz_u16_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/clz_u32.c (clz_u32_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/clz_u64.c (clz_u64_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/clz_u8.c (clz_u8_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/cnot_s16.c (cnot_s16_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/cnot_s32.c (cnot_s32_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/cnot_s64.c (cnot_s64_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/cnot_s8.c (cnot_s8_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/cnot_u16.c (cnot_u16_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/cnot_u32.c (cnot_u32_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/cnot_u64.c (cnot_u64_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/cnot_u8.c (cnot_u8_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/cnt_bf16.c (cnt_bf16_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/cnt_f16.c (cnt_f16_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/cnt_f32.c (cnt_f32_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/cnt_f64.c (cnt_f64_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/cnt_s16.c (cnt_s16_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/cnt_s32.c (cnt_s32_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/cnt_s64.c (cnt_s64_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/cnt_s8.c (cnt_s8_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/cnt_u16.c (cnt_u16_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/cnt_u32.c (cnt_u32_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/cnt_u64.c (cnt_u64_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/cnt_u8.c (cnt_u8_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/cvt_bf16.c (cvt_bf16_f32_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/cvt_f16.c (cvt_f16_f32_x_untied)
	(cvt_f16_f64_x_untied, cvt_f16_s16_x_untied, cvt_f16_s32_x_untied)
	(cvt_f16_s64_x_untied, cvt_f16_u16_x_untied, cvt_f16_u32_x_untied)
	(cvt_f16_u64_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/cvt_f32.c (cvt_f32_f16_x_untied)
	(cvt_f32_f64_x_untied, cvt_f32_s16_x_untied, cvt_f32_s32_x_untied)
	(cvt_f32_s64_x_untied, cvt_f32_u16_x_untied, cvt_f32_u32_x_untied)
	(cvt_f32_u64_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/cvt_f64.c (cvt_f64_f16_x_untied)
	(cvt_f64_f32_x_untied, cvt_f64_s16_x_untied, cvt_f64_s32_x_untied)
	(cvt_f64_s64_x_untied, cvt_f64_u16_x_untied, cvt_f64_u32_x_untied)
	(cvt_f64_u64_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/cvt_s16.c (cvt_s16_f16_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/cvt_s32.c (cvt_s32_f16_x_untied)
	(cvt_s32_f32_x_untied, cvt_s32_s64_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/cvt_s64.c (cvt_s64_f16_x_untied)
	(cvt_s64_f32_x_untied, cvt_s64_s64_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/cvt_u16.c (cvt_u16_f16_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/cvt_u32.c (cvt_u32_f16_x_untied)
	(cvt_u32_f32_x_untied, cvt_u32_u64_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/cvt_u64.c (cvt_u64_f16_x_untied)
	(cvt_u64_f32_x_untied, cvt_u64_u64_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/extb_s16.c (extb_s16_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/extb_s32.c (extb_s32_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/extb_s64.c (extb_s64_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/exth_s32.c (exth_s32_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/exth_s64.c (exth_s64_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/extw_s64.c (extw_s64_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/neg_f16.c (neg_f16_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/neg_f32.c (neg_f32_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/neg_f64.c (neg_f64_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/neg_s16.c (neg_s16_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/neg_s32.c (neg_s32_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/neg_s64.c (neg_s64_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/neg_s8.c (neg_s8_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/not_s16.c (not_s16_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/not_s32.c (not_s32_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/not_s64.c (not_s64_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/not_s8.c (not_s8_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/not_u16.c (not_u16_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/not_u32.c (not_u32_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/not_u64.c (not_u64_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/not_u8.c (not_u8_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/rbit_s16.c (rbit_s16_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/rbit_s32.c (rbit_s32_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/rbit_s64.c (rbit_s64_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/rbit_s8.c (rbit_s8_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/rbit_u16.c (rbit_u16_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/rbit_u32.c (rbit_u32_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/rbit_u64.c (rbit_u64_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/rbit_u8.c (rbit_u8_x_untied): Ditto.
	* gcc.target/aarch64/sve/acle/asm/recpx_f16.c (recpx_f16_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/recpx_f32.c (recpx_f32_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/recpx_f64.c (recpx_f64_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/revb_s16.c (revb_s16_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/revb_s32.c (revb_s32_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/revb_s64.c (revb_s64_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/revb_u16.c (revb_u16_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/revb_u32.c (revb_u32_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/revb_u64.c (revb_u64_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/revh_s32.c (revh_s32_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/revh_s64.c (revh_s64_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/revh_u32.c (revh_u32_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/revh_u64.c (revh_u64_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/revw_s64.c (revw_s64_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/revw_u64.c (revw_u64_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/rinta_f16.c (rinta_f16_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/rinta_f32.c (rinta_f32_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/rinta_f64.c (rinta_f64_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/rinti_f16.c (rinti_f16_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/rinti_f32.c (rinti_f32_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/rinti_f64.c (rinti_f64_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/rintm_f16.c (rintm_f16_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/rintm_f32.c (rintm_f32_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/rintm_f64.c (rintm_f64_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/rintn_f16.c (rintn_f16_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/rintn_f32.c (rintn_f32_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/rintn_f64.c (rintn_f64_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/rintp_f16.c (rintp_f16_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/rintp_f32.c (rintp_f32_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/rintp_f64.c (rintp_f64_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/rintx_f16.c (rintx_f16_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/rintx_f32.c (rintx_f32_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/rintx_f64.c (rintx_f64_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/rintz_f16.c (rintz_f16_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/rintz_f32.c (rintz_f32_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/rintz_f64.c (rintz_f64_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/sqrt_f16.c (sqrt_f16_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/sqrt_f32.c (sqrt_f32_x_untied):
	Ditto.
	* gcc.target/aarch64/sve/acle/asm/sqrt_f64.c (sqrt_f64_x_untied):
	Ditto.
	* gcc.target/aarch64/sve2/acle/asm/cvtx_f32.c (cvtx_f32_f64_x_untied):
	Ditto.
	* gcc.target/aarch64/sve2/acle/asm/logb_f16.c (logb_f16_x_untied):
	Ditto.
	* gcc.target/aarch64/sve2/acle/asm/logb_f32.c (logb_f32_x_untied):
	Ditto.
	* gcc.target/aarch64/sve2/acle/asm/logb_f64.c (logb_f64_x_untied):
	Ditto.
	* gcc.target/aarch64/sve2/acle/asm/qabs_s16.c (qabs_s16_x_untied):
	Ditto.
	* gcc.target/aarch64/sve2/acle/asm/qabs_s32.c (qabs_s32_x_untied):
	Ditto.
	* gcc.target/aarch64/sve2/acle/asm/qabs_s64.c (qabs_s64_x_untied):
	Ditto.
	* gcc.target/aarch64/sve2/acle/asm/qabs_s8.c (qabs_s8_x_untied):
	Ditto.
	* gcc.target/aarch64/sve2/acle/asm/qneg_s16.c (qneg_s16_x_untied):
	Ditto.
	* gcc.target/aarch64/sve2/acle/asm/qneg_s32.c (qneg_s32_x_untied):
	Ditto.
	* gcc.target/aarch64/sve2/acle/asm/qneg_s64.c (qneg_s64_x_untied):
	Ditto.
	* gcc.target/aarch64/sve2/acle/asm/qneg_s8.c (qneg_s8_x_untied):
	Ditto.
	* gcc.target/aarch64/sve2/acle/asm/recpe_u32.c (recpe_u32_x_untied):
	Ditto.
	* gcc.target/aarch64/sve2/acle/asm/rsqrte_u32.c (rsqrte_u32_x_untied):
	Ditto.
	* gcc.target/aarch64/sve2/acle/asm/cvtlt_f32.c
	(cvtlt_f32_f16_x_untied): Expect a MOV instruction.
	* gcc.target/aarch64/sve2/acle/asm/cvtlt_f64.c
	(cvtlt_f64_f32_x_untied): Likewise.
2020-11-25 16:14:20 +00:00
Ian Lance Taylor
4aff491ffc compiler: avoid silent truncation for string(1 << 32)
In the conversion of a constant integer to a string type, the value of
the constant integer was being silently truncated from unsigned long
to unsigned int, producing the wrong string value.  Add an explicit
overflow check to avoid this problem.

For golang/go#42790

Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/272611
2020-11-25 08:02:39 -08:00
Jakub Jelinek
049ce9d233 middle-end: __builtin_mul_overflow expansion improvements [PR95862]
The following patch adds some improvements for __builtin_mul_overflow
expansion.
One optimization is for the u1 * u2 -> sr case, as documented we normally
do:
     u1 * u2 -> sr
        res = (S) (u1 * u2)
        ovf = res < 0 || main_ovf (true)
where main_ovf (true) stands for jump on unsigned multiplication overflow.
If we know that the most significant bits of both operands are clear (such
as when they are zero extended from something smaller), we can
emit better coe by handling it like s1 * s2 -> sr, i.e. just jump on
overflow after signed multiplication.

Another two cases are s1 * s2 -> ur or s1 * u2 -> ur, if we know the minimum
precision needed to encode all values of both arguments summed together
is smaller or equal to destination precision (such as when the two arguments
are sign (or zero) extended from half precision types, we know the overflows
happen only iff one argument is negative and the other argument is positive
(not zero), because even if both have maximum possible values, the maximum
is still representable (e.g. for char * char -> unsigned short
0x7f * 0x7f = 0x3f01 and for char * unsigned char -> unsigned short
0x7f * 0xffU = 0x7e81) and as the result is unsigned, all negative results
do overflow, but are also representable if we consider the result signed
- all of them have the MSB set.  So, it is more efficient to just
do the normal multiplication in that case and compare the result considered
as signed value against 0, if it is smaller, overflow happened.

And the get_min_precision change is to improve the char to short handling,
we have there in the IL
  _2 = (int) arg_1(D);
promotion from C promotions from char or unsigned char arg, and the caller
adds a NOP_EXPR cast to short or unsigned short.  get_min_precision punts
on the narrowing cast though, it handled only widening casts, but we can
handle narrowing casts fine too, by recursing on the narrowing cast operands
and using it only if it has in the end smaller minimal precision, which
would duplicate the sign bits (or zero bits) to both the bits above the
narrowing conversion and also at least one below that.

2020-10-25  Jakub Jelinek  <jakub@redhat.com>

	PR rtl-optimization/95862
	* internal-fn.c (get_min_precision): For narrowing conversion, recurse
	on the operand and if the operand precision is smaller than the
	current one, return that smaller precision.
	(expand_mul_overflow): For s1 * u2 -> ur and s1 * s2 -> ur cases
	if the sum of minimum precisions of both operands is smaller or equal
	to the result precision, just perform normal multiplication and
	set overflow to the sign bit of the multiplication result.  For
	u1 * u2 -> sr if both arguments have the MSB known zero, use
	normal s1 * s2 -> sr expansion.

	* gcc.dg/builtin-artih-overflow-5.c: New test.
2020-11-25 15:42:38 +01:00
Jan Hubicka
45281f120d Free more of CFG
* cfg.c (free_block): New function.
	(clear_edges): Rename to ....
	(free_cfg): ... this one; also free BBs and vectors.
	(expunge_block): Update comment.
	* cfg.h (clear_edges): Rename to ...
	(free_cfg): ... this one.
	* cgraph.c (release_function_body): Use free_cfg.
2020-11-25 15:05:41 +01:00
Richard Biener
fddc7f0080 middle-end/97579 - lower VECTOR_BOOLEAN_TYPE_P VEC_COND_EXPRs
This makes sure to lower VECTOR_BOOLEAN_TYPE_P typed non-vector
mode VEC_COND_EXPRs so we don't try to use vcond to expand those.
That's required for x86 and gcn integer mode boolean vectors.

2020-11-25  Richard Biener  <rguenther@suse.de>

	PR middle-end/97579
	* gimple-isel.cc (gimple_expand_vec_cond_expr): Lower
	VECTOR_BOOLEAN_TYPE_P, non-vector mode VEC_COND_EXPRs.

	* gcc.dg/pr97579.c: New testcase.
2020-11-25 15:01:17 +01:00
Andrew Stubbs
52ce50d6c5 Fix atomic_capture-1.f90 testcase
The testcase had invalid assumptions about which loop iterations would run
first and last.

libgomp/ChangeLog

	* testsuite/libgomp.oacc-fortran/atomic_capture-1.f90 (main): Adjust
	expected results.
2020-11-25 13:55:45 +00:00
Ed Schonberg
a46fa6510d [Ada] Further optimization with uninitialized aggregates
gcc/ada/

	* freeze.adb (Is_Uninitialized_Aggregate): Move...
	* exp_util.adb (Is_Uninitialized_Aggregate): ... here.
	(Expand_Subtype_From_Expr): If the expression is an
	uninitialized aggregate, capture subtype for declared object and
	remove expression to suppress further superfluous expansion.
2020-11-25 08:22:47 -05:00
Ed Schonberg
55fae09dcb [Ada] Spurious error on instance with predicated actual
gcc/ada/

	* sem_eval.adb (Subtypes_Statically_Compatible): Scalar types
	with compatible static bounds are statically compatible if
	predicates are compatible, even if they are not static subtypes.
	Same for private types without discriminants.
2020-11-25 08:22:46 -05:00
Eric Botcazou
57966b4d2f [Ada] Fix couple of minor issues with local exception propagation
gcc/ada/

	* exp_ch11.adb (Expand_N_Raise_Statement): Use Is_Entity_Name
	consistently in tests on the name of the statement.
	* exp_prag.adb (Expand_Pragma_Check): In the local propagation
	case, wrap the raise statement in a block statement.
2020-11-25 08:22:45 -05:00
Piotr Trojanek
7a17384884 [Ada] Remove shadowing by a nested subprogram parameter
gcc/ada/

	* exp_ch8.adb (Expand_N_Exception_Renaming_Declaration): Move
	"Nam" constant after the body of a nested subprogram; change "T"
	from variable to constant.
2020-11-25 08:22:44 -05:00
Piotr Trojanek
ea89e1c31e [Ada] Merge duplicated processing for gnatmake -u and -U switches
gcc/ada/

	* make.adb (Scan_Make_Arg): Merge ELSIF branches for -u and -U.
2020-11-25 08:22:43 -05:00
Piotr Trojanek
47c2b77ffb [Ada] Document attribute Has_Tagged_Values in GNAT RM
gcc/ada/

	* doc/gnat_rm/implementation_defined_attributes.rst
	(Has_Tagged_Values): Document based on the existing description
	of Has_Access_Type and the comment for Has_Tagged_Component,
	which is where frontend evaluates this attribute.
	* gnat_rm.texi: Regenerate.
	* sem_attr.adb (Analyze_Attribute): Merge processing of
	Has_Access_Type and Has_Tagged_Component attributes.
	* sem_util.adb (Has_Access_Type): Fix casing in comment.
	* sem_util.ads (Has_Tagged_Component): Remove wrong (or
	outdated) comment about the use of this routine to implement the
	equality operator.
2020-11-25 08:22:42 -05:00
Piotr Trojanek
14a16e30ca [Ada] Minor whitespace fix in expansion of attribute Size
gcc/ada/

	* exp_attr.adb (Expand_Size_Attribute): Remove whitespace;
	simplify with a membership test, which are now allowed in the
	frontend code.
2020-11-25 08:22:41 -05:00
Piotr Trojanek
52b9a264dd [Ada] Use hardcoded names when converting aspects to pragmas
gcc/ada/

	* sem_ch13.adb (Analyze_One_Aspect): Fix inconsistent calls to
	Make_Aitem_Pragma.
2020-11-25 08:22:40 -05:00
Piotr Trojanek
6d97121d2f [Ada] Reuse Is_Named_Number where possible
gcc/ada/

	* sem_ch13.adb (Check_Expr_Constants): Simplify with
	Is_Named_Number.
	* sem_prag.adb (Process_Convention): Likewise.
2020-11-25 08:22:39 -05:00
Piotr Trojanek
28488f5ff5 [Ada] Simplify aspect processing with membership tests
gcc/ada/

	* sem_ch13.adb (Analyze_One_Aspect): Detect aspect identifiers
	with membership tests.
	(Check_Aspect_At_End_Of_Declarations): Likewise.
	(Freeze_Entity_Checks): Likewise; a local constant is no longer
	needed.
	(Is_Operational_Item): Similar simplification for attribute
	identifiers.
	(Is_Type_Related_Rep_Item): Likewise.
	(Resolve_Iterable_Operation): Detect names with a membership
	test.
	(Validate_Independence): Replace repeated Ekind with a
	membership test.
2020-11-25 08:22:38 -05:00
Piotr Trojanek
a79039c0eb [Ada] Fix copy-paste mistake in diagnostics for aspect Effective_Writes
gcc/ada/

	* sem_ch13.adb (Analyze_One_Aspect): Replace duplicate of
	Effective_Reads.
2020-11-25 08:22:37 -05:00