From b2e305bdc4601a1f98f2cf49114235727b419711 Mon Sep 17 00:00:00 2001 From: Maxim Kuvyrkov Date: Thu, 13 Dec 2018 11:59:47 +0000 Subject: Merge branches/gcc-7-branch rev 267072. Change-Id: I83ceab6336401e9ffe788b948ba29c3fdadea973 --- ChangeLog | 4 + config/ChangeLog | 4 + contrib/ChangeLog | 4 + contrib/header-tools/ChangeLog | 4 + contrib/reghunt/ChangeLog | 4 + contrib/regression/ChangeLog | 4 + fixincludes/ChangeLog | 4 + gcc/BASE-VER | 2 +- gcc/ChangeLog | 215 ++++++++++++++++++++- gcc/DATESTAMP | 2 +- gcc/ada/ChangeLog | 14 ++ gcc/ada/gcc-interface/misc.c | 12 +- gcc/brig/ChangeLog | 4 + gcc/c-family/ChangeLog | 4 + gcc/c/ChangeLog | 4 + gcc/cfgexpand.c | 14 +- gcc/combine.c | 1 + gcc/config/arm/arm.c | 23 ++- gcc/config/darwin.c | 17 -- gcc/config/darwin.h | 4 - gcc/config/i386/cygming.h | 3 - gcc/config/i386/darwin.h | 3 +- gcc/config/i386/emmintrin.h | 7 +- gcc/config/i386/i386.h | 3 +- gcc/config/i386/sse.md | 11 +- gcc/config/rs6000/rs6000.c | 12 ++ gcc/config/s390/s390.md | 16 +- gcc/cp/ChangeLog | 15 ++ gcc/cp/constexpr.c | 15 +- gcc/doc/invoke.texi | 10 +- gcc/dse.c | 7 +- gcc/dwarf2out.c | 13 +- gcc/final.c | 3 + gcc/fortran/ChangeLog | 57 ++++++ gcc/fortran/frontend-passes.c | 4 + gcc/fortran/gfortran.h | 2 +- gcc/fortran/io.c | 83 ++++---- gcc/fortran/match.c | 5 + gcc/fortran/primary.c | 1 + gcc/fortran/resolve.c | 8 +- gcc/gimple-match-head.c | 43 +++++ gcc/go/ChangeLog | 4 + gcc/jit/ChangeLog | 4 + gcc/lto/ChangeLog | 4 + gcc/objc/ChangeLog | 4 + gcc/objcp/ChangeLog | 4 + gcc/po/ChangeLog | 4 + gcc/rtl.h | 19 ++ gcc/rtlanal.c | 30 +-- gcc/testsuite/ChangeLog | 203 +++++++++++++++++-- gcc/testsuite/g++.dg/cpp1y/constexpr-array6.C | 26 +++ gcc/testsuite/g++.dg/debug/dwarf2/pr87462.C | 20 ++ gcc/testsuite/g++.dg/debug/dwarf2/pr88006.C | 39 ++++ gcc/testsuite/g++.dg/other/thunk1.C | 26 +++ gcc/testsuite/g++.dg/other/thunk2a.C | 15 ++ gcc/testsuite/g++.dg/other/thunk2b.C | 16 ++ gcc/testsuite/g++.dg/other/vthunk1.C | 26 --- gcc/testsuite/g++.dg/pr58372.C | 10 + gcc/testsuite/g++.dg/torture/pr77745-2.C | 4 + gcc/testsuite/g++.dg/torture/pr77745.C | 6 +- gcc/testsuite/gcc.c-torture/execute/20181120-1.c | 28 +++ gcc/testsuite/gcc.dg/pr86076.c | 26 +++ gcc/testsuite/gcc.dg/torture/pr79351.c | 26 +++ gcc/testsuite/gcc.dg/torture/pr87645.c | 21 ++ gcc/testsuite/gcc.dg/torture/pr87665.c | 27 +++ gcc/testsuite/gcc.dg/torture/restrict-6.c | 24 +++ gcc/testsuite/gcc.target/i386/pr87928.c | 23 +++ gcc/testsuite/gcc.target/powerpc/pr87496-1.c | 11 ++ gcc/testsuite/gcc.target/powerpc/pr87496-2.c | 10 + gcc/testsuite/gcc.target/powerpc/pr87496-3.c | 9 + gcc/testsuite/gcc.target/s390/flogr-1.c | 47 +++++ gcc/testsuite/gfortran.dg/20181025-1.f | 28 +++ gcc/testsuite/gfortran.dg/associate_46.f90 | 37 ++++ gcc/testsuite/gfortran.dg/pr70870_1.f90 | 1 + gcc/testsuite/gfortran.dg/pr88155.f90 | 9 + gcc/testsuite/gfortran.dg/pr88205.f90 | 14 ++ gcc/testsuite/gfortran.dg/pr88206.f90 | 8 + gcc/testsuite/gfortran.dg/pr88228.f90 | 8 + gcc/testsuite/gfortran.dg/pr88249.f90 | 7 + gcc/testsuite/gfortran.dg/pr88269.f90 | 6 + gcc/testsuite/gfortran.dg/where_7.f90 | 25 +++ gcc/testsuite/jit.dg/test-long-names.c | 2 +- gcc/tree-cfg.c | 11 +- gcc/tree-ssa-loop-ch.c | 3 +- gcc/tree-ssa-sccvn.c | 1 + gcc/tree-ssa-structalias.c | 15 +- gcc/tree-vect-data-refs.c | 58 ++++-- gcc/tree-vect-generic.c | 6 +- gcc/tree-vectorizer.h | 60 ++---- gcc/vmsdbgout.c | 10 +- gnattools/ChangeLog | 4 + gotools/ChangeLog | 4 + include/ChangeLog | 4 + intl/ChangeLog | 4 + libada/ChangeLog | 4 + libatomic/ChangeLog | 4 + libbacktrace/ChangeLog | 4 + libcc1/ChangeLog | 4 + libcilkrts/ChangeLog | 4 + libcpp/ChangeLog | 4 + libcpp/po/ChangeLog | 4 + libdecnumber/ChangeLog | 4 + libffi/ChangeLog | 4 + libgcc/ChangeLog | 4 + libgcc/config/libbid/ChangeLog | 4 + libgfortran/ChangeLog | 11 ++ libgfortran/runtime/backtrace.c | 19 +- libgo/mksysinfo.sh | 13 ++ libgomp/ChangeLog | 4 + libhsail-rt/ChangeLog | 4 + libiberty/ChangeLog | 4 + libitm/ChangeLog | 4 + libmpx/ChangeLog | 4 + libobjc/ChangeLog | 4 + liboffloadmic/ChangeLog | 4 + libquadmath/ChangeLog | 4 + libsanitizer/ChangeLog | 4 + libssp/ChangeLog | 4 + libstdc++-v3/ChangeLog | 13 ++ libstdc++-v3/include/bits/hashtable.h | 3 + .../unordered_set/allocator/move_assign.cc | 128 ++++++++---- libvtv/ChangeLog | 4 + lto-plugin/ChangeLog | 4 + maintainer-scripts/ChangeLog | 4 + zlib/ChangeLog | 4 + 125 files changed, 1713 insertions(+), 280 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp1y/constexpr-array6.C create mode 100644 gcc/testsuite/g++.dg/debug/dwarf2/pr87462.C create mode 100644 gcc/testsuite/g++.dg/debug/dwarf2/pr88006.C create mode 100644 gcc/testsuite/g++.dg/other/thunk1.C create mode 100644 gcc/testsuite/g++.dg/other/thunk2a.C create mode 100644 gcc/testsuite/g++.dg/other/thunk2b.C delete mode 100644 gcc/testsuite/g++.dg/other/vthunk1.C create mode 100644 gcc/testsuite/g++.dg/pr58372.C create mode 100644 gcc/testsuite/g++.dg/torture/pr77745-2.C create mode 100644 gcc/testsuite/gcc.c-torture/execute/20181120-1.c create mode 100644 gcc/testsuite/gcc.dg/pr86076.c create mode 100644 gcc/testsuite/gcc.dg/torture/pr79351.c create mode 100644 gcc/testsuite/gcc.dg/torture/pr87645.c create mode 100644 gcc/testsuite/gcc.dg/torture/pr87665.c create mode 100644 gcc/testsuite/gcc.dg/torture/restrict-6.c create mode 100644 gcc/testsuite/gcc.target/i386/pr87928.c create mode 100644 gcc/testsuite/gcc.target/powerpc/pr87496-1.c create mode 100644 gcc/testsuite/gcc.target/powerpc/pr87496-2.c create mode 100644 gcc/testsuite/gcc.target/powerpc/pr87496-3.c create mode 100644 gcc/testsuite/gcc.target/s390/flogr-1.c create mode 100644 gcc/testsuite/gfortran.dg/20181025-1.f create mode 100644 gcc/testsuite/gfortran.dg/associate_46.f90 create mode 100644 gcc/testsuite/gfortran.dg/pr88155.f90 create mode 100644 gcc/testsuite/gfortran.dg/pr88205.f90 create mode 100644 gcc/testsuite/gfortran.dg/pr88206.f90 create mode 100644 gcc/testsuite/gfortran.dg/pr88228.f90 create mode 100644 gcc/testsuite/gfortran.dg/pr88249.f90 create mode 100644 gcc/testsuite/gfortran.dg/pr88269.f90 create mode 100644 gcc/testsuite/gfortran.dg/where_7.f90 diff --git a/ChangeLog b/ChangeLog index f5199ea8db6..56a7217496a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2018-12-06 Release Manager + + * GCC 7.4.0 released. + 2018-06-22 Jakub Jelinek Backported from mainline diff --git a/config/ChangeLog b/config/ChangeLog index 57c8ff87fcf..478b7a72c73 100644 --- a/config/ChangeLog +++ b/config/ChangeLog @@ -1,3 +1,7 @@ +2018-12-06 Release Manager + + * GCC 7.4.0 released. + 2018-06-22 Jakub Jelinek Backported from mainline diff --git a/contrib/ChangeLog b/contrib/ChangeLog index fb94d319326..5ec3d1aa4da 100644 --- a/contrib/ChangeLog +++ b/contrib/ChangeLog @@ -1,3 +1,7 @@ +2018-12-06 Release Manager + + * GCC 7.4.0 released. + 2018-01-25 Release Manager * GCC 7.3.0 released. diff --git a/contrib/header-tools/ChangeLog b/contrib/header-tools/ChangeLog index dfacf7a361f..3a8a7ec0265 100644 --- a/contrib/header-tools/ChangeLog +++ b/contrib/header-tools/ChangeLog @@ -1,3 +1,7 @@ +2018-12-06 Release Manager + + * GCC 7.4.0 released. + 2018-01-25 Release Manager * GCC 7.3.0 released. diff --git a/contrib/reghunt/ChangeLog b/contrib/reghunt/ChangeLog index b398ce8a078..3d127b9aef5 100644 --- a/contrib/reghunt/ChangeLog +++ b/contrib/reghunt/ChangeLog @@ -1,3 +1,7 @@ +2018-12-06 Release Manager + + * GCC 7.4.0 released. + 2018-01-25 Release Manager * GCC 7.3.0 released. diff --git a/contrib/regression/ChangeLog b/contrib/regression/ChangeLog index 87a1afd0573..3d77c4252ae 100644 --- a/contrib/regression/ChangeLog +++ b/contrib/regression/ChangeLog @@ -1,3 +1,7 @@ +2018-12-06 Release Manager + + * GCC 7.4.0 released. + 2018-01-25 Release Manager * GCC 7.3.0 released. diff --git a/fixincludes/ChangeLog b/fixincludes/ChangeLog index 96107ab5015..1157c939e6c 100644 --- a/fixincludes/ChangeLog +++ b/fixincludes/ChangeLog @@ -1,3 +1,7 @@ +2018-12-06 Release Manager + + * GCC 7.4.0 released. + 2018-06-22 Jakub Jelinek Backported from mainline diff --git a/gcc/BASE-VER b/gcc/BASE-VER index 643916c03f1..815da58b7a9 100644 --- a/gcc/BASE-VER +++ b/gcc/BASE-VER @@ -1 +1 @@ -7.3.1 +7.4.1 diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d6877a588aa..deffd65cc60 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,210 @@ +2018-12-12 Peter Bergner + + Backport from mainline + 2018-12-07 Peter Bergner + + PR target/87496 + * config/rs6000/rs6000.c (rs6000_option_override_internal): Disallow + -mabi=ieeelongdouble and -mabi=ibmlongdouble without -mlong-double-128. + Do not error for -mabi=ibmlongdouble and no ISA 2.06 support. + * doc/invoke.texi: Document -mabi=ibmlongdouble and -mabi=ieeelongdouble + require -mlong-double-128. + +2018-12-06 Richard Biener + + * BASE-VER: Increment to 7.4.1. + +2018-12-06 Release Manager + + * GCC 7.4.0 released. + +2018-11-28 Richard Biener + + PR tree-optimization/79351 + * tree-ssa-sccvn.c (vn_reference_lookup_3): For assignments from + empty CONSTRUCTORs ensure the store is at a constant position. + +2018-11-26 Iain Sandoe + + Backport from mainline + 2018-08-22 Iain Sandoe + + PR bootstrap/81033 + PR target/81733 + PR target/52795 + * gcc/dwarf2out.c (FUNC_SECOND_SECT_LABEL): New. + (dwarf2out_switch_text_section): Generate a local label for the second + function sub-section and apply it as the second FDE start label. + * gcc/final.c (final_scan_insn_1): Emit second FDE label after the second + sub-section start. + +2018-11-26 Iain Sandoe + + 2018-08-15 Iain Sandoe + + * config/darwin.c + (darwin_function_switched_text_sections): Delete. + * gcc/config/darwin.h + (TARGET_ASM_FUNCTION_SWITCHED_TEXT_SECTIONS): Likewise. + +2018-11-26 Andreas Krebbel + + Backport from mainline + 2018-11-20 Andreas Krebbel + + * config/s390/s390.md ("clztidi2"): Swap the RTX's written to the + DImode parts of the target operand. + +2018-11-26 Andreas Krebbel + + Backport from mainline + 2018-11-26 Andreas Krebbel + + * doc/invoke.texi: Document z14/arch12 -march option. + +2018-10-19 Richard Biener + + PR middle-end/87645 + Backport from mainline + 2018-07-12 Richard Biener + + * gimple-match-head.c (gimple_resimplify1): Apply recursion + limit. + (gimple_resimplify2): Likewise. + (gimple_resimplify3): Likewise. + (gimple_resimplify4): Likewise. + +2018-11-26 Richard Biener + + Backport from mainline + 2018-10-15 Richard Biener + + PR middle-end/87610 + * tree-ssa-structalias.c (struct vls_data): Add escaped_p member. + (visit_loadstore): When a used restrict tag escaped verify that + the points-to solution of "other" pointers do not include + escaped. + (compute_dependence_clique): If a used restrict tag escaped + communicated that down to visit_loadstore. + + 2018-10-25 Richard Biener + + PR tree-optimization/87665 + PR tree-optimization/87745 + * tree-vectorizer.h (get_earlier_stmt): Remove. + (get_later_stmt): Pick up UID from the original non-pattern stmt. + + 2018-10-24 Richard Biener + + PR tree-optimization/87665 + * tree-vect-data-refs.c (vect_preserves_scalar_order_p): Adjust + to reflect reality. + +2018-11-26 Richard Biener + + Backport from mainline + 2018-06-14 Richard Biener + + PR middle-end/86139 + * tree-vect-generic.c (build_word_mode_vector_type): Remove + duplicate and harmful type_hash_canon. + + 2018-06-15 Richard Biener + + PR middle-end/86076 + * tree-cfg.c (move_stmt_op): unshare invariant addresses + before adjusting their block. + +2018-11-22 Uros Bizjak + + Backport from mainline + 2018-11-16 Uros Bizjak + + PR target/88051 + * config/i386/sse.md (UNSPEC_MOVDI_TO_SSE): New UNSPEC. + (movdi_to_sse): Rewrite using UNSPEC_MOVDI_TO_SSE unspec. + +2018-11-22 Tom de Vries + + backport from trunk: + 2017-11-19 Tom de Vries + + PR target/82961 + * vmsdbgout.c (vmsdbgout_early_finish): New function. + (vmsdbg_debug_hooks): Set early_finish field to vmsdbgout_early_finish. + +2018-11-21 Mihail Ionescu + + PR target/87867 + Backport from mainiline + 2018-09-26 Eric Botcazou + + * config/arm/arm.c (arm_reorg): Skip Thumb reorg pass for thunks. + (arm32_output_mi_thunk): Deal with long calls. + +2018-11-20 Richard Biener + + Backport from mainline + 2018-03-12 Richard Biener + + PR tree-optimization/84777 + * tree-ssa-loop-ch.c (should_duplicate_loop_header_p): For + force-vectorize loops ignore whether we are optimizing for size. + + 2018-01-26 Richard Biener + + PR rtl-optimization/84003 + * dse.c (record_store): Only record redundant stores when + the earlier store aliases at least all accesses the later one does. + +2018-11-20 Xuepeng Guo + + Backport from mainline + 2018-11-05 Xuepeng Guo + + PR target/87853 + * config/i386/emmintrin.h (__v16qs): New to cope with option + -funsigned-char. + (_mm_cmpeq_epi8): Replace __v16qi with __v16qs. + (_mm_cmplt_epi8): Likewise. + (_mm_cmpgt_epi8): Likewise. + +2018-11-20 Eric Botcazou + + PR rtl-optimization/85925 + * rtl.h (word_register_operation_p): New predicate. + * combine.c (record_dead_and_set_regs_1): Only apply specific handling + for WORD_REGISTER_OPERATIONS targets to word_register_operation_p RTX. + * rtlanal.c (nonzero_bits1): Likewise. Adjust couple of comments. + (num_sign_bit_copies1): Likewise. + +2018-11-18 Uros Bizjak + + Backport from mainline + 2018-11-11 Uros Bizjak + + PR target/87928 + * config/i386/i386.h (STACK_BOUNDARY): Use TARGET_64BIT_MS_ABI + instead of (TARGET_64BIT && ix86_abi == MS_ABI). + * config/i386/darwin.h (STACK_BOUNDARY): Ditto. + * config/i386/cygming.h (STACK_BOUNDARY): Remove. + +2018-11-15 Nathan Sidwell + + PR debug/88006 + PR debug/87462 + * dwarf2out.c (dwarf2out_finish): Apply resolve_addr to comdat + type list. + +2018-11-11 Uros Bizjak + + Backport from mainline + 2018-11-04 Uros Bizjak + + PR middle-end/58372 + * cfgexpand.c (pass_expand::execute): Move the call to + finish_eh_generation in front of the call to expand_stack_alignment. + 2018-11-07 Max Filippov Backport from mainline @@ -683,10 +890,10 @@ 2018-06-18 Martin Sebor - PR middle-end/82063 - * calls.c (alloc_max_size): Correct a logic error/typo. - Treat excessive arguments as infinite. Warn for invalid arguments. - * doc/invoke.texi (-Walloc-size-larger-than): Update. + PR middle-end/82063 + * calls.c (alloc_max_size): Correct a logic error/typo. + Treat excessive arguments as infinite. Warn for invalid arguments. + * doc/invoke.texi (-Walloc-size-larger-than): Update. 2018-06-14 Sebastian Huber diff --git a/gcc/DATESTAMP b/gcc/DATESTAMP index fddfc0ed0dc..3ede128ad65 100644 --- a/gcc/DATESTAMP +++ b/gcc/DATESTAMP @@ -1 +1 @@ -20181109 +20181213 diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 7f5333f79d6..3e319373f5d 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,17 @@ +2018-12-06 Release Manager + + * GCC 7.4.0 released. + +2018-11-15 Eric Botcazou + + * gcc-interface/misc.c (gnat_init_gcc_eh): Do not override the switch + -fnon-call-exceptions passed on the command line in -gnatp mode. + +2018-11-13 Eric Botcazou + + * gcc-interface/misc.c (gnat_init_gcc_eh): Set -fnon-call-exceptions + for the runtime on platforms where System.Machine_Overflow is true. + 2018-11-08 Eric Botcazou * fe.h (Suppress_Checks): Declare. diff --git a/gcc/ada/gcc-interface/misc.c b/gcc/ada/gcc-interface/misc.c index c9f1c745531..f23d7337e0a 100644 --- a/gcc/ada/gcc-interface/misc.c +++ b/gcc/ada/gcc-interface/misc.c @@ -409,10 +409,18 @@ gnat_init_gcc_eh (void) as permitted in Ada. Turn off -faggressive-loop-optimizations because it may optimize away out-of-bound array accesses that we want to be able to catch. - If checks are disabled, we use the same settings as the C++ compiler. */ + If checks are disabled, we use the same settings as the C++ compiler, + except for the runtime on platforms where S'Machine_Overflow is true + because the runtime depends on FP (hardware) checks being properly + handled despite being compiled in -gnatp mode. */ flag_exceptions = 1; flag_delete_dead_exceptions = 1; - if (!Suppress_Checks) + if (Suppress_Checks) + { + if (!global_options_set.x_flag_non_call_exceptions) + flag_non_call_exceptions = Machine_Overflows_On_Target && GNAT_Mode; + } + else { flag_non_call_exceptions = 1; flag_aggressive_loop_optimizations = 0; diff --git a/gcc/brig/ChangeLog b/gcc/brig/ChangeLog index ec73d2d6f18..06e3dd535db 100644 --- a/gcc/brig/ChangeLog +++ b/gcc/brig/ChangeLog @@ -1,3 +1,7 @@ +2018-12-06 Release Manager + + * GCC 7.4.0 released. + 2018-07-04 Martin Jambor PR hsa/86371 diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index a3e153a13db..5b03b3beb5d 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,7 @@ +2018-12-06 Release Manager + + * GCC 7.4.0 released. + 2018-06-22 Jakub Jelinek Backported from mainline diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index 35f93f6ef3e..2f2795165ad 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,7 @@ +2018-12-06 Release Manager + + * GCC 7.4.0 released. + 2018-06-22 Jakub Jelinek Backported from mainline diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c index 4b985822568..7fd3916a3c7 100644 --- a/gcc/cfgexpand.c +++ b/gcc/cfgexpand.c @@ -6466,6 +6466,14 @@ pass_expand::execute (function *fun) find_many_sub_basic_blocks (blocks); purge_all_dead_edges (); + /* After initial rtl generation, call back to finish generating + exception support code. We need to do this before cleaning up + the CFG as the code does not expect dead landing pads. */ + if (fun->eh->region_tree != NULL) + finish_eh_generation (); + + /* Call expand_stack_alignment after finishing all + updates to crtl->preferred_stack_boundary. */ expand_stack_alignment (); /* Fixup REG_EQUIV notes in the prologue if there are tailcalls in this @@ -6473,12 +6481,6 @@ pass_expand::execute (function *fun) if (crtl->tail_call_emit) fixup_tail_calls (); - /* After initial rtl generation, call back to finish generating - exception support code. We need to do this before cleaning up - the CFG as the code does not expect dead landing pads. */ - if (fun->eh->region_tree != NULL) - finish_eh_generation (); - /* Remove unreachable blocks, otherwise we cannot compute dominators which are needed for loop state verification. As a side-effect this also compacts blocks. diff --git a/gcc/combine.c b/gcc/combine.c index 8da96d23cc8..bc023d2f994 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -13117,6 +13117,7 @@ record_dead_and_set_regs_1 (rtx dest, const_rtx setter, void *data) && subreg_lowpart_p (SET_DEST (setter))) record_value_for_reg (dest, record_dead_insn, WORD_REGISTER_OPERATIONS + && word_register_operation_p (SET_SRC (setter)) && paradoxical_subreg_p (SET_DEST (setter)) ? SET_SRC (setter) : gen_lowpart (GET_MODE (dest), diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index 180771f129f..943ec0a179c 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -17382,7 +17382,11 @@ arm_reorg (void) if (use_cmse) cmse_nonsecure_call_clear_caller_saved (); - if (TARGET_THUMB1) + + /* We cannot run the Thumb passes for thunks because there is no CFG. */ + if (cfun->is_thunk) + ; + else if (TARGET_THUMB1) thumb1_reorg (); else if (TARGET_THUMB2) thumb2_reorg (); @@ -26446,6 +26450,8 @@ static void arm32_output_mi_thunk (FILE *file, tree, HOST_WIDE_INT delta, HOST_WIDE_INT vcall_offset, tree function) { + const bool long_call_p = arm_is_long_call_p (function); + /* On ARM, this_regno is R0 or R1 depending on whether the function returns an aggregate or not. */ @@ -26483,9 +26489,22 @@ arm32_output_mi_thunk (FILE *file, tree, HOST_WIDE_INT delta, TREE_USED (function) = 1; } rtx funexp = XEXP (DECL_RTL (function), 0); + if (long_call_p) + { + emit_move_insn (temp, funexp); + funexp = temp; + } funexp = gen_rtx_MEM (FUNCTION_MODE, funexp); - rtx_insn * insn = emit_call_insn (gen_sibcall (funexp, const0_rtx, NULL_RTX)); + rtx_insn *insn = emit_call_insn (gen_sibcall (funexp, const0_rtx, NULL_RTX)); SIBLING_CALL_P (insn) = 1; + emit_barrier (); + + /* Indirect calls require a bit of fixup in PIC mode. */ + if (long_call_p) + { + split_all_insns_noflow (); + arm_reorg (); + } insn = get_insns (); shorten_branches (insn); diff --git a/gcc/config/darwin.c b/gcc/config/darwin.c index 8e6e25ab7f5..bafb1c541cd 100644 --- a/gcc/config/darwin.c +++ b/gcc/config/darwin.c @@ -3674,21 +3674,4 @@ default_function_sections: : text_section; } -/* When a function is partitioned between sections, we need to insert a label - at the start of each new chunk - so that it may become a valid 'atom' for - eh and debug purposes. Without this the linker will emit warnings if one - tries to add line location information (since the switched fragment will - be anonymous). */ - -void -darwin_function_switched_text_sections (FILE *fp, tree decl, bool new_is_cold) -{ - char buf[128]; - snprintf (buf, 128, "%s%s",new_is_cold?"__cold_sect_of_":"__hot_sect_of_", - IDENTIFIER_POINTER (DECL_NAME (decl))); - /* Make sure we pick up all the relevant quotes etc. */ - assemble_name_raw (fp, (const char *) buf); - fputs (":\n", fp); -} - #include "gt-darwin.h" diff --git a/gcc/config/darwin.h b/gcc/config/darwin.h index a8397cd2331..fb8634f81c1 100644 --- a/gcc/config/darwin.h +++ b/gcc/config/darwin.h @@ -705,10 +705,6 @@ extern GTY(()) section * darwin_sections[NUM_DARWIN_SECTIONS]; #undef TARGET_ASM_FUNCTION_SECTION #define TARGET_ASM_FUNCTION_SECTION darwin_function_section -#undef TARGET_ASM_FUNCTION_SWITCHED_TEXT_SECTIONS -#define TARGET_ASM_FUNCTION_SWITCHED_TEXT_SECTIONS \ - darwin_function_switched_text_sections - #undef TARGET_ASM_SELECT_RTX_SECTION #define TARGET_ASM_SELECT_RTX_SECTION machopic_select_rtx_section #undef TARGET_ASM_UNIQUE_SECTION diff --git a/gcc/config/i386/cygming.h b/gcc/config/i386/cygming.h index a731e2f6c6a..8cca8615114 100644 --- a/gcc/config/i386/cygming.h +++ b/gcc/config/i386/cygming.h @@ -269,9 +269,6 @@ do { \ bytes in one go. */ #define CHECK_STACK_LIMIT 4000 -#undef STACK_BOUNDARY -#define STACK_BOUNDARY (TARGET_64BIT && ix86_abi == MS_ABI ? 128 : BITS_PER_WORD) - /* By default, target has a 80387, uses IEEE compatible arithmetic, returns float values in the 387 and needs stack probes. We also align doubles to 64-bits for MSVC default compatibility. */ diff --git a/gcc/config/i386/darwin.h b/gcc/config/i386/darwin.h index fccaf7eb94b..3a4beb05904 100644 --- a/gcc/config/i386/darwin.h +++ b/gcc/config/i386/darwin.h @@ -87,8 +87,7 @@ extern int darwin_emit_branch_islands; or dynamic loader. */ #undef STACK_BOUNDARY #define STACK_BOUNDARY \ - ((profile_flag || (TARGET_64BIT && ix86_abi == MS_ABI)) \ - ? 128 : BITS_PER_WORD) + ((profile_flag || TARGET_64BIT_MS_ABI) ? 128 : BITS_PER_WORD) #undef MAIN_STACK_BOUNDARY #define MAIN_STACK_BOUNDARY 128 diff --git a/gcc/config/i386/emmintrin.h b/gcc/config/i386/emmintrin.h index 828f4a07a9b..c35a20f7107 100644 --- a/gcc/config/i386/emmintrin.h +++ b/gcc/config/i386/emmintrin.h @@ -45,6 +45,7 @@ typedef unsigned int __v4su __attribute__ ((__vector_size__ (16))); typedef short __v8hi __attribute__ ((__vector_size__ (16))); typedef unsigned short __v8hu __attribute__ ((__vector_size__ (16))); typedef char __v16qi __attribute__ ((__vector_size__ (16))); +typedef signed char __v16qs __attribute__ ((__vector_size__ (16))); typedef unsigned char __v16qu __attribute__ ((__vector_size__ (16))); /* The Intel API is flexible enough that we must allow aliasing with other @@ -1295,7 +1296,7 @@ _mm_xor_si128 (__m128i __A, __m128i __B) extern __inline __m128i __attribute__((__gnu_inline__, __always_inline__, __artificial__)) _mm_cmpeq_epi8 (__m128i __A, __m128i __B) { - return (__m128i) ((__v16qi)__A == (__v16qi)__B); + return (__m128i) ((__v16qs)__A == (__v16qs)__B); } extern __inline __m128i __attribute__((__gnu_inline__, __always_inline__, __artificial__)) @@ -1313,7 +1314,7 @@ _mm_cmpeq_epi32 (__m128i __A, __m128i __B) extern __inline __m128i __attribute__((__gnu_inline__, __always_inline__, __artificial__)) _mm_cmplt_epi8 (__m128i __A, __m128i __B) { - return (__m128i) ((__v16qi)__A < (__v16qi)__B); + return (__m128i) ((__v16qs)__A < (__v16qs)__B); } extern __inline __m128i __attribute__((__gnu_inline__, __always_inline__, __artificial__)) @@ -1331,7 +1332,7 @@ _mm_cmplt_epi32 (__m128i __A, __m128i __B) extern __inline __m128i __attribute__((__gnu_inline__, __always_inline__, __artificial__)) _mm_cmpgt_epi8 (__m128i __A, __m128i __B) { - return (__m128i) ((__v16qi)__A > (__v16qi)__B); + return (__m128i) ((__v16qs)__A > (__v16qs)__B); } extern __inline __m128i __attribute__((__gnu_inline__, __always_inline__, __artificial__)) diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h index 16396fc250b..0fe4c8b2caa 100644 --- a/gcc/config/i386/i386.h +++ b/gcc/config/i386/i386.h @@ -759,8 +759,7 @@ extern const char *host_detect_local_cpu (int argc, const char **argv); #define PARM_BOUNDARY BITS_PER_WORD /* Boundary (in *bits*) on which stack pointer should be aligned. */ -#define STACK_BOUNDARY \ - (TARGET_64BIT && ix86_abi == MS_ABI ? 128 : BITS_PER_WORD) +#define STACK_BOUNDARY (TARGET_64BIT_MS_ABI ? 128 : BITS_PER_WORD) /* Stack boundary of the main function guaranteed by OS. */ #define MAIN_STACK_BOUNDARY (TARGET_64BIT ? 128 : 32) diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md index 9c72e6f8b1d..cecb734a2dd 100644 --- a/gcc/config/i386/sse.md +++ b/gcc/config/i386/sse.md @@ -21,6 +21,9 @@ ;; SSE UNSPEC_MOVNT + ;; SSE2 + UNSPEC_MOVDI_TO_SSE + ;; SSE3 UNSPEC_LDDQU @@ -1113,10 +1116,10 @@ ;; from there. (define_insn_and_split "movdi_to_sse" - [(parallel - [(set (match_operand:V4SI 0 "register_operand" "=?x,x") - (subreg:V4SI (match_operand:DI 1 "nonimmediate_operand" "r,m") 0)) - (clobber (match_scratch:V4SI 2 "=&x,X"))])] + [(set (match_operand:V4SI 0 "register_operand" "=?x,x") + (unspec:V4SI [(match_operand:DI 1 "nonimmediate_operand" "r,m")] + UNSPEC_MOVDI_TO_SSE)) + (clobber (match_scratch:V4SI 2 "=&x,X"))] "!TARGET_64BIT && TARGET_SSE2 && TARGET_INTER_UNIT_MOVES_TO_VEC" "#" "&& reload_completed" diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index d377e242913..68dd95429fe 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -4829,6 +4829,13 @@ rs6000_option_override_internal (bool global_init_p) else rs6000_long_double_type_size = RS6000_DEFAULT_LONG_DOUBLE_SIZE; } + else if (global_options_set.x_rs6000_ieeequad) + { + if (global_options.x_rs6000_ieeequad) + error ("%qs requires %qs", "-mabi=ieeelongdouble", "-mlong-double-128"); + else + error ("%qs requires %qs", "-mabi=ibmlongdouble", "-mlong-double-128"); + } /* Set -mabi=ieeelongdouble on some old targets. Note, AIX and Darwin explicitly redefine TARGET_IEEEQUAD to 0, so those systems will not @@ -4838,6 +4845,11 @@ rs6000_option_override_internal (bool global_init_p) rs6000_ieeequad = 1; #endif + if (global_options_set.x_rs6000_ieeequad + && global_options.x_rs6000_ieeequad + && (!TARGET_POPCNTD || !TARGET_VSX)) + error ("%qs requires full ISA 2.06 support", "-mabi=ieeelongdouble"); + /* Enable the default support for IEEE 128-bit floating point on Linux VSX sytems, but don't enable the __float128 keyword. */ if (TARGET_VSX && TARGET_LONG_DOUBLE_128 diff --git a/gcc/config/s390/s390.md b/gcc/config/s390/s390.md index 9e42a593c17..6560ded0693 100644 --- a/gcc/config/s390/s390.md +++ b/gcc/config/s390/s390.md @@ -8871,17 +8871,17 @@ DONE; }) +; CLZ result is in hard reg op0 - this is the high part of the target operand +; The source with the left-most one bit cleared is in hard reg op0 + 1 - the low part (define_insn "clztidi2" [(set (match_operand:TI 0 "register_operand" "=d") (ior:TI - (ashift:TI - (zero_extend:TI - (xor:DI (match_operand:DI 1 "register_operand" "d") - (lshiftrt (match_operand:DI 2 "const_int_operand" "") - (subreg:SI (clz:DI (match_dup 1)) 4)))) - - (const_int 64)) - (zero_extend:TI (clz:DI (match_dup 1))))) + (ashift:TI (zero_extend:TI (clz:DI (match_operand:DI 1 "register_operand" "d"))) + (const_int 64)) + (zero_extend:TI + (xor:DI (match_dup 1) + (lshiftrt (match_operand:DI 2 "const_int_operand" "") + (subreg:SI (clz:DI (match_dup 1)) 4)))))) (clobber (reg:CC CC_REGNUM))] "UINTVAL (operands[2]) == HOST_WIDE_INT_1U << 63 && TARGET_EXTIMM && TARGET_ZARCH" diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 854e0b59e75..1830969cbd2 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,18 @@ +2018-12-06 Release Manager + + * GCC 7.4.0 released. + +2018-11-26 Richard Biener + + PR c++/84281 + * constexpr.c (cxx_eval_vec_init_1): Use a RANGE_EXPR to compact + uniform constructors and delay allocating them fully. + +2018-11-26 Jason Merrill + + PR c++/87075 - ICE with constexpr array initialization. + * constexpr.c (cxx_eval_vec_init_1): Handle trivial initialization. + 2018-10-23 Tom de Vries backport from trunk: diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c index 361a955ba01..cfd6a3a0e6e 100644 --- a/gcc/cp/constexpr.c +++ b/gcc/cp/constexpr.c @@ -2843,7 +2843,6 @@ cxx_eval_vec_init_1 (const constexpr_ctx *ctx, tree atype, tree init, unsigned HOST_WIDE_INT max = tree_to_uhwi (array_type_nelts_top (atype)); verify_ctor_sanity (ctx, atype); vec **p = &CONSTRUCTOR_ELTS (ctx->ctor); - vec_alloc (*p, max + 1); bool pre_init = false; unsigned HOST_WIDE_INT i; @@ -2898,6 +2897,9 @@ cxx_eval_vec_init_1 (const constexpr_ctx *ctx, tree atype, tree init, { /* Initializing an element using value or default initialization we just pre-built above. */ + if (init == void_node) + /* Trivial default-init, don't do anything to the CONSTRUCTOR. */ + return ctx->ctor; eltinit = cxx_eval_constant_expression (&new_ctx, init, lval, non_constant_p, overflow_p); reuse = i == 0; @@ -2936,13 +2938,14 @@ cxx_eval_vec_init_1 (const constexpr_ctx *ctx, tree atype, tree init, { if (new_ctx.ctor != ctx->ctor) eltinit = new_ctx.ctor; - for (i = 1; i < max; ++i) - { - idx = build_int_cst (size_type_node, i); - CONSTRUCTOR_APPEND_ELT (*p, idx, unshare_constructor (eltinit)); - } + tree range = build2 (RANGE_EXPR, size_type_node, + build_int_cst (size_type_node, 1), + build_int_cst (size_type_node, max - 1)); + CONSTRUCTOR_APPEND_ELT (*p, range, unshare_constructor (eltinit)); break; } + else if (i == 0) + vec_safe_reserve (*p, max); } if (!*non_constant_p) diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index c893e676256..c17860d8172 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -21956,12 +21956,14 @@ Disable Book-E SPE ABI extensions for the current ABI@. @item -mabi=ibmlongdouble @opindex mabi=ibmlongdouble Change the current ABI to use IBM extended-precision long double. -This is a PowerPC 32-bit SYSV ABI option. +This is a PowerPC 32-bit SYSV ABI option. Requires @option{-mlong-double-128} +to be enabled. @item -mabi=ieeelongdouble @opindex mabi=ieeelongdouble Change the current ABI to use IEEE extended-precision long double. -This is a PowerPC 32-bit Linux ABI option. +This is a PowerPC 32-bit Linux ABI option. Requires @option{-mlong-double-128} +to be enabled. @item -mabi=elfv1 @opindex mabi=elfv1 @@ -22721,8 +22723,8 @@ Generate code that runs on @var{cpu-type}, which is the name of a system representing a certain processor type. Possible values for @var{cpu-type} are @samp{z900}/@samp{arch5}, @samp{z990}/@samp{arch6}, @samp{z9-109}, @samp{z9-ec}/@samp{arch7}, @samp{z10}/@samp{arch8}, -@samp{z196}/@samp{arch9}, @samp{zEC12}, @samp{z13}/@samp{arch11}, and -@samp{native}. +@samp{z196}/@samp{arch9}, @samp{zEC12}, @samp{z13}/@samp{arch11}, +@samp{z14}/@samp{arch12}, and @samp{native}. The default is @option{-march=z900}. @samp{g5}/@samp{arch3} and @samp{g6} are deprecated and will be removed with future releases. diff --git a/gcc/dse.c b/gcc/dse.c index 174865bbc40..f638f38a403 100644 --- a/gcc/dse.c +++ b/gcc/dse.c @@ -1450,7 +1450,12 @@ record_store (rtx body, bb_info_t bb_info) && offset >= s_info->begin && offset + width <= s_info->end && all_positions_needed_p (s_info, offset - s_info->begin, - width)) + width) + /* We can only remove the later store if the earlier aliases + at least all accesses the later one. */ + && (MEM_ALIAS_SET (mem) == MEM_ALIAS_SET (s_info->mem) + || alias_set_subset_of (MEM_ALIAS_SET (mem), + MEM_ALIAS_SET (s_info->mem)))) { if (GET_MODE (mem) == BLKmode) { diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 7e1ce9e152a..5223e3b2fb4 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -297,6 +297,10 @@ static unsigned int rnglist_idx; #define FUNC_BEGIN_LABEL "LFB" #endif +#ifndef FUNC_SECOND_SECT_LABEL +#define FUNC_SECOND_SECT_LABEL "LFSB" +#endif + #ifndef FUNC_END_LABEL #define FUNC_END_LABEL "LFE" #endif @@ -1200,21 +1204,24 @@ static void set_cur_line_info_table (section *); void dwarf2out_switch_text_section (void) { + char label[MAX_ARTIFICIAL_LABEL_BYTES]; section *sect; dw_fde_ref fde = cfun->fde; gcc_assert (cfun && fde && fde->dw_fde_second_begin == NULL); + ASM_GENERATE_INTERNAL_LABEL (label, FUNC_SECOND_SECT_LABEL, + current_function_funcdef_no); + + fde->dw_fde_second_begin = ggc_strdup (label); if (!in_cold_section_p) { fde->dw_fde_end = crtl->subsections.cold_section_end_label; - fde->dw_fde_second_begin = crtl->subsections.hot_section_label; fde->dw_fde_second_end = crtl->subsections.hot_section_end_label; } else { fde->dw_fde_end = crtl->subsections.hot_section_end_label; - fde->dw_fde_second_begin = crtl->subsections.cold_section_label; fde->dw_fde_second_end = crtl->subsections.cold_section_end_label; } have_multiple_function_sections = true; @@ -29722,6 +29729,8 @@ dwarf2out_finish (const char *) FOR_EACH_CHILD (die, c, gcc_assert (! c->die_mark)); } #endif + for (ctnode = comdat_type_list; ctnode != NULL; ctnode = ctnode->next) + resolve_addr (ctnode->root_die); resolve_addr (comp_unit_die ()); move_marked_base_types (); diff --git a/gcc/final.c b/gcc/final.c index 20af67816bb..c3023285c21 100644 --- a/gcc/final.c +++ b/gcc/final.c @@ -2232,6 +2232,9 @@ final_scan_insn (rtx_insn *insn, FILE *file, int optimize_p ATTRIBUTE_UNUSED, ASM_OUTPUT_LABEL (asm_out_file, IDENTIFIER_POINTER (cold_function_name)); #endif + if (dwarf2out_do_frame () + && cfun->fde->dw_fde_second_begin != NULL) + ASM_OUTPUT_LABEL (asm_out_file, cfun->fde->dw_fde_second_begin); } break; diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 6c85b63169c..12b348733ce 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,60 @@ +2018-12-11 Steven G. Kargl + + PR fortran/88155 + * primary.c (gfc_match_structure_constructor): Set the locus of + an expression to avoid a NULL pointer dereference. + +2018-12-11 Steven G. Kargl + + PR fortran/88249 + * gfortran.h: Update prototype for gfc_resolve_filepos(). + * io.c (gfc_resolve_filepos): Check for UNIT number if ERR= is present. + Use passed in locus for error message. + * resolve.c (gfc_resolve_code): Pass locus in gfc_resolve_filepos() + call. + +2018-12-10 Steven G. Kargl + + PR fortran/88269 + * io.c (io_constraint): Update macro. If locus line buffer is NULL, + use gfc_current_locus in error messages. + (check_io_constraints): Catch missing IO UNIT in write and read + statements. io_constraint macro is incompatible here. + +2018-12-09 Steven G. Kargl + + PR fortran/88205 + * io.c (gfc_match_open): Move NEWUNIT checks to after STATUS checks. + +2018-12-09 Steven G. Kargl + + PR fortran/88206 + * match.c (gfc_match_type_spec): REAL can be an intrinsic function. + +2018-12-09 Fritz Reese + + PR fortran/88228 + * resolve.c (resolve_operator): Do not call resolve_function. + Break like other cases. + +2018-12-06 Release Manager + + * GCC 7.4.0 released. + +2018-11-25 Thomas Koenig + + Backport from trunk + PR fortran/88073 + * frontend-passes.c (combine_array_constructor): Do not do + anything if in a WHERE statement. + +2018-11-24 Paul Thomas + + Backport from mainline + PR fortran/88143 + * resolve.c (resolve_variable): Check for associate names with + NULL target. + 2019-11-03 Tobias Burnus Thomas Koenig diff --git a/gcc/fortran/frontend-passes.c b/gcc/fortran/frontend-passes.c index ef1d8f97434..7c83a882ecc 100644 --- a/gcc/fortran/frontend-passes.c +++ b/gcc/fortran/frontend-passes.c @@ -1358,6 +1358,10 @@ combine_array_constructor (gfc_expr *e) if (iterator_level > 0) return false; + /* WHERE also doesn't work. */ + if (in_where > 0) + return false; + op1 = e->value.op.op1; op2 = e->value.op.op2; diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h index e5287c5d8d9..071dece717c 100644 --- a/gcc/fortran/gfortran.h +++ b/gcc/fortran/gfortran.h @@ -3269,7 +3269,7 @@ bool gfc_resolve_open (gfc_open *); void gfc_free_close (gfc_close *); bool gfc_resolve_close (gfc_close *); void gfc_free_filepos (gfc_filepos *); -bool gfc_resolve_filepos (gfc_filepos *); +bool gfc_resolve_filepos (gfc_filepos *, locus *); void gfc_free_inquire (gfc_inquire *); bool gfc_resolve_inquire (gfc_inquire *); void gfc_free_dt (gfc_dt *); diff --git a/gcc/fortran/io.c b/gcc/fortran/io.c index b2fa741d03f..90f4baafd74 100644 --- a/gcc/fortran/io.c +++ b/gcc/fortran/io.c @@ -2090,33 +2090,6 @@ gfc_match_open (void) warn = (open->err || open->iostat) ? true : false; - /* Checks on NEWUNIT specifier. */ - if (open->newunit) - { - if (open->unit) - { - gfc_error ("UNIT specifier not allowed with NEWUNIT at %C"); - goto cleanup; - } - - if (!open->file && open->status) - { - if (open->status->expr_type == EXPR_CONSTANT - && gfc_wide_strncasecmp (open->status->value.character.string, - "scratch", 7) != 0) - { - gfc_error ("NEWUNIT specifier must have FILE= " - "or STATUS='scratch' at %C"); - goto cleanup; - } - } - } - else if (!open->unit) - { - gfc_error ("OPEN statement at %C must have UNIT or NEWUNIT specified"); - goto cleanup; - } - /* Checks on the ACCESS specifier. */ if (open->access && open->access->expr_type == EXPR_CONSTANT) { @@ -2441,6 +2414,33 @@ gfc_match_open (void) } } + /* Checks on NEWUNIT specifier. */ + if (open->newunit) + { + if (open->unit) + { + gfc_error ("UNIT specifier not allowed with NEWUNIT at %C"); + goto cleanup; + } + + if (!open->file && open->status) + { + if (open->status->expr_type == EXPR_CONSTANT + && gfc_wide_strncasecmp (open->status->value.character.string, + "scratch", 7) != 0) + { + gfc_error ("NEWUNIT specifier must have FILE= " + "or STATUS='scratch' at %C"); + goto cleanup; + } + } + } + else if (!open->unit) + { + gfc_error ("OPEN statement at %C must have UNIT or NEWUNIT specified"); + goto cleanup; + } + /* Things that are not allowed for unformatted I/O. */ if (open->form && open->form->expr_type == EXPR_CONSTANT && (open->delim || open->decimal || open->encoding || open->round @@ -2774,22 +2774,21 @@ cleanup: bool -gfc_resolve_filepos (gfc_filepos *fp) +gfc_resolve_filepos (gfc_filepos *fp, locus *where) { RESOLVE_TAG (&tag_unit, fp->unit); RESOLVE_TAG (&tag_iostat, fp->iostat); RESOLVE_TAG (&tag_iomsg, fp->iomsg); - if (!gfc_reference_st_label (fp->err, ST_LABEL_TARGET)) - return false; - if (!fp->unit && (fp->iostat || fp->iomsg)) + if (!fp->unit && (fp->iostat || fp->iomsg || fp->err)) { - locus where; - where = fp->iostat ? fp->iostat->where : fp->iomsg->where; - gfc_error ("UNIT number missing in statement at %L", &where); + gfc_error ("UNIT number missing in statement at %L", where); return false; } + if (!gfc_reference_st_label (fp->err, ST_LABEL_TARGET)) + return false; + if (fp->unit->expr_type == EXPR_CONSTANT && fp->unit->ts.type == BT_INTEGER && mpz_sgn (fp->unit->value.integer) < 0) @@ -3617,10 +3616,13 @@ static match check_io_constraints (io_kind k, gfc_dt *dt, gfc_code *io_code, locus *spec_end) { -#define io_constraint(condition,msg,arg)\ +#define io_constraint(condition, msg, arg)\ if (condition) \ {\ - gfc_error(msg,arg);\ + if ((arg)->lb != NULL)\ + gfc_error ((msg), (arg));\ + else\ + gfc_error ((msg), &gfc_current_locus);\ m = MATCH_ERROR;\ } @@ -3680,11 +3682,14 @@ if (condition) \ if (expr && expr->ts.type != BT_CHARACTER) { - io_constraint (gfc_pure (NULL) && (k == M_READ || k == M_WRITE), - "IO UNIT in %s statement at %C must be " + if (gfc_pure (NULL) && (k == M_READ || k == M_WRITE)) + { + gfc_error ("IO UNIT in %s statement at %C must be " "an internal file in a PURE procedure", io_kind_name (k)); - + return MATCH_ERROR; + } + if (k == M_READ || k == M_WRITE) gfc_unset_implicit_pure (NULL); } diff --git a/gcc/fortran/match.c b/gcc/fortran/match.c index 89fb43dc048..222c8d0068e 100644 --- a/gcc/fortran/match.c +++ b/gcc/fortran/match.c @@ -2153,6 +2153,9 @@ found: return MATCH_NO; } + if (e->expr_type != EXPR_CONSTANT) + goto ohno; + gfc_next_char (); /* Burn the ')'. */ ts->kind = (int) mpz_get_si (e->value.integer); if (gfc_validate_kind (ts->type, ts->kind , true) == -1) @@ -2167,6 +2170,8 @@ found: } } +ohno: + /* If a type is not matched, simply return MATCH_NO. */ gfc_current_locus = old_locus; return MATCH_NO; diff --git a/gcc/fortran/primary.c b/gcc/fortran/primary.c index c0ab09e7f50..7dc05881bf7 100644 --- a/gcc/fortran/primary.c +++ b/gcc/fortran/primary.c @@ -2980,6 +2980,7 @@ gfc_match_structure_constructor (gfc_symbol *sym, gfc_expr **result) e = gfc_get_expr (); e->symtree = symtree; e->expr_type = EXPR_FUNCTION; + e->where = gfc_current_locus; gcc_assert (gfc_fl_struct (sym->attr.flavor) && symtree->n.sym->attr.flavor == FL_PROCEDURE); diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 483f3b2a7b7..4850f99a0b2 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -3737,7 +3737,7 @@ resolve_operator (gfc_expr *e) if (op2->ts.type != e->ts.type || op2->ts.kind != e->ts.kind) gfc_convert_type (op2, &e->ts, 1); e = logical_to_bitwise (e); - return resolve_function (e); + break; } sprintf (msg, _("Operands of logical operator %%<%s%%> at %%L are %s/%s"), @@ -3753,7 +3753,7 @@ resolve_operator (gfc_expr *e) e->ts.type = BT_INTEGER; e->ts.kind = op1->ts.kind; e = logical_to_bitwise (e); - return resolve_function (e); + break; } if (op1->ts.type == BT_LOGICAL) @@ -5132,7 +5132,7 @@ resolve_variable (gfc_expr *e) the ts' type of the component refs is still array valued, which can't be translated that way. */ if (sym->assoc && e->rank == 0 && e->ref && sym->ts.type == BT_CLASS - && sym->assoc->target->ts.type == BT_CLASS + && sym->assoc->target && sym->assoc->target->ts.type == BT_CLASS && CLASS_DATA (sym->assoc->target)->as) { gfc_ref *ref = e->ref; @@ -11163,7 +11163,7 @@ start: case EXEC_ENDFILE: case EXEC_REWIND: case EXEC_FLUSH: - if (!gfc_resolve_filepos (code->ext.filepos)) + if (!gfc_resolve_filepos (code->ext.filepos, &code->loc)) break; resolve_branch (code->ext.filepos->err, code); diff --git a/gcc/gimple-match-head.c b/gcc/gimple-match-head.c index 5f6aa273b96..ee06ab6590d 100644 --- a/gcc/gimple-match-head.c +++ b/gcc/gimple-match-head.c @@ -100,17 +100,34 @@ gimple_resimplify1 (gimple_seq *seq, } } + /* Limit recursion, there are cases like PR80887 and others, for + example when value-numbering presents us with unfolded expressions + that we are really not prepared to handle without eventual + oscillation like ((_50 + 0) + 8) where _50 gets mapped to _50 + itself as available expression. */ + static unsigned depth; + if (depth > 10) + { + if (dump_file && (dump_flags & TDF_DETAILS)) + fprintf (dump_file, "Aborting expression simplification due to " + "deep recursion\n"); + return false; + } + + ++depth; code_helper res_code2; tree res_ops2[3] = {}; if (gimple_simplify (&res_code2, res_ops2, seq, valueize, *res_code, type, res_ops[0])) { + --depth; *res_code = res_code2; res_ops[0] = res_ops2[0]; res_ops[1] = res_ops2[1]; res_ops[2] = res_ops2[2]; return true; } + --depth; return false; } @@ -160,17 +177,30 @@ gimple_resimplify2 (gimple_seq *seq, canonicalized = true; } + /* Limit recursion, see gimple_resimplify1. */ + static unsigned depth; + if (depth > 10) + { + if (dump_file && (dump_flags & TDF_DETAILS)) + fprintf (dump_file, "Aborting expression simplification due to " + "deep recursion\n"); + return false; + } + + ++depth; code_helper res_code2; tree res_ops2[3] = {}; if (gimple_simplify (&res_code2, res_ops2, seq, valueize, *res_code, type, res_ops[0], res_ops[1])) { + --depth; *res_code = res_code2; res_ops[0] = res_ops2[0]; res_ops[1] = res_ops2[1]; res_ops[2] = res_ops2[2]; return true; } + --depth; return canonicalized; } @@ -219,18 +249,31 @@ gimple_resimplify3 (gimple_seq *seq, canonicalized = true; } + /* Limit recursion, see gimple_resimplify1. */ + static unsigned depth; + if (depth > 10) + { + if (dump_file && (dump_flags & TDF_DETAILS)) + fprintf (dump_file, "Aborting expression simplification due to " + "deep recursion\n"); + return false; + } + + ++depth; code_helper res_code2; tree res_ops2[3] = {}; if (gimple_simplify (&res_code2, res_ops2, seq, valueize, *res_code, type, res_ops[0], res_ops[1], res_ops[2])) { + --depth; *res_code = res_code2; res_ops[0] = res_ops2[0]; res_ops[1] = res_ops2[1]; res_ops[2] = res_ops2[2]; return true; } + --depth; return canonicalized; } diff --git a/gcc/go/ChangeLog b/gcc/go/ChangeLog index 2d6cdbea429..f014302cbc5 100644 --- a/gcc/go/ChangeLog +++ b/gcc/go/ChangeLog @@ -1,3 +1,7 @@ +2018-12-06 Release Manager + + * GCC 7.4.0 released. + 2018-01-25 Release Manager * GCC 7.3.0 released. diff --git a/gcc/jit/ChangeLog b/gcc/jit/ChangeLog index e77a00f6139..00016616a6a 100644 --- a/gcc/jit/ChangeLog +++ b/gcc/jit/ChangeLog @@ -1,3 +1,7 @@ +2018-12-06 Release Manager + + * GCC 7.4.0 released. + 2018-01-25 Release Manager * GCC 7.3.0 released. diff --git a/gcc/lto/ChangeLog b/gcc/lto/ChangeLog index 17431acfe90..fa3b356cacb 100644 --- a/gcc/lto/ChangeLog +++ b/gcc/lto/ChangeLog @@ -1,3 +1,7 @@ +2018-12-06 Release Manager + + * GCC 7.4.0 released. + 2018-04-24 Martin Liska Backport from mainline diff --git a/gcc/objc/ChangeLog b/gcc/objc/ChangeLog index 62e7c9f97d8..b9a5e0790c9 100644 --- a/gcc/objc/ChangeLog +++ b/gcc/objc/ChangeLog @@ -1,3 +1,7 @@ +2018-12-06 Release Manager + + * GCC 7.4.0 released. + 2018-01-25 Release Manager * GCC 7.3.0 released. diff --git a/gcc/objcp/ChangeLog b/gcc/objcp/ChangeLog index babdf8c10da..b77e32d421f 100644 --- a/gcc/objcp/ChangeLog +++ b/gcc/objcp/ChangeLog @@ -1,3 +1,7 @@ +2018-12-06 Release Manager + + * GCC 7.4.0 released. + 2018-01-25 Release Manager * GCC 7.3.0 released. diff --git a/gcc/po/ChangeLog b/gcc/po/ChangeLog index b8ed7deef96..233c5fd9005 100644 --- a/gcc/po/ChangeLog +++ b/gcc/po/ChangeLog @@ -1,3 +1,7 @@ +2018-12-06 Release Manager + + * GCC 7.4.0 released. + 2018-01-25 Release Manager * GCC 7.3.0 released. diff --git a/gcc/rtl.h b/gcc/rtl.h index 93330425c00..05372cf8c95 100644 --- a/gcc/rtl.h +++ b/gcc/rtl.h @@ -3832,6 +3832,25 @@ load_extend_op (machine_mode mode) return UNKNOWN; } +/* Return true if X is an operation that always operates on the full + registers for WORD_REGISTER_OPERATIONS architectures. */ + +inline bool +word_register_operation_p (const_rtx x) +{ + switch (GET_CODE (x)) + { + case ROTATE: + case ROTATERT: + case SIGN_EXTRACT: + case ZERO_EXTRACT: + return false; + + default: + return true; + } +} + /* gtype-desc.c. */ extern void gt_ggc_mx (rtx &); extern void gt_pch_nx (rtx &); diff --git a/gcc/rtlanal.c b/gcc/rtlanal.c index 772a6a993bb..5df0e5d6fdd 100644 --- a/gcc/rtlanal.c +++ b/gcc/rtlanal.c @@ -4339,14 +4339,14 @@ nonzero_bits1 (const_rtx x, machine_mode mode, const_rtx known_x, might be nonzero in its own mode, taking into account the fact that, on CISC machines, accessing an object in a wider mode generally causes the high-order bits to become undefined, so they are not known to be zero. - We extend this reasoning to RISC machines for rotate operations since the - semantics of the operations in the larger mode is not well defined. */ + We extend this reasoning to RISC machines for operations that might not + operate on the full registers. */ if (GET_MODE (x) != VOIDmode && GET_MODE (x) != mode && GET_MODE_PRECISION (GET_MODE (x)) <= BITS_PER_WORD && GET_MODE_PRECISION (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT && GET_MODE_PRECISION (mode) > GET_MODE_PRECISION (GET_MODE (x)) - && (!WORD_REGISTER_OPERATIONS || code == ROTATE)) + && !(WORD_REGISTER_OPERATIONS && word_register_operation_p (x))) { nonzero &= cached_nonzero_bits (x, GET_MODE (x), known_x, known_mode, known_ret); @@ -4623,13 +4623,16 @@ nonzero_bits1 (const_rtx x, machine_mode mode, const_rtx known_x, nonzero &= cached_nonzero_bits (SUBREG_REG (x), mode, known_x, known_mode, known_ret); - /* On many CISC machines, accessing an object in a wider mode + /* On a typical CISC machine, accessing an object in a wider mode causes the high-order bits to become undefined. So they are - not known to be zero. */ + not known to be zero. + + On a typical RISC machine, we only have to worry about the way + loads are extended. Otherwise, if we get a reload for the inner + part, it may be loaded from the stack, and then we may lose all + the zero bits that existed before the store to the stack. */ rtx_code extend_op; if ((!WORD_REGISTER_OPERATIONS - /* If this is a typical RISC machine, we only have to worry - about the way loads are extended. */ || ((extend_op = load_extend_op (inner_mode)) == SIGN_EXTEND ? val_signbit_known_set_p (inner_mode, nonzero) : extend_op != ZERO_EXTEND) @@ -4872,10 +4875,9 @@ num_sign_bit_copies1 (const_rtx x, machine_mode mode, const_rtx known_x, { /* If this machine does not do all register operations on the entire register and MODE is wider than the mode of X, we can say nothing - at all about the high-order bits. We extend this reasoning to every - machine for rotate operations since the semantics of the operations - in the larger mode is not well defined. */ - if (!WORD_REGISTER_OPERATIONS || code == ROTATE || code == ROTATERT) + at all about the high-order bits. We extend this reasoning to RISC + machines for operations that might not operate on full registers. */ + if (!(WORD_REGISTER_OPERATIONS && word_register_operation_p (x))) return 1; /* Likewise on machines that do, if the mode of the object is smaller @@ -4965,10 +4967,10 @@ num_sign_bit_copies1 (const_rtx x, machine_mode mode, const_rtx known_x, /* For paradoxical SUBREGs on machines where all register operations affect the entire register, just look inside. Note that we are - passing MODE to the recursive call, so the number of sign bit copies - will remain relative to that mode, not the inner mode. */ + passing MODE to the recursive call, so the number of sign bit + copies will remain relative to that mode, not the inner mode. - /* This works only if loads sign extend. Otherwise, if we get a + This works only if loads sign extend. Otherwise, if we get a reload for the inner part, it may be loaded from the stack, and then we lose all sign bit copies that existed before the store to the stack. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3564bfdc6b0..c63a9cce9f0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,170 @@ +2018-12-12 Peter Bergner + + Backport from mainline + 2018-12-07 Peter Bergner + + PR target/87496 + * gcc.target/powerpc/pr87496-1.c: New test. + * gcc.target/powerpc/pr87496-2.c: New test. + * gcc.target/powerpc/pr87496-3.c: New test. + +2018-12-11 Steven G. Kargl + + PR fortran/88155 + * gfortran.dg/pr70870_1.f90: Update testcase to use -std=gnu. + * gfortran.dg/pr88155.f90: New test. + +2018-12-11 Steven G. Kargl + + PR fortran/88249 + * gfortran.dg/pr88249.f90: New test. + +2018-12-10 Steven G. Kargl + + PR fortran/88269 + * gfortran.dg/pr88269.f90: New test. + +2018-12-09 Steven G. Kargl + + PR fortran/88205 + * gfortran.dg/pr88205.f90: New unit. + +2018-12-09 Steven G. Kargl + + PR fortran/88206 + * gfortran.dg/pr88206.f90: New test. + +2018-12-09 Steven G. Kargl + + PR fortran/88228 + * gfortran.dg/pr88228.f90: New test. + +2018-12-06 Release Manager + + * GCC 7.4.0 released. + +2018-11-28 Richard Biener + + PR tree-optimization/79351 + * gcc.dg/torture/pr79351.c: New testcase. + +2018-11-26 Andreas Krebbel + + Backport from mainline + 2018-11-20 Andreas Krebbel + + * gcc.target/s390/flogr-1.c: New test. + +2018-10-19 Richard Biener + + PR middle-end/87645 + Backport from mainline + 2018-07-12 Richard Biener + + * gcc.dg/torture/pr87645.c: New testcase. + +2018-11-26 Richard Biener + + Backport from mainline + 2018-10-15 Richard Biener + + PR middle-end/87610 + * gcc.dg/torture/restrict-6.c: New testcase. + + 2018-10-25 Richard Biener + + PR tree-optimization/87665 + PR tree-optimization/87745 + * gfortran.dg/20181025-1.f: New testcase. + + 2018-10-24 Richard Biener + + PR tree-optimization/87665 + * gcc.dg/torture/pr87665.c: New testcase. + +2018-11-26 Richard Biener + + Backport from mainline + 2018-06-15 Richard Biener + + PR middle-end/86076 + * gcc.dg/pr86076.c: New testcase. + +2018-11-26 Matthias Klose + + * jit.dg/test-long-names.c: Fix build with -Wformat-security. + +2018-11-25 Thomas Koenig + + Backport from trunk + PR fortran/88073 + * gfortran.dg/where_7.f90: New test. + +2018-11-24 Paul Thomas + + Backport from mainline + PR fortran/88143 + * gfortran.dg/associate_46.f90: New test. + +2018-11-22 Eric Botcazou + + Backport from mainline + 2018-11-21 Jakub Jelinek + + PR rtl-optimization/85925 + * gcc.c-torture/execute/20181120-1.c: Require effective target + int32plus. + (u): New variable. + (main): Compare d against u.f1 rather than 0x101. Use 0x4030201 + instead of 0x10101. + +2018-11-21 Mihail Ionescu + + PR target/87867 + Backport from mainiline + 2018-09-17 Eric Botcazou + + * g++.dg/other/thunk2a.C: New test. + * g++.dg/other/thunk2b.C: Likewise. + +2018-11-20 Richard Biener + + Backport from mainline + 2018-01-26 Richard Biener + + PR rtl-optimization/84003 + * g++.dg/torture/pr77745.C: Mark foo noinline to trigger + latent bug in DSE if NOINLINE is appropriately defined. + * g++.dg/torture/pr77745-2.C: New testcase including pr77745.C + and defining NOINLINE. + +2018-11-20 Eric Botcazou + + * gcc.c-torture/execute/20181120-1.c: New test. + +2018-11-18 Uros Bizjak + + Backport from mainline + 2018-11-11 Uros Bizjak + + PR target/87928 + * gcc.target/i386/pr87928.c: New test. + +2018-11-15 Nathan Sidwell + + PR debug/88006 + PR debug/87462 + * g++.dg/debug/dwarf2/pr87462.C: New. + * g++.dg/debug/dwarf2/pr88006.C: New. + +2018-11-11 Uros Bizjak + + Backport from mainline + 2018-11-04 Uros Bizjak + + PR middle-end/58372 + * g++.dg/pr58372.C: New test. + 2018-11-08 Eric Botcazou * gnat.dg/null_pointer_deref1.adb: Remove -gnatp and add pragma. @@ -530,24 +697,24 @@ 2018-06-18 Martin Sebor - PR middle-end/82063 - * gcc.dg/Walloc-size-larger-than-1.c: New test. - * gcc.dg/Walloc-size-larger-than-10.c: New test. - * gcc.dg/Walloc-size-larger-than-11.c: New test. - * gcc.dg/Walloc-size-larger-than-12.c: New test. - * gcc.dg/Walloc-size-larger-than-13.c: New test. - * gcc.dg/Walloc-size-larger-than-14.c: New test. - * gcc.dg/Walloc-size-larger-than-15.c: New test. - * gcc.dg/Walloc-size-larger-than-16.c: New test. - * gcc.dg/Walloc-size-larger-than-2.c: New test. - * gcc.dg/Walloc-size-larger-than-3.c: New test. - * gcc.dg/Walloc-size-larger-than-4.c: New test. - * gcc.dg/Walloc-size-larger-than-5.c: New test. - * gcc.dg/Walloc-size-larger-than-6.c: New test. - * gcc.dg/Walloc-size-larger-than-7.c: New test. - * gcc.dg/Walloc-size-larger-than-8.c: New test. - * gcc.dg/Walloc-size-larger-than-9.c: New test. - * gcc.dg/Walloc-size-larger-than.c: New test. + PR middle-end/82063 + * gcc.dg/Walloc-size-larger-than-1.c: New test. + * gcc.dg/Walloc-size-larger-than-10.c: New test. + * gcc.dg/Walloc-size-larger-than-11.c: New test. + * gcc.dg/Walloc-size-larger-than-12.c: New test. + * gcc.dg/Walloc-size-larger-than-13.c: New test. + * gcc.dg/Walloc-size-larger-than-14.c: New test. + * gcc.dg/Walloc-size-larger-than-15.c: New test. + * gcc.dg/Walloc-size-larger-than-16.c: New test. + * gcc.dg/Walloc-size-larger-than-2.c: New test. + * gcc.dg/Walloc-size-larger-than-3.c: New test. + * gcc.dg/Walloc-size-larger-than-4.c: New test. + * gcc.dg/Walloc-size-larger-than-5.c: New test. + * gcc.dg/Walloc-size-larger-than-6.c: New test. + * gcc.dg/Walloc-size-larger-than-7.c: New test. + * gcc.dg/Walloc-size-larger-than-8.c: New test. + * gcc.dg/Walloc-size-larger-than-9.c: New test. + * gcc.dg/Walloc-size-larger-than.c: New test. 2018-06-13 Steven G. Kargl diff --git a/gcc/testsuite/g++.dg/cpp1y/constexpr-array6.C b/gcc/testsuite/g++.dg/cpp1y/constexpr-array6.C new file mode 100644 index 00000000000..1f15bef8d0c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/constexpr-array6.C @@ -0,0 +1,26 @@ +// PR c++/87075 +// { dg-do compile { target c++14 } } + +template +struct vec +{ + struct { T y; } n; + vec() = default; +}; + +template +struct S +{ + vec value[2]; + template + constexpr S(const U&); +}; + +template +template +constexpr S::S(const X&) +{ + value[0] = vec(); +} + +Sm(0); diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/pr87462.C b/gcc/testsuite/g++.dg/debug/dwarf2/pr87462.C new file mode 100644 index 00000000000..bfbaad0c413 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/pr87462.C @@ -0,0 +1,20 @@ +// { dg-additional-options "-dA -std=gnu++17 -gdwarf-4 -O1 -fdebug-types-section" } +// reject .pseudo label, but "label" is ok. +// { dg-final { scan-assembler-not "\[^L\"\]_ZN5Test18testFuncEv" } } +// undefined ref to _ZN5Test18testFuncEv + +class Test1 { +public: + static int testFunc() { return 1; } +}; + +template +class TestWrapper { +public: + static T func() __attribute((noinline)) { return (*funcImpl)(); } +}; + +int main() { + return TestWrapper::func(); +} diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/pr88006.C b/gcc/testsuite/g++.dg/debug/dwarf2/pr88006.C new file mode 100644 index 00000000000..86584e17763 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/pr88006.C @@ -0,0 +1,39 @@ +// { dg-additional-options "-dA -std=gnu++17 -gdwarf-4 -O1 -fdebug-types-section" } +// reject .pseudo label, but "label" is ok. +// { dg-final { scan-assembler-not "\[^\"\]_ZN3Foo4mfunEv" } } +// undefined ref to _ZN3Foo4mfunEv + +struct Foo { + void mfun () {} +}; + +struct A { static constexpr bool Value = false; }; + +template struct B { typedef int Type; }; + +class Arg +{ + template struct Local : A {}; + +public: + template ::Value>::Type> + Arg (Init) {} +}; + +class Lambda { + static constexpr int Unused = 0; + +public: + Lambda (Arg); +}; + +// Generated ref to Foo::mfun in the type die of an instantiation of this +template struct Callable {}; + +class I { + I() : lamb ([this] {}) {} + + Lambda lamb; + + Callable<&Foo::mfun> bm; +}; diff --git a/gcc/testsuite/g++.dg/other/thunk1.C b/gcc/testsuite/g++.dg/other/thunk1.C new file mode 100644 index 00000000000..90165628b45 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/thunk1.C @@ -0,0 +1,26 @@ +// PR c++/12007 Multiple inheritance float pass by value fails +// { dg-do run } + +extern "C" void abort (void); + +class gvImpl +{ +public: + virtual void PutVal(float value){} +}; + +class foo { public: virtual void Bar(){} }; + +class myGv: public foo, public gvImpl +{ + void PutVal(float value){ if (value != 3.14159f) abort (); } +}; + +myGv x; +gvImpl* object = &x; + +int main() +{ + object->PutVal(3.14159f); + return 0; +} diff --git a/gcc/testsuite/g++.dg/other/thunk2a.C b/gcc/testsuite/g++.dg/other/thunk2a.C new file mode 100644 index 00000000000..8e5ebd4960d --- /dev/null +++ b/gcc/testsuite/g++.dg/other/thunk2a.C @@ -0,0 +1,15 @@ +// { dg-do compile { target arm*-*-* } } +// { dg-options "-mlong-calls -ffunction-sections" } + +class a { +public: + virtual ~a(); +}; + +class b : virtual a {}; + +class c : b { + ~c(); +}; + +c::~c() {} diff --git a/gcc/testsuite/g++.dg/other/thunk2b.C b/gcc/testsuite/g++.dg/other/thunk2b.C new file mode 100644 index 00000000000..c8f4570923d --- /dev/null +++ b/gcc/testsuite/g++.dg/other/thunk2b.C @@ -0,0 +1,16 @@ +// { dg-do compile { target arm*-*-* } } +// { dg-options "-mlong-calls -ffunction-sections" } +// { dg-additional-options "-fPIC" { target fpic } } + +class a { +public: + virtual ~a(); +}; + +class b : virtual a {}; + +class c : b { + ~c(); +}; + +c::~c() {} diff --git a/gcc/testsuite/g++.dg/other/vthunk1.C b/gcc/testsuite/g++.dg/other/vthunk1.C deleted file mode 100644 index 90165628b45..00000000000 --- a/gcc/testsuite/g++.dg/other/vthunk1.C +++ /dev/null @@ -1,26 +0,0 @@ -// PR c++/12007 Multiple inheritance float pass by value fails -// { dg-do run } - -extern "C" void abort (void); - -class gvImpl -{ -public: - virtual void PutVal(float value){} -}; - -class foo { public: virtual void Bar(){} }; - -class myGv: public foo, public gvImpl -{ - void PutVal(float value){ if (value != 3.14159f) abort (); } -}; - -myGv x; -gvImpl* object = &x; - -int main() -{ - object->PutVal(3.14159f); - return 0; -} diff --git a/gcc/testsuite/g++.dg/pr58372.C b/gcc/testsuite/g++.dg/pr58372.C new file mode 100644 index 00000000000..865f88e987d --- /dev/null +++ b/gcc/testsuite/g++.dg/pr58372.C @@ -0,0 +1,10 @@ +/* PR target/58372 */ +/* { dg-do compile { target { i?86-*-* x86_64-*-* } } } */ +/* { dg-options "-O2" } */ +/* { dg-require-effective-target c++14 } */ + +__attribute__ ((__target__ ("rdrnd"))) +void f (unsigned int *b) noexcept +{ + __builtin_ia32_rdrand32_step (b); +} diff --git a/gcc/testsuite/g++.dg/torture/pr77745-2.C b/gcc/testsuite/g++.dg/torture/pr77745-2.C new file mode 100644 index 00000000000..7861089a817 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr77745-2.C @@ -0,0 +1,4 @@ +// { dg-do run } + +#define NOINLINE __attribute__((noinline)) +#include "pr77745.C" diff --git a/gcc/testsuite/g++.dg/torture/pr77745.C b/gcc/testsuite/g++.dg/torture/pr77745.C index 59d86b5c501..6285bc14a43 100644 --- a/gcc/testsuite/g++.dg/torture/pr77745.C +++ b/gcc/testsuite/g++.dg/torture/pr77745.C @@ -1,8 +1,12 @@ // { dg-do run } +#ifndef NOINLINE +#define NOINLINE /* */ +#endif + inline void* operator new(__SIZE_TYPE__, void* __p) noexcept { return __p; } -long foo(char *c1, char *c2) +long NOINLINE foo(char *c1, char *c2) { long *p1 = new (c1) long; *p1 = 100; diff --git a/gcc/testsuite/gcc.c-torture/execute/20181120-1.c b/gcc/testsuite/gcc.c-torture/execute/20181120-1.c new file mode 100644 index 00000000000..da3d4552a2f --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/20181120-1.c @@ -0,0 +1,28 @@ +/* PR rtl-optimization/85925 */ +/* { dg-require-effective-target int32plus } */ +/* Testcase by */ + +int a, c, d; +volatile int b; +int *e = &d; + +union U1 { + unsigned f0; + unsigned f1 : 15; +}; +volatile union U1 u = { 0x4030201 }; + +int main (void) +{ + for (c = 0; c <= 1; c++) { + union U1 f = {0x4030201}; + if (c == 1) + b; + *e = f.f1; + } + + if (d != u.f1) + __builtin_abort (); + + return 0; +} diff --git a/gcc/testsuite/gcc.dg/pr86076.c b/gcc/testsuite/gcc.dg/pr86076.c new file mode 100644 index 00000000000..390ca47ba12 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr86076.c @@ -0,0 +1,26 @@ +/* { dg-do compile { target pthread } } */ +/* { dg-options "-O2 -ftree-parallelize-loops=2 -fno-tree-dce -fno-tree-pre -fno-tree-vrp --param max-loop-header-insns=1" } */ + +int __attribute__ ((noinline)) +lv (int tm) +{ + (void) tm; + + return 0; +} + +void +o7 (int uu) +{ + while (uu < 1) + while (uu != 0) + { + short int ca; + + ca = lv (0); + (void) ca; + ++uu; + } + + lv (lv (0)); +} diff --git a/gcc/testsuite/gcc.dg/torture/pr79351.c b/gcc/testsuite/gcc.dg/torture/pr79351.c new file mode 100644 index 00000000000..d5d0271c376 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr79351.c @@ -0,0 +1,26 @@ +/* { dg-do run } */ + +static struct state { + int k; + int dummy; +} states[256]; + +__attribute((noinline)) +static void +ismatch(int n) +{ + for (int j=0; j +#include + +static inline uint32_t pow2_ceil_u32(uint32_t x) { + if (x <= 1) { + return x; + } + int msb_on_index; + msb_on_index = (31 ^ __builtin_clz(x - 1)); + assert(msb_on_index < 31); + return 1U << (msb_on_index + 1); +} + +void __attribute__((noinline,noclone)) +die (int a) +{ + if (a) + __builtin_abort (); +} + +void test_pow2_ceil_u32(void) { + unsigned i; + + for (i = 0; i < 18; i++) { + uint32_t a_ = (pow2_ceil_u32(((uint32_t)1) << i)); + if (!(a_ == (((uint32_t)1) << i))) { + die(1); + } + } +} + +int +main(void) { + test_pow2_ceil_u32(); + + return 0; +} diff --git a/gcc/testsuite/gfortran.dg/20181025-1.f b/gcc/testsuite/gfortran.dg/20181025-1.f new file mode 100644 index 00000000000..1acbd72616c --- /dev/null +++ b/gcc/testsuite/gfortran.dg/20181025-1.f @@ -0,0 +1,28 @@ +! { dg-do compile } +! { dg-options "-Ofast" } +! { dg-additional-options "-mavx2" { target { x86_64-*-* i?86-*-* } } } + SUBROUTINE FOO(EF3,CA,ZA,NATA,IC4,NFRGPT) + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + PARAMETER (MXATM=500) + COMMON DE(3,MXATM) + DIMENSION CA(3,NATA) + DIMENSION ZA(NATA) + DIMENSION EF3(3,NFRGPT) + DO II = 1,NATA + XII = XJ - CA(1,II) + YII = YJ - CA(2,II) + ZII = ZJ - CA(3,II) + RJII = SQRT(XII*XII + YII*YII + ZII*ZII) + R3 = RJII*RJII*RJII + IF (IC4.EQ.0) THEN + DE(1,II) = DE(1,II) - S2*ZA(II)*XII/R3 + DE(2,II) = DE(2,II) - S2*ZA(II)*YII/R3 + DE(3,II) = DE(3,II) - S2*ZA(II)*ZII/R3 + ELSE + EF3(1,IC4+II) = EF3(1,IC4+II) - S2*ZA(II)*XII/R3 + EF3(2,IC4+II) = EF3(2,IC4+II) - S2*ZA(II)*YII/R3 + EF3(3,IC4+II) = EF3(3,IC4+II) - S2*ZA(II)*ZII/R3 + END IF + END DO + RETURN + END diff --git a/gcc/testsuite/gfortran.dg/associate_46.f90 b/gcc/testsuite/gfortran.dg/associate_46.f90 new file mode 100644 index 00000000000..69cc189bfa4 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/associate_46.f90 @@ -0,0 +1,37 @@ +! { dg-do run } +! +! Check the fix for PR88143, in which the associate name caused +! a segfault in resolve.c. Make sure that the associate construct +! does its job correctly, as well as compiles. +! +! Contributed by Andrew Wood +! +MODULE m + IMPLICIT NONE + TYPE t + INTEGER, DIMENSION(:), ALLOCATABLE :: i + END TYPE + CONTAINS + SUBROUTINE s(x, idx1, idx2, k) + CLASS(*), DIMENSION(:), INTENT(IN), OPTIONAL :: x + INTEGER :: idx1, idx2, k + SELECT TYPE ( x ) + CLASS IS ( t ) + ASSOCIATE ( j => x(idx1)%i ) + k = j(idx2) + END ASSOCIATE + END SELECT + END +END + + use m + class (t), allocatable :: c(:) + integer :: k + allocate (c(2)) + allocate (c(1)%i, source = [3,2,1]) + allocate (c(2)%i, source = [6,5,4]) + call s(c, 1, 3, k) + if (k .ne. 1) stop 1 + call s(c, 2, 1, k) + if (k .ne. 6) stop 2 +end diff --git a/gcc/testsuite/gfortran.dg/pr70870_1.f90 b/gcc/testsuite/gfortran.dg/pr70870_1.f90 index 0f9584a36db..eeec92143f4 100644 --- a/gcc/testsuite/gfortran.dg/pr70870_1.f90 +++ b/gcc/testsuite/gfortran.dg/pr70870_1.f90 @@ -1,4 +1,5 @@ ! { dg-do compile } +! { dg-options "-std=gnu" } ! PR fortran/70870 ! Contributed by Vittorio Zecca type t diff --git a/gcc/testsuite/gfortran.dg/pr88155.f90 b/gcc/testsuite/gfortran.dg/pr88155.f90 new file mode 100644 index 00000000000..e10eaca2ba6 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr88155.f90 @@ -0,0 +1,9 @@ +! { dg-do compile } +program p + type t + integer :: a + end type + type(t) :: x + data x /t()1/ ! { dg-error "No initializer for component" } + print *, x +end diff --git a/gcc/testsuite/gfortran.dg/pr88205.f90 b/gcc/testsuite/gfortran.dg/pr88205.f90 new file mode 100644 index 00000000000..d9e08069109 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr88205.f90 @@ -0,0 +1,14 @@ +! { dg-do compile } +! PR fortran/88205 +subroutine s1 + real, parameter :: status = 0 + open (newunit=n, status=status) ! { dg-error "STATUS requires" } +end +subroutine s2 + complex, parameter :: status = 0 + open (newunit=n, status=status) ! { dg-error "STATUS requires" } +end +program p + logical, parameter :: status = .false. + open (newunit=a, status=status) ! { dg-error "STATUS requires" } +end diff --git a/gcc/testsuite/gfortran.dg/pr88206.f90 b/gcc/testsuite/gfortran.dg/pr88206.f90 new file mode 100644 index 00000000000..71c61f06098 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr88206.f90 @@ -0,0 +1,8 @@ +! { dg-do compile } +! PR fortran/88206 +program p + integer, parameter :: z(4) = [1,2,3,4] + integer :: k = 2 + print *, [real(z(k))] +end + diff --git a/gcc/testsuite/gfortran.dg/pr88228.f90 b/gcc/testsuite/gfortran.dg/pr88228.f90 new file mode 100644 index 00000000000..cf5bbbe0ae8 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr88228.f90 @@ -0,0 +1,8 @@ +! { dg-do compile } +! { dg-options "-fdec" } +! PR fortran/88228 +program p + integer :: n = .not. 1 + integer :: j = .true. .or. 1 +end + diff --git a/gcc/testsuite/gfortran.dg/pr88249.f90 b/gcc/testsuite/gfortran.dg/pr88249.f90 new file mode 100644 index 00000000000..401fb3514e7 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr88249.f90 @@ -0,0 +1,7 @@ +! { dg-do compile } +program p + backspace (err=1) ! { dg-error "UNIT number missing" } + endfile (err=1) ! { dg-error "UNIT number missing" } + flush (err=1) ! { dg-error "UNIT number missing" } + rewind (err=1) ! { dg-error "UNIT number missing" } +end diff --git a/gcc/testsuite/gfortran.dg/pr88269.f90 b/gcc/testsuite/gfortran.dg/pr88269.f90 new file mode 100644 index 00000000000..6cda5f7a339 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr88269.f90 @@ -0,0 +1,6 @@ +! { dg-do compile } +! PR fortran/88269 +program p + write (end=1e1) ! { dg-error "tag not allowed" } +end + diff --git a/gcc/testsuite/gfortran.dg/where_7.f90 b/gcc/testsuite/gfortran.dg/where_7.f90 new file mode 100644 index 00000000000..1c79ef50553 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/where_7.f90 @@ -0,0 +1,25 @@ +! { dg-do compile } +! { dg-options "-ffrontend-optimize" } +! PR fortran/88073 - this used to ICE with front-end optimization +! Original test case by 'mecej4' +Subroutine tfu (n, x, f) + Implicit None + Integer, Parameter :: double = Kind (0.d0) + Integer, Intent (In) :: n + Real (double), Intent (Out) :: f + Real (double), Intent (In) :: x (n) + Integer :: j + Logical, Dimension(n) :: l1v, l2v, l3v +! + l3v = .False. + l2v = .False. + l1v = (/ (j, j=1, n) /) == 1 + Where ( .Not. (l1v)) + l2v = (/ (j, j=1, n) /) == n + End Where + Where ( .Not. l1v) + l3v = .Not. l2v + End Where + f = sum (x(1:n), mask=l3v) + Return +end subroutine tfu diff --git a/gcc/testsuite/jit.dg/test-long-names.c b/gcc/testsuite/jit.dg/test-long-names.c index 0fc7e676b39..8f4aa7e7026 100644 --- a/gcc/testsuite/jit.dg/test-long-names.c +++ b/gcc/testsuite/jit.dg/test-long-names.c @@ -24,7 +24,7 @@ populate_name (const char *prefix, char *buffer) int i; /* Begin with the given prefix: */ - sprintf (buffer, prefix); + sprintf (buffer, "%s", prefix); /* Populate the rest of the buffer with 0123456789 repeatedly: */ for (i = strlen (prefix); i < NAME_LENGTH - 1; i++) diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index 4f09c827d9e..f9d75c5f64d 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -6640,7 +6640,16 @@ move_stmt_op (tree *tp, int *walk_subtrees, void *data) ; else if (block == p->orig_block || p->orig_block == NULL_TREE) - TREE_SET_BLOCK (t, p->new_block); + { + /* tree_node_can_be_shared says we can share invariant + addresses but unshare_expr copies them anyways. Make sure + to unshare before adjusting the block in place - we do not + always see a copy here. */ + if (TREE_CODE (t) == ADDR_EXPR + && is_gimple_min_invariant (t)) + *tp = t = unshare_expr (t); + TREE_SET_BLOCK (t, p->new_block); + } else if (flag_checking) { while (block && TREE_CODE (block) == BLOCK && block != p->orig_block) diff --git a/gcc/tree-ssa-loop-ch.c b/gcc/tree-ssa-loop-ch.c index 86be34a1ac7..923efa42a69 100644 --- a/gcc/tree-ssa-loop-ch.c +++ b/gcc/tree-ssa-loop-ch.c @@ -57,7 +57,8 @@ should_duplicate_loop_header_p (basic_block header, struct loop *loop, be true, since quite often it is possible to verify that the condition is satisfied in the first iteration and therefore to eliminate it. Jump threading handles these cases now. */ - if (optimize_loop_for_size_p (loop)) + if (optimize_loop_for_size_p (loop) + && !loop->force_vectorize) { if (dump_file && (dump_flags & TDF_DETAILS)) fprintf (dump_file, diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c index 00bb229b4a2..8e7052f950e 100644 --- a/gcc/tree-ssa-sccvn.c +++ b/gcc/tree-ssa-sccvn.c @@ -1936,6 +1936,7 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *vr_, base2 = get_ref_base_and_extent (gimple_assign_lhs (def_stmt), &offset2, &size2, &maxsize2, &reverse); if (maxsize2 != -1 + && maxsize2 == size2 && operand_equal_p (base, base2, 0) && offset2 <= offset && offset2 + size2 >= offset + maxsize) diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c index 33ad80efe3c..b5a5f0f54d1 100644 --- a/gcc/tree-ssa-structalias.c +++ b/gcc/tree-ssa-structalias.c @@ -7274,6 +7274,7 @@ delete_points_to_sets (void) struct vls_data { unsigned short clique; + bool escaped_p; bitmap rvars; }; @@ -7285,6 +7286,7 @@ visit_loadstore (gimple *, tree base, tree ref, void *data) { unsigned short clique = ((vls_data *) data)->clique; bitmap rvars = ((vls_data *) data)->rvars; + bool escaped_p = ((vls_data *) data)->escaped_p; if (TREE_CODE (base) == MEM_REF || TREE_CODE (base) == TARGET_MEM_REF) { @@ -7305,7 +7307,8 @@ visit_loadstore (gimple *, tree base, tree ref, void *data) return false; vi = get_varinfo (find (vi->id)); - if (bitmap_intersect_p (rvars, vi->solution)) + if (bitmap_intersect_p (rvars, vi->solution) + || (escaped_p && bitmap_bit_p (vi->solution, escaped_id))) return false; } @@ -7382,6 +7385,7 @@ compute_dependence_clique (void) unsigned short clique = 0; unsigned short last_ruid = 0; bitmap rvars = BITMAP_ALLOC (NULL); + bool escaped_p = false; for (unsigned i = 0; i < num_ssa_names; ++i) { tree ptr = ssa_name (i); @@ -7451,7 +7455,12 @@ compute_dependence_clique (void) last_ruid); } if (used) - bitmap_set_bit (rvars, restrict_var->id); + { + bitmap_set_bit (rvars, restrict_var->id); + varinfo_t escaped = get_varinfo (find (escaped_id)); + if (bitmap_bit_p (escaped->solution, restrict_var->id)) + escaped_p = true; + } } } @@ -7464,7 +7473,7 @@ compute_dependence_clique (void) parameters) we can't restrict scoping properly thus the following is too aggressive there. For now we have excluded those globals from getting into the MR_DEPENDENCE machinery. */ - vls_data data = { clique, rvars }; + vls_data data = { clique, escaped_p, rvars }; basic_block bb; FOR_EACH_BB_FN (bb, cfun) for (gimple_stmt_iterator gsi = gsi_start_bb (bb); diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c index f0e97060d7b..9c32d9a90ee 100644 --- a/gcc/tree-vect-data-refs.c +++ b/gcc/tree-vect-data-refs.c @@ -195,6 +195,45 @@ vect_mark_for_runtime_alias_test (ddr_p ddr, loop_vec_info loop_vinfo) } +/* Return true if we know that the order of vectorized STMT_A and + vectorized STMT_B will be the same as the order of STMT_A and STMT_B. + At least one of the statements is a write. */ + +static bool +vect_preserves_scalar_order_p (gimple *stmt_a, gimple *stmt_b) +{ + stmt_vec_info stmtinfo_a = vinfo_for_stmt (stmt_a); + stmt_vec_info stmtinfo_b = vinfo_for_stmt (stmt_b); + + /* Single statements are always kept in their original order. */ + if (!STMT_VINFO_GROUPED_ACCESS (stmtinfo_a) + && !STMT_VINFO_GROUPED_ACCESS (stmtinfo_b)) + return true; + + /* STMT_A and STMT_B belong to overlapping groups. All loads in a + group are emitted at the position of the last scalar load and all + stores in a group are emitted at the position of the last scalar store. + Compute that position and check whether the resulting order matches + the current one. */ + gimple *last_a = GROUP_FIRST_ELEMENT (stmtinfo_a); + if (last_a) + for (gimple *s = GROUP_NEXT_ELEMENT (vinfo_for_stmt (last_a)); s; + s = GROUP_NEXT_ELEMENT (vinfo_for_stmt (s))) + last_a = get_later_stmt (last_a, s); + else + last_a = stmt_a; + gimple *last_b = GROUP_FIRST_ELEMENT (stmtinfo_b); + if (last_b) + for (gimple *s = GROUP_NEXT_ELEMENT (vinfo_for_stmt (last_b)); s; + s = GROUP_NEXT_ELEMENT (vinfo_for_stmt (s))) + last_b = get_later_stmt (last_b, s); + else + last_b = stmt_b; + return ((get_later_stmt (last_a, last_b) == last_a) + == (get_later_stmt (stmt_a, stmt_b) == stmt_a)); +} + + /* Function vect_analyze_data_ref_dependence. Return TRUE if there (might) exist a dependence between a memory-reference @@ -378,20 +417,13 @@ vect_analyze_data_ref_dependence (struct data_dependence_relation *ddr, ... = a[i]; a[i+1] = ...; where loads from the group interleave with the store. */ - if (STMT_VINFO_GROUPED_ACCESS (stmtinfo_a) - || STMT_VINFO_GROUPED_ACCESS (stmtinfo_b)) + if (!vect_preserves_scalar_order_p (DR_STMT (dra), DR_STMT (drb))) { - gimple *earlier_stmt; - earlier_stmt = get_earlier_stmt (DR_STMT (dra), DR_STMT (drb)); - if (DR_IS_WRITE - (STMT_VINFO_DATA_REF (vinfo_for_stmt (earlier_stmt)))) - { - if (dump_enabled_p ()) - dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, - "READ_WRITE dependence in interleaving." - "\n"); - return true; - } + if (dump_enabled_p ()) + dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, + "READ_WRITE dependence in interleaving." + "\n"); + return true; } unsigned int step_prec = TYPE_PRECISION (TREE_TYPE (DR_STEP (dra))); diff --git a/gcc/tree-vect-generic.c b/gcc/tree-vect-generic.c index c1b3c24a0b4..2e6dbcc0215 100644 --- a/gcc/tree-vect-generic.c +++ b/gcc/tree-vect-generic.c @@ -89,12 +89,8 @@ build_word_mode_vector_type (int nunits) return vector_last_type; } - /* We build a new type, but we canonicalize it nevertheless, - because it still saves some memory. */ vector_last_nunits = nunits; - vector_last_type = type_hash_canon (nunits, - build_vector_type (vector_inner_type, - nunits)); + vector_last_type = build_vector_type (vector_inner_type, nunits); return vector_last_type; } diff --git a/gcc/tree-vectorizer.h b/gcc/tree-vectorizer.h index 12bb904abee..276289bd8cf 100644 --- a/gcc/tree-vectorizer.h +++ b/gcc/tree-vectorizer.h @@ -833,32 +833,22 @@ set_vinfo_for_stmt (gimple *stmt, stmt_vec_info info) } } -/* Return the earlier statement between STMT1 and STMT2. */ +/* Return TRUE if a statement represented by STMT_INFO is a part of a + pattern. */ -static inline gimple * -get_earlier_stmt (gimple *stmt1, gimple *stmt2) +static inline bool +is_pattern_stmt_p (stmt_vec_info stmt_info) { - unsigned int uid1, uid2; - - if (stmt1 == NULL) - return stmt2; - - if (stmt2 == NULL) - return stmt1; - - uid1 = gimple_uid (stmt1); - uid2 = gimple_uid (stmt2); - - if (uid1 == 0 || uid2 == 0) - return NULL; + gimple *related_stmt; + stmt_vec_info related_stmt_info; - gcc_checking_assert (uid1 <= stmt_vec_info_vec.length () - && uid2 <= stmt_vec_info_vec.length ()); + related_stmt = STMT_VINFO_RELATED_STMT (stmt_info); + if (related_stmt + && (related_stmt_info = vinfo_for_stmt (related_stmt)) + && STMT_VINFO_IN_PATTERN_P (related_stmt_info)) + return true; - if (uid1 < uid2) - return stmt1; - else - return stmt2; + return false; } /* Return the later statement between STMT1 and STMT2. */ @@ -874,8 +864,12 @@ get_later_stmt (gimple *stmt1, gimple *stmt2) if (stmt2 == NULL) return stmt1; - uid1 = gimple_uid (stmt1); - uid2 = gimple_uid (stmt2); + stmt_vec_info stmt_info1 = vinfo_for_stmt (stmt1); + stmt_vec_info stmt_info2 = vinfo_for_stmt (stmt2); + uid1 = gimple_uid (is_pattern_stmt_p (stmt_info1) + ? STMT_VINFO_RELATED_STMT (stmt_info1) : stmt1); + uid2 = gimple_uid (is_pattern_stmt_p (stmt_info2) + ? STMT_VINFO_RELATED_STMT (stmt_info2) : stmt2); if (uid1 == 0 || uid2 == 0) return NULL; @@ -889,24 +883,6 @@ get_later_stmt (gimple *stmt1, gimple *stmt2) return stmt2; } -/* Return TRUE if a statement represented by STMT_INFO is a part of a - pattern. */ - -static inline bool -is_pattern_stmt_p (stmt_vec_info stmt_info) -{ - gimple *related_stmt; - stmt_vec_info related_stmt_info; - - related_stmt = STMT_VINFO_RELATED_STMT (stmt_info); - if (related_stmt - && (related_stmt_info = vinfo_for_stmt (related_stmt)) - && STMT_VINFO_IN_PATTERN_P (related_stmt_info)) - return true; - - return false; -} - /* Return true if BB is a loop header. */ static inline bool diff --git a/gcc/vmsdbgout.c b/gcc/vmsdbgout.c index 41928a400a9..aef4013d1f4 100644 --- a/gcc/vmsdbgout.c +++ b/gcc/vmsdbgout.c @@ -147,6 +147,7 @@ static int write_srccorrs (int); static void vmsdbgout_init (const char *); static void vmsdbgout_finish (const char *); +static void vmsdbgout_early_finish (const char *); static void vmsdbgout_assembly_start (void); static void vmsdbgout_define (unsigned int, const char *); static void vmsdbgout_undef (unsigned int, const char *); @@ -176,7 +177,7 @@ static void vmsdbgout_abstract_function (tree); const struct gcc_debug_hooks vmsdbg_debug_hooks = {vmsdbgout_init, vmsdbgout_finish, - debug_nothing_charstar, + vmsdbgout_early_finish, vmsdbgout_assembly_start, vmsdbgout_define, vmsdbgout_undef, @@ -1554,6 +1555,13 @@ vmsdbgout_abstract_function (tree decl) (*dwarf2_debug_hooks.outlining_inline_function) (decl); } +static void +vmsdbgout_early_finish (const char *filename) +{ + if (write_symbols == VMS_AND_DWARF2_DEBUG) + (*dwarf2_debug_hooks.early_finish) (filename); +} + /* Output stuff that Debug requires at the end of every file and generate the VMS Debug debugging info. */ diff --git a/gnattools/ChangeLog b/gnattools/ChangeLog index 9139933defa..3a5970ccba5 100644 --- a/gnattools/ChangeLog +++ b/gnattools/ChangeLog @@ -1,3 +1,7 @@ +2018-12-06 Release Manager + + * GCC 7.4.0 released. + 2018-01-25 Release Manager * GCC 7.3.0 released. diff --git a/gotools/ChangeLog b/gotools/ChangeLog index 870fca90988..8172b5aac0b 100644 --- a/gotools/ChangeLog +++ b/gotools/ChangeLog @@ -1,3 +1,7 @@ +2018-12-06 Release Manager + + * GCC 7.4.0 released. + 2018-01-25 Release Manager * GCC 7.3.0 released. diff --git a/include/ChangeLog b/include/ChangeLog index 2bea3cbfe37..7e3c033bfab 100644 --- a/include/ChangeLog +++ b/include/ChangeLog @@ -1,3 +1,7 @@ +2018-12-06 Release Manager + + * GCC 7.4.0 released. + 2018-01-25 Release Manager * GCC 7.3.0 released. diff --git a/intl/ChangeLog b/intl/ChangeLog index b835f641642..b3b02c97b36 100644 --- a/intl/ChangeLog +++ b/intl/ChangeLog @@ -1,3 +1,7 @@ +2018-12-06 Release Manager + + * GCC 7.4.0 released. + 2018-01-25 Release Manager * GCC 7.3.0 released. diff --git a/libada/ChangeLog b/libada/ChangeLog index 452a58a4d48..e55648ad480 100644 --- a/libada/ChangeLog +++ b/libada/ChangeLog @@ -1,3 +1,7 @@ +2018-12-06 Release Manager + + * GCC 7.4.0 released. + 2018-06-22 Jakub Jelinek Backported from mainline diff --git a/libatomic/ChangeLog b/libatomic/ChangeLog index 5faddcc6a7a..a76c095b1b7 100644 --- a/libatomic/ChangeLog +++ b/libatomic/ChangeLog @@ -1,3 +1,7 @@ +2018-12-06 Release Manager + + * GCC 7.4.0 released. + 2018-06-22 Jakub Jelinek Backported from mainline diff --git a/libbacktrace/ChangeLog b/libbacktrace/ChangeLog index 2d8810bd83f..0bd76863013 100644 --- a/libbacktrace/ChangeLog +++ b/libbacktrace/ChangeLog @@ -1,3 +1,7 @@ +2018-12-06 Release Manager + + * GCC 7.4.0 released. + 2018-01-25 Release Manager * GCC 7.3.0 released. diff --git a/libcc1/ChangeLog b/libcc1/ChangeLog index 98501d05276..45a9fc935b3 100644 --- a/libcc1/ChangeLog +++ b/libcc1/ChangeLog @@ -1,3 +1,7 @@ +2018-12-06 Release Manager + + * GCC 7.4.0 released. + 2018-06-22 Jakub Jelinek Backported from mainline diff --git a/libcilkrts/ChangeLog b/libcilkrts/ChangeLog index 1893d0dfbfb..2fd6f1c6f36 100644 --- a/libcilkrts/ChangeLog +++ b/libcilkrts/ChangeLog @@ -1,3 +1,7 @@ +2018-12-06 Release Manager + + * GCC 7.4.0 released. + 2018-06-22 Jakub Jelinek Backported from mainline diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog index 84167121915..a320882ab0d 100644 --- a/libcpp/ChangeLog +++ b/libcpp/ChangeLog @@ -1,3 +1,7 @@ +2018-12-06 Release Manager + + * GCC 7.4.0 released. + 2018-03-03 Jakub Jelinek Backported from mainline diff --git a/libcpp/po/ChangeLog b/libcpp/po/ChangeLog index df61ee5fe50..17b719d7978 100644 --- a/libcpp/po/ChangeLog +++ b/libcpp/po/ChangeLog @@ -1,3 +1,7 @@ +2018-12-06 Release Manager + + * GCC 7.4.0 released. + 2018-01-25 Release Manager * GCC 7.3.0 released. diff --git a/libdecnumber/ChangeLog b/libdecnumber/ChangeLog index 008d54f5652..13cda41ec8a 100644 --- a/libdecnumber/ChangeLog +++ b/libdecnumber/ChangeLog @@ -1,3 +1,7 @@ +2018-12-06 Release Manager + + * GCC 7.4.0 released. + 2018-01-25 Release Manager * GCC 7.3.0 released. diff --git a/libffi/ChangeLog b/libffi/ChangeLog index f3136eabbc2..944b6085cb2 100644 --- a/libffi/ChangeLog +++ b/libffi/ChangeLog @@ -1,3 +1,7 @@ +2018-12-06 Release Manager + + * GCC 7.4.0 released. + 2018-06-22 Jakub Jelinek Backported from mainline diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog index 3808a8090be..64fb43fdd27 100644 --- a/libgcc/ChangeLog +++ b/libgcc/ChangeLog @@ -1,3 +1,7 @@ +2018-12-06 Release Manager + + * GCC 7.4.0 released. + 2018-08-17 John David Anglin Backport from mainline diff --git a/libgcc/config/libbid/ChangeLog b/libgcc/config/libbid/ChangeLog index 3d38f5fde4a..8e3fd557305 100644 --- a/libgcc/config/libbid/ChangeLog +++ b/libgcc/config/libbid/ChangeLog @@ -1,3 +1,7 @@ +2018-12-06 Release Manager + + * GCC 7.4.0 released. + 2018-01-25 Release Manager * GCC 7.3.0 released. diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 43af6bb3a6d..0aec54a5448 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,14 @@ +2018-12-06 Janne Blomqvist + + Backport from trunk + PR libfortran/88137 + * runtime/backtrace.c (show_backtrace): Store backtrace state in a + static variable, initialize once. + +2018-12-06 Release Manager + + * GCC 7.4.0 released. + 2018-10-13 Gerald Pfeifer Backport from trunk diff --git a/libgfortran/runtime/backtrace.c b/libgfortran/runtime/backtrace.c index 77dd4d5f0ac..d7e72c80460 100644 --- a/libgfortran/runtime/backtrace.c +++ b/libgfortran/runtime/backtrace.c @@ -135,14 +135,23 @@ full_callback (void *data, uintptr_t pc, const char *filename, void show_backtrace (bool in_signal_handler) { + /* Note that libbacktrace allows the state to be accessed from + multiple threads, so we don't need to use a TLS variable for the + state here. */ + static struct backtrace_state *lbstate_saved; struct backtrace_state *lbstate; struct mystate state = { 0, false, in_signal_handler }; - - lbstate = backtrace_create_state (NULL, __gthread_active_p (), - error_callback, NULL); - if (lbstate == NULL) - return; + lbstate = __atomic_load_n (&lbstate_saved, __ATOMIC_RELAXED); + if (!lbstate) + { + lbstate = backtrace_create_state (NULL, __gthread_active_p (), + error_callback, NULL); + if (lbstate) + __atomic_store_n (&lbstate_saved, lbstate, __ATOMIC_RELAXED); + else + return; + } if (!BACKTRACE_SUPPORTED || (in_signal_handler && BACKTRACE_USES_MALLOC)) { diff --git a/libgo/mksysinfo.sh b/libgo/mksysinfo.sh index 2284928ae53..3c2c2d2ad01 100755 --- a/libgo/mksysinfo.sh +++ b/libgo/mksysinfo.sh @@ -1088,7 +1088,20 @@ grep '^type _rlimit ' gen-sysinfo.go | \ grep '^const _RLIMIT_' gen-sysinfo.go | sed -e 's/^\(const \)_\(RLIMIT_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT} grep '^const _RLIM_' gen-sysinfo.go | + grep -v '^const _RLIM_INFINITY ' | sed -e 's/^\(const \)_\(RLIM_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT} +rliminf="" +if test "${rlimit}" = "_rlimit64" && grep '^const _RLIM64_INFINITY ' gen-sysinfo.go > /dev/null 2>&1; then + rliminf=`grep '^const _RLIM64_INFINITY ' gen-sysinfo.go | sed -e 's/.* //'` +else + rliminf=`grep '^const _RLIM_INFINITY ' gen-sysinfo.go | sed -e 's/.* //'` +fi +# For compatibility with the gc syscall package, treat 0xffffffffffffffff as -1. +if test "$rliminf" = "0xffffffffffffffff"; then + echo "const RLIM_INFINITY = -1" >> ${OUT} +elif test -n "$rliminf"; then + echo "const RLIM_INFINITY = $rliminf" >> ${OUT} +fi # The sysinfo struct. grep '^type _sysinfo ' gen-sysinfo.go | \ diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog index 78eb3d74c76..24d1d0a719f 100644 --- a/libgomp/ChangeLog +++ b/libgomp/ChangeLog @@ -1,3 +1,7 @@ +2018-12-06 Release Manager + + * GCC 7.4.0 released. + 2018-10-12 Jakub Jelinek Backported from mainline diff --git a/libhsail-rt/ChangeLog b/libhsail-rt/ChangeLog index 5d18dbb66b4..7ff52019a9a 100644 --- a/libhsail-rt/ChangeLog +++ b/libhsail-rt/ChangeLog @@ -1,3 +1,7 @@ +2018-12-06 Release Manager + + * GCC 7.4.0 released. + 2018-06-22 Jakub Jelinek Backported from mainline diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog index 400b33b7527..b785e710df3 100644 --- a/libiberty/ChangeLog +++ b/libiberty/ChangeLog @@ -1,3 +1,7 @@ +2018-12-06 Release Manager + + * GCC 7.4.0 released. + 2018-01-25 Release Manager * GCC 7.3.0 released. diff --git a/libitm/ChangeLog b/libitm/ChangeLog index 2d2fee851d0..846e1b0ecfb 100644 --- a/libitm/ChangeLog +++ b/libitm/ChangeLog @@ -1,3 +1,7 @@ +2018-12-06 Release Manager + + * GCC 7.4.0 released. + 2018-06-22 Jakub Jelinek Backported from mainline diff --git a/libmpx/ChangeLog b/libmpx/ChangeLog index e10a10c719b..04d36796899 100644 --- a/libmpx/ChangeLog +++ b/libmpx/ChangeLog @@ -1,3 +1,7 @@ +2018-12-06 Release Manager + + * GCC 7.4.0 released. + 2018-06-22 Jakub Jelinek Backported from mainline diff --git a/libobjc/ChangeLog b/libobjc/ChangeLog index 1f1e198cc45..74053657fe1 100644 --- a/libobjc/ChangeLog +++ b/libobjc/ChangeLog @@ -1,3 +1,7 @@ +2018-12-06 Release Manager + + * GCC 7.4.0 released. + 2018-06-22 Jakub Jelinek Backported from mainline diff --git a/liboffloadmic/ChangeLog b/liboffloadmic/ChangeLog index 2b20f8a3f1a..309efad6602 100644 --- a/liboffloadmic/ChangeLog +++ b/liboffloadmic/ChangeLog @@ -1,3 +1,7 @@ +2018-12-06 Release Manager + + * GCC 7.4.0 released. + 2018-06-22 Jakub Jelinek Backported from mainline diff --git a/libquadmath/ChangeLog b/libquadmath/ChangeLog index 004c808fb3d..aea32d500bb 100644 --- a/libquadmath/ChangeLog +++ b/libquadmath/ChangeLog @@ -1,3 +1,7 @@ +2018-12-06 Release Manager + + * GCC 7.4.0 released. + 2018-06-22 Jakub Jelinek Backported from mainline diff --git a/libsanitizer/ChangeLog b/libsanitizer/ChangeLog index 8eab49f00b4..d2921321d7a 100644 --- a/libsanitizer/ChangeLog +++ b/libsanitizer/ChangeLog @@ -1,3 +1,7 @@ +2018-12-06 Release Manager + + * GCC 7.4.0 released. + 2018-08-16 Martin Liska Backport from mainline diff --git a/libssp/ChangeLog b/libssp/ChangeLog index 9ae263e73ba..e77959abbc7 100644 --- a/libssp/ChangeLog +++ b/libssp/ChangeLog @@ -1,3 +1,7 @@ +2018-12-06 Release Manager + + * GCC 7.4.0 released. + 2018-06-22 Jakub Jelinek Backported from mainline diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 15ca57cd006..a342ff4e44f 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,16 @@ +2018-12-06 Release Manager + + * GCC 7.4.0 released. + +2018-11-28 François Dumont + + PR libstdc++/88199 + * include/bits/hashtable.h + (_Hashtable<>::_M_move_assign(_Hashtable&&, false_type)): Deallocate + former buckets after assignment. + * testsuite/23_containers/unordered_set/allocator/move_assign.cc + (test03): New. + 2018-10-31 Jonathan Wakely Backport from mainline diff --git a/libstdc++-v3/include/bits/hashtable.h b/libstdc++-v3/include/bits/hashtable.h index e0806dc93a1..e9c349ac956 100644 --- a/libstdc++-v3/include/bits/hashtable.h +++ b/libstdc++-v3/include/bits/hashtable.h @@ -1206,6 +1206,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _M_assign(__ht, [&__roan](__node_type* __n) { return __roan(std::move_if_noexcept(__n->_M_v())); }); + + if (__former_buckets) + _M_deallocate_buckets(__former_buckets, __former_bucket_count); __ht.clear(); } __catch(...) diff --git a/libstdc++-v3/testsuite/23_containers/unordered_set/allocator/move_assign.cc b/libstdc++-v3/testsuite/23_containers/unordered_set/allocator/move_assign.cc index 01d4dd6c0a1..75006fadd5b 100644 --- a/libstdc++-v3/testsuite/23_containers/unordered_set/allocator/move_assign.cc +++ b/libstdc++-v3/testsuite/23_containers/unordered_set/allocator/move_assign.cc @@ -18,71 +18,133 @@ // { dg-do run { target c++11 } } #include + #include #include #include using __gnu_test::propagating_allocator; using __gnu_test::counter_type; +using __gnu_test::tracker_allocator; +using __gnu_test::tracker_allocator_counter; void test01() { - typedef propagating_allocator alloc_type; - typedef __gnu_test::counter_type_hasher hash; - typedef std::unordered_set, - alloc_type> test_type; + tracker_allocator_counter::reset(); + { + typedef propagating_allocator> alloc_type; + typedef __gnu_test::counter_type_hasher hash; + typedef std::unordered_set, + alloc_type> test_type; + + test_type v1(alloc_type(1)); + v1.emplace(0); - test_type v1(alloc_type(1)); - v1.emplace(0); + test_type v2(alloc_type(2)); + v2.emplace(1); - test_type v2(alloc_type(2)); - v2.emplace(1); + counter_type::reset(); - counter_type::reset(); + v2 = std::move(v1); - v2 = std::move(v1); + VERIFY( 1 == v1.get_allocator().get_personality() ); + VERIFY( 2 == v2.get_allocator().get_personality() ); - VERIFY( 1 == v1.get_allocator().get_personality() ); - VERIFY( 2 == v2.get_allocator().get_personality() ); + VERIFY( counter_type::move_count == 1 ); + VERIFY( counter_type::destructor_count == 2 ); + } - VERIFY( counter_type::move_count == 1 ); - VERIFY( counter_type::destructor_count == 2 ); + // Check there's nothing left allocated or constructed. + VERIFY( tracker_allocator_counter::get_construct_count() + == tracker_allocator_counter::get_destruct_count() ); + VERIFY( tracker_allocator_counter::get_allocation_count() + == tracker_allocator_counter::get_deallocation_count() ); } void test02() { - typedef propagating_allocator alloc_type; - typedef __gnu_test::counter_type_hasher hash; - typedef std::unordered_set, - alloc_type> test_type; + tracker_allocator_counter::reset(); + { + typedef propagating_allocator> alloc_type; + typedef __gnu_test::counter_type_hasher hash; + typedef std::unordered_set, + alloc_type> test_type; + + test_type v1(alloc_type(1)); + v1.emplace(0); - test_type v1(alloc_type(1)); - v1.emplace(0); + auto it = v1.begin(); - auto it = v1.begin(); + test_type v2(alloc_type(2)); + v2.emplace(0); - test_type v2(alloc_type(2)); - v2.emplace(0); + counter_type::reset(); - counter_type::reset(); + v2 = std::move(v1); - v2 = std::move(v1); + VERIFY(0 == v1.get_allocator().get_personality()); + VERIFY(1 == v2.get_allocator().get_personality()); - VERIFY(0 == v1.get_allocator().get_personality()); - VERIFY(1 == v2.get_allocator().get_personality()); + VERIFY( counter_type::move_count == 0 ); + VERIFY( counter_type::copy_count == 0 ); + VERIFY( counter_type::destructor_count == 1 ); - VERIFY( counter_type::move_count == 0 ); - VERIFY( counter_type::copy_count == 0 ); - VERIFY( counter_type::destructor_count == 1 ); + VERIFY( it == v2.begin() ); + } - VERIFY( it == v2.begin() ); + // Check there's nothing left allocated or constructed. + VERIFY( tracker_allocator_counter::get_construct_count() + == tracker_allocator_counter::get_destruct_count() ); + VERIFY( tracker_allocator_counter::get_allocation_count() + == tracker_allocator_counter::get_deallocation_count() ); +} + +void test03() +{ + tracker_allocator_counter::reset(); + { + typedef propagating_allocator> alloc_type; + typedef __gnu_test::counter_type_hasher hash; + typedef std::unordered_set, + alloc_type> test_type; + + test_type v1(alloc_type(1)); + v1.emplace(0); + + test_type v2(alloc_type(2)); + int i = 0; + v2.emplace(i++); + for (; v2.bucket_count() == v1.bucket_count(); ++i) + v2.emplace(i); + + counter_type::reset(); + + v2 = std::move(v1); + + VERIFY( 1 == v1.get_allocator().get_personality() ); + VERIFY( 2 == v2.get_allocator().get_personality() ); + + VERIFY( counter_type::move_count == 1 ); + VERIFY( counter_type::destructor_count == i + 1 ); + } + + // Check there's nothing left allocated or constructed. + VERIFY( tracker_allocator_counter::get_construct_count() + == tracker_allocator_counter::get_destruct_count() ); + VERIFY( tracker_allocator_counter::get_allocation_count() + == tracker_allocator_counter::get_deallocation_count() ); } int main() { test01(); test02(); + test03(); return 0; } diff --git a/libvtv/ChangeLog b/libvtv/ChangeLog index 1f5a9f6deb8..c77d1b3bdac 100644 --- a/libvtv/ChangeLog +++ b/libvtv/ChangeLog @@ -1,3 +1,7 @@ +2018-12-06 Release Manager + + * GCC 7.4.0 released. + 2018-06-22 Jakub Jelinek Backported from mainline diff --git a/lto-plugin/ChangeLog b/lto-plugin/ChangeLog index 954d7821cd0..64e4369b19c 100644 --- a/lto-plugin/ChangeLog +++ b/lto-plugin/ChangeLog @@ -1,3 +1,7 @@ +2018-12-06 Release Manager + + * GCC 7.4.0 released. + 2018-01-25 Release Manager * GCC 7.3.0 released. diff --git a/maintainer-scripts/ChangeLog b/maintainer-scripts/ChangeLog index 656bdfa253b..96f7953d9e5 100644 --- a/maintainer-scripts/ChangeLog +++ b/maintainer-scripts/ChangeLog @@ -1,3 +1,7 @@ +2018-12-06 Release Manager + + * GCC 7.4.0 released. + 2018-01-25 Release Manager * GCC 7.3.0 released. diff --git a/zlib/ChangeLog b/zlib/ChangeLog index 4d613481e75..a8de51f66e9 100644 --- a/zlib/ChangeLog +++ b/zlib/ChangeLog @@ -1,3 +1,7 @@ +2018-12-06 Release Manager + + * GCC 7.4.0 released. + 2018-01-25 Release Manager * GCC 7.3.0 released. -- cgit v1.2.3