aboutsummaryrefslogtreecommitdiff
path: root/gcc
AgeCommit message (Collapse)AuthorFilesLines
2020-11-26[Ada] Reuse Is_Concurrent_Type when detecting protected or task typesPiotr Trojanek4-9/+7
gcc/ada/ * exp_ch13.adb, exp_ch9.adb, sem_ch8.adb, sem_util.adb: Replace a combination of Is_Protected_Type and Is_Task_Type by Is_Concurrent_Type.
2020-11-26[Ada] Constraint_Error in Task_Wrapper and -u0Arnaud Charlet1-6/+5
gcc/ada/ * libgnarl/s-tassta.adb (Task_Wrapper): Fix computation of Pattern_Size.
2020-11-26[Ada] Pass base type to Set_Has_Own_InvariantsBob Duff3-9/+2
gcc/ada/ * freeze.adb (Freeze_Array_Type): Remove propagation of Has_Own_Invariants to the first subtype. This is a no-op, because the current (incorrect) version of Has_Own_Invariants calls Base_Type. * sem_prag.adb, sem_util.adb: Pass the base type to Set_Has_Own_Invariants.
2020-11-26[Ada] Adjust documentation of Aft_Value and Scale_ValueEric Botcazou1-5/+8
gcc/ada/ * einfo.ads (Aft_Value): Adjust documentation. (Scale_Value): Likewise.
2020-11-26[Ada] Incorrect runtime accessibility check on access discriminantJustin Squirek1-1/+1
gcc/ada/ * exp_ch4.adb (Expand_N_Type_Conversion): Use the unexpanded operand when generating accessibility checks.
2020-11-26[Ada] Remove extra whitespace in bounded container Read proceduresPiotr Trojanek3-3/+3
gcc/ada/ * libgnat/a-cbhase.adb (Read): Remove extra whitespace. * libgnat/a-cbmutr.ads (Read): Likewise. * libgnat/a-cborse.adb (Read): Likewise.
2020-11-26[Ada] Reuse Is_Access_Object_Type where possiblePiotr Trojanek3-6/+3
gcc/ada/ * exp_ch7.adb, exp_util.adb, freeze.adb: Rewrite with Is_Access_Object_Type.
2020-11-26[Ada] Simplify checks for library unit pragmasPiotr Trojanek1-34/+3
gcc/ada/ * sem_prag.adb (Check_Valid_Library_Unit_Pragma): Raise exception. (Analyze_Pragma): Remove detection of rewritten pragmas.
2020-11-26[Ada] Add contracts to Ada.Strings.MapsJoffrey Huguet1-21/+158
gcc/ada/ * libgnat/a-strmap.ads: Add preconditions and postconditions to all subprograms.
2020-11-26[Ada] New warning on questionable missing parenthesesYannick Moy1-0/+64
gcc/ada/ * sem_res.adb (Resolve_Equality_Op): Warn when -gnatwq is used (the default) and the problematic case is encountered.
2020-11-26[Ada] Issue advice for error regarding Old/Loop_Entry on unevaluated expr.Yannick Moy1-4/+12
gcc/ada/ * sem_attr.adb (Analyze_Attribute): Issue a continuation message to give proper recommendation here.
2020-11-26[Ada] Correct a typo, plus other minor reformattingGary Dismukes1-4/+4
gcc/ada/ * exp_util.adb (Expand_Subtype_From_Expr): A typo correction, plus other minor reformatting.
2020-11-26[Ada] Spurious error on formal package with overloaded subprogramsEd Schonberg1-0/+10
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[Ada] Compiler crash on named association in return aggregateJustin Squirek1-13/+201
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[Ada] Fix casing of "circular instantiation" errorPiotr Trojanek1-4/+4
gcc/ada/ * sem_ch12.adb: Fix casing from "Instantiation" to "instantiation".
2020-11-26i386: Optimize psubusw compared to 0 into pminuw compared to op0 [PR96906]Jakub Jelinek2-20/+103
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-26C: Do not drop qualifiers in typeof for _Atomic types. [PR65455,PR92935]Martin Uecker3-24/+19
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-25testsuite: Adjust nextafter and skip profile-info-section on AIX.David Edelsohn3-0/+7
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[PR97983] LRA: Use the right emit func for putting insn in the destination BB.Vladimir N. Makarov1-7/+7
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-26Daily bump.GCC Administrator8-1/+931
2020-11-25Clean up -Wformat-diag warnings (PR bootstrap/97622, PR bootstrap/94982)Martin Sebor18-37/+109
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-25New ipa-modref testcasesJan Hubicka5-0/+87
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-25Add EAF_NODIRECTESCAPE flagJan Hubicka4-11/+40
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-25Copy arg_flags in duplication hoooks in ipa-modrefJan Hubicka1-1/+5
* ipa-modref.c (modref_summaries::duplicate, modref_summaries_lto::duplicate): Copy arg_flags. (remap_arg_flags): Fix remapping of arg_flags.
2020-11-25PR fortran/85796 - Floating point exception with implied doHarald Anlauf2-2/+17
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-25Add 'g++.dg/gomp/map-{1,2}.C'Thomas Schwinge4-4/+175
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-25Fix templatized C++ OpenACC 'cache' directive ICEsThomas Schwinge5-12/+97
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-25PR middle-end/97956 - ICE due to type mismatch in pointer_plus_expr during ↵Martin Sebor2-1/+26
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-25libsanitizer: Add testsMatthew Malcomson65-13/+1924
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-25libsanitizer: Add hwasan pass and associated gimple changesMatthew Malcomson12-36/+845
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-25libsanitizer: mid-end: Introduce stack variable handling for HWASANMatthew Malcomson14-25/+879
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-25libsanitizer: options: Add hwasan flags and argument parsingMatthew Malcomson15-20/+283
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-25libsanitizer: Add option to bootstrap using HWASANMatthew Malcomson1-0/+5
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-25testsuite: Rename test to avoid typo in its name [PR95862]Jakub Jelinek1-0/+0
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-25aarch64: Avoid false dependencies for SVE unary operationsRichard Sandiford136-74/+319
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-25compiler: avoid silent truncation for string(1 << 32)Ian Lance Taylor2-2/+10
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-25middle-end: __builtin_mul_overflow expansion improvements [PR95862]Jakub Jelinek2-1/+169
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-25Free more of CFGJan Hubicka3-17/+32
* 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-25middle-end/97579 - lower VECTOR_BOOLEAN_TYPE_P VEC_COND_EXPRsRichard Biener2-2/+51
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[Ada] Further optimization with uninitialized aggregatesEd Schonberg2-46/+62
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[Ada] Spurious error on instance with predicated actualEd Schonberg1-4/+14
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[Ada] Fix couple of minor issues with local exception propagationEric Botcazou2-6/+17
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[Ada] Remove shadowing by a nested subprogram parameterPiotr Trojanek1-6/+6
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[Ada] Merge duplicated processing for gnatmake -u and -U switchesPiotr Trojanek1-12/+2
gcc/ada/ * make.adb (Scan_Make_Arg): Merge ELSIF branches for -u and -U.
2020-11-25[Ada] Document attribute Has_Tagged_Values in GNAT RMPiotr Trojanek5-487/+516
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[Ada] Minor whitespace fix in expansion of attribute SizePiotr Trojanek1-7/+7
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[Ada] Use hardcoded names when converting aspects to pragmasPiotr Trojanek1-13/+13
gcc/ada/ * sem_ch13.adb (Analyze_One_Aspect): Fix inconsistent calls to Make_Aitem_Pragma.
2020-11-25[Ada] Reuse Is_Named_Number where possiblePiotr Trojanek2-4/+2
gcc/ada/ * sem_ch13.adb (Check_Expr_Constants): Simplify with Is_Named_Number. * sem_prag.adb (Process_Convention): Likewise.
2020-11-25[Ada] Simplify aspect processing with membership testsPiotr Trojanek1-107/+83
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[Ada] Fix copy-paste mistake in diagnostics for aspect Effective_WritesPiotr Trojanek1-2/+2
gcc/ada/ * sem_ch13.adb (Analyze_One_Aspect): Replace duplicate of Effective_Reads.