aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaxim Kuvyrkov <maxim.kuvyrkov@linaro.org>2018-12-13 11:59:47 +0000
committerMaxim Kuvyrkov <maxim.kuvyrkov@linaro.org>2018-12-13 11:59:47 +0000
commitb2e305bdc4601a1f98f2cf49114235727b419711 (patch)
treee06ebd0da23340e00b520effa6fd2489b39773ed
parent89f1ff7eba467df127b22540e83cfff4c81afb61 (diff)
Merge branches/gcc-7-branch rev 267072.
Change-Id: I83ceab6336401e9ffe788b948ba29c3fdadea973
-rw-r--r--ChangeLog4
-rw-r--r--config/ChangeLog4
-rw-r--r--contrib/ChangeLog4
-rw-r--r--contrib/header-tools/ChangeLog4
-rw-r--r--contrib/reghunt/ChangeLog4
-rw-r--r--contrib/regression/ChangeLog4
-rw-r--r--fixincludes/ChangeLog4
-rw-r--r--gcc/BASE-VER2
-rw-r--r--gcc/ChangeLog215
-rw-r--r--gcc/DATESTAMP2
-rw-r--r--gcc/ada/ChangeLog14
-rw-r--r--gcc/ada/gcc-interface/misc.c12
-rw-r--r--gcc/brig/ChangeLog4
-rw-r--r--gcc/c-family/ChangeLog4
-rw-r--r--gcc/c/ChangeLog4
-rw-r--r--gcc/cfgexpand.c14
-rw-r--r--gcc/combine.c1
-rw-r--r--gcc/config/arm/arm.c23
-rw-r--r--gcc/config/darwin.c17
-rw-r--r--gcc/config/darwin.h4
-rw-r--r--gcc/config/i386/cygming.h3
-rw-r--r--gcc/config/i386/darwin.h3
-rw-r--r--gcc/config/i386/emmintrin.h7
-rw-r--r--gcc/config/i386/i386.h3
-rw-r--r--gcc/config/i386/sse.md11
-rw-r--r--gcc/config/rs6000/rs6000.c12
-rw-r--r--gcc/config/s390/s390.md16
-rw-r--r--gcc/cp/ChangeLog15
-rw-r--r--gcc/cp/constexpr.c15
-rw-r--r--gcc/doc/invoke.texi10
-rw-r--r--gcc/dse.c7
-rw-r--r--gcc/dwarf2out.c13
-rw-r--r--gcc/final.c3
-rw-r--r--gcc/fortran/ChangeLog57
-rw-r--r--gcc/fortran/frontend-passes.c4
-rw-r--r--gcc/fortran/gfortran.h2
-rw-r--r--gcc/fortran/io.c83
-rw-r--r--gcc/fortran/match.c5
-rw-r--r--gcc/fortran/primary.c1
-rw-r--r--gcc/fortran/resolve.c8
-rw-r--r--gcc/gimple-match-head.c43
-rw-r--r--gcc/go/ChangeLog4
-rw-r--r--gcc/jit/ChangeLog4
-rw-r--r--gcc/lto/ChangeLog4
-rw-r--r--gcc/objc/ChangeLog4
-rw-r--r--gcc/objcp/ChangeLog4
-rw-r--r--gcc/po/ChangeLog4
-rw-r--r--gcc/rtl.h19
-rw-r--r--gcc/rtlanal.c30
-rw-r--r--gcc/testsuite/ChangeLog203
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/constexpr-array6.C26
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/pr87462.C20
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/pr88006.C39
-rw-r--r--gcc/testsuite/g++.dg/other/thunk1.C (renamed from gcc/testsuite/g++.dg/other/vthunk1.C)0
-rw-r--r--gcc/testsuite/g++.dg/other/thunk2a.C15
-rw-r--r--gcc/testsuite/g++.dg/other/thunk2b.C16
-rw-r--r--gcc/testsuite/g++.dg/pr58372.C10
-rw-r--r--gcc/testsuite/g++.dg/torture/pr77745-2.C4
-rw-r--r--gcc/testsuite/g++.dg/torture/pr77745.C6
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/20181120-1.c28
-rw-r--r--gcc/testsuite/gcc.dg/pr86076.c26
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr79351.c26
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr87645.c21
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr87665.c27
-rw-r--r--gcc/testsuite/gcc.dg/torture/restrict-6.c24
-rw-r--r--gcc/testsuite/gcc.target/i386/pr87928.c23
-rw-r--r--gcc/testsuite/gcc.target/powerpc/pr87496-1.c11
-rw-r--r--gcc/testsuite/gcc.target/powerpc/pr87496-2.c10
-rw-r--r--gcc/testsuite/gcc.target/powerpc/pr87496-3.c9
-rw-r--r--gcc/testsuite/gcc.target/s390/flogr-1.c47
-rw-r--r--gcc/testsuite/gfortran.dg/20181025-1.f28
-rw-r--r--gcc/testsuite/gfortran.dg/associate_46.f9037
-rw-r--r--gcc/testsuite/gfortran.dg/pr70870_1.f901
-rw-r--r--gcc/testsuite/gfortran.dg/pr88155.f909
-rw-r--r--gcc/testsuite/gfortran.dg/pr88205.f9014
-rw-r--r--gcc/testsuite/gfortran.dg/pr88206.f908
-rw-r--r--gcc/testsuite/gfortran.dg/pr88228.f908
-rw-r--r--gcc/testsuite/gfortran.dg/pr88249.f907
-rw-r--r--gcc/testsuite/gfortran.dg/pr88269.f906
-rw-r--r--gcc/testsuite/gfortran.dg/where_7.f9025
-rw-r--r--gcc/testsuite/jit.dg/test-long-names.c2
-rw-r--r--gcc/tree-cfg.c11
-rw-r--r--gcc/tree-ssa-loop-ch.c3
-rw-r--r--gcc/tree-ssa-sccvn.c1
-rw-r--r--gcc/tree-ssa-structalias.c15
-rw-r--r--gcc/tree-vect-data-refs.c58
-rw-r--r--gcc/tree-vect-generic.c6
-rw-r--r--gcc/tree-vectorizer.h60
-rw-r--r--gcc/vmsdbgout.c10
-rw-r--r--gnattools/ChangeLog4
-rw-r--r--gotools/ChangeLog4
-rw-r--r--include/ChangeLog4
-rw-r--r--intl/ChangeLog4
-rw-r--r--libada/ChangeLog4
-rw-r--r--libatomic/ChangeLog4
-rw-r--r--libbacktrace/ChangeLog4
-rw-r--r--libcc1/ChangeLog4
-rw-r--r--libcilkrts/ChangeLog4
-rw-r--r--libcpp/ChangeLog4
-rw-r--r--libcpp/po/ChangeLog4
-rw-r--r--libdecnumber/ChangeLog4
-rw-r--r--libffi/ChangeLog4
-rw-r--r--libgcc/ChangeLog4
-rw-r--r--libgcc/config/libbid/ChangeLog4
-rw-r--r--libgfortran/ChangeLog11
-rw-r--r--libgfortran/runtime/backtrace.c19
-rwxr-xr-xlibgo/mksysinfo.sh13
-rw-r--r--libgomp/ChangeLog4
-rw-r--r--libhsail-rt/ChangeLog4
-rw-r--r--libiberty/ChangeLog4
-rw-r--r--libitm/ChangeLog4
-rw-r--r--libmpx/ChangeLog4
-rw-r--r--libobjc/ChangeLog4
-rw-r--r--liboffloadmic/ChangeLog4
-rw-r--r--libquadmath/ChangeLog4
-rw-r--r--libsanitizer/ChangeLog4
-rw-r--r--libssp/ChangeLog4
-rw-r--r--libstdc++-v3/ChangeLog13
-rw-r--r--libstdc++-v3/include/bits/hashtable.h3
-rw-r--r--libstdc++-v3/testsuite/23_containers/unordered_set/allocator/move_assign.cc128
-rw-r--r--libvtv/ChangeLog4
-rw-r--r--lto-plugin/ChangeLog4
-rw-r--r--maintainer-scripts/ChangeLog4
-rw-r--r--zlib/ChangeLog4
124 files changed, 1687 insertions, 254 deletions
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 <jakub@redhat.com>
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 <jakub@redhat.com>
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 <jakub@redhat.com>
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 <bergner@linux.ibm.com>
+
+ Backport from mainline
+ 2018-12-07 Peter Bergner <bergner@linux.ibm.com>
+
+ 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 <rguenther@suse.de>
+
+ * BASE-VER: Increment to 7.4.1.
+
+2018-12-06 Release Manager
+
+ * GCC 7.4.0 released.
+
+2018-11-28 Richard Biener <rguenther@suse.de>
+
+ 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 <iain@sandoe.co.uk>
+
+ Backport from mainline
+ 2018-08-22 Iain Sandoe <iain@sandoe.co.uk>
+
+ 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 <iain@sandoe.co.uk>
+
+ 2018-08-15 Iain Sandoe <iain@sandoe.co.uk>
+
+ * 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 <krebbel@linux.ibm.com>
+
+ Backport from mainline
+ 2018-11-20 Andreas Krebbel <krebbel@linux.ibm.com>
+
+ * config/s390/s390.md ("clztidi2"): Swap the RTX's written to the
+ DImode parts of the target operand.
+
+2018-11-26 Andreas Krebbel <krebbel@linux.ibm.com>
+
+ Backport from mainline
+ 2018-11-26 Andreas Krebbel <krebbel@linux.ibm.com>
+
+ * doc/invoke.texi: Document z14/arch12 -march option.
+
+2018-10-19 Richard Biener <rguenther@suse.de>
+
+ PR middle-end/87645
+ Backport from mainline
+ 2018-07-12 Richard Biener <rguenther@suse.de>
+
+ * gimple-match-head.c (gimple_resimplify1): Apply recursion
+ limit.
+ (gimple_resimplify2): Likewise.
+ (gimple_resimplify3): Likewise.
+ (gimple_resimplify4): Likewise.
+
+2018-11-26 Richard Biener <rguenther@suse.de>
+
+ Backport from mainline
+ 2018-10-15 Richard Biener <rguenther@suse.de>
+
+ 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 <rguenther@suse.de>
+
+ 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 <rguenther@suse.de>
+
+ PR tree-optimization/87665
+ * tree-vect-data-refs.c (vect_preserves_scalar_order_p): Adjust
+ to reflect reality.
+
+2018-11-26 Richard Biener <rguenther@suse.de>
+
+ Backport from mainline
+ 2018-06-14 Richard Biener <rguenther@suse.de>
+
+ 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 <rguenther@suse.de>
+
+ PR middle-end/86076
+ * tree-cfg.c (move_stmt_op): unshare invariant addresses
+ before adjusting their block.
+
+2018-11-22 Uros Bizjak <ubizjak@gmail.com>
+
+ Backport from mainline
+ 2018-11-16 Uros Bizjak <ubizjak@gmail.com>
+
+ 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 <tom@codesourcery.com>
+
+ backport from trunk:
+ 2017-11-19 Tom de Vries <tom@codesourcery.com>
+
+ 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 <mihail.ionescu@arm.com>
+
+ PR target/87867
+ Backport from mainiline
+ 2018-09-26 Eric Botcazou <ebotcazou@adacore.com>
+
+ * 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 <rguenther@suse.de>
+
+ Backport from mainline
+ 2018-03-12 Richard Biener <rguenther@suse.de>
+
+ 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 <rguenther@suse.de>
+
+ 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 <xuepeng.guo@intel.com>
+
+ Backport from mainline
+ 2018-11-05 Xuepeng Guo <xuepeng.guo@intel.com>
+
+ 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 <ebotcazou@adacore.com>
+
+ 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 <ubizjak@gmail.com>
+
+ Backport from mainline
+ 2018-11-11 Uros Bizjak <ubizjak@gmail.com>
+
+ 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 <nathan@acm.org>
+
+ PR debug/88006
+ PR debug/87462
+ * dwarf2out.c (dwarf2out_finish): Apply resolve_addr to comdat
+ type list.
+
+2018-11-11 Uros Bizjak <ubizjak@gmail.com>
+
+ Backport from mainline
+ 2018-11-04 Uros Bizjak <ubizjak@gmail.com>
+
+ 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 <jcmvbkbc@gmail.com>
Backport from mainline
@@ -683,10 +890,10 @@
2018-06-18 Martin Sebor <msebor@redhat.com>
- 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 <sebastian.huber@embedded-brains.de>
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 <ebotcazou@adacore.com>
+
+ * 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 <ebotcazou@adacore.com>
+
+ * 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 <ebotcazou@adacore.com>
* 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 <mjambor@suse.cz>
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 <jakub@redhat.com>
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 <jakub@redhat.com>
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 <rguenther@suse.de>
+
+ 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 <jason@redhat.com>
+
+ PR c++/87075 - ICE with constexpr array initialization.
+ * constexpr.c (cxx_eval_vec_init_1): Handle trivial initialization.
+
2018-10-23 Tom de Vries <tdevries@suse.de>
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<constructor_elt, va_gc> **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 <kargl@gcc.gnu.org>
+
+ 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 <kargl@gcc.gnu.org>
+
+ 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 <kargl@gcc.gnu.org>
+
+ 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 <kargl@gcc.gnu.org>
+
+ PR fortran/88205
+ * io.c (gfc_match_open): Move NEWUNIT checks to after STATUS checks.
+
+2018-12-09 Steven G. Kargl <kargl@gcc.gnu.org>
+
+ PR fortran/88206
+ * match.c (gfc_match_type_spec): REAL can be an intrinsic function.
+
+2018-12-09 Fritz Reese <fritzoreese@gmail.com>
+
+ 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 <tkoenig@gcc.gnu.org>
+
+ 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 <pault@gcc.gnu.org>
+
+ Backport from mainline
+ PR fortran/88143
+ * resolve.c (resolve_variable): Check for associate names with
+ NULL target.
+
2019-11-03 Tobias Burnus <burnus@net-b.de>
Thomas Koenig <tkoenig@gcc.gnu.org>
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 <mliska@suse.cz>
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 <bergner@linux.ibm.com>
+
+ Backport from mainline
+ 2018-12-07 Peter Bergner <bergner@linux.ibm.com>
+
+ 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 <kargl@gcc.gnu.org>
+
+ 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 <kargl@gcc.gnu.org>
+
+ PR fortran/88249
+ * gfortran.dg/pr88249.f90: New test.
+
+2018-12-10 Steven G. Kargl <kargl@gcc.gnu.org>
+
+ PR fortran/88269
+ * gfortran.dg/pr88269.f90: New test.
+
+2018-12-09 Steven G. Kargl <kargl@gcc.gnu.org>
+
+ PR fortran/88205
+ * gfortran.dg/pr88205.f90: New unit.
+
+2018-12-09 Steven G. Kargl <kargl@gcc.gnu.org>
+
+ PR fortran/88206
+ * gfortran.dg/pr88206.f90: New test.
+
+2018-12-09 Steven G. Kargl <kargl@gcc.gnu.org>
+
+ PR fortran/88228
+ * gfortran.dg/pr88228.f90: New test.
+
+2018-12-06 Release Manager
+
+ * GCC 7.4.0 released.
+
+2018-11-28 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/79351
+ * gcc.dg/torture/pr79351.c: New testcase.
+
+2018-11-26 Andreas Krebbel <krebbel@linux.ibm.com>
+
+ Backport from mainline
+ 2018-11-20 Andreas Krebbel <krebbel@linux.ibm.com>
+
+ * gcc.target/s390/flogr-1.c: New test.
+
+2018-10-19 Richard Biener <rguenther@suse.de>
+
+ PR middle-end/87645
+ Backport from mainline
+ 2018-07-12 Richard Biener <rguenther@suse.de>
+
+ * gcc.dg/torture/pr87645.c: New testcase.
+
+2018-11-26 Richard Biener <rguenther@suse.de>
+
+ Backport from mainline
+ 2018-10-15 Richard Biener <rguenther@suse.de>
+
+ PR middle-end/87610
+ * gcc.dg/torture/restrict-6.c: New testcase.
+
+ 2018-10-25 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/87665
+ PR tree-optimization/87745
+ * gfortran.dg/20181025-1.f: New testcase.
+
+ 2018-10-24 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/87665
+ * gcc.dg/torture/pr87665.c: New testcase.
+
+2018-11-26 Richard Biener <rguenther@suse.de>
+
+ Backport from mainline
+ 2018-06-15 Richard Biener <rguenther@suse.de>
+
+ PR middle-end/86076
+ * gcc.dg/pr86076.c: New testcase.
+
+2018-11-26 Matthias Klose <doko@ubuntu.com>
+
+ * jit.dg/test-long-names.c: Fix build with -Wformat-security.
+
+2018-11-25 Thomas Koenig <tkoenig@gcc.gnu.org>
+
+ Backport from trunk
+ PR fortran/88073
+ * gfortran.dg/where_7.f90: New test.
+
+2018-11-24 Paul Thomas <pault@gcc.gnu.org>
+
+ Backport from mainline
+ PR fortran/88143
+ * gfortran.dg/associate_46.f90: New test.
+
+2018-11-22 Eric Botcazou <ebotcazou@adacore.com>
+
+ Backport from mainline
+ 2018-11-21 Jakub Jelinek <jakub@redhat.com>
+
+ 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 <mihail.ionescu@arm.com>
+
+ PR target/87867
+ Backport from mainiline
+ 2018-09-17 Eric Botcazou <ebotcazou@adacore.com>
+
+ * g++.dg/other/thunk2a.C: New test.
+ * g++.dg/other/thunk2b.C: Likewise.
+
+2018-11-20 Richard Biener <rguenther@suse.de>
+
+ Backport from mainline
+ 2018-01-26 Richard Biener <rguenther@suse.de>
+
+ 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 <ebotcazou@adacore.com>
+
+ * gcc.c-torture/execute/20181120-1.c: New test.
+
+2018-11-18 Uros Bizjak <ubizjak@gmail.com>
+
+ Backport from mainline
+ 2018-11-11 Uros Bizjak <ubizjak@gmail.com>
+
+ PR target/87928
+ * gcc.target/i386/pr87928.c: New test.
+
+2018-11-15 Nathan Sidwell <nathan@acm.org>
+
+ 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 <ubizjak@gmail.com>
+
+ Backport from mainline
+ 2018-11-04 Uros Bizjak <ubizjak@gmail.com>
+
+ PR middle-end/58372
+ * g++.dg/pr58372.C: New test.
+
2018-11-08 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/null_pointer_deref1.adb: Remove -gnatp and add pragma.
@@ -530,24 +697,24 @@
2018-06-18 Martin Sebor <msebor@redhat.com>
- 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 <kargl@gcc.gnu.org>
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 <typename T>
+struct vec
+{
+ struct { T y; } n;
+ vec() = default;
+};
+
+template <typename T>
+struct S
+{
+ vec<T> value[2];
+ template<typename U>
+ constexpr S(const U&);
+};
+
+template<typename T>
+template<typename X>
+constexpr S<T>::S(const X&)
+{
+ value[0] = vec<T>();
+}
+
+S<float>m(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 <typename T,
+ T (*funcImpl)()>
+class TestWrapper {
+public:
+ static T func() __attribute((noinline)) { return (*funcImpl)(); }
+};
+
+int main() {
+ return TestWrapper<int, &Test1::testFunc>::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 <bool> struct B { typedef int Type; };
+
+class Arg
+{
+ template <typename Unused> struct Local : A {};
+
+public:
+ template <typename Init, typename = typename B<Local<Init>::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 <void (Foo::*unused)()> struct Callable {};
+
+class I {
+ I() : lamb ([this] {}) {}
+
+ Lambda lamb;
+
+ Callable<&Foo::mfun> bm;
+};
diff --git a/gcc/testsuite/g++.dg/other/vthunk1.C b/gcc/testsuite/g++.dg/other/thunk1.C
index 90165628b45..90165628b45 100644
--- a/gcc/testsuite/g++.dg/other/vthunk1.C
+++ b/gcc/testsuite/g++.dg/other/thunk1.C
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/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 <sudi@gcc.gnu.org> */
+
+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<n; j++) {
+ states[j] = (struct state){0};
+ for (int i = 0; i <= j; i++) {
+ states[i].k++;
+ }
+ }
+}
+
+int
+main()
+{
+ ismatch(2);
+ if (states[0].k != 2)
+ __builtin_abort();
+}
diff --git a/gcc/testsuite/gcc.dg/torture/pr87645.c b/gcc/testsuite/gcc.dg/torture/pr87645.c
new file mode 100644
index 00000000000..5360e380080
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr87645.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+
+typedef unsigned a[8];
+a b, g;
+int c, d, e, f;
+int h() {
+ unsigned i = 2;
+ for (; i < 8; i++)
+ b[i] = 0;
+ for (; f;) {
+ d = 1;
+ for (; d < 14; d += 3) {
+ e = 0;
+ for (; e < 8; e++) {
+ i = 2;
+ for (; i < 8; i++)
+ b[i] = 5 - (c - g[e] + b[i]);
+ }
+ }
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/torture/pr87665.c b/gcc/testsuite/gcc.dg/torture/pr87665.c
new file mode 100644
index 00000000000..6f5e968b628
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr87665.c
@@ -0,0 +1,27 @@
+/* { dg-do run } */
+
+struct X { long x; long y; };
+
+struct X a[1024], b[1024];
+
+void foo ()
+{
+ for (int i = 0; i < 1024; ++i)
+ {
+ long tem = a[i].x;
+ a[i].x = 0;
+ b[i].x = tem;
+ b[i].y = a[i].y;
+ }
+}
+
+int main()
+{
+ for (int i = 0; i < 1024; ++i)
+ a[i].x = i;
+ foo ();
+ for (int i = 0; i < 1024; ++i)
+ if (b[i].x != i)
+ __builtin_abort();
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/torture/restrict-6.c b/gcc/testsuite/gcc.dg/torture/restrict-6.c
new file mode 100644
index 00000000000..9fe12a68850
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/restrict-6.c
@@ -0,0 +1,24 @@
+/* { dg-do run } */
+
+extern void abort (void);
+
+void __attribute__((noinline)) g(int **a, int *b)
+{
+ *a = b;
+}
+
+int foo(int * restrict p, int *q)
+{
+ g(&q, p);
+ *p = 1;
+ *q = 2;
+ return *p + *q;
+}
+
+int main()
+{
+ int x, y;
+ if (foo(&x, &y) != 4)
+ abort ();
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.target/i386/pr87928.c b/gcc/testsuite/gcc.target/i386/pr87928.c
new file mode 100644
index 00000000000..5edaa5f0676
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr87928.c
@@ -0,0 +1,23 @@
+/* { dg-do compile { target lp64 } } */
+/* { dg-options "-O1 -mstackrealign -mabi=ms" } */
+
+struct foo
+{
+ int a;
+ int b;
+ int c;
+ int d;
+};
+
+__attribute__ ((sysv_abi))
+struct foo bar (void)
+{
+ struct foo retval;
+
+ retval.a = 1;
+ retval.b = 2;
+ retval.c = 3;
+ retval.d = 4;
+
+ return retval;
+}
diff --git a/gcc/testsuite/gcc.target/powerpc/pr87496-1.c b/gcc/testsuite/gcc.target/powerpc/pr87496-1.c
new file mode 100644
index 00000000000..691e440bcf7
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/pr87496-1.c
@@ -0,0 +1,11 @@
+/* PR target/87496 */
+/* { dg-do compile { target { powerpc*-*-* && lp64 } } } */
+/* { dg-skip-if "" { powerpc*-*-darwin* } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power7" } } */
+/* { dg-require-effective-target longdouble128 } */
+/* { dg-options "-O2 -mcpu=power7 -mabi=ieeelongdouble -mno-popcntd -Wno-psabi" } */
+
+int i;
+
+/* { dg-error "'-mabi=ieeelongdouble' requires full ISA 2.06 support" "PR87496" { target *-*-* } 0 } */
+/* { dg-warning "using IEEE extended precision long double" "" { target *-*-* } 0 } */
diff --git a/gcc/testsuite/gcc.target/powerpc/pr87496-2.c b/gcc/testsuite/gcc.target/powerpc/pr87496-2.c
new file mode 100644
index 00000000000..b3e2f01e3b5
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/pr87496-2.c
@@ -0,0 +1,10 @@
+/* PR target/87496 */
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "" { powerpc*-*-darwin* } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power7" } } */
+/* { dg-options "-O2 -mcpu=power7 -mabi=ieeelongdouble -mlong-double-64 -Wno-psabi" } */
+
+int i;
+
+/* { dg-error "'-mabi=ieeelongdouble' requires '-mlong-double-128'" "PR87496" { target *-*-* } 0 } */
+/* { dg-warning "using IEEE extended precision long double" "" { target *-*-* } 0 } */
diff --git a/gcc/testsuite/gcc.target/powerpc/pr87496-3.c b/gcc/testsuite/gcc.target/powerpc/pr87496-3.c
new file mode 100644
index 00000000000..207680ee17a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/pr87496-3.c
@@ -0,0 +1,9 @@
+/* PR target/87496 */
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "" { powerpc*-*-darwin* } } */
+/* { dg-options "-O2 -mabi=ibmlongdouble -mlong-double-64 -Wno-psabi" } */
+
+int i;
+
+/* { dg-error "'-mabi=ibmlongdouble' requires '-mlong-double-128'" "PR87496" { target *-*-* } 0 } */
+/* { dg-warning "using IBM extended precision long double" "" { target *-*-* } 0 } */
diff --git a/gcc/testsuite/gcc.target/s390/flogr-1.c b/gcc/testsuite/gcc.target/s390/flogr-1.c
new file mode 100644
index 00000000000..a3869000d62
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/flogr-1.c
@@ -0,0 +1,47 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -funroll-loops -march=z9-109" } */
+/* { dg-require-effective-target stdint_types } */
+
+/* Folding of the FLOGR caused a wrong value to be returned by
+ __builtin_clz becuase of a problem in the RTX we emit for FLOGR.
+ The problematic folding can only be triggered with constants inputs
+ introduced on RTL level. In this case it happens with loop
+ unrolling. */
+
+#include <stdint.h>
+#include <assert.h>
+
+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 <andrew@fluidgravity.co.uk>
+!
+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 <zeccav at gmail dot com >
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 <jakub@redhat.com>
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 <jakub@redhat.com>
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 <jakub@redhat.com>
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 <jakub@redhat.com>
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 <jakub@redhat.com>
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 <jakub@redhat.com>
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 <danglin@gcc.gnu.org>
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 <jb@gcc.gnu.org>
+
+ 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 <gerald@pfeifer.com>
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 <jakub@redhat.com>
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 <jakub@redhat.com>
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 <jakub@redhat.com>
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 <jakub@redhat.com>
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 <jakub@redhat.com>
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 <jakub@redhat.com>
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 <jakub@redhat.com>
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 <mliska@suse.cz>
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 <jakub@redhat.com>
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 <fdumont@gcc.gnu.org>
+
+ 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 <jwakely@redhat.com>
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 <unordered_set>
+
#include <testsuite_hooks.h>
#include <testsuite_allocator.h>
#include <testsuite_counter_type.h>
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<counter_type, false> alloc_type;
- typedef __gnu_test::counter_type_hasher hash;
- typedef std::unordered_set<counter_type, hash,
- std::equal_to<counter_type>,
- alloc_type> test_type;
+ tracker_allocator_counter::reset();
+ {
+ typedef propagating_allocator<counter_type, false,
+ tracker_allocator<counter_type>> alloc_type;
+ typedef __gnu_test::counter_type_hasher hash;
+ typedef std::unordered_set<counter_type, hash,
+ std::equal_to<counter_type>,
+ 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<counter_type, true> alloc_type;
- typedef __gnu_test::counter_type_hasher hash;
- typedef std::unordered_set<counter_type, hash,
- std::equal_to<counter_type>,
- alloc_type> test_type;
+ tracker_allocator_counter::reset();
+ {
+ typedef propagating_allocator<counter_type, true,
+ tracker_allocator<counter_type>> alloc_type;
+ typedef __gnu_test::counter_type_hasher hash;
+ typedef std::unordered_set<counter_type, hash,
+ std::equal_to<counter_type>,
+ 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<counter_type, false,
+ tracker_allocator<counter_type>> alloc_type;
+ typedef __gnu_test::counter_type_hasher hash;
+ typedef std::unordered_set<counter_type, hash,
+ std::equal_to<counter_type>,
+ 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 <jakub@redhat.com>
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.